(original) (raw)

{-# LANGUAGE MagicHash #-} {-# LANGUAGE Trustworthy #-} {-# LANGUAGE UnboxedTuples #-}

module GHC.StableName (

StableName (..), makeStableName, hashStableName, eqStableName ) where

import GHC.IO ( IO(..) ) import GHC.Base ( Int(..), StableName#, makeStableName# , eqStableName#, stableNameToInt# )

data StableName a = StableName (StableName# a)

makeStableName :: a -> IO (StableName a) makeStableName :: forall a. a -> IO (StableName a) makeStableName a a = (State# RealWorld -> (# State# RealWorld, StableName a #)) -> IO (StableName a) forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a IO ((State# RealWorld -> (# State# RealWorld, StableName a #)) -> IO (StableName a)) -> (State# RealWorld -> (# State# RealWorld, StableName a #)) -> IO (StableName a) forall a b. (a -> b) -> a -> b $ \ State# RealWorld s -> case a -> State# RealWorld -> (# State# RealWorld, StableName# a #) forall a. a -> State# RealWorld -> (# State# RealWorld, StableName# a #) makeStableName# a a State# RealWorld s of (# State# RealWorld s', StableName# a sn #) -> (# State# RealWorld s', StableName# a -> StableName a forall a. StableName# a -> StableName a StableName StableName# a sn #)

hashStableName :: StableName a -> Int hashStableName :: forall a. StableName a -> Int hashStableName (StableName StableName# a sn) = Int# -> Int I# (StableName# a -> Int# forall a. StableName# a -> Int# stableNameToInt# StableName# a sn)

instance Eq (StableName a) where (StableName StableName# a sn1) == :: StableName a -> StableName a -> Bool == (StableName StableName# a sn2) = case StableName# a -> StableName# a -> Int# forall a b. StableName# a -> StableName# b -> Int# eqStableName# StableName# a sn1 StableName# a sn2 of Int# 0# -> Bool False Int# _ -> Bool True

eqStableName :: StableName a -> StableName b -> Bool eqStableName :: forall a b. StableName a -> StableName b -> Bool eqStableName (StableName StableName# a sn1) (StableName StableName# b sn2) = case StableName# a -> StableName# b -> Int# forall a b. StableName# a -> StableName# b -> Int# eqStableName# StableName# a sn1 StableName# b sn2 of Int# 0# -> Bool False Int# _ -> Bool True