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 Data.Maybe
import Data.Monoid
import Data.Foldable
import Data.Traversable
import Generics.MultiRec
import Prelude hiding (foldr, foldl)
newtype UMap (phi :: * -> *) (r :: * -> *) ix a = UMap (Maybe a)
type instance HTrieMapT phi U = UMap phi
instance HTrieKeyT phi U (UMap phi) where
emptyH _ = UMap Nothing
nullH _ (UMap m) = isNothing m
sizeH _ s (UMap m) = maybe 0 s m
lookupH _ _ (UMap m) = m
lookupIxH _ _ _ (UMap m) = (mempty, Asc 0 U <$> m, mempty)
assocAtH _ _ _ (UMap m) = (mempty, Asc 0 U <$> m, mempty)
alterH _ _ f _ (UMap m) = UMap (f m)
alterLookupH _ _ 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)
extractH _ _ f (UMap m) = maybe empty (fmap UMap <.> f U) m
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))