module Data.TrieMap.Class (TMap(..), TSet (..), TKey, TKeyT, Rep, TrieMap, TrieKey) where
import Data.TrieMap.TrieKey
import Data.TrieMap.OrdMap
import Data.TrieMap.Rep
import Data.TrieMap.Sized
import Control.Applicative
import Data.Foldable
import Data.Traversable
import Data.TrieMap.Regular.Class
import Data.TrieMap.Regular.Base
import Data.TrieMap.Regular.Sized
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) (TrieMap (Rep k))) => TKey k
instance (Repr k, TrieKey (Rep k) (TrieMap (Rep k))) => TKey k
class (ReprT f, TrieKeyT (RepT f) (TrieMapT (RepT f))) => TKeyT f
instance (ReprT f, TrieKeyT (RepT f) (TrieMapT (RepT f))) => TKeyT f
instance TKey k => Functor (TMap k) where
fmap = fmapDefault
instance TKey k => Foldable (TMap k) where
foldr f z (TMap m) = foldWithKeyM (\ _ (Elem 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 elemSize (\ _ (Elem a) -> Elem <$> f a) m