module Data.TrieMap.Key () where
import Data.Functor
import Data.Foldable
import Data.TrieMap.Class
import Data.TrieMap.TrieKey
import Data.TrieMap.Sized
import Data.TrieMap.Representation.Class
import Data.TrieMap.Modifiers
import Prelude hiding (foldr, foldl, foldr1, foldl1)
keyMap :: (TKey k, Sized a) => TrieMap (Rep k) a -> TrieMap (Key k) a
keyMap m = KeyMap (sizeM m) m
#define KMAP(m) KeyMap{tMap = m}
instance TKey k => Foldable (TrieMap (Key k)) where
foldMap f KMAP(m) = foldMap f m
foldr f z KMAP(m) = foldr f z m
foldl f z KMAP(m) = foldl f z m
foldr1 f KMAP(m) = foldr1 f m
foldl1 f KMAP(m) = foldl1 f m
instance TKey k => TrieKey (Key k) where
data TrieMap (Key k) a = KeyMap {sz :: !Int, tMap :: !(TrieMap (Rep k) a)}
newtype Hole (Key k) a = KeyHole (Hole (Rep k) a)
emptyM = KeyMap 0 emptyM
singletonM (Key k) a = KeyMap (getSize a) (singletonM (toRep k) a)
getSimpleM KMAP(m) = getSimpleM m
sizeM = sz
lookupM (Key k) KMAP(m) = lookupM (toRep k) m
traverseM f KMAP(m) = keyMap <$> traverseM f m
fmapM f KMAP(m) = keyMap (fmapM f m)
mapMaybeM f KMAP(m) = keyMap (mapMaybeM f m)
mapEitherM f KMAP(m) = both keyMap keyMap (mapEitherM f) m
unionM f KMAP(m1) KMAP(m2) = keyMap (unionM f m1 m2)
isectM f KMAP(m1) KMAP(m2) = keyMap (isectM f m1 m2)
diffM f KMAP(m1) KMAP(m2) = keyMap (diffM f m1 m2)
isSubmapM (<=) KMAP(m1) KMAP(m2) = isSubmapM (<=) m1 m2
singleHoleM (Key k) = KeyHole (singleHoleM (toRep k))
beforeM (KeyHole hole) = keyMap (beforeM hole)
beforeWithM a (KeyHole hole) = keyMap (beforeWithM a hole)
afterM (KeyHole hole) = keyMap (afterM hole)
afterWithM a (KeyHole hole) = keyMap (afterWithM a hole)
searchMC (Key k) KMAP(m) = mapSearch KeyHole (searchMC (toRep k) m)
indexM i KMAP(m) = onThird KeyHole (indexM i) m
extractHoleM KMAP(m) = fmap KeyHole <$> extractHoleM m
assignM v (KeyHole hole) = keyMap (assignM v hole)
clearM (KeyHole hole) = keyMap (clearM hole)
insertWithM f (Key k) a KMAP(m) = keyMap (insertWithM f (toRep k) a m)
fromListM f xs = keyMap (fromListM f [(toRep k, a) | (Key k, a) <- xs])
fromAscListM f xs = keyMap (fromAscListM f [(toRep k, a) | (Key k, a) <- xs])
fromDistAscListM xs = keyMap (fromDistAscListM [(toRep k, a) | (Key k, a) <- xs])