module SocketActivation.IO where

import           Control.Applicative        (Applicative)
import           Control.Monad              (Functor, Monad (return))
import           Control.Monad.IO.Class     (MonadIO)
import           Control.Monad.Trans.Except (ExceptT (..))
import           Data.Either                (Either (Left))
import           Data.Function              ((.))
import           System.IO                  (IO)

import           SocketActivation.Concepts

newtype IO' a = IO' { IO' a -> IO (Either Error a)
run :: IO (Either Error a) }
    deriving (a -> IO' b -> IO' a
(a -> b) -> IO' a -> IO' b
(forall a b. (a -> b) -> IO' a -> IO' b)
-> (forall a b. a -> IO' b -> IO' a) -> Functor IO'
forall a b. a -> IO' b -> IO' a
forall a b. (a -> b) -> IO' a -> IO' b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> IO' b -> IO' a
$c<$ :: forall a b. a -> IO' b -> IO' a
fmap :: (a -> b) -> IO' a -> IO' b
$cfmap :: forall a b. (a -> b) -> IO' a -> IO' b
Functor, Functor IO'
a -> IO' a
Functor IO'
-> (forall a. a -> IO' a)
-> (forall a b. IO' (a -> b) -> IO' a -> IO' b)
-> (forall a b c. (a -> b -> c) -> IO' a -> IO' b -> IO' c)
-> (forall a b. IO' a -> IO' b -> IO' b)
-> (forall a b. IO' a -> IO' b -> IO' a)
-> Applicative IO'
IO' a -> IO' b -> IO' b
IO' a -> IO' b -> IO' a
IO' (a -> b) -> IO' a -> IO' b
(a -> b -> c) -> IO' a -> IO' b -> IO' c
forall a. a -> IO' a
forall a b. IO' a -> IO' b -> IO' a
forall a b. IO' a -> IO' b -> IO' b
forall a b. IO' (a -> b) -> IO' a -> IO' b
forall a b c. (a -> b -> c) -> IO' a -> IO' b -> IO' c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: IO' a -> IO' b -> IO' a
$c<* :: forall a b. IO' a -> IO' b -> IO' a
*> :: IO' a -> IO' b -> IO' b
$c*> :: forall a b. IO' a -> IO' b -> IO' b
liftA2 :: (a -> b -> c) -> IO' a -> IO' b -> IO' c
$cliftA2 :: forall a b c. (a -> b -> c) -> IO' a -> IO' b -> IO' c
<*> :: IO' (a -> b) -> IO' a -> IO' b
$c<*> :: forall a b. IO' (a -> b) -> IO' a -> IO' b
pure :: a -> IO' a
$cpure :: forall a. a -> IO' a
$cp1Applicative :: Functor IO'
Applicative, Applicative IO'
a -> IO' a
Applicative IO'
-> (forall a b. IO' a -> (a -> IO' b) -> IO' b)
-> (forall a b. IO' a -> IO' b -> IO' b)
-> (forall a. a -> IO' a)
-> Monad IO'
IO' a -> (a -> IO' b) -> IO' b
IO' a -> IO' b -> IO' b
forall a. a -> IO' a
forall a b. IO' a -> IO' b -> IO' b
forall a b. IO' a -> (a -> IO' b) -> IO' b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: a -> IO' a
$creturn :: forall a. a -> IO' a
>> :: IO' a -> IO' b -> IO' b
$c>> :: forall a b. IO' a -> IO' b -> IO' b
>>= :: IO' a -> (a -> IO' b) -> IO' b
$c>>= :: forall a b. IO' a -> (a -> IO' b) -> IO' b
$cp1Monad :: Applicative IO'
Monad, Monad IO'
Monad IO' -> (forall a. IO a -> IO' a) -> MonadIO IO'
IO a -> IO' a
forall a. IO a -> IO' a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: IO a -> IO' a
$cliftIO :: forall a. IO a -> IO' a
$cp1MonadIO :: Monad IO'
MonadIO) via ExceptT Error IO

throwError :: Error -> IO' a
throwError :: Error -> IO' a
throwError = IO (Either Error a) -> IO' a
forall a. IO (Either Error a) -> IO' a
IO' (IO (Either Error a) -> IO' a)
-> (Error -> IO (Either Error a)) -> Error -> IO' a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either Error a -> IO (Either Error a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either Error a -> IO (Either Error a))
-> (Error -> Either Error a) -> Error -> IO (Either Error a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Error -> Either Error a
forall a b. a -> Either a b
Left