module ANSI where csi = ("\27[" ++) up n = csi (show n ++ "A") down n = csi (show n ++ "B") clear = csi "J" ansi = putStr . concat line = "\n-----------------------------\n" header n = ansi [up (n+5), clear, line, down (n+3)] display f strs = do ansi [up (length strs+2), clear] mapM_ putStrLn strs ansi [down 1] r <- getLine if take 1 r == "q" then return () else display f (f r strs) test f strs = header (length strs) >> display f strs main = test (const (rotate 1)) ["Hello.", "", " This is a test.", " Only a test.", ""] rotate n xs = drop n xs ++ take n xs ----------------------------------------- test' f s x = header (length (s x)) >> disp f s x disp f s x = do let strs = s x ansi [up (length strs+2), clear] mapM_ putStrLn strs ansi [down 1] r <- getLine if take 1 r == "q" then return () else disp f s (f r x)