--------------------------------------------------------------------------------
-- Copyright © 2011 National Institute of Aerospace / Galois, Inc.
--------------------------------------------------------------------------------

{-# LANGUAGE Trustworthy #-}

module System.Mem.StableName.Dynamic
  ( DynStableName(..)
  , hashDynStableName
  , makeDynStableName
  ) where

import System.Mem.StableName (StableName, makeStableName, hashStableName)
import Unsafe.Coerce (unsafeCoerce) -- XXX Not safe!

newtype DynStableName = DynStableName (StableName ())

makeDynStableName :: a -> IO DynStableName
makeDynStableName x =
  do
    stn <- makeStableName x
    return (DynStableName (unsafeCoerce stn))

hashDynStableName :: DynStableName -> Int
hashDynStableName (DynStableName sn) = hashStableName sn

instance Eq DynStableName where
  DynStableName sn1 == DynStableName sn2 = sn1 == sn2