{-# LANGUAGE StrictData #-} {-# LANGUAGE TemplateHaskell #-} module Dodge.Data.MetaTree where import Control.Lens import Data.Tree data MetaTree a b = MTree {_mtLabel :: b, _mtTree :: MetaNode a b, _mtBranches :: [MetaBranch a b]} data MetaNode a b = NodeTree {_nodeTree :: Tree a} | NodeMTree {_nodeMetaTree :: MetaTree a b} data MetaBranch a b = MBranch {_mbAttach :: a -> Maybe a, _mbTree :: MetaTree a b} newtype SelfTree a = ST {_unST :: Tree (a, Either (Tree a) (SelfTree a))} makeLenses ''MetaTree makeLenses ''MetaBranch makeLenses ''MetaNode instance Functor (MetaTree a) where fmap f (MTree b mn bs) = MTree (f b) (mn & nodeMetaTree %~ fmap f) (map (mbTree %~ fmap f) bs)