labeled-tree-1.0.0.0: Data/LabeledTree.hs
{-# LANGUAGE TypeOperators #-}
module Data.LabeledTree where
import Data.Traversable
import Data.Foldable
import Control.Applicative
data Tree k a = Node {
rootLabel :: a, -- ^ label value
subForest :: Forest k a -- ^ zero or more child trees
} deriving (Show, Eq, Read)
-- | label + value pair
data k ::> a = k ::> a
deriving (Show, Eq, Read)
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)