module Lava.Patterns where
import Lava
infixr 5 ->-
infixr 4 -|-
swap :: (b, a) -> (a, b)
swap (a :: b
a,b :: a
b) = (a
b,b
a)
swapl :: [a] -> [a]
swapl [a :: a
a,b :: a
b] = [a
b,a
a]
copy :: b -> (b, b)
copy a :: b
a = (b
a,b
a)
riffle :: [a] -> [a]
riffle = [a] -> ([a], [a])
forall a. [a] -> ([a], [a])
halveList ([a] -> ([a], [a])) -> (([a], [a]) -> [a]) -> [a] -> [a]
forall a b c. (a -> b) -> (b -> c) -> a -> c
->- ([a], [a]) -> [(a, a)]
forall a b. ([a], [b]) -> [(a, b)]
zipp (([a], [a]) -> [(a, a)]) -> ([(a, a)] -> [a]) -> ([a], [a]) -> [a]
forall a b c. (a -> b) -> (b -> c) -> a -> c
->- [(a, a)] -> [a]
forall a. [(a, a)] -> [a]
unpair
unriffle :: [a] -> [a]
unriffle = [a] -> [(a, a)]
forall b. [b] -> [(b, b)]
pair ([a] -> [(a, a)]) -> ([(a, a)] -> [a]) -> [a] -> [a]
forall a b c. (a -> b) -> (b -> c) -> a -> c
->- [(a, a)] -> ([a], [a])
forall a a. [(a, a)] -> ([a], [a])
unzipp ([(a, a)] -> ([a], [a])) -> (([a], [a]) -> [a]) -> [(a, a)] -> [a]
forall a b c. (a -> b) -> (b -> c) -> a -> c
->- ([a], [a]) -> [a]
forall a. ([a], [a]) -> [a]
append
zipp :: ([a], [b]) -> [(a, b)]
zipp ([], []) = []
zipp (a :: a
a:as :: [a]
as, b :: b
b:bs :: [b]
bs) = (a
a,b
b) (a, b) -> [(a, b)] -> [(a, b)]
forall a. a -> [a] -> [a]
: ([a], [b]) -> [(a, b)]
zipp ([a]
as, [b]
bs)
unzipp :: [(a, a)] -> ([a], [a])
unzipp [] = ([], [])
unzipp ((a :: a
a,b :: a
b):abs :: [(a, a)]
abs) = (a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
as, a
ba -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
bs)
where
(as :: [a]
as, bs :: [a]
bs) = [(a, a)] -> ([a], [a])
unzipp [(a, a)]
abs
pair :: [b] -> [(b, b)]
pair (x :: b
x:y :: b
y:xs :: [b]
xs) = (b
x,b
y) (b, b) -> [(b, b)] -> [(b, b)]
forall a. a -> [a] -> [a]
: [b] -> [(b, b)]
pair [b]
xs
pair xs :: [b]
xs = []
unpair :: [(a, a)] -> [a]
unpair ((x :: a
x,y :: a
y):xys :: [(a, a)]
xys) = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [(a, a)] -> [a]
unpair [(a, a)]
xys
unpair [] = []
halveList :: [a] -> ([a], [a])
halveList inps :: [a]
inps = ([a]
left,[a]
right)
where
left :: [a]
left = Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
take Int
half [a]
inps
right :: [a]
right = Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
drop Int
half [a]
inps
half :: Int
half = [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
inps Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` 2
append :: ([a], [a]) -> [a]
append (a :: [a]
a,b :: [a]
b) = [a]
a [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a]
b
serial :: (a -> b) -> (b -> c) -> a -> c
serial circ1 :: a -> b
circ1 circ2 :: b -> c
circ2 = b -> c
circ2 (b -> c) -> (a -> b) -> a -> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
circ1
circ1 :: a -> b
circ1 ->- :: (a -> b) -> (b -> c) -> a -> c
->- circ2 :: b -> c
circ2 = (a -> b) -> (b -> c) -> a -> c
forall a b c. (a -> b) -> (b -> c) -> a -> c
serial a -> b
circ1 b -> c
circ2
compose :: [b -> b] -> b -> b
compose [] = b -> b
forall a. a -> a
id
compose (circ :: b -> b
circ:circs :: [b -> b]
circs) = b -> b
circ (b -> b) -> (b -> b) -> b -> b
forall a b c. (a -> b) -> (b -> c) -> a -> c
->- [b -> b] -> b -> b
compose [b -> b]
circs
composeN :: Int -> (b -> b) -> b -> b
composeN n :: Int
n circ :: b -> b
circ = [b -> b] -> b -> b
forall b. [b -> b] -> b -> b
compose (Int -> (b -> b) -> [b -> b]
forall a. Int -> a -> [a]
replicate Int
n b -> b
circ)
par :: (t -> a) -> (t -> b) -> (t, t) -> (a, b)
par circ1 :: t -> a
circ1 circ2 :: t -> b
circ2 (a :: t
a, b :: t
b) = (t -> a
circ1 t
a, t -> b
circ2 t
b)
circ1 :: t -> a
circ1 -|- :: (t -> a) -> (t -> b) -> (t, t) -> (a, b)
-|- circ2 :: t -> b
circ2 = (t -> a) -> (t -> b) -> (t, t) -> (a, b)
forall t a t b. (t -> a) -> (t -> b) -> (t, t) -> (a, b)
par t -> a
circ1 t -> b
circ2
parl :: ([a] -> [a]) -> ([a] -> [a]) -> [a] -> [a]
parl circ1 :: [a] -> [a]
circ1 circ2 :: [a] -> [a]
circ2 = [a] -> ([a], [a])
forall a. [a] -> ([a], [a])
halveList ([a] -> ([a], [a])) -> (([a], [a]) -> [a]) -> [a] -> [a]
forall a b c. (a -> b) -> (b -> c) -> a -> c
->- ([a] -> [a]
circ1 ([a] -> [a]) -> ([a] -> [a]) -> ([a], [a]) -> ([a], [a])
forall t a t b. (t -> a) -> (t -> b) -> (t, t) -> (a, b)
-|- [a] -> [a]
circ2) (([a], [a]) -> ([a], [a]))
-> (([a], [a]) -> [a]) -> ([a], [a]) -> [a]
forall a b c. (a -> b) -> (b -> c) -> a -> c
->- ([a], [a]) -> [a]
forall a. ([a], [a]) -> [a]
append
two :: ([a] -> [a]) -> [a] -> [a]
two circ :: [a] -> [a]
circ = ([a] -> [a]) -> ([a] -> [a]) -> [a] -> [a]
forall a a. ([a] -> [a]) -> ([a] -> [a]) -> [a] -> [a]
parl [a] -> [a]
circ [a] -> [a]
circ
ilv :: ([a] -> [a]) -> [a] -> [a]
ilv circ :: [a] -> [a]
circ = [a] -> [a]
forall a. [a] -> [a]
unriffle ([a] -> [a]) -> ([a] -> [a]) -> [a] -> [a]
forall a b c. (a -> b) -> (b -> c) -> a -> c
->- ([a] -> [a]) -> [a] -> [a]
forall a a. ([a] -> [a]) -> [a] -> [a]
two [a] -> [a]
circ ([a] -> [a]) -> ([a] -> [a]) -> [a] -> [a]
forall a b c. (a -> b) -> (b -> c) -> a -> c
->- [a] -> [a]
forall a. [a] -> [a]
riffle
iter :: t -> (t -> t) -> t -> t
iter 0 comb :: t -> t
comb circ :: t
circ = t
circ
iter n :: t
n comb :: t -> t
comb circ :: t
circ = t -> t
comb (t -> (t -> t) -> t -> t
iter (t
nt -> t -> t
forall a. Num a => a -> a -> a
-1) t -> t
comb t
circ)
twoN :: t -> ([a] -> [a]) -> [a] -> [a]
twoN n :: t
n circ :: [a] -> [a]
circ = t -> (([a] -> [a]) -> [a] -> [a]) -> ([a] -> [a]) -> [a] -> [a]
forall t t. (Eq t, Num t) => t -> (t -> t) -> t -> t
iter t
n ([a] -> [a]) -> [a] -> [a]
forall a a. ([a] -> [a]) -> [a] -> [a]
two [a] -> [a]
circ
ilvN :: t -> ([a] -> [a]) -> [a] -> [a]
ilvN n :: t
n circ :: [a] -> [a]
circ = t -> (([a] -> [a]) -> [a] -> [a]) -> ([a] -> [a]) -> [a] -> [a]
forall t t. (Eq t, Num t) => t -> (t -> t) -> t -> t
iter t
n ([a] -> [a]) -> [a] -> [a]
forall a a. ([a] -> [a]) -> [a] -> [a]
ilv [a] -> [a]
circ
bfly :: t -> ([a] -> [a]) -> [a] -> [a]
bfly 0 circ :: [a] -> [a]
circ = [a] -> [a]
forall a. a -> a
id
bfly n :: t
n circ :: [a] -> [a]
circ = ([a] -> [a]) -> [a] -> [a]
forall a a. ([a] -> [a]) -> [a] -> [a]
ilv (t -> ([a] -> [a]) -> [a] -> [a]
bfly (t
nt -> t -> t
forall a. Num a => a -> a -> a
-1) [a] -> [a]
circ) ([a] -> [a]) -> ([a] -> [a]) -> [a] -> [a]
forall a b c. (a -> b) -> (b -> c) -> a -> c
->- t -> ([a] -> [a]) -> [a] -> [a]
forall t a a. (Eq t, Num t) => t -> ([a] -> [a]) -> [a] -> [a]
twoN (t
nt -> t -> t
forall a. Num a => a -> a -> a
-1) [a] -> [a]
circ
pmap :: ((b, b) -> (a, a)) -> [b] -> [a]
pmap circ :: (b, b) -> (a, a)
circ = [b] -> [(b, b)]
forall b. [b] -> [(b, b)]
pair ([b] -> [(b, b)]) -> ([(b, b)] -> [a]) -> [b] -> [a]
forall a b c. (a -> b) -> (b -> c) -> a -> c
->- ((b, b) -> (a, a)) -> [(b, b)] -> [(a, a)]
forall a b. (a -> b) -> [a] -> [b]
map (b, b) -> (a, a)
circ ([(b, b)] -> [(a, a)]) -> ([(a, a)] -> [a]) -> [(b, b)] -> [a]
forall a b c. (a -> b) -> (b -> c) -> a -> c
->- [(a, a)] -> [a]
forall a. [(a, a)] -> [a]
unpair
tri :: (b -> b) -> [b] -> [b]
tri circ :: b -> b
circ [] = []
tri circ :: b -> b
circ (inp :: b
inp:inps :: [b]
inps) = b
inp b -> [b] -> [b]
forall a. a -> [a] -> [a]
: ((b -> b) -> [b] -> [b]
forall a b. (a -> b) -> [a] -> [b]
map b -> b
circ ([b] -> [b]) -> ([b] -> [b]) -> [b] -> [b]
forall a b c. (a -> b) -> (b -> c) -> a -> c
->- (b -> b) -> [b] -> [b]
tri b -> b
circ) [b]
inps
mirror :: ((b, a) -> (b, a)) -> (a, b) -> (a, b)
mirror circ :: (b, a) -> (b, a)
circ (a :: a
a, b :: b
b) = (a
c, b
d)
where
(d :: b
d, c :: a
c) = (b, a) -> (b, a)
circ (b
b, a
a)
row :: ((b, a) -> (a, b)) -> (b, [a]) -> ([a], b)
row circ :: (b, a) -> (a, b)
circ (carryIn :: b
carryIn, []) = ([], b
carryIn)
row circ :: (b, a) -> (a, b)
circ (carryIn :: b
carryIn, a :: a
a:as :: [a]
as) = (a
ba -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
bs, b
carryOut)
where
(b :: a
b, carry :: b
carry) = (b, a) -> (a, b)
circ (b
carryIn, a
a)
(bs :: [a]
bs, carryOut :: b
carryOut) = ((b, a) -> (a, b)) -> (b, [a]) -> ([a], b)
row (b, a) -> (a, b)
circ (b
carry, [a]
as)
column :: ((b, a) -> (a, a)) -> ([b], a) -> (a, [a])
column circ :: (b, a) -> (a, a)
circ = ((a, [b]) -> ([a], a)) -> ([b], a) -> (a, [a])
forall b a b a. ((b, a) -> (b, a)) -> (a, b) -> (a, b)
mirror (((a, b) -> (a, a)) -> (a, [b]) -> ([a], a)
forall b a a. ((b, a) -> (a, b)) -> (b, [a]) -> ([a], b)
row (((b, a) -> (a, a)) -> (a, b) -> (a, a)
forall b a b a. ((b, a) -> (b, a)) -> (a, b) -> (a, b)
mirror (b, a) -> (a, a)
circ))
grid :: ((b, a) -> (a, b)) -> ([b], [a]) -> ([a], [b])
grid circ :: (b, a) -> (a, b)
circ = (([b], a) -> (a, [b])) -> ([b], [a]) -> ([a], [b])
forall b a a. ((b, a) -> (a, b)) -> (b, [a]) -> ([a], b)
row (((b, a) -> (a, b)) -> ([b], a) -> (a, [b])
forall b a a. ((b, a) -> (a, a)) -> ([b], a) -> (a, [a])
column (b, a) -> (a, b)
circ)