module ZipFold (Zip(..), zip, zip') where
import Prelude hiding (zip)
newtype Zip a b = Zip { forall a b. Zip a b -> a -> (Zip a b -> b) -> b
runZip :: a -> (Zip a b -> b) -> b }
zip :: [a] -> [b] -> [(a,b)]
zip :: forall a b. [a] -> [b] -> [(a, b)]
zip [a]
xs [b]
ys = (a -> (Zip a [(a, b)] -> [(a, b)]) -> Zip a [(a, b)] -> [(a, b)])
-> (Zip a [(a, b)] -> [(a, b)])
-> [a]
-> Zip a [(a, b)]
-> [(a, b)]
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> (Zip a [(a, b)] -> [(a, b)]) -> Zip a [(a, b)] -> [(a, b)]
forall {a} {b}. a -> (Zip a b -> b) -> Zip a b -> b
xf Zip a [(a, b)] -> [(a, b)]
forall {p} {a}. p -> [a]
xb [a]
xs ((a -> (Zip a [(a, b)] -> [(a, b)]) -> [(a, b)]) -> Zip a [(a, b)]
forall a b. (a -> (Zip a b -> b) -> b) -> Zip a b
Zip ((b
-> (a -> (Zip a [(a, b)] -> [(a, b)]) -> [(a, b)])
-> a
-> (Zip a [(a, b)] -> [(a, b)])
-> [(a, b)])
-> (a -> (Zip a [(a, b)] -> [(a, b)]) -> [(a, b)])
-> [b]
-> a
-> (Zip a [(a, b)] -> [(a, b)])
-> [(a, b)]
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr b
-> (a -> (Zip a [(a, b)] -> [(a, b)]) -> [(a, b)])
-> a
-> (Zip a [(a, b)] -> [(a, b)])
-> [(a, b)]
forall {b} {a} {b} {a}.
b
-> (a -> (Zip a b -> b) -> b)
-> a
-> (Zip a b -> [(a, b)])
-> [(a, b)]
yf a -> (Zip a [(a, b)] -> [(a, b)]) -> [(a, b)]
forall {p} {p} {a}. p -> p -> [a]
yb [b]
ys))
where
xf :: a -> (Zip a b -> b) -> Zip a b -> b
xf a
x Zip a b -> b
xk Zip a b
yk = Zip a b -> a -> (Zip a b -> b) -> b
forall a b. Zip a b -> a -> (Zip a b -> b) -> b
runZip Zip a b
yk a
x Zip a b -> b
xk
xb :: p -> [a]
xb p
_ = []
yf :: b
-> (a -> (Zip a b -> b) -> b)
-> a
-> (Zip a b -> [(a, b)])
-> [(a, b)]
yf b
y a -> (Zip a b -> b) -> b
yk a
x Zip a b -> [(a, b)]
xk = (a
x,b
y) (a, b) -> [(a, b)] -> [(a, b)]
forall a. a -> [a] -> [a]
: Zip a b -> [(a, b)]
xk ((a -> (Zip a b -> b) -> b) -> Zip a b
forall a b. (a -> (Zip a b -> b) -> b) -> Zip a b
Zip a -> (Zip a b -> b) -> b
yk)
yb :: p -> p -> [a]
yb p
_ p
_ = []
zip' :: [a] -> [b] -> [(a,b)]
zip' :: forall a b. [a] -> [b] -> [(a, b)]
zip' = (a -> ([b] -> [(a, b)]) -> [b] -> [(a, b)])
-> ([b] -> [(a, b)]) -> [a] -> [b] -> [(a, b)]
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> ([b] -> [(a, b)]) -> [b] -> [(a, b)]
forall {a} {b}. a -> ([b] -> [(a, b)]) -> [b] -> [(a, b)]
go ([(a, b)] -> [b] -> [(a, b)]
forall a b. a -> b -> a
const [])
where
go :: a -> ([b] -> [(a, b)]) -> [b] -> [(a, b)]
go a
_ [b] -> [(a, b)]
_ [] = []
go a
x [b] -> [(a, b)]
f (b
y:[b]
ys) = (a
x, b
y) (a, b) -> [(a, b)] -> [(a, b)]
forall a. a -> [a] -> [a]
: [b] -> [(a, b)]
f [b]
ys