module Data.AlternatingList.Custom where
infixr 5 :>, :<
data Disparate a b =
a :> Uniform a b
| End
data Uniform a b =
b :< Disparate a b
mapDisparate ::
(a0 -> a1) -> (b0 -> b1) ->
(Disparate a0 b0 -> Disparate a1 b1)
mapDisparate :: forall a0 a1 b0 b1.
(a0 -> a1) -> (b0 -> b1) -> Disparate a0 b0 -> Disparate a1 b1
mapDisparate a0 -> a1
f b0 -> b1
g =
forall a c d b.
(a -> c -> d) -> (b -> d -> c) -> d -> Disparate a b -> d
foldrDisparate (forall a b. a -> Uniform a b -> Disparate a b
(:>) forall b c a. (b -> c) -> (a -> b) -> a -> c
. a0 -> a1
f) (forall a b. b -> Disparate a b -> Uniform a b
(:<) forall b c a. (b -> c) -> (a -> b) -> a -> c
. b0 -> b1
g) forall a b. Disparate a b
End
mapUniform ::
(a0 -> a1) -> (b0 -> b1) ->
(Uniform a0 b0 -> Uniform a1 b1)
mapUniform :: forall a0 a1 b0 b1.
(a0 -> a1) -> (b0 -> b1) -> Uniform a0 b0 -> Uniform a1 b1
mapUniform a0 -> a1
f b0 -> b1
g =
forall a c d b.
(a -> c -> d) -> (b -> d -> c) -> d -> Uniform a b -> c
foldrUniform (forall a b. a -> Uniform a b -> Disparate a b
(:>) forall b c a. (b -> c) -> (a -> b) -> a -> c
. a0 -> a1
f) (forall a b. b -> Disparate a b -> Uniform a b
(:<) forall b c a. (b -> c) -> (a -> b) -> a -> c
. b0 -> b1
g) forall a b. Disparate a b
End
foldrDisparate ::
(a -> c -> d) -> (b -> d -> c) ->
d -> Disparate a b -> d
foldrDisparate :: forall a c d b.
(a -> c -> d) -> (b -> d -> c) -> d -> Disparate a b -> d
foldrDisparate a -> c -> d
f b -> d -> c
g d
start Disparate a b
a0 =
case Disparate a b
a0 of
Disparate a b
End -> d
start
a
a :> Uniform a b
bas -> a -> c -> d
f a
a (forall a c d b.
(a -> c -> d) -> (b -> d -> c) -> d -> Uniform a b -> c
foldrUniform a -> c -> d
f b -> d -> c
g d
start Uniform a b
bas)
foldrUniform ::
(a -> c -> d) -> (b -> d -> c) ->
d -> Uniform a b -> c
foldrUniform :: forall a c d b.
(a -> c -> d) -> (b -> d -> c) -> d -> Uniform a b -> c
foldrUniform a -> c -> d
f b -> d -> c
g d
start (b
b :< Disparate a b
abas) =
b -> d -> c
g b
b (forall a c d b.
(a -> c -> d) -> (b -> d -> c) -> d -> Disparate a b -> d
foldrDisparate a -> c -> d
f b -> d -> c
g d
start Disparate a b
abas)