module Data.CAS.Internal.Class
(CASable(..), unsafeName, ptrEq)
where
import GHC.IO (unsafePerformIO)
import GHC.Exts (Int(I#))
import GHC.Prim (reallyUnsafePtrEquality#)
import System.Mem.StableName
class CASable casref a where
newCASable :: a -> IO (casref a)
readCASable :: casref a -> IO a
writeCASable :: casref a -> a -> IO ()
cas :: casref a -> a -> a -> IO (Bool,a)
unsafeName :: a -> Int
unsafeName x = unsafePerformIO $ do
sn <- makeStableName x
return (hashStableName sn)
ptrEq :: a -> a -> Bool
ptrEq !x !y = I# (reallyUnsafePtrEquality# x y) == 1