module Data.Tree.Rose where
import Data.Tree.Rose.Internal
import Data.Tree (Tree (Node))
import Data.Tree.Knuth
import Data.Trie.Pseudo hiding (Nil)
import Data.List.NonEmpty (NonEmpty (..))
import Data.Default
import Data.Functor.Identity
class RoseTree (c :: * -> *) (u :: * -> *) (t :: * -> *) | c -> u, c -> t where
(@->) :: t a -> u (c a) -> c a
infixr 9 @->
instance RoseTree Tree [] Identity where
(@->) (Identity x) xs = Node x xs
newtype PT t a = PT (t, Maybe a)
instance Default t => RoseTree (PseudoTrie t) NonEmpty (PT t) where
(@->) (PT x) xs = More x xs
instance RoseTree KnuthForest Identity Identity where
(@->) (Identity x) (Identity xs) = Fork x xs Nil