{-# LANGUAGE TypeFamilies, TypeSynonymInstances, FlexibleInstances, MultiParamTypeClasses, FlexibleContexts #-} module Data.TrieMap.Key (Key(..)) where import Control.Applicative import Data.TrieMap.Class import Data.TrieMap.TrieKey import Data.TrieMap.Rep import Data.TrieMap.Modifiers instance TKey k => TrieKey (Key k) where newtype TrieMap (Key k) a = KeyMap (TrieMap (Rep k) a) emptyM = KeyMap emptyM singletonM s (Key k) a = KeyMap (singletonM s (toRep k) a) nullM (KeyMap m) = nullM m lookupM (Key k) (KeyMap m) = lookupM (toRep k) m alterM s f (Key k) (KeyMap m) = KeyMap (alterM s f (toRep k) m) alterLookupM s f (Key k) (KeyMap m) = onUnboxed KeyMap (alterLookupM s f (toRep k)) m traverseWithKeyM s f (KeyMap m) = KeyMap <$> traverseWithKeyM s (f . Key . fromRep) m foldWithKeyM f (KeyMap m) = foldWithKeyM (f . Key . fromRep) m foldlWithKeyM f (KeyMap m) = foldlWithKeyM (f . Key . fromRep) m mapMaybeM s f (KeyMap m) = KeyMap (mapMaybeM s (f . Key . fromRep) m) mapEitherM s1 s2 f (KeyMap m) = both KeyMap KeyMap (mapEitherM s1 s2 (f . Key . fromRep)) m splitLookupM s f (Key k) (KeyMap m) = sides KeyMap (splitLookupM s f (toRep k)) m unionM s f (KeyMap m1) (KeyMap m2) = KeyMap (unionM s (f . Key . fromRep) m1 m2) isectM s f (KeyMap m1) (KeyMap m2) = KeyMap (isectM s (f . Key . fromRep) m1 m2) diffM s f (KeyMap m1) (KeyMap m2) = KeyMap (diffM s (f . Key . fromRep) m1 m2) extractM s f (KeyMap m) = fmap KeyMap <$> extractM s (f . Key . fromRep) m isSubmapM (<=) (KeyMap m1) (KeyMap m2) = isSubmapM (<=) m1 m2