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 f g =
foldrDisparate ((:>) . f) ((:<) . g) End
mapUniform ::
(a0 -> a1) -> (b0 -> b1) ->
(Uniform a0 b0 -> Uniform a1 b1)
mapUniform f g =
foldrUniform ((:>) . f) ((:<) . g) End
foldrDisparate ::
(a -> c -> d) -> (b -> d -> c) ->
d -> Disparate a b -> d
foldrDisparate f g start a0 =
case a0 of
End -> start
a :> bas -> f a (foldrUniform f g start bas)
foldrUniform ::
(a -> c -> d) -> (b -> d -> c) ->
d -> Uniform a b -> c
foldrUniform f g start (b :< abas) =
g b (foldrDisparate f g start abas)