{-# LANGUAGE TypeFamilies, TemplateHaskell, UndecidableInstances #-}
module Data.TrieMap.Representation (Repr(..)) where

import Data.TrieMap.Sized
import Data.TrieMap.TrieKey
import Data.TrieMap.Class
import Data.TrieMap.Rep
import Data.TrieMap.Rep.Instances ()
import Data.TrieMap.Representation.TH

import Data.Complex
import Data.Tree
import Data.Ratio
import Foreign.C.Types

instance (TKey k, Repr a) => Repr (TMap k a) where
	type Rep (TMap k a) = [(Rep k, Rep a)]
	toRep (TMap m) = foldrWithKeyM (\ k (Elem a) xs -> (k, toRep a):xs) m []
	fromRep xs = TMap (fromDistAscListM [(k, Elem (fromRep a)) | (k, a) <- xs])

genOrdRepr ''Float
genOrdRepr ''Double
genRepr ''Bool
genRepr ''Tree
genRepr ''Ratio
genRepr ''Maybe
genRepr ''Complex
genRepr ''CInt
genRepr ''CChar
genRepr ''CSChar
genRepr ''CUChar
genRepr ''CShort
genRepr ''CUShort
genRepr ''CUInt
genRepr ''CLong
genRepr ''CULong
genRepr ''CLLong
genRepr ''CULLong
genRepr ''CClock
genRepr ''CTime
genRepr ''CFloat
genRepr ''CDouble