module Data.TrieMap.MultiRec.ConstMap () where
import Data.TrieMap.MultiRec.Class
import Data.TrieMap.TrieKey
import Control.Applicative
import Control.Arrow
import Control.Monad
import Generics.MultiRec
newtype KMap (phi :: * -> *) m (r :: * -> *) ix a = KMap (m a)
type instance HTrieMapT phi (K k) = KMap phi (TrieMap k)
instance TrieKey k m => HTrieKeyT phi (K k) (KMap phi m) where
emptyH _ = KMap emptyM
nullH _ (KMap m) = nullM m
lookupH _ (K k) (KMap m) = lookupM k m
lookupIxH _ s (K k) (KMap m) = onKey K (lookupIxM s k m)
assocAtH _ s i (KMap m) = onKey K (assocAtM s i m)
alterH _ s f (K k) (KMap m) = KMap (alterM s f k m)
alterLookupH _ s f (K k) (KMap m) = KMap <$> alterLookupM s f k m
traverseWithKeyH _ s f (KMap m) = KMap <$> traverseWithKeyM s (f . K) m
foldWithKeyH _ f (KMap m) = foldWithKeyM (f . K) m
foldlWithKeyH _ f (KMap m) = foldlWithKeyM (f . K) m
mapEitherH _ s1 s2 f (KMap m) = (KMap *** KMap) (mapEitherM s1 s2 (f . K) m)
splitLookupH _ s f (K k) (KMap m) = KMap `sides` splitLookupM s f k m
unionH _ s f (KMap m1) (KMap m2) = KMap (unionM s (f . K) m1 m2)
isectH _ s f (KMap m1) (KMap m2) = KMap (isectM s (f . K) m1 m2)
diffH _ s f (KMap m1) (KMap m2) = KMap (diffM s (f . K) m1 m2)
extractH _ s f (KMap m) = fmap KMap <$> extractM s (f . K) m
isSubmapH _ (<=) (KMap m1) (KMap m2) = isSubmapM (<=) m1 m2