module Bitcoin.Misc.Unique where
import Data.Word
import Control.Concurrent.MVar
import System.IO.Unsafe as Unsafe
theGlobalUniqueSupport :: MVar Word64
theGlobalUniqueSupport = Unsafe.unsafePerformIO (newMVar 1000000000)
theGlobalSink :: MVar a
theGlobalSink = Unsafe.unsafePerformIO (newMVar undefined)
newUnique :: IO Word64
newUnique = do
n <- takeMVar theGlobalUniqueSupport
putMVar theGlobalUniqueSupport (n+1)
return n
convertToUnique :: a -> Word64
convertToUnique sacrifice = Unsafe.unsafePerformIO $ do
_ <- takeMVar theGlobalSink
n <- newUnique
putMVar theGlobalSink (sacrifice,n)
return n