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 +5/−5
- library/Acquire.hs +90/−0
- library/Acquire/Acquire.hs +0/−38
- library/Acquire/IO.hs +0/−11
- library/Acquire/Prelude.hs +13/−1
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)