module SocketActivation.IO where

import Essentials

import Control.Monad.IO.Class (MonadIO)
import Control.Monad.Trans.Except (ExceptT (..))
import Data.Either (Either (Left))
import System.IO (IO)

import SocketActivation.Concepts (Error)

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

throwError :: Error -> IO' a
throwError :: forall a. 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
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Either Error a -> IO (Either Error a)
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (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
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Error -> Either Error a
forall a b. a -> Either a b
Left