module Data.LabeledTree where
import Data.Traversable
import Data.Foldable
import Control.Applicative
data Tree k a = Node {
rootLabel :: a,
subForest :: Forest k a
} deriving Show
data k ::> a = k ::> a
deriving Show
type Forest k a = [k ::> Tree k a]
instance Functor ((::>) k) where
fmap = fmapDefault
instance Foldable ((::>) k) where
foldMap = foldMapDefault
instance Traversable ((::>) k) where
traverse f (k ::> v) = (::>) k <$> f v
instance Functor (Tree k) where
fmap = fmapDefault
instance Foldable (Tree k) where
foldMap = foldMapDefault
instance Traversable (Tree k) where
traverse f (Node l sf) = Node <$> f l <*> (traverse (traverse (traverse f)) sf)