async-io-either (empty) → 0.1.0.0
raw patch · 5 files changed
+123/−0 lines, 5 filesdep +asyncdep +basesetup-changed
Dependencies added: async, base
Files
- LICENSE +30/−0
- README.md +12/−0
- Setup.hs +2/−0
- async-io-either.cabal +25/−0
- src/Control/Concurrent/Async/Either.hs +54/−0
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright Sean Chalmers (c) 2017++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Sean Chalmers nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ README.md view
@@ -0,0 +1,12 @@+Async IO Either+===============++This is a tiny package that captures an pattern I've been using a lot...++Essentially I am tired of needing something of (IO a) and it so often coming with exceptions+that are not indicated in the type. Generally speaking my application, like many others, is+just going to throw in the towel when an exception occurs, but I would prefer it if a value was+provided. This would then allow me to decide just what sort of tantrum my application will throw.++I've tried to understand the different manners of handling exceptions in Haskell, and I'm sure there+is a better or more fitting approach. But this is what I have for now.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ async-io-either.cabal view
@@ -0,0 +1,25 @@+name: async-io-either+version: 0.1.0.0+synopsis: Could be useful+description: A way of running any IO type and capturing any exception, maybe, I think...+homepage: https://github.com/mankyKitty/async-io-either#readme+license: BSD3+license-file: LICENSE+author: Sean Chalmers+maintainer: schalmers@iseek.com.au+copyright: 2017 Sean Chalmers+category: Werk+build-type: Simple+extra-source-files: README.md+cabal-version: >=1.10++library+ hs-source-dirs: src+ exposed-modules: Control.Concurrent.Async.Either+ build-depends: base >= 4.7 && < 5+ , async > 0.2+ default-language: Haskell2010++source-repository head+ type: git+ location: https://github.com/mankyKitty/async-io-either
+ src/Control/Concurrent/Async/Either.hs view
@@ -0,0 +1,54 @@+{-# LANGUAGE CPP #-}+module Control.Concurrent.Async.Either+ ( runAsyncForE+ , runAsyncToE+#if VERSION_retry+ , handleRetryE+ , handleRetryToE+#endif+ ) where++import qualified Control.Concurrent.Async as Async+import Control.Monad.IO.Class (MonadIO, liftIO)++import Control.Exception (SomeException)+import Data.Bifunctor (first)++#if VERSION_retry+import Control.Retry (RetryPolicyM, RetryStatus,+ recoverAll)+#endif++#if VERSION_retry+handleRetryE+ :: MonadIO m+ => RetryPolicyM IO+ -> (RetryStatus -> IO a)+ -> m (Either SomeException a)+handleRetryE rPolicy f =+ runAsyncForE ( recoverAll rPolicy f )++handleRetryToE+ :: MonadIO m+ => RetryPolicyM IO+ -> (RetryStatus -> IO a)+ -> (SomeException -> e)+ -> m (Either e a)+handleRetryToE rPolicy f eFn =+ runAsyncToE ( recoverAll rPolicy f ) eFn+#endif++runAsyncForE+ :: MonadIO m+ => IO a+ -> m (Either SomeException a)+runAsyncForE =+ liftIO . flip Async.withAsync Async.waitCatch++runAsyncToE+ :: MonadIO m+ => IO a+ -> (SomeException -> b)+ -> m (Either b a)+runAsyncToE rFn eFn =+ (first eFn) <$> runAsyncForE rFn