module Mischief.ECS.Stdin where
import Control.Monad.IO.Class
import GHC.IO.Handle
import Mischief.ECS.World
import System.IO
import Prelude hiding (read)
init :: System ()
init :: System ()
init = IO () -> System ()
forall a. IO a -> System a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> System ()) -> IO () -> System ()
forall a b. (a -> b) -> a -> b
$ do
Handle -> BufferMode -> IO ()
hSetBuffering Handle
stdin BufferMode
NoBuffering
Handle -> Bool -> IO ()
hSetEcho Handle
stdin Bool
False
read :: System String
read :: System String
read = do
ready <- IO Bool -> System Bool
forall a. IO a -> System a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Bool -> System Bool) -> IO Bool -> System Bool
forall a b. (a -> b) -> a -> b
$ Handle -> IO Bool
hReady Handle
stdin
if ready
then do
c <- liftIO getChar
([c] ++) <$> read
else do
return []
readLast :: System (Maybe Char)
readLast :: System (Maybe Char)
readLast = do
r <- System String
read
return $ case r of
[] -> Maybe Char
forall a. Maybe a
Nothing
String
x -> Char -> Maybe Char
forall a. a -> Maybe a
Just (Char -> Maybe Char) -> Char -> Maybe Char
forall a b. (a -> b) -> a -> b
$ String -> Char
forall a. HasCallStack => [a] -> a
last String
x