{-|
  This module can color some Text to be displayed in a terminal
-}
module Data.Text.Color where

import Protolude

-- | Available ASCII colors
data Color =
  Black | Red | Green | Yellow | Blue | Magenta | Cyan | White deriving (Color -> Color -> Bool
(Color -> Color -> Bool) -> (Color -> Color -> Bool) -> Eq Color
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Color -> Color -> Bool
$c/= :: Color -> Color -> Bool
== :: Color -> Color -> Bool
$c== :: Color -> Color -> Bool
Eq, Int -> Color -> ShowS
[Color] -> ShowS
Color -> String
(Int -> Color -> ShowS)
-> (Color -> String) -> ([Color] -> ShowS) -> Show Color
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Color] -> ShowS
$cshowList :: [Color] -> ShowS
show :: Color -> String
$cshow :: Color -> String
showsPrec :: Int -> Color -> ShowS
$cshowsPrec :: Int -> Color -> ShowS
Show)

-- | Surround a piece of text with ASCII control characters to color it
colorAs :: Color -> Text -> Text
colorAs :: Color -> Text -> Text
colorAs Color
c Text
t =  Text
"\x1b[" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Color -> Text
forall {a}. IsString a => Color -> a
code Color
c Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"m" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
t Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"\x1b[0m"
  where
    code :: Color -> a
code Color
Black = a
"30"
    code Color
Red = a
"31"
    code Color
Green = a
"32"
    code Color
Yellow = a
"33"
    code Color
Blue = a
"34"
    code Color
Magenta = a
"35"
    code Color
Cyan = a
"36"
    code Color
White = a
"37"