{-# LANGUAGE Trustworthy #-}
module System.Mem.StableName.Dynamic
( DynStableName(..)
, hashDynStableName
, makeDynStableName
) where
import System.Mem.StableName (StableName, makeStableName, hashStableName)
import Unsafe.Coerce (unsafeCoerce)
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