packages feed

starrover2-0.0.9: src/Tree.hs

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