module FortyTwo.Renderers.Question (renderQuestion, renderMessage) where
import Control.Monad.IO.Class
import FortyTwo.Types (Message(..))
import System.Console.ANSI
renderMessage :: MonadIO m => Message -> String -> m ()
renderMessage :: forall (m :: * -> *). MonadIO m => Message -> String -> m ()
renderMessage Message
messageType String
message
| Message
messageType forall a. Eq a => a -> a -> Bool
== Message
Question = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ do
[SGR] -> IO ()
setSGR [ConsoleLayer -> ColorIntensity -> Color -> SGR
SetColor ConsoleLayer
Foreground ColorIntensity
Dull Color
Green]
String -> IO ()
putStr String
"? "
[SGR] -> IO ()
setSGR [SGR
Reset]
[SGR] -> IO ()
setSGR [ConsoleIntensity -> SGR
SetConsoleIntensity ConsoleIntensity
BoldIntensity]
String -> IO ()
putStr String
text
[SGR] -> IO ()
setSGR [SGR
Reset]
| Message
messageType forall a. Eq a => a -> a -> Bool
== Message
Answer = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ do
[SGR] -> IO ()
setSGR [ConsoleLayer -> ColorIntensity -> Color -> SGR
SetColor ConsoleLayer
Foreground ColorIntensity
Dull Color
Cyan]
String -> IO ()
putStr forall a b. (a -> b) -> a -> b
$ String
" " forall a. [a] -> [a] -> [a]
++ String
text
[SGR] -> IO ()
setSGR [SGR
Reset]
| Message
messageType forall a. Eq a => a -> a -> Bool
== Message
DefaultAnswer = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ do
[SGR] -> IO ()
setSGR [ConsoleIntensity -> SGR
SetConsoleIntensity ConsoleIntensity
FaintIntensity]
String -> IO ()
putStr forall a b. (a -> b) -> a -> b
$ String
" (" forall a. [a] -> [a] -> [a]
++ String
text forall a. [a] -> [a] -> [a]
++ String
")"
[SGR] -> IO ()
setSGR [SGR
Reset]
| Bool
otherwise =
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ String -> IO ()
putStr String
text
where
text :: String
text = ([String] -> String
unwords forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
lines) String
message
renderQuestion :: MonadIO m => String -> String -> String -> m ()
renderQuestion :: forall (m :: * -> *).
MonadIO m =>
String -> String -> String -> m ()
renderQuestion String
question String
defaultAnswer String
answer
| Bool
hasDefaultAnswer Bool -> Bool -> Bool
&& Bool
hasAnswer = do
forall (m :: * -> *). MonadIO m => Message -> String -> m ()
renderMessage Message
Question String
question
forall (m :: * -> *). MonadIO m => Message -> String -> m ()
renderMessage Message
DefaultAnswer String
defaultAnswer
forall (m :: * -> *). MonadIO m => Message -> String -> m ()
renderMessage Message
Answer String
answer
| Bool
hasDefaultAnswer = do
forall (m :: * -> *). MonadIO m => Message -> String -> m ()
renderMessage Message
Question String
question
forall (m :: * -> *). MonadIO m => Message -> String -> m ()
renderMessage Message
DefaultAnswer String
defaultAnswer
| Bool
hasAnswer = do
forall (m :: * -> *). MonadIO m => Message -> String -> m ()
renderMessage Message
Question String
question
forall (m :: * -> *). MonadIO m => Message -> String -> m ()
renderMessage Message
Answer String
answer
| Bool
otherwise = forall (m :: * -> *). MonadIO m => Message -> String -> m ()
renderMessage Message
Question String
question
where
hasDefaultAnswer :: Bool
hasDefaultAnswer = Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
defaultAnswer
hasAnswer :: Bool
hasAnswer = Bool -> Bool
not forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
answer