2 -- Break Arrays in the IO monad
3 -- Entries in the array are Word sized
21 data BreakArray = BA (MutableByteArray# RealWorld)
23 breakOff, breakOn :: Word
24 breakOn = fromIntegral 1
25 breakOff = fromIntegral 0
28 showBreakArray :: BreakArray -> IO ()
29 showBreakArray array = do
31 | count == sz = return ()
33 val <- readBreakArray array count
34 putStr $ " " ++ show val
39 setBreakOn :: BreakArray -> Int -> IO Bool
40 setBreakOn array index
41 | safeIndex array index = do
42 writeBreakArray array index breakOn
44 | otherwise = return False
46 setBreakOff :: BreakArray -> Int -> IO Bool
47 setBreakOff array index
48 | safeIndex array index = do
49 writeBreakArray array index breakOff
51 | otherwise = return False
53 getBreak :: BreakArray -> Int -> IO (Maybe Word)
55 | safeIndex array index = do
56 val <- readBreakArray array index
58 | otherwise = return Nothing
60 safeIndex :: BreakArray -> Int -> Bool
61 safeIndex array index = index < size array && index >= 0
63 size :: BreakArray -> Int
64 size (BA array) = (I# (sizeofMutableByteArray# array)) `div` wORD_SIZE
66 allocBA :: Int -> IO BreakArray
67 allocBA (I# sz) = IO $ \s1 ->
68 case newByteArray# sz s1 of { (# s2, array #) -> (# s2, BA array #) }
70 -- create a new break array and initialise elements to zero
71 newBreakArray :: Int -> IO BreakArray
72 newBreakArray entries@(I# sz) = do
73 BA array <- allocBA (entries * wORD_SIZE)
75 W# off -> do -- Todo: there must be a better way to write zero as a Word!
77 | n ==# sz = return ()
84 writeBA# :: MutableByteArray# RealWorld -> Int# -> Word# -> IO ()
85 writeBA# array i word = IO $ \s ->
86 case writeWordArray# array i word s of { s -> (# s, () #) }
88 writeBreakArray :: BreakArray -> Int -> Word -> IO ()
89 writeBreakArray (BA array) (I# i) (W# word) = writeBA# array i word
91 readBA# :: MutableByteArray# RealWorld -> Int# -> IO Word
92 readBA# array i = IO $ \s ->
93 case readWordArray# array i s of { (# s, c #) -> (# s, W# c #) }
95 readBreakArray :: BreakArray -> Int -> IO Word
96 readBreakArray (BA array) (I# i) = readBA# array i