gameServer/Store.hs
changeset 4932 f11d80bac7ed
parent 4905 7842d085acf4
child 5003 db4726bf9205
equal deleted inserted replaced
4931:da43c36a6e92 4932:f11d80bac7ed
    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