{-# LANGUAGE ExplicitForAll #-}

module Hextra.IO where

processInput :: forall a. (String -> IO a) -> IO a
processInput :: (String -> IO a) -> IO a
processInput = (IO String
getLine IO String -> (String -> IO a) -> IO a
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=)

processInputRead :: forall a b. Read b => (b -> IO a) -> IO a
processInputRead :: (b -> IO a) -> IO a
processInputRead b -> IO a
f = (IO String
getLine IO String -> (String -> IO a) -> IO a
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= b -> IO a
f (b -> IO a) -> (String -> b) -> String -> IO a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> b
forall a. Read a => String -> a
read)

processPrompt :: forall a. Maybe String -> (String -> IO a) -> IO a
processPrompt :: Maybe String -> (String -> IO a) -> IO a
processPrompt Maybe String
a String -> IO a
m = case Maybe String
a of
    Just String
p -> String -> IO ()
putStr String
p IO () -> IO a -> IO a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (String -> IO a) -> IO a
forall a. (String -> IO a) -> IO a
processInput String -> IO a
m
    Maybe String
Nothing -> (String -> IO a) -> IO a
forall a. (String -> IO a) -> IO a
processInput String -> IO a
m

processPromptRead :: forall a b. Read b => Maybe String -> (b -> IO a) -> IO a
processPromptRead :: Maybe String -> (b -> IO a) -> IO a
processPromptRead Maybe String
a b -> IO a
m = case Maybe String
a of
    Just String
p -> String -> IO ()
putStr String
p IO () -> IO a -> IO a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (b -> IO a) -> IO a
forall a b. Read b => (b -> IO a) -> IO a
processInputRead b -> IO a
m
    Maybe String
Nothing -> (b -> IO a) -> IO a
forall a b. Read b => (b -> IO a) -> IO a
processInputRead b -> IO a
m

prompt :: String -> IO String
prompt :: String -> IO String
prompt String
p = do
    String -> IO ()
putStr String
p
    IO String
getLine