packages feed

aivika-branches 0.1.1 → 0.1.2

raw patch · 2 files changed

+22/−15 lines, 2 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

Files

Simulation/Aivika/Branch/Internal/Ref.hs view
@@ -36,7 +36,7 @@ import Simulation.Aivika.Branch.Internal.Br  -- | A reference map.-type RefMap a = IORef (M.IntMap (IORef a))+type RefMap a = IORef (M.IntMap (IORef a, Weak (IORef ())))  -- | A mutable reference. data Ref a = Ref { refMap :: RefMap a,@@ -59,7 +59,7 @@   do rm <- newIORef M.empty      wm <- mkWeakIORef rm $            -- trace ("fin newEmptyRef0: " ++ show (brId ps)) $-           return ()+           finalizeRef rm      return Ref { refMap = rm,                   refWeakMap = wm } @@ -75,10 +75,10 @@      ra <- newIORef a      let !i  = brId ps          !wm = refWeakMap r-     -- mkWeakIORef (brUniqueRef ps) (trace ("fin newIORef0: " ++ show i) $ finalizeRef wm i)-     mkWeakIORef (brUniqueRef ps) (finalizeRef wm i)+     -- mkWeakIORef (brUniqueRef ps) (trace ("fin newIORef0: " ++ show i) $ finalizeCell wm i)+     wa <- mkWeakIORef (brUniqueRef ps) (finalizeCell wm i)      writeIORef (refMap r) $-       M.insert i ra M.empty+       M.insert i (ra, wa) M.empty      return r       -- | Read the value of a reference.@@ -89,7 +89,7 @@   do m <- readIORef (refMap r)      let loop ps =            case M.lookup (brId ps) m of-             Just ra -> readIORef ra+             Just (ra, wa) -> readIORef ra              Nothing ->                case brParent ps of                  Just ps' -> loop ps'@@ -104,14 +104,14 @@   do m <- readIORef (refMap r)      let !i = brId ps      case M.lookup i m of-       Just ra -> a `seq` writeIORef ra a+       Just (ra, wa) -> a `seq` writeIORef ra a        Nothing ->          do ra <- a `seq` newIORef a             let !wm = refWeakMap r-            -- mkWeakIORef (brUniqueRef ps) (trace ("fin writeRef: " ++ show i) $ finalizeRef wm i)-            mkWeakIORef (brUniqueRef ps) (finalizeRef wm i)+            -- mkWeakIORef (brUniqueRef ps) (trace ("fin writeRef: " ++ show i) $ finalizeCell wm i)+            wa <- mkWeakIORef (brUniqueRef ps) (finalizeCell wm i)             atomicModifyIORef (refMap r) $ \m ->-              let m' = M.insert i ra m in (m', ())+              let m' = M.insert i (ra, wa) m in (m', ())  -- | Mutate the contents of the reference. modifyRef :: Ref a -> (a -> a) -> Event BrIO ()@@ -121,7 +121,7 @@   do m <- readIORef (refMap r)      let !i = brId ps      case M.lookup i m of-       Just ra ->+       Just (ra, wa) ->          do a <- readIORef ra             let b = f a             b `seq` writeIORef ra b@@ -129,9 +129,16 @@          do a <- invokeBr ps $ invokeEvent p $ readRef r             invokeBr ps $ invokeEvent p $ writeRef r (f a) +-- | Finalize the reference.+finalizeRef :: RefMap a -> IO ()+finalizeRef r =+  do m <- readIORef r+     forM_ (M.elems m) $ \(ra, wa) ->+       finalize wa+ -- | Finalize the reference cell by the specified branch identifier.-finalizeRef :: Weak (RefMap a) -> Int -> IO ()-finalizeRef wm i =+finalizeCell :: Weak (RefMap a) -> Int -> IO ()+finalizeCell wm i =   do rm <- deRefWeak wm      -- trace ("finalizeRef: " ++ show i) $ return ()      case rm of@@ -140,7 +147,7 @@        Just rm ->          do m <- readIORef rm             case M.lookup i m of-              Just ra ->+              Just (ra, wa) ->                 atomicModifyIORef rm $ \m ->                 let m' = M.delete i m in (m', ())               Nothing ->
aivika-branches.cabal view
@@ -1,5 +1,5 @@ name:            aivika-branches-version:         0.1.1+version:         0.1.2 synopsis:        Branching discrete event simulation library description:     This package extends the Aivika [1] library with facilities for creating branches to run