gameServer/Store.hs
changeset 3741 73246d25dfe1
parent 3673 45778b16b224
child 3747 76a197793b62
--- a/gameServer/Store.hs	Sat Aug 14 02:10:27 2010 +0200
+++ b/gameServer/Store.hs	Mon Aug 16 18:43:32 2010 +0400
@@ -8,6 +8,7 @@
     readElem,
     writeElem,
     modifyElem,
+    elemExists,
     firstIndex,
     indicesM,
     withIStore,
@@ -94,6 +95,10 @@
     (_, _, arr) <- readIORef ref
     IOA.readArray arr n >>= (IOA.writeArray arr n) . f
 
+elemExists :: MStore e -> ElemIndex -> IO Bool
+elemExists (MStore ref) (ElemIndex n) = do
+    (_, free, _) <- readIORef ref
+    return $ n `IntSet.notMember` free
 
 indicesM :: MStore e -> IO [ElemIndex]
 indicesM (MStore ref) = do
@@ -101,23 +106,35 @@
     return $ map ElemIndex $ IntSet.toList busy
 
 
--- A way to use see MStore elements in pure code via IStore
+-- A way to see MStore elements in pure code via IStore
 m2i :: MStore e -> IO (IStore e)
 m2i (MStore ref) = do
-    (a, _, c') <- readIORef ref 
-    c <- IOA.freeze c'
+    (a, _, c') <- readIORef ref
+    c <- IOA.unsafeFreeze c'
     return $ IStore (a, c)
 
+i2m :: (MStore e) -> IStore e -> IO ()
+i2m (MStore ref) (IStore (_, arr)) = do
+    (b, e, _) <- readIORef ref
+    a <- IOA.unsafeThaw arr
+    writeIORef ref (b, e, a)
 
 withIStore :: MStore e -> (IStore e -> a) -> IO a
-withIStore m f = liftM f (m2i m)
+withIStore m f = do
+    i <- m2i m
+    let res = f i
+    res `seq` i2m m i
+    return res
 
 
 withIStore2 :: MStore e1 -> MStore e2 -> (IStore e1 -> IStore e2 -> a) -> IO a
 withIStore2 m1 m2 f = do
     i1 <- m2i m1
     i2 <- m2i m2
-    return $ f i1 i2
+    let res = f i1 i2
+    res `seq` i2m m1 i1
+    i2m m2 i2
+    return res
 
 
 -- IStore code