module Data.TrieMap.Key () where
import Control.Applicative
import Data.TrieMap.Class
import Data.TrieMap.TrieKey
import Data.TrieMap.Representation.Class
import Data.TrieMap.Modifiers
import Data.TrieMap.ProdMap()
import Data.TrieMap.UnionMap()
import Data.TrieMap.IntMap()
import Data.TrieMap.OrdMap()
import Data.TrieMap.RadixTrie()
instance TKey k => TrieKey (Key k) where
Key k1 =? Key k2 = toRep k1 =? toRep k2
Key k1 `cmp` Key k2 = toRep k1 `cmp` toRep k2
newtype TrieMap (Key k) a = KeyMap (TrieMap (Rep k) a)
newtype Hole (Key k) a = KeyHole (Hole (Rep k) a)
emptyM = KeyMap emptyM
singletonM (Key k) a = KeyMap (singletonM (toRep k) a)
getSimpleM (KeyMap m) = getSimpleM m
sizeM (KeyMap m) = sizeM m
lookupM (Key k) (KeyMap m) = lookupM (toRep k) m
traverseM f (KeyMap m) = KeyMap <$> traverseM f m
foldrM f (KeyMap m) = foldrM f m
foldlM f (KeyMap m) = foldlM f m
fmapM f (KeyMap m) = KeyMap (fmapM f m)
mapMaybeM f (KeyMap m) = KeyMap (mapMaybeM f m)
mapEitherM f (KeyMap m) = both KeyMap KeyMap (mapEitherM f) m
unionM f (KeyMap m1) (KeyMap m2) = KeyMap (unionM f m1 m2)
isectM f (KeyMap m1) (KeyMap m2) = KeyMap (isectM f m1 m2)
diffM f (KeyMap m1) (KeyMap m2) = KeyMap (diffM f m1 m2)
isSubmapM (<=) (KeyMap m1) (KeyMap m2) = isSubmapM (<=) m1 m2
singleHoleM (Key k) = KeyHole (singleHoleM (toRep k))
beforeM a (KeyHole hole) = KeyMap (beforeM a hole)
afterM a (KeyHole hole) = KeyMap (afterM a hole)
searchM (Key k) (KeyMap m) = onSnd KeyHole (searchM (toRep k)) m
indexM i (KeyMap m) = case indexM i m of
(# i', v, hole #) -> (# i', v, KeyHole hole #)
extractHoleM (KeyMap m) = do
(v, hole) <- extractHoleM m
return (v, KeyHole hole)
assignM v (KeyHole hole) = KeyMap (assignM v hole)
unifyM (Key k1) a1 (Key k2) a2 = either (Left . KeyHole) (Right . KeyMap) (unifyM (toRep k1) a1 (toRep k2) a2)