X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Data%2FTree.hs;h=e0a7cb6de2f6d9eba90052c06378bddc8f979c99;hb=641f8d5964b2b02f4cd7b9081adf6596c6f4d4d7;hp=5a304705e62fd1a4c203867f9491125facb3ac59;hpb=13e58f0482069d84b89d90eeeeca2c172c3e6682;p=ghc-base.git diff --git a/Data/Tree.hs b/Data/Tree.hs index 5a30470..e0a7cb6 100644 --- a/Data/Tree.hs +++ b/Data/Tree.hs @@ -28,9 +28,13 @@ module Data.Tree( import Prelude #endif +import Control.Applicative (Applicative(..)) import Control.Monad -import Data.Sequence (Seq, empty, singleton, (<|), (|>), fromList, toList, +import Data.Monoid (Monoid(..)) +import Data.Sequence (Seq, empty, singleton, (<|), (|>), fromList, ViewL(..), ViewR(..), viewl, viewr) +import Data.Foldable (Foldable(foldMap), toList) +import Data.Traversable (Traversable(traverse)) import Data.Typeable #include "Typeable.h" @@ -57,6 +61,12 @@ instance Functor Tree where mapTree :: (a -> b) -> (Tree a -> Tree b) mapTree f (Node x ts) = Node (f x) (map (mapTree f) ts) +instance Traversable Tree where + traverse f (Node x ts) = Node <$> f x <*> traverse (traverse f) ts + +instance Foldable Tree where + foldMap f (Node x ts) = f x `mappend` foldMap (foldMap f) ts + -- | Neat 2-dimensional drawing of a tree. drawTree :: Tree String -> String drawTree = unlines . draw