packages feed

acquire 0.2.0.1 → 0.3

raw patch · 5 files changed

+108/−55 lines, 5 filesdep +transformersPVP ok

version bump matches the API change (PVP)

Dependencies added: transformers

API changes (from Hackage documentation)

- Acquire.Acquire: Acquire :: (IO (resource, IO ())) -> Acquire resource
- Acquire.Acquire: instance Control.Monad.IO.Class.MonadIO Acquire.Acquire.Acquire
- Acquire.Acquire: instance GHC.Base.Applicative Acquire.Acquire.Acquire
- Acquire.Acquire: instance GHC.Base.Functor Acquire.Acquire.Acquire
- Acquire.Acquire: instance GHC.Base.Monad Acquire.Acquire.Acquire
- Acquire.Acquire: newtype Acquire resource
- Acquire.IO: acquire :: Acquire resource -> (resource -> IO a) -> IO a
+ Acquire: Acquire :: IO (resource, IO ()) -> Acquire resource
+ Acquire: Use :: ReaderT env (ExceptT err IO) res -> Use env err res
+ Acquire: acquireAndUse :: Acquire env -> Use env err res -> IO (Either err res)
+ Acquire: instance Control.Monad.IO.Class.MonadIO Acquire.Acquire
+ Acquire: instance Data.Bifunctor.Bifunctor (Acquire.Use env)
+ Acquire: instance GHC.Base.Applicative (Acquire.Use env err)
+ Acquire: instance GHC.Base.Applicative Acquire.Acquire
+ Acquire: instance GHC.Base.Functor (Acquire.Use env err)
+ Acquire: instance GHC.Base.Functor Acquire.Acquire
+ Acquire: instance GHC.Base.Monad (Acquire.Use env err)
+ Acquire: instance GHC.Base.Monad Acquire.Acquire
+ Acquire: instance GHC.Base.Monoid err => GHC.Base.Alternative (Acquire.Use env err)
+ Acquire: instance GHC.Base.Monoid err => GHC.Base.MonadPlus (Acquire.Use env err)
+ Acquire: mapEnv :: (b -> a) -> Use a err res -> Use b err res
+ Acquire: mapEnvAndErr :: (envB -> envA) -> (errA -> errB) -> Use envA errA res -> Use envB errB res
+ Acquire: mapErr :: (a -> b) -> Use env a res -> Use env b res
+ Acquire: newtype Acquire resource
+ Acquire: newtype Use env err res

Files

acquire.cabal view
@@ -1,7 +1,7 @@ name:   acquire version:-  0.2.0.1+  0.3 synopsis:   Abstraction over management of resources description:@@ -16,7 +16,7 @@ author:   Nikita Volkov <nikita.y.volkov@mail.ru> maintainer:-  Metrix.AI Ninjas <ninjas@metrix.ai>+  Metrix.AI Tech Team <tech@metrix.ai> copyright:   (c) 2013 Gabriel Gonzalez, 2018 Metrix.AI license:@@ -42,9 +42,9 @@   default-language:     Haskell2010   exposed-modules:-    Acquire.Acquire-    Acquire.IO+    Acquire   other-modules:     Acquire.Prelude   build-depends:-    base >=4.7 && <5+    base >=4.9 && <5,+    transformers >=0.5 && <0.6
+ library/Acquire.hs view
@@ -0,0 +1,90 @@+module Acquire+where++import Acquire.Prelude+++-- * IO+-------------------------++{-|+Execute an action, which uses a resource,+having a resource provider.+-}+acquireAndUse :: Acquire env -> Use env err res -> IO (Either err res)+acquireAndUse (Acquire acquireIo) (Use useRdr) =+  bracket acquireIo snd (runExceptT . runReaderT useRdr . fst)+++-- * Acquire+-------------------------++{-|+Resource provider.+Abstracts over resource acquisition and releasing.++Composes well, allowing you to merge multiple providers into one.++Implementation of http://www.haskellforall.com/2013/06/the-resource-applicative.html+-}+newtype Acquire resource =+  Acquire (IO (resource, IO ()))++instance Functor Acquire where+  fmap f (Acquire io) =+    Acquire $ do+      (resource, release) <- io+      return (f resource, release)++instance Applicative Acquire where+  pure resource =+    Acquire (pure (resource, pure ()))+  Acquire io1 <*> Acquire io2 =+    Acquire $ do+      (f, release1) <- io1+      (x, release2) <- onException io2 release1+      return (f x, release2 >> release1)++instance Monad Acquire where+  return = pure+  (>>=) (Acquire io1) k2 =+    Acquire $ do+      (resource1, release1) <- io1+      (resource2, release2) <- case k2 resource1 of Acquire io2 -> onException io2 release1+      return (resource2, release2 >> release1)++instance MonadIO Acquire where+  liftIO io =+    Acquire (fmap (, return ()) io)+++-- * Use+-------------------------++{-|+Resource handler, which has a notion of pure errors.+-}+newtype Use env err res = Use (ReaderT env (ExceptT err IO) res)+  deriving (Functor, Applicative, Alternative, Monad, MonadPlus)++instance Bifunctor (Use env) where+  first = mapErr+  second = fmap++{-|+Map the environment of a resource handler.+-}+mapEnv :: (b -> a) -> Use a err res -> Use b err res+mapEnv fn (Use rdr) = Use (withReaderT fn rdr)++{-|+Map the error of a resource handler.+-}+mapErr :: (a -> b) -> Use env a res -> Use env b res+mapErr fn (Use rdr) = Use (mapReaderT (withExceptT fn) rdr)++{-|+Map both the environment and the error of a resource handler.+-}+mapEnvAndErr :: (envB -> envA) -> (errA -> errB) -> Use envA errA res -> Use envB errB res+mapEnvAndErr envProj errProj (Use rdr) = Use (withReaderT envProj (mapReaderT (withExceptT errProj) rdr))
− library/Acquire/Acquire.hs
@@ -1,38 +0,0 @@-module Acquire.Acquire-where--import Acquire.Prelude---{-|-Implementation of http://www.haskellforall.com/2013/06/the-resource-applicative.html--}-newtype Acquire resource =-  Acquire (IO (resource, IO ()))--instance Functor Acquire where-  fmap f (Acquire io) =-    Acquire $ do-      (resource, release) <- io-      return (f resource, release)--instance Applicative Acquire where-  pure resource =-    Acquire (pure (resource, pure ()))-  Acquire io1 <*> Acquire io2 =-    Acquire $ do-      (f, release1) <- io1-      (x, release2) <- onException io2 release1-      return (f x, release2 >> release1)--instance Monad Acquire where-  return = pure-  (>>=) (Acquire io1) k2 =-    Acquire $ do-      (resource1, release1) <- io1-      (resource2, release2) <- case k2 resource1 of Acquire io2 -> onException io2 release1-      return (resource2, release2 >> release1)--instance MonadIO Acquire where-  liftIO io =-    Acquire (fmap (, return ()) io)
− library/Acquire/IO.hs
@@ -1,11 +0,0 @@-module Acquire.IO-where--import Acquire.Prelude-import Acquire.Acquire---acquire :: Acquire resource -> (resource -> IO a) -> IO a-acquire (Acquire io) handle =-  bracket io snd (handle . fst)-
library/Acquire/Prelude.hs view
@@ -7,7 +7,7 @@ -- base ------------------------- import Control.Applicative as Exports-import Control.Arrow as Exports+import Control.Arrow as Exports hiding (first, second) import Control.Category as Exports import Control.Concurrent as Exports import Control.Exception as Exports@@ -15,6 +15,7 @@ import Control.Monad.IO.Class as Exports import Control.Monad.Fix as Exports hiding (fix) import Control.Monad.ST as Exports+import Data.Bifunctor as Exports import Data.Bits as Exports import Data.Bool as Exports import Data.Char as Exports@@ -67,3 +68,14 @@ import Text.Printf as Exports (printf, hPrintf) import Text.Read as Exports (Read(..), readMaybe, readEither) import Unsafe.Coerce as Exports++-- transformers+-------------------------+import Control.Monad.IO.Class as Exports+import Control.Monad.Trans.Class as Exports+import Control.Monad.Trans.Cont as Exports hiding (shift, callCC)+import Control.Monad.Trans.Except as Exports (ExceptT(ExceptT), Except, except, runExcept, runExceptT, mapExcept, mapExceptT, withExcept, withExceptT)+import Control.Monad.Trans.Maybe as Exports+import Control.Monad.Trans.Reader as Exports (Reader, runReader, mapReader, withReader, ReaderT(ReaderT), runReaderT, mapReaderT, withReaderT)+import Control.Monad.Trans.State.Strict as Exports (State, runState, evalState, execState, mapState, withState, StateT(StateT), runStateT, evalStateT, execStateT, mapStateT, withStateT)+import Control.Monad.Trans.Writer.Strict as Exports (Writer, runWriter, execWriter, mapWriter, WriterT(..), execWriterT, mapWriterT)