{-# LANGUAGE TypeOperators #-} 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)