module TrieMap.Reflection where
import TrieMap.TrieAlgebraic
import TrieMap.Algebraic
import TrieMap.Applicative
import TrieMap.RadixTrie()
import qualified TrieMap.TrieAlgebraic as TA
instance Algebraic (m1 (m2 v)) => Algebraic (ProdMap m1 m2 v) where
type Alg (ProdMap m1 m2 v) = Alg (m1 (m2 v))
toAlg (PMap m) = toAlg m
fromAlg = PMap . fromAlg
instance (Algebraic (m1 v), Algebraic (m2 v)) => Algebraic (UnionMap m1 m2 v) where
type Alg (UnionMap m1 m2 v) = (Alg (m1 v), Alg (m2 v))
toAlg (m1 :+: m2) = (toAlg m1, toAlg m2)
fromAlg (m1, m2) = fromAlg m1 :+: fromAlg m2
instance (Ord k, Algebraic k, Algebraic v, TrieKey k m) => Algebraic (RadixTrie k m v) where
type Alg (RadixTrie k m v) = Alg [([k], v)]
toAlg m = toAlg (build (\ c n -> foldWithKeyAlg (curry c) n m))
fromAlg = fromDistAscListAlg . fromAlg