equal
deleted
inserted
replaced
54 (busyElems, freeElems, arr) <- readIORef ref |
54 (busyElems, freeElems, arr) <- readIORef ref |
55 (_, m') <- IOA.getBounds arr |
55 (_, m') <- IOA.getBounds arr |
56 let newM' = growFunc (m' + 1) - 1 |
56 let newM' = growFunc (m' + 1) - 1 |
57 newArr <- IOA.newArray_ (0, newM') |
57 newArr <- IOA.newArray_ (0, newM') |
58 sequence_ [IOA.readArray arr i >>= IOA.writeArray newArr i | i <- [0..m']] |
58 sequence_ [IOA.readArray arr i >>= IOA.writeArray newArr i | i <- [0..m']] |
59 writeIORef ref (busyElems, freeElems `IntSet.union` (IntSet.fromAscList [m'+1..newM']), newArr) |
59 writeIORef ref (busyElems, freeElems `IntSet.union` IntSet.fromAscList [m'+1..newM'], newArr) |
60 |
60 |
61 |
61 |
62 growIfNeeded :: MStore e -> IO () |
62 growIfNeeded :: MStore e -> IO () |
63 growIfNeeded m@(MStore ref) = do |
63 growIfNeeded m@(MStore ref) = do |
64 (_, freeElems, _) <- readIORef ref |
64 (_, freeElems, _) <- readIORef ref |
111 m2i (MStore ref) = do |
111 m2i (MStore ref) = do |
112 (a, _, c') <- readIORef ref |
112 (a, _, c') <- readIORef ref |
113 c <- IOA.unsafeFreeze c' |
113 c <- IOA.unsafeFreeze c' |
114 return $ IStore (a, c) |
114 return $ IStore (a, c) |
115 |
115 |
116 i2m :: (MStore e) -> IStore e -> IO () |
116 i2m :: MStore e -> IStore e -> IO () |
117 i2m (MStore ref) (IStore (_, arr)) = do |
117 i2m (MStore ref) (IStore (_, arr)) = do |
118 (b, e, _) <- readIORef ref |
118 (b, e, _) <- readIORef ref |
119 a <- IOA.unsafeThaw arr |
119 a <- IOA.unsafeThaw arr |
120 writeIORef ref (b, e, a) |
120 writeIORef ref (b, e, a) |
121 |
121 |