{-# LANGUAGE PatternGuards, FlexibleContexts, FlexibleInstances, TypeFamilies, MultiParamTypeClasses #-} module Data.TrieMap.MultiRec.FixMap () where import Data.TrieMap.MultiRec.Base import Data.TrieMap.MultiRec.Class import Data.TrieMap.TrieKey import Control.Applicative import Control.Arrow newtype HFixMap (phi :: * -> *) (f :: (* -> *) -> * -> *) a ix = HFixMap (HTrieMapT phi f (HFix f) a ix) type instance HTrieMap phi (HFix f) = HFixMap phi f instance HTrieKeyT phi f (HTrieMapT phi f) => HTrieKey phi (HFix f) (HFixMap phi f) where emptyH = HFixMap . emptyT nullH pf (HFixMap m) = nullT pf m sizeH pf s (HFixMap m) = sizeT pf s m lookupH pf (HIn k) (HFixMap m) = lookupT pf k m lookupIxH pf s (HIn k) (HFixMap m) = onKey HIn (lookupIxT pf s k m) assocAtH pf s i (HFixMap m) = onKey HIn (assocAtT pf s i m) -- updateAtH pf s r f i (HFixMap m) = HFixMap (updateAtT pf s r (\ i' -> f i' . HIn) i m) alterH pf s f (HIn k) (HFixMap m) = HFixMap (alterT pf s f k m) traverseWithKeyH pf s f (HFixMap m) = HFixMap <$> traverseWithKeyT pf s (f . HIn) m foldWithKeyH pf f (HFixMap m) = foldWithKeyT pf (f . HIn) m foldlWithKeyH pf f (HFixMap m) = foldlWithKeyT pf (f . HIn) m unionH pf s f (HFixMap m1) (HFixMap m2) = HFixMap (unionT pf s (f . HIn) m1 m2) isectH pf s f (HFixMap m1) (HFixMap m2) = HFixMap (isectT pf s (f . HIn) m1 m2) diffH pf s f (HFixMap m1) (HFixMap m2) = HFixMap (diffT pf s (f . HIn) m1 m2) isSubmapH pf (<=) (HFixMap m1) (HFixMap m2) = isSubmapT pf (<=) m1 m2 mapEitherH pf s1 s2 f (HFixMap m) = (HFixMap *** HFixMap) (mapEitherT pf s1 s2 (f . HIn) m) splitLookupH pf s f (HIn k) (HFixMap m) = HFixMap `sides` splitLookupT pf s f k m extractH pf s f (HFixMap m) = second HFixMap <$> extractT pf s (f . HIn) m -- extractMinH pf s f (HFixMap m) = second HFixMap <$> extractMinT pf s (f . HIn) m -- extractMaxH pf s f (HFixMap m) = second HFixMap <$> extractMaxT pf s (f . HIn) m -- alterMinH pf s f (HFixMap m) = HFixMap <$> alterMinT pf s (f . HIn) m -- alterMaxH pf s f (HFixMap m) = HFixMap <$> alterMaxT pf s (f . HIn) m