module Data.TrieMap.MultiRec.UnitMap where
import Data.TrieMap.MultiRec.Class
import Data.TrieMap.MultiRec.Eq
import Data.TrieMap.Applicative
import Data.TrieMap.TrieKey
import Control.Applicative
import Control.Arrow
import Control.Monad
import Data.Maybe
import Data.Monoid
import Data.Foldable
import Data.Traversable
import Generics.MultiRec
import Prelude hiding (foldr, foldl)
newtype UMap (phi :: * -> *) (r :: * -> *) a ix = UMap (Maybe (a ix))
type instance HTrieMapT phi U = UMap phi
type instance HTrieMap phi (U r) = UMap phi r
instance HTrieKeyT phi U (UMap phi) where
emptyT = emptyH
nullT = nullH
sizeT = sizeH
lookupT = lookupH
lookupIxT = lookupIxH
assocAtT = assocAtH
updateAtT = updateAtH
alterT = alterH
traverseWithKeyT = traverseWithKeyH
foldWithKeyT = foldWithKeyH
foldlWithKeyT = foldlWithKeyH
mapEitherT = mapEitherH
splitLookupT = splitLookupH
unionT = unionH
isectT = isectH
diffT = diffH
extractMinT = extractMinH
extractMaxT = extractMaxH
alterMinT = alterMinH
alterMaxT = alterMaxH
isSubmapT = isSubmapH
fromListT = fromListH
fromAscListT = fromAscListH
fromDistAscListT = fromDistAscListH
instance HTrieKey phi (U r) (UMap phi r) where
emptyH _ = UMap Nothing
nullH _ (UMap m) = isNothing m
sizeH s (UMap m) = maybe 0 s m
lookupH _ _ (UMap m) = m
lookupIxH _ _ _ (UMap m) = fmap ((,) 0) m
assocAtH _ _ _ (UMap (Just a)) = (0, U, a)
updateAtH _ _ f _ (UMap m) = UMap (m >>= f 0 U)
alterH _ _ f _ (UMap m) = UMap (f m)
traverseWithKeyH _ _ f (UMap m) = UMap <$> traverse (f U) m
foldWithKeyH _ f (UMap m) z = foldr (f U) z m
foldlWithKeyH _ f (UMap m) z = foldl (f U) z m
mapEitherH _ _ _ f (UMap m) = (UMap *** UMap) (maybe (Nothing, Nothing) (f U) m)
splitLookupH _ _ f _ (UMap m) = UMap `sides` maybe (Nothing, Nothing, Nothing) f m
unionH _ _ f (UMap m1) (UMap m2) = UMap (unionMaybe (f U) m1 m2)
isectH _ _ f (UMap m1) (UMap m2) = UMap (isectMaybe (f U) m1 m2)
diffH _ _ f (UMap m1) (UMap m2) = UMap (diffMaybe (f U) m1 m2)
extractMinH _ _ (UMap m) = do v <- First m
return ((U, v), UMap Nothing)
extractMaxH _ _ (UMap m) = do v <- Last m
return ((U, v), UMap Nothing)
alterMinH _ _ f (UMap m) = UMap (m >>= f U)
alterMaxH = alterMinH
isSubmapH _ _ (UMap Nothing) _ = True
isSubmapH _ (<=) (UMap m1) (UMap m2) = subMaybe (<=) m1 m2
fromListH _ _ f xs = UMap (foldr (\ (_, a) -> Just . maybe a (f U a)) Nothing xs)
fromAscListH = fromListH
fromDistAscListH _ _ xs = UMap (fmap snd (listToMaybe xs))