blob: f973a34bfba286582bd6a9a74bd55b46a699aa8e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP, MagicHash, NoImplicitPrelude, UnboxedTuples #-}
module GHC.Event.IntVar
( IntVar
, newIntVar
, readIntVar
, writeIntVar
) where
import GHC.Base
import GHC.Bits
data IntVar = IntVar (MutableByteArray# RealWorld)
newIntVar :: Int -> IO IntVar
newIntVar n = do
let !(I# size) = finiteBitSize (0 :: Int) `unsafeShiftR` 3
iv <- IO $ \s ->
case newByteArray# size s of
(# s', mba #) -> (# s', IntVar mba #)
writeIntVar iv n
return iv
readIntVar :: IntVar -> IO Int
readIntVar (IntVar mba) = IO $ \s ->
case readIntArray# mba 0# s of
(# s', n #) -> (# s', I# n #)
writeIntVar :: IntVar -> Int -> IO ()
writeIntVar (IntVar mba) (I# n) = IO $ \s ->
case writeIntArray# mba 0# n s of
s' -> (# s', () #)
|