{-# 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