{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE BangPatterns, CPP, GeneralizedNewtypeDeriving, MagicHash,
  NoImplicitPrelude, UnboxedTuples #-}
module GHC.Event.Unique
    (
      UniqueSource
    , Unique(..)
    , newSource
    , newUnique
    ) where
import GHC.Base
import GHC.Num(Num)
import GHC.Show(Show(..))
#include "MachDeps.h"
data UniqueSource = US (MutableByteArray# RealWorld)
newtype Unique = Unique { asInt :: Int }
    deriving ( Eq  
             , Ord 
             , Num 
             )
instance Show Unique where
    show = show . asInt
newSource :: IO UniqueSource
newSource = IO $ \s ->
  case newByteArray# size s of
    (# s', mba #) -> (# s', US mba #)
  where
    !(I# size) = SIZEOF_HSINT
newUnique :: UniqueSource -> IO Unique
newUnique (US mba) = IO $ \s ->
  case fetchAddIntArray# mba 0# 1# s of
    (# s', a #) -> (# s', Unique (I# a) #)
{-# INLINE newUnique #-}