module Data.TrieMap.Regular.Class where
import Data.TrieMap.Sized
import Data.TrieMap.Applicative
import Data.TrieMap.TrieKey
import Data.TrieMap.Regular.Ord
import Data.TrieMap.CPair
import Control.Applicative
type family TrieMapT (f :: * -> *) :: * -> * -> *
class OrdT f => TrieKeyT (f :: * -> *) (m :: * -> * -> *) | m -> f, f -> m where
emptyT :: (TrieMapT f ~ m, TrieKey k (TrieMap k)) => m k a
nullT :: (TrieMapT f ~ m, TrieKey k (TrieMap k)) => m k a -> Bool
sizeT :: (TrieMapT f ~ m, TrieKey k (TrieMap k)) => Sized a -> m k a -> Int
lookupT :: (TrieMapT f ~ m, TrieKey k (TrieMap k)) => f k -> m k a -> Maybe (a)
lookupIxT :: (TrieMapT f ~ m, TrieKey k (TrieMap k)) => Sized a -> f k -> m k a -> IndexPos (f k) a
assocAtT :: (TrieMapT f ~ m, TrieKey k (TrieMap k)) => Sized a -> Int -> m k a -> IndexPos (f k) a
alterT :: (TrieMapT f ~ m, TrieKey k (TrieMap k)) => Sized a -> (Maybe (a) -> Maybe (a)) -> f k -> m k a -> m k a
alterLookupT :: (TrieMapT f ~ m, TrieKey k (TrieMap k)) => Sized a -> (Maybe a -> CPair x (Maybe a)) -> f k -> m k a -> CPair x (m k a)
traverseWithKeyT :: (TrieMapT f ~ m, TrieKey k (TrieMap k), Applicative t) =>
Sized b -> (f k -> a -> t (b)) -> m k a -> t (m k b)
foldWithKeyT :: (TrieMapT f ~ m, TrieKey k (TrieMap k)) =>
(f k -> a -> b -> b) -> m k a -> b -> b
foldlWithKeyT :: (TrieMapT f ~ m, TrieKey k (TrieMap k)) =>
(f k -> b -> a -> b) -> m k a -> b -> b
mapEitherT :: (TrieMapT f ~ m, TrieKey k (TrieMap k)) =>
Sized b -> Sized c -> EitherMap (f k) (a) (b) (c) -> m k a -> (m k b, m k c)
splitLookupT :: (TrieMapT f ~ m, TrieKey k (TrieMap k)) => Sized a -> SplitMap (a) x -> f k ->
m k a -> (m k a, Maybe x, m k a)
unionT :: (TrieMapT f ~ m, TrieKey k (TrieMap k)) => Sized a -> UnionFunc (f k) (a) ->
m k a -> m k a -> m k a
isectT :: (TrieMapT f ~ m, TrieKey k (TrieMap k)) => Sized c -> IsectFunc (f k) (a) (b) (c) ->
m k a -> m k b -> m k c
diffT :: (TrieMapT f ~ m, TrieKey k (TrieMap k)) => Sized a -> DiffFunc (f k) (a) (b) ->
m k a -> m k b -> m k a
extractT :: (TrieMapT f ~ m, TrieKey k (TrieMap k), Alternative t) =>
Sized a -> ExtractFunc t (m k a) (f k) a x
isSubmapT :: (TrieMapT f ~ m, TrieKey k (TrieMap k)) => LEq (a) (b) -> LEq (m k a) (m k b)
fromListT, fromAscListT :: (TrieMapT f ~ m, TrieKey k (TrieMap k)) => Sized a -> (f k -> a -> a -> a) ->
[(f k, a)] -> m k a
fromDistAscListT :: (TrieMapT f ~ m, TrieKey k (TrieMap k)) => Sized a -> [(f k, a)] -> m k a
fromListT s f = foldr (\ (k, a) -> alterT s (Just . maybe a (f k a)) k) emptyT
fromAscListT = fromListT
fromDistAscListT s = fromAscListT s (const const)
alterT s f k m = cpSnd (alterLookupT s (cP () . f) k m)
guardNullT :: (TrieKeyT f (TrieMapT f), TrieKey k (TrieMap k)) => TrieMapT f k a -> Maybe (TrieMapT f k a)
guardNullT m
| nullT m = Nothing
| otherwise = Just m
assocsT :: (TrieKeyT f (TrieMapT f), TrieKey k (TrieMap k)) => TrieMapT f k a -> [(f k, a)]
assocsT m = foldWithKeyT (\ k a -> ((k, a):)) m []
singletonT :: (TrieKeyT f (TrieMapT f), TrieKey k (TrieMap k)) => Sized a -> f k -> a -> TrieMapT f k a
singletonT s k a = alterT s (const (Just a)) k emptyT
mapWithKeyT :: (TrieKeyT f (TrieMapT f), TrieKey k (TrieMap k)) =>
Sized b -> (f k -> a -> b) -> TrieMapT f k a -> TrieMapT f k b
mapWithKeyT s f m = unId (traverseWithKeyT s (Id .: f) m)
aboutT :: (TrieKeyT f (TrieMapT f), TrieKey k (TrieMap k), Alternative t) =>
(f k -> a -> t z) -> TrieMapT f k a -> t z
aboutT f m = cpFst <$> extractT (const 0) (\ k a -> fmap (flip cP Nothing) (f k a)) m