concurrent-state 0.3.0.0 → 0.3.1.0
raw patch · 3 files changed
+15/−13 lines, 3 files
Files
- concurrent-state.cabal +1/−1
- src/Control/Monad/State/Concurrent/Lazy.hs +7/−6
- src/Control/Monad/State/Concurrent/Strict.hs +7/−6
concurrent-state.cabal view
@@ -1,5 +1,5 @@ name: concurrent-state-version: 0.3.0.0+version: 0.3.1.0 synopsis: MTL-like library using TVars description: State and Writer backed by TVars. homepage: https://github.com/joelteon/concurrent-state
src/Control/Monad/State/Concurrent/Lazy.hs view
@@ -77,12 +77,13 @@ _runStateC (k a) s' instance (Functor m, MonadIO m) => MonadState s (StateC s m) where- get = StateC $ \s -> do- m <- liftIO (readTVarIO s)- return (m, s)- put s = StateC $ \tv -> do- liftIO . atomically $ swapTVar tv s- return ((), tv)+ state f = StateC $ \tv -> do+ newval <- liftIO . atomically $ do+ old <- readTVar tv+ let ~(a, s) = f old+ swapTVar tv s+ return a+ return (newval, tv) instance (MonadIO m, MonadFix m) => MonadFix (StateC s m) where mfix f = StateC $ \s -> mfix $ \ ~(a, _) -> _runStateC (f a) s
src/Control/Monad/State/Concurrent/Strict.hs view
@@ -78,12 +78,13 @@ _runStateC (k a) s' instance (Functor m, MonadIO m) => MonadState s (StateC s m) where- get = StateC $ \s -> do- m <- liftIO (readTVarIO s)- return (m, s)- put s = StateC $ \tv -> do- liftIO . atomically $ swapTVar tv s- return ((), tv)+ state f = StateC $ \tv -> do+ newval <- liftIO . atomically $ do+ old <- readTVar tv+ let (a, s) = f old+ swapTVar tv s+ return a+ return (newval, tv) instance (MonadIO m, MonadFix m) => MonadFix (StateC s m) where mfix f = StateC $ \s -> mfix $ \(a, _) -> _runStateC (f a) s