module Data.TrieMap.UnitMap () where
import Data.TrieMap.TrieKey
import Data.TrieMap.Sized
import Data.Functor
import Control.Monad
import Data.Foldable
import Data.Traversable
import Data.Maybe
import Prelude hiding (foldr, foldl, foldr1, foldl1)
instance Foldable (TrieMap ()) where
foldMap f (Unit m) = foldMap f m
foldr f z (Unit m) = foldr f z m
foldl f z (Unit m) = foldl f z m
foldr1 f (Unit m) = foldr1 f m
foldl1 f (Unit m) = foldl1 f m
instance TrieKey () where
newtype TrieMap () a = Unit (Maybe a)
data Hole () a = Hole
emptyM = Unit Nothing
singletonM _ = single
getSimpleM (Unit m) = maybe Null Singleton m
sizeM (Unit m) = getSize m
lookupM _ (Unit m) = liftMaybe m
traverseM f (Unit m) = Unit <$> traverse f 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
insertWithM f _ a (Unit m) = Unit (Just (maybe a f m))
fromListM _ [] = emptyM
fromListM f ((_, v):xs) = single (foldl (\ v' -> f v' . snd) v xs)
singleHoleM _ = Hole
beforeM _ = emptyM
afterM _ = emptyM
beforeWithM a _ = single a
afterWithM a _ = single a
searchMC _ (Unit (Just v)) _ g = g v Hole
searchMC _ _ f _ = f Hole
indexM i (Unit (Just v)) = (# i, v, Hole #)
indexM _ _ = indexFail ()
unifierM _ _ _ = Nothing
extractHoleM (Unit (Just v)) = return (v, Hole)
extractHoleM _ = mzero
clearM _ = emptyM
assignM v _ = single v
single :: a -> TrieMap () a
single = Unit . Just