module SocketActivation
    (
    -- * Actions
      getMySocketByName

    -- * Types
    , Name (..), VarName (..), Socket, Error (..)

    ) where

import           Control.Applicative             (Applicative ((*>)))
import           Control.Monad                   (Monad (return, (>>=)))
import           Data.Either                     (Either, either)
import           System.IO                       (IO, print)

import qualified Control.Exception               as Ex

import qualified SocketActivation.CheckRecipient as SA
import qualified SocketActivation.Concepts       as SA
import qualified SocketActivation.Env            as SA
import qualified SocketActivation.GetByName      as SA

import           SocketActivation.Concepts       as Concepts

getMySocketByName :: SA.Name -> IO SA.Socket
getMySocketByName :: Name -> IO Socket
getMySocketByName Name
name = IO (Either Error ()) -> IO ()
forall a. IO (Either Error a) -> IO a
f IO (Either Error ())
SA.checkRecipient IO () -> IO Socket -> IO Socket
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> IO (Either Error Socket) -> IO Socket
forall a. IO (Either Error a) -> IO a
f (Name -> IO (Either Error Socket)
SA.getSocketByName Name
name)
  where
    f :: IO (Either SA.Error a) -> IO a
    f :: IO (Either Error a) -> IO a
f = (IO (Either Error a) -> (Either Error a -> IO a) -> IO a
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Error -> IO a) -> (a -> IO a) -> Either Error a -> IO a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (\Error
e -> (IO [(VarName, Maybe Text)]
SA.getEnvVars IO [(VarName, Maybe Text)]
-> ([(VarName, Maybe Text)] -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [(VarName, Maybe Text)] -> IO ()
forall a. Show a => a -> IO ()
print) IO () -> IO a -> IO a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Error -> IO a
forall a e. Exception e => e -> a
Ex.throw Error
e) a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return)