{-# 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)