module SocketActivation.Parsing where

import Essentials

import Data.Bits (toIntegralSized)
import Data.Text (Text)
import Foreign.C.Types (CInt)
import Numeric.Natural (Natural)
import Text.Read (readMaybe)

import qualified Data.Text as Text

import SocketActivation.Concepts

readRecipient :: Text -> Maybe Recipient
readRecipient :: Text -> Maybe Recipient
readRecipient = Text -> Maybe ProcessID
read forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> ProcessID -> Maybe Recipient
wrap
  where
    read :: Text -> Maybe ProcessID
read = forall a. Read a => String -> Maybe a
readMaybe @ProcessID forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> String
Text.unpack
    wrap :: ProcessID -> Maybe Recipient
wrap = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ProcessID -> Recipient
RecipientPID

readCount :: Text -> Maybe Count
readCount :: Text -> Maybe Count
readCount = Text -> Maybe CInt
read forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> CInt -> Maybe Natural
convert forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> Natural -> Maybe Count
wrap
  where
    read :: Text -> Maybe CInt
read = forall a. Read a => String -> Maybe a
readMaybe @CInt forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> String
Text.unpack
    convert :: CInt -> Maybe Natural
convert = forall a b.
(Integral a, Integral b, Bits a, Bits b) =>
a -> Maybe b
toIntegralSized :: CInt -> Maybe Natural
    wrap :: Natural -> Maybe Count
wrap = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Natural -> Count
CountNat

readNames :: Text -> Names
readNames :: Text -> Names
readNames = [Name] -> Names
NamesList forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Text -> Name
NameText forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> Text -> [Text]
Text.splitOn Text
":"