ansi-terminal-0.1: System/Console/ANSI/Example.hs
module Main (
main
) where
import System.Console.ANSI
import System.IO
import Control.Concurrent
import Control.Monad
examples :: [IO ()]
examples = [ cursorMovementExample
, lineChangeExample
, setPositionExample
, clearExample
, scrollExample
, sgrExample
, cursorVisibilityExample
]
main :: IO ()
main = mapM_ (\example -> resetScreen >> example) examples
resetScreen :: IO ()
resetScreen = clearScreen >> setSGR Reset >> setPosition 0 0
pause :: IO ()
pause = do
hFlush stdout
-- 1 second pause
threadDelay 1000000
cursorMovementExample :: IO ()
cursorMovementExample = do
putStrLn "Line One"
putStr "Line Two"
pause
-- Line One
-- Line Two
cursorUp 1
putStr " - Extras"
pause
-- Line One - Extras
-- Line Two
cursorBackward 2
putStr "zz"
pause
-- Line One - Extrzz
-- Line Two
cursorForward 2
putStr "- And More"
pause
-- Line One - Extrzz - And More
-- Line Two
cursorDown 1
putStr "Disconnected"
pause
-- Line One - Extrzz - And More
-- Line Two Disconnected
lineChangeExample :: IO ()
lineChangeExample = do
putStrLn "Line One"
putStr "Line Two"
pause
-- Line One
-- Line Two
previousLine 1
putStr "New Line One"
pause
-- New Line One
-- Line Two
nextLine 1
putStr "New Line Two"
pause
-- New Line One
-- New Line Two
setPositionExample :: IO ()
setPositionExample = do
putStrLn "Line One"
putStrLn "Line Two"
pause
-- Line One
-- Line Two
setPosition 0 5
putStr "Foo"
pause
-- Line Foo
-- Line Two
setPosition 1 5
putStr "Bar"
pause
-- Line Foo
-- Line Bar
setColumn 1
putStr "oaf"
pause
-- Line Foo
-- Loaf Bar
clearExample :: IO ()
clearExample = do
putStrLn "Line One"
putStrLn "Line Two"
pause
-- Line One
-- Line Two
setPosition 0 4
clearFromCursorToScreenEnd
pause
-- Line
resetScreen
putStrLn "Line One"
putStrLn "Line Two"
pause
-- Line One
-- Line Two
setPosition 1 4
clearFromCursorToScreenBeginning
pause
--
-- Two
resetScreen
putStrLn "Line One"
putStrLn "Line Two"
pause
-- Line One
-- Line Two
setPosition 0 4
clearFromCursorToLineEnd
pause
-- Line
-- Line Two
setPosition 1 4
clearFromCursorToLineBeginning
pause
-- Line
-- Two
clearLine
pause
-- Line
clearScreen
pause
--
scrollExample :: IO ()
scrollExample = do
putStrLn "Line One"
putStrLn "Line Two"
putStrLn "Line Three"
pause
-- Line One
-- Line Two
-- Line Three
scrollPageDown 2
pause
--
--
-- Line One
-- Line Two
-- Line Three
scrollPageUp 3
pause
-- Line Two
-- Line Three
sgrExample :: IO ()
sgrExample = do
let colors = enumFromTo minBound maxBound :: [ANSIColor]
forM_ [ForegroundNormalIntensity, ForegroundHighIntensity, BackgroundNormalIntensity, BackgroundHighIntensity] $ \color_way -> do
resetScreen
forM_ colors $ \color -> do
setSGR Reset
setSGR (color_way color)
putStrLn (show color)
pause
-- All the colors, 4 times in sequence
let named_styles = [ (BoldIntensity, "Bold")
, (FaintIntensity, "Faint")
, (NormalIntensity, "Normal")
, (Italic, "Italic")
, (SingleUnderline, "Single Underline")
, (DoubleUnderline, "Double Underline")
, (NoUnderline, "No Underline")
, (SlowBlink, "Slow Blink")
, (RapidBlink, "Rapid Blink")
, (NoBlink, "No Blink")
, (Conceal, "Conceal")
, (Reveal, "Reveal")
]
forM_ named_styles $ \(style, name) -> do
resetScreen
setSGR style
putStrLn name
pause
-- Text describing a style displayed in that style in sequence
setSGR (ForegroundHighIntensity Red)
setSGR (BackgroundHighIntensity Blue)
clearScreen >> setPosition 0 0
setSGR DontSwapForegroundBackground
putStr "Red-On-Blue"
pause
-- Red-On-Blue
clearScreen >> setPosition 0 0
setSGR SwapForegroundBackground
putStr "Blue-On-Red"
pause
-- Blue-On-Red
cursorVisibilityExample :: IO ()
cursorVisibilityExample = do
putStr "Cursor Demo"
pause
-- Cursor Demo|
hideCursor
pause
-- Cursor Demo
showCursor
pause
-- Cursor Demo|