module Test.Console.Color
( red,
magenta,
black,
blue,
yellow,
green,
grey,
underlined,
Colored (Colors, NoColors),
Style,
Styled (..),
unlines,
style,
styled,
unstyled,
)
where
import Data.Function (on)
import Data.Sequence (Seq)
import qualified Data.Sequence as Seq
import Data.String (IsString (..))
import Prelude hiding (unlines)
import qualified System.Console.ANSI as Console
import System.Console.Concurrent (Outputable (..))
type Style = [Console.SGR]
code :: IsString a => Style -> a
code = fromString . Console.setSGRCode
newtype Styled a = Styled { getStyled :: Seq (Either [Console.SGR] a) }
instance Semigroup (Styled a) where
(<>) a b = Styled (on (<>) getStyled a b)
instance Monoid (Styled a) where
mempty = Styled mempty
instance IsString a => IsString (Styled a) where
fromString = Styled . Seq.singleton . Right . fromString
instance (IsString a, Outputable a) => Outputable (Styled a) where
toOutput = foldMap (either code toOutput) . getStyled
unlines :: IsString t => [Styled t] -> Styled t
unlines [] = mempty
unlines (t : ts) = t <> fromString "\n" <> unlines ts
style :: Style -> Styled a
style col = (Styled . Seq.singleton) (Left col)
styled :: Style -> t -> Styled t
styled col t =
style col <> (Styled . Seq.singleton) (Right t) <> style [reset]
unstyled :: Monoid a => Styled a -> a
unstyled = foldMap (either mempty id) . getStyled
data Colored = Colors | NoColors
reset :: Console.SGR
reset = Console.Reset
red :: Console.SGR
red = Console.SetColor Console.Foreground Console.Dull Console.Red
magenta :: Console.SGR
magenta = Console.SetColor Console.Foreground Console.Dull Console.Magenta
blue :: Console.SGR
blue = Console.SetColor Console.Foreground Console.Dull Console.Blue
yellow :: Console.SGR
yellow = Console.SetColor Console.Foreground Console.Dull Console.Yellow
green :: Console.SGR
green = Console.SetColor Console.Foreground Console.Dull Console.Green
grey :: Console.SGR
grey = Console.SetColor Console.Foreground Console.Vivid Console.Black
black :: Console.SGR
black = Console.SetColor Console.Foreground Console.Dull Console.White
underlined :: Console.SGR
underlined = Console.SetUnderlining Console.SingleUnderline