module Data.TrieMap.UnitMap where
import Data.TrieMap.TrieKey
import Data.TrieMap.Sized
import Control.Applicative
import Control.Monad
import Data.Foldable
import Data.Traversable
import Data.Maybe
import Prelude hiding (foldr, foldl)
instance TrieKey () where
_ =? _ = True
_ `cmp` _ = EQ
newtype TrieMap () a = Unit {getUnit :: Maybe a}
data Hole () a = Hole
emptyM = Unit Nothing
singletonM _ = Unit . Just
getSimpleM (Unit m) = maybe Null Singleton m
sizeM (Unit (Just a)) = getSize# a
sizeM _ = 0#
lookupM _ (Unit m) = m
traverseM f (Unit m) = Unit <$> traverse f m
foldrM f (Unit m) z = foldr f z m
foldlM f (Unit m) z = foldl f z m
fmapM f (Unit m) = Unit (f <$> m)
mapMaybeM f (Unit m) = Unit (m >>= f)
mapEitherM f (Unit a) = both Unit Unit (mapEitherMaybe f) a
unionM f (Unit m1) (Unit m2) = Unit (unionMaybe f m1 m2)
isectM f (Unit m1) (Unit m2) = Unit (isectMaybe f m1 m2)
diffM f (Unit m1) (Unit m2) = Unit (diffMaybe f m1 m2)
isSubmapM (<=) (Unit m1) (Unit m2) = subMaybe (<=) m1 m2
fromListM _ [] = Unit Nothing
fromListM f ((_, v):xs) = Unit $ Just (foldl (\ v' -> f v' . snd) v xs)
singleHoleM _ = Hole
beforeM a _ = Unit a
afterM a _ = Unit a
searchM _ (Unit m) = (# m, Hole #)
indexM i (Unit (Just v)) = (# i, v, Hole #)
indexM _ _ = indexFail ()
unifyM _ _ _ _ = Left Hole
extractHoleM (Unit (Just v)) = return (v, Hole)
extractHoleM _ = mzero
assignM v _ = Unit v