module Data.SomeStableName where

import Data.Hashable
import GHC.StableName
import Control.Monad.IO.Class

data SomeStableName = forall a. SomeStableName (StableName a)

instance Eq SomeStableName where
  (SomeStableName StableName a
sn1) == :: SomeStableName -> SomeStableName -> Bool
== (SomeStableName StableName a
sn2) = StableName a
sn1 StableName a -> StableName a -> Bool
forall a b. StableName a -> StableName b -> Bool
`eqStableName` StableName a
sn2

instance Hashable SomeStableName where
  hashWithSalt :: Int -> SomeStableName -> Int
hashWithSalt Int
salt (SomeStableName StableName a
sn) = Int
salt Int -> Int -> Int
forall a. Num a => a -> a -> a
* StableName a -> Int
forall a. StableName a -> Int
hashStableName StableName a
sn
  hash :: SomeStableName -> Int
hash (SomeStableName StableName a
sn) = StableName a -> Int
forall a. StableName a -> Int
hashStableName StableName a
sn

makeSomeStableName :: MonadIO m => a -> m SomeStableName
makeSomeStableName :: forall (m :: * -> *) a. MonadIO m => a -> m SomeStableName
makeSomeStableName = IO SomeStableName -> m SomeStableName
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO SomeStableName -> m SomeStableName)
-> (a -> IO SomeStableName) -> a -> m SomeStableName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StableName a -> SomeStableName)
-> IO (StableName a) -> IO SomeStableName
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap StableName a -> SomeStableName
forall a. StableName a -> SomeStableName
SomeStableName (IO (StableName a) -> IO SomeStableName)
-> (a -> IO (StableName a)) -> a -> IO SomeStableName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> IO (StableName a)
forall a. a -> IO (StableName a)
makeStableName

instance Show SomeStableName where
  show :: SomeStableName -> String
show (SomeStableName StableName a
sn) = String
"SomeStableName (" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show (StableName a -> Int
forall a. StableName a -> Int
hashStableName StableName a
sn) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
")"