module CFold (cfold', cfold) where
cfold' :: (t1 -> t2 -> (t2 -> t2) -> t2) -> t2 -> [t1] -> t2
cfold' :: forall t1 t2. (t1 -> t2 -> (t2 -> t2) -> t2) -> t2 -> [t1] -> t2
cfold' t1 -> t2 -> (t2 -> t2) -> t2
_ t2
z [] = t2
z
cfold' t1 -> t2 -> (t2 -> t2) -> t2
f t2
z (t1
x:[t1]
xs) = t1 -> t2 -> (t2 -> t2) -> t2
f t1
x t2
z (\t2
y -> (t1 -> t2 -> (t2 -> t2) -> t2) -> t2 -> [t1] -> t2
forall t1 t2. (t1 -> t2 -> (t2 -> t2) -> t2) -> t2 -> [t1] -> t2
cfold' t1 -> t2 -> (t2 -> t2) -> t2
f t2
y [t1]
xs)
cfold :: (t1 -> t2 -> t2) -> t2 -> [t1] -> t2
cfold :: forall t1 t2. (t1 -> t2 -> t2) -> t2 -> [t1] -> t2
cfold t1 -> t2 -> t2
f = (t1 -> t2 -> (t2 -> t2) -> t2) -> t2 -> [t1] -> t2
forall t1 t2. (t1 -> t2 -> (t2 -> t2) -> t2) -> t2 -> [t1] -> t2
cfold' (\ t1
x t2
t t2 -> t2
g -> t1 -> t2 -> t2
f t1
x (t2 -> t2
g t2
t))