pred-trie-0.0.3: src/Data/Trie/Pred/Disjoint.hs
module Data.Trie.Pred.Disjoint where
import Data.Trie.Pred.Disjoint.Tail
import qualified Data.Trie.Pred.Disjoint.Tail as ND
import Data.Monoid
data RPDTrie p t x = Rooted (Maybe x) [NDPTrie p t x]
instance (Eq p, Eq t) => Monoid (RPDTrie p t x) where
mempty = Rooted Nothing []
mappend = Data.Trie.Pred.Disjoint.merge
merge :: (Eq p, Eq t) => RPDTrie p t x -> RPDTrie p t x -> RPDTrie p t x
merge (Rooted mx xs) (Rooted my ys) =
Rooted my $ foldr go [] $ xs ++ ys
where
go :: (Eq p, Eq t) => NDPTrie p t x -> [NDPTrie p t x] -> [NDPTrie p t x]
go a [] = [a]
go a (b:bs) | ND.areDisjoint a b = a : b : bs
| otherwise = (ND.merge a b) : bs