packages feed

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 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