FastMutInt.lhs 1.92 KB
 simonpj committed Apr 01, 2002 1 2 {-# OPTIONS -cpp #-} --  Simon Marlow committed Oct 11, 2006 3 -- (c) The University of Glasgow 2002-2006  simonpj committed Apr 01, 2002 4 5 6 7 8 9 -- -- Unboxed mutable Ints \begin{code} module FastMutInt( FastMutInt, newFastMutInt,  simonmar committed Nov 17, 2003 10  readFastMutInt, writeFastMutInt  simonpj committed Apr 01, 2002 11 12  ) where  Isaac Dupree committed Jun 01, 2007 13 14 15 #include "HsVersions.h" #ifdef __GLASGOW_HASKELL__  simonpj committed Apr 01, 2002 16   Isaac Dupree committed Jun 01, 2007 17 #include "MachDeps.h"  simonpj committed Apr 01, 2002 18 19 20 21 #ifndef SIZEOF_HSINT #define SIZEOF_HSINT INT_SIZE_IN_BYTES #endif  panne committed Apr 01, 2002 22 23 import GHC.Base import GHC.IOBase  Isaac Dupree committed Jun 01, 2007 24 25 26 27 28 29 30 31 32 33  #else /* ! __GLASGOW_HASKELL__ */ import Data.IORef #endif newFastMutInt :: IO FastMutInt readFastMutInt :: FastMutInt -> IO Int writeFastMutInt :: FastMutInt -> Int -> IO ()  simonpj committed Apr 01, 2002 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 \end{code} \begin{code} #ifdef __GLASGOW_HASKELL__ data FastMutInt = FastMutInt (MutableByteArray# RealWorld) newFastMutInt = IO $\s -> case newByteArray# size s of { (# s, arr #) -> (# s, FastMutInt arr #) } where I# size = SIZEOF_HSINT readFastMutInt (FastMutInt arr) = IO$ \s -> case readIntArray# arr 0# s of { (# s, i #) -> (# s, I# i #) } writeFastMutInt (FastMutInt arr) (I# i) = IO \$ \s -> case writeIntArray# arr 0# i s of { s -> (# s, () #) }  Isaac Dupree committed Jun 01, 2007 52 #else /* ! __GLASGOW_HASKELL__ */  Isaac Dupree committed Aug 06, 2007 53 54 55 56 --maybe someday we could use --http://haskell.org/haskellwiki/Library/ArrayRef --which has an implementation of IOURefs --that is unboxed in GHC and just strict in all other compilers...  Isaac Dupree committed Jun 01, 2007 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 newtype FastMutInt = FastMutInt (IORef Int) -- If any default value was chosen, it surely would be 0, -- so we will use that since IORef requires a default value. -- Or maybe it would be more interesting to package an error, -- assuming nothing relies on being able to read a bogus Int? -- That could interfere with its strictness for smart optimizers -- (are they allowed to optimize a 'newtype' that way?) ... -- Well, maybe that can be added (in DEBUG?) later. newFastMutInt = fmap FastMutInt (newIORef 0) readFastMutInt (FastMutInt ioRefInt) = readIORef ioRefInt -- FastMutInt is strict in the value it contains. writeFastMutInt (FastMutInt ioRefInt) i = i seq writeIORef ioRefInt i  simonpj committed Apr 01, 2002 72 #endif  Isaac Dupree committed May 19, 2007 73 \end{code}  simonpj committed Apr 01, 2002 74