--------------------------------------------------------------------------------
-- 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 :: a -> IO DynStableName
makeDynStableName a
x =
  do
    StableName a
stn <- a -> IO (StableName a)
forall a. a -> IO (StableName a)
makeStableName a
x
    DynStableName -> IO DynStableName
forall (m :: * -> *) a. Monad m => a -> m a
return (StableName () -> DynStableName
DynStableName (StableName a -> StableName ()
forall a b. a -> b
unsafeCoerce StableName a
stn))

hashDynStableName :: DynStableName -> Int
hashDynStableName :: DynStableName -> Int
hashDynStableName (DynStableName StableName ()
sn) = StableName () -> Int
forall a. StableName a -> Int
hashStableName StableName ()
sn

instance Eq DynStableName where
  DynStableName StableName ()
sn1 == :: DynStableName -> DynStableName -> Bool
== DynStableName StableName ()
sn2 = StableName ()
sn1 StableName () -> StableName () -> Bool
forall a. Eq a => a -> a -> Bool
== StableName ()
sn2