module Test.HUnit.Terminal (
terminalAppearance
) where
import Data.Char (isPrint)
terminalAppearance :: String -> String
terminalAppearance :: String -> String
terminalAppearance str :: String
str = (String -> String) -> String -> String -> String -> String
forall t. (String -> t) -> String -> String -> String -> t
ta String -> String
forall a. a -> a
id "" "" String
str
ta
:: ([Char] -> t)
-> [Char]
-> [Char]
-> [Char]
-> t
ta :: (String -> t) -> String -> String -> String -> t
ta f :: String -> t
f bs :: String
bs as :: String
as ('\n':cs :: String
cs) = (String -> t) -> String -> String -> String -> t
forall t. (String -> t) -> String -> String -> String -> t
ta (\t :: String
t -> String -> t
f (String -> String
forall a. [a] -> [a]
reverse String
bs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
as String -> String -> String
forall a. [a] -> [a] -> [a]
++ '\n' Char -> String -> String
forall a. a -> [a] -> [a]
: String
t)) "" "" String
cs
ta f :: String -> t
f bs :: String
bs as :: String
as ('\r':cs :: String
cs) = (String -> t) -> String -> String -> String -> t
forall t. (String -> t) -> String -> String -> String -> t
ta String -> t
f "" (String -> String
forall a. [a] -> [a]
reverse String
bs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
as) String
cs
ta f :: String -> t
f (b :: Char
b:bs :: String
bs) as :: String
as ('\b':cs :: String
cs) = (String -> t) -> String -> String -> String -> t
forall t. (String -> t) -> String -> String -> String -> t
ta String -> t
f String
bs (Char
bChar -> String -> String
forall a. a -> [a] -> [a]
:String
as) String
cs
ta _ "" _ ('\b': _) = String -> t
forall a. HasCallStack => String -> a
error "'\\b' at beginning of line"
ta f :: String -> t
f bs :: String
bs as :: String
as (c :: Char
c:cs :: String
cs)
| Bool -> Bool
not (Char -> Bool
isPrint Char
c) = String -> t
forall a. HasCallStack => String -> a
error "invalid nonprinting character"
| String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
as = (String -> t) -> String -> String -> String -> t
forall t. (String -> t) -> String -> String -> String -> t
ta String -> t
f (Char
cChar -> String -> String
forall a. a -> [a] -> [a]
:String
bs) "" String
cs
| Bool
otherwise = (String -> t) -> String -> String -> String -> t
forall t. (String -> t) -> String -> String -> String -> t
ta String -> t
f (Char
cChar -> String -> String
forall a. a -> [a] -> [a]
:String
bs) (String -> String
forall a. [a] -> [a]
tail String
as) String
cs
ta f :: String -> t
f bs :: String
bs as :: String
as "" = String -> t
f (String -> String
forall a. [a] -> [a]
reverse String
bs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
as)