module Data.TrieMap.MultiRec.IMap () where
import Data.TrieMap.MultiRec.Class
import Data.TrieMap.MultiRec.Sized
import Data.TrieMap.TrieKey
import Control.Applicative
import Control.Arrow
import Generics.MultiRec
newtype IMap phi xi r ix a = IMap (HTrieMap phi r xi a)
type instance HTrieMapT phi (I xi) = IMap phi xi
instance (El phi xi) => HTrieKeyT phi (I xi) (IMap phi xi) where
emptyH _ = IMap (empty0 proof)
nullH _ (IMap m) = null0 proof m
sizeH _ s (IMap m) = size0 proof s m
lookupH _ (I k) (IMap m) = lookup0 proof k m
lookupIxH _ s (I k) (IMap m) = onKey I (lookupIx0 proof s k m)
assocAtH _ s i (IMap m) = onKey I (assocAt0 proof s i m)
alterH _ s f (I k) (IMap m) = IMap (alter0 proof s f k m)
alterLookupH _ s f (I k) (IMap m) = IMap <$> alterLookup0 proof s f k m
traverseWithKeyH _ s f (IMap m) = IMap <$> traverseWithKey0 proof s (f . I) m
foldWithKeyH _ f (IMap m) = foldWithKey0 proof (f . I) m
foldlWithKeyH _ f (IMap m) = foldlWithKey0 proof (f . I) m
mapEitherH _ s1 s2 f (IMap m) = (IMap *** IMap) (mapEither0 proof s1 s2 (f . I) m)
splitLookupH pf s f (I k) (IMap m) = IMap `sides` splitLookup0 proof s (f) k m
unionH pf s f (IMap m1) (IMap m2) = IMap (union0 proof s (f . I) m1 m2)
isectH pf s f (IMap m1) (IMap m2) = IMap (isect0 proof s (f . I) m1 m2)
diffH pf s f (IMap m1) (IMap m2) = IMap (diff0 proof s (f . I) m1 m2)
extractH pf s f (IMap m) = fmap IMap <$> extract0 proof s (f . I) m
isSubmapH pf (<=) (IMap m1) (IMap m2) = isSubmap0 proof (<=) m1 m2
fromListH _ s f xs = IMap (fromList0 proof s (f . I) [(k, a) | (I k, a) <- xs])
fromAscListH _ s f xs = IMap (fromAscList0 proof s (f . I) [(k, a) | (I k, a) <- xs])
fromDistAscListH _ s xs = IMap (fromDistAscList0 proof s [(k, a) | (I k, a) <- xs])