module Papa.Lens.Implement.Data.Collapse(
collapse0
, collapse1
, collapse2
, map0
, map1
, map2
, mapMaybe
, catMaybes
) where
import Control.Category((.))
import Control.Lens(AsEmpty(_Empty), Cons, cons, Getting, folded, foldrOf, ( # ))
import Data.Monoid(Endo)
import Data.Foldable(Foldable(foldr))
import Data.Functor(Functor(fmap))
collapse0 ::
(Cons r r a a, AsEmpty r) =>
Getting (Endo r) s a
-> s
-> r
collapse0 x =
foldrOf x cons (_Empty # ())
collapse1 ::
(Cons r r a a, AsEmpty r) =>
Getting (Endo r) (Compose f g b) a
-> f (g b)
-> r
collapse1 x =
collapse0 x . Compose
collapse2 ::
(Cons r r a a, AsEmpty r) =>
Getting (Endo r) (Compose (Compose f g) h b) a
-> f (g (h b))
-> r
collapse2 x =
collapse1 x . Compose
map0 ::
(Cons r r a a, AsEmpty r, Functor f) =>
Getting (Endo r) (f c) a
-> (b -> c)
-> f b
-> r
map0 x f =
collapse0 x . fmap f
map1 ::
(Cons r r a a, AsEmpty r, Functor f) =>
Getting (Endo r) (Compose f g c) a
-> (b -> g c)
-> f b
-> r
map1 x f =
collapse1 x . fmap f
map2 ::
(Cons r r a a, AsEmpty r, Functor f) =>
Getting (Endo r) (Compose (Compose f g) h c) a
-> (b -> g (h c))
-> f b
-> r
map2 x f =
collapse2 x . fmap f
mapMaybe ::
(Cons r r c c, AsEmpty r, Foldable f, Functor f, Foldable g) =>
(b -> g c)
-> f b
-> r
mapMaybe =
map1 folded
catMaybes ::
(Cons r r b b, AsEmpty r, Foldable f, Foldable g) =>
f (g b)
-> r
catMaybes =
collapse1 folded
newtype Compose f g a =
Compose (f (g a))
instance (Foldable f, Foldable g) => Foldable (Compose f g) where
foldr f z (Compose x) =
foldr (\a b -> foldr f b a) z x