{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE FlexibleInstances #-} 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