{-# LANGUAGE TypeFamilies, FlexibleContexts, FlexibleInstances, UndecidableInstances #-} module Data.TrieMap.Class (TMap(..), TSet (..), TKey, Rep, TrieMap, TrieKey) where import Data.TrieMap.TrieKey import Data.TrieMap.Rep import Data.TrieMap.Sized import Control.Applicative import Data.Foldable import Data.Traversable import Prelude hiding (foldr) newtype TMap k a = TMap {getTMap :: TrieMap (Rep k) (Elem a)} newtype TSet a = TSet (TMap a ()) class (Repr k, TrieKey (Rep k)) => TKey k instance (Repr k, TrieKey (Rep k)) => TKey k instance TKey k => Functor (TMap k) where fmap = fmapDefault instance TKey k => Foldable (TMap k) where foldr f z (TMap m) = foldrWithKeyM (\ _ (Elem a) -> f a) m z instance TKey k => Traversable (TMap k) where traverse f (TMap m) = TMap <$> traverseWithKeyM (\ _ (Elem a) -> Elem <$> f a) m