{-# LANGUAGE ScopedTypeVariables, GADTs #-}
module Data.Pass.Key
  ( Key(..)
  ) where

import Prelude hiding (lookup)
import Data.Binary
import Data.Typeable
import Data.Hashable
import Data.Monoid
import Data.Pass.Thrist
import Data.Pass.Named

data Key k a where
  Key :: (Typeable b, Binary b, Monoid b) => Thrist k a b -> Key k a

instance Named k => Eq (Key k a) where
  Key (x :: Thrist k a b) == Key (y :: Thrist k a c) = equalFun x y && typeOf (undefined :: b) == typeOf (undefined :: c)

instance Named k => Hashable (Key k a) where
  hashWithSalt s (Key (tkab :: Thrist k a b)) = s `hashFunWithSalt` tkab `hashWithSalt` typeOf (undefined :: b)

instance Named k => Show (Key k a) where
  showsPrec d (Key t) = showParen (d > 10) $ showString "Key " . showsFun 10 t