module FortyTwo.Prompts.Input (inputWithDefault, input) where

import Control.Monad.IO.Class

import FortyTwo.Renderers.Question (renderQuestion)
import FortyTwo.Utils (clearLines, flush)
import FortyTwo.Constants (emptyString)

-- | Ask a simple input question falling back to a default value if no answer will be provided
-- inputWithDefault "What is your name?" "The Dude"
inputWithDefault :: MonadIO m => String -> String -> m String
inputWithDefault :: forall (m :: * -> *). MonadIO m => String -> String -> m String
inputWithDefault String
question String
defaultAnswer = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ do
  String -> IO ()
putStrLn String
emptyString
  forall (m :: * -> *).
MonadIO m =>
String -> String -> String -> m ()
renderQuestion String
question String
defaultAnswer String
emptyString
  String -> IO ()
putStr String
" "
  IO ()
flush
  String
answer <- IO String
getLine
  forall (m :: * -> *). MonadIO m => Int -> m ()
clearLines Int
1
  -- return the default answer if no answer was given
  if forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
answer then do
    forall (m :: * -> *).
MonadIO m =>
String -> String -> String -> m ()
renderQuestion String
question String
emptyString String
defaultAnswer
    forall (m :: * -> *) a. Monad m => a -> m a
return String
defaultAnswer
  else do
    forall (m :: * -> *).
MonadIO m =>
String -> String -> String -> m ()
renderQuestion String
question String
emptyString String
answer
    forall (m :: * -> *) a. Monad m => a -> m a
return String
answer

-- | Simple input question
-- input "What is your name?"
input :: MonadIO m => String -> m String
input :: forall (m :: * -> *). MonadIO m => String -> m String
input String
question = forall (m :: * -> *). MonadIO m => String -> String -> m String
inputWithDefault String
question String
emptyString