module Tree where
data Tree a = Tree a [Tree a]
deriving Show
treeRoot :: Tree a -> a
treeChildren :: Tree a -> [Tree a]
treeRoot (Tree a _) = a
treeChildren (Tree _ c) = c
leafNode :: a -> Tree a
leafNode x = Tree x []
preorderTree :: Tree a -> [a]
preorderTree t = traverse t [] where
traverse (Tree a c) k = a : travlist c k
travlist (c:cs) k = traverse c (travlist cs k)
travlist [] k = k
mapTree :: (a -> b) -> Tree a -> Tree b
mapTree f (Tree a c) = Tree (f a) (map (mapTree f) c)
instance Functor Tree where fmap = mapTree
cataTree :: ((a, [b]) -> b) -> Tree a -> b
anaTree :: (b -> (a, [b])) -> b -> Tree a
cataTree f (Tree a c) = f (a,map (cataTree f) c)
anaTree g b = let (a,bs) = g b in Tree a (map (anaTree g) bs)
foldTree :: (a -> b -> c) -> (c -> b -> b) -> b -> Tree a -> c
foldTree tree cons nil (Tree a c)
= tree a (foldr cons nil (map (foldTree tree cons nil) c))
scanTree :: (a -> b -> a) -> a -> Tree b -> Tree a
scanTree op a (Tree b children)
= let a' = a `op` b in Tree a' (map (scanTree op a') children)
accumTree :: (a -> b -> (c, a)) -> a -> Tree b -> Tree c
accumTree op a (Tree b children)
= let (c,a') = a `op` b in Tree c (map (accumTree op a') children)