module Tree(Tree(..), mapInner)
where
import Data.Foldable
data Tree a b = Leaf b | Node a [Tree a b]
deriving (Eq, Read, Show)
mapTree :: (b -> c) -> Tree a b -> Tree a c
mapTree f (Leaf b) = Leaf (f b)
mapTree f (Node a ts) = Node a (map (mapTree f) ts)
mapInner :: (a -> c) -> Tree a b -> Tree c b
mapInner _ (Leaf b) = Leaf b
mapInner f (Node a ts) = Node (f a) (map (mapInner f) ts)
instance Functor (Tree a) where
fmap = mapTree
foldTreer :: (a -> b -> b) -> b -> Tree c a -> b
foldTreer f v (Leaf a) = f a v
foldTreer _ v (Node _ []) = v
foldTreer f v (Node c (t:ts)) = foldTreer f (foldTreer f v t) (Node c ts)
instance Foldable (Tree a) where
foldr = foldTreer