module System.Console.Questioner.Util
where
import Control.Exception (bracket_)
import System.Console.ANSI (clearLine, cursorDownLine, cursorUpLine,
hideCursor, showCursor)
import System.IO (BufferMode(..), Handle, hGetBuffering, hSetBuffering,
hSetEcho, stdin)
hWithBufferMode :: Handle -> BufferMode -> IO a -> IO a
hWithBufferMode handle bufferMode action = do
originalBuffering <- hGetBuffering handle
bracket_
(hSetBuffering handle bufferMode)
(hSetBuffering handle originalBuffering)
action
hWithNoBuffering :: Handle -> IO a -> IO a
hWithNoBuffering handle = hWithBufferMode handle NoBuffering
withNoCursor :: IO a -> IO a
withNoCursor = bracket_ hideCursor showCursor
withNoEcho :: IO a -> IO a
withNoEcho = bracket_ (hSetEcho stdin False) (hSetEcho stdin True)
clearFromCursorTo :: Int -> IO ()
clearFromCursorTo nlines = loop nlines >> cursorDownLine (nlines 2)
where
loop (1) = return ()
loop n = clearLine >> cursorUpLine 1 >> loop (n 1)