module Data.TrieMap.Class (TMap(..), TKey(..), Rep, Ordered (..), TrieMap, TrieKey) where
import Data.TrieMap.TrieKey
import Data.TrieMap.OrdMap
import Control.Applicative
import Data.Foldable
import Data.Traversable
import Data.TrieMap.Regular.Base
import Data.TrieMap.Regular.Sized
import Prelude hiding (foldr)
newtype TMap k a = TMap {getTMap :: TrieMap (Rep k) (K0 a) (Rep k)}
type family Rep k
class TrieKey (Rep k) (TrieMap (Rep k)) => TKey k where
toRep :: k -> Rep k
fromRep :: Rep k -> k
instance TKey k => Functor (TMap k) where
fmap = fmapDefault
instance TKey k => Foldable (TMap k) where
foldr f z (TMap m) = foldWithKeyM (\ _ (K0 a) -> f a) m z
instance TKey k => Traversable (TMap k) where
traverse = trv
trv :: (Applicative f, TKey k) => (a -> f b) -> TMap k a -> f (TMap k b)
trv f (TMap m) = TMap <$> traverseWithKeyM sizeK0 (\ _ (K0 a) -> K0 <$> f a) m