{-# LANGUAGE MagicHash, FlexibleInstances, OverlappingInstances,IncoherentInstances,
  IncoherentInstances, UndecidableInstances #-}

module Data.Array.Judy.HashIO (
    HashIO (..),
    UniqueHashIO, -- (..),
    ReversibleHashIO (..)
) where

import Data.HashTable (hashString)

import Data.Array.Judy.Private
import GHC.Exts (unsafeCoerce#)

class HashIO a where
    -- Two step conversion, first from a -> Int then Int -> Value
    hashIO :: a -> IO Value
class HashIO a => UniqueHashIO a
class UniqueHashIO a => ReversibleHashIO a where
    -- Two step conversion, first from Value -> Int then Int -> a
    unHashIO :: Value -> IO a

instance Enum a => UniqueHashIO a where

instance Enum a => HashIO a where
    hashIO = return . unsafeCoerce# . fromEnum

instance Enum a => ReversibleHashIO a where
    unHashIO = return . toEnum . unsafeCoerce#


instance HashIO Value where
    hashIO = return

instance UniqueHashIO Value

instance ReversibleHashIO Value where
    unHashIO = return

instance HashIO Integer where
    hashIO = return . fromIntegral . hashString . show