{-# 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