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