20 lines
506 B
Haskell
20 lines
506 B
Haskell
{-# LANGUAGE ScopedTypeVariables #-}
|
|
module Utils (
|
|
outputLn
|
|
, prompt
|
|
) where
|
|
|
|
import Control.Monad.IO.Class (MonadIO(..))
|
|
import Text.Read (readMaybe)
|
|
|
|
outputLn :: MonadIO m => String -> m ()
|
|
outputLn = liftIO . putStrLn
|
|
|
|
prompt :: MonadIO m => m () -> m () -> (Int, Int) -> m Int
|
|
prompt message onError range@(minVal, maxVal) = do
|
|
message
|
|
mn <- readMaybe <$> liftIO getLine
|
|
case mn of
|
|
Just n | n >= minVal && n <= maxVal -> return n
|
|
_ -> onError >> prompt message onError range
|