monad-finally 0.1.1 → 0.1.2
raw patch · 2 files changed
+19/−3 lines, 2 filesdep ~monad-abort-fddep ~transformers-compatPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: monad-abort-fd, transformers-compat
API changes (from Hackage documentation)
+ Control.Monad.Finally: instance (Control.Monad.Finally.MonadFinally μ, GHC.Base.Monoid w) => Control.Monad.Finally.MonadFinally (Control.Monad.Trans.Accum.AccumT w μ)
Files
- monad-finally.cabal +3/−3
- src/Control/Monad/Finally.hs +16/−0
monad-finally.cabal view
@@ -1,5 +1,5 @@ Name: monad-finally-Version: 0.1.1+Version: 0.1.2 Category: Control Stability: experimental Synopsis: Guard monadic computations with cleanup actions@@ -35,10 +35,10 @@ Library Build-Depends: base >= 4.4 && < 5 Build-Depends: transformers >= 0.2- , transformers-compat >= 0.5+ , transformers-compat >= 0.6.1 , transformers-base >= 0.4 , transformers-abort >= 0.6- , monad-abort-fd >= 0.6+ , monad-abort-fd >= 0.6.2 , monad-control >= 1.0 Hs-Source-Dirs: src GHC-Options: -Wall
src/Control/Monad/Finally.hs view
@@ -34,6 +34,7 @@ import qualified Control.Monad.Trans.Writer.Strict as SW import qualified Control.Monad.Trans.RWS.Lazy as L import qualified Control.Monad.Trans.RWS.Strict as S+import Control.Monad.Trans.Accum import Control.Monad.Trans.Abort import Control.Monad.Trans.Finish import qualified Control.Exception as E@@ -255,6 +256,21 @@ Nothing → S.runRWST (release ar Nothing) r s') (\(ar, s', aw) → S.runRWST (S.tell aw >> m ar) r s') return ((mr, fr), s''', w `mappend` w')++instance (MonadFinally μ, Monoid w) ⇒ MonadFinally (AccumT w μ) where+ finally' m f = AccumT $ \w → do+ ~(~(mr, _), ~(fr, w'')) ← finally' (runAccumT m w) $ \case+ Just ~(a, w') → runAccumT (f $ Just a) w'+ Nothing → runAccumT (f Nothing) w+ return ((mr, fr), w'')+ bracket' acquire release m = AccumT $ \w → do+ ~(~(mr, _), ~(fr, w''')) ←+ bracket' (runAccumT acquire w)+ (\ ~(ar, w') → \case+ Just ~(mr, w'') → runAccumT (release ar (Just mr)) w''+ Nothing → runAccumT (release ar Nothing) w')+ (\ ~(ar, w') → runAccumT (m ar) w')+ return ((mr, fr), w''') -- | Run the provided list of cleanup actions sequentually, attempting to run -- the next action even if the previous one did not produce a result.