penny-lib-0.2.0.0: Penny/Lincoln/Family/Family.hs
module Penny.Lincoln.Family.Family where
import qualified Data.Functor.Identity as I
-- | A Family has one parent (ah, the anomie, sorry) and at least two
-- children.
data Family p c =
Family { parent :: p
, child1 :: c
, child2 :: c
, children :: [c] }
deriving (Eq, Show)
-- | Maps over all children in a monad, in order starting with child
-- 1, then child 2, then the children in the list from left to right.
mapChildrenM ::
Monad m
=> (a -> m b)
-> Family p a
-> m (Family p b)
mapChildrenM f (Family p c1 c2 cs) = do
c1' <- f c1
c2' <- f c2
cs' <- mapM f cs
return $ Family p c1' c2' cs'
-- | Maps over all children, in order starting with child
-- 1, then child 2, then the children in the list from left to right.
mapChildren ::
(a -> b)
-> Family p a
-> Family p b
mapChildren f fam = I.runIdentity (mapChildrenM f' fam) where
f' = return . f
-- | Maps over the parent in a monad.
mapParentM ::
Monad m
=> (a -> m b)
-> Family a c
-> m (Family b c)
mapParentM f (Family p c1 c2 cs) = do
p' <- f p
return $ Family p' c1 c2 cs
-- | Maps over the parent.
mapParent :: (a -> b) -> Family a c -> Family b c
mapParent f fam = I.runIdentity (mapParentM f' fam) where
f' = return . f