{-|
    Stability   :  provisional
    Portability :  haskell98

    Simplistic ANSI color support.
-}

module AnsiColor
  ( Color(..)
  , bold
  , inColor
  ) where

import Data.List

data Color  =  Black
            |  Red
            |  Green
            |  Yellow
            |  Blue
            |  Magenta
            |  Cyan
            |  White
            |  Default
  deriving Int -> Color
Color -> Int
Color -> [Color]
Color -> Color
Color -> Color -> [Color]
Color -> Color -> Color -> [Color]
(Color -> Color)
-> (Color -> Color)
-> (Int -> Color)
-> (Color -> Int)
-> (Color -> [Color])
-> (Color -> Color -> [Color])
-> (Color -> Color -> [Color])
-> (Color -> Color -> Color -> [Color])
-> Enum Color
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Color -> Color -> Color -> [Color]
$cenumFromThenTo :: Color -> Color -> Color -> [Color]
enumFromTo :: Color -> Color -> [Color]
$cenumFromTo :: Color -> Color -> [Color]
enumFromThen :: Color -> Color -> [Color]
$cenumFromThen :: Color -> Color -> [Color]
enumFrom :: Color -> [Color]
$cenumFrom :: Color -> [Color]
fromEnum :: Color -> Int
$cfromEnum :: Color -> Int
toEnum :: Int -> Color
$ctoEnum :: Int -> Color
pred :: Color -> Color
$cpred :: Color -> Color
succ :: Color -> Color
$csucc :: Color -> Color
Enum

esc :: [String] -> String
esc :: [String] -> String
esc []  =  String
""
esc [String]
xs  =  String
"\ESC[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ (String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
";" [String]
xs) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"m"

col :: Color -> Bool -> Color -> [String]
col :: Color -> Bool -> Color -> [String]
col Color
fg Bool
bf Color
bg = Int -> String
forall a. Show a => a -> String
show (Color -> Int
forall a. Enum a => a -> Int
fromEnum Color
fg Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
30) String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String] -> [String]
bf' [Int -> String
forall a. Show a => a -> String
show (Color -> Int
forall a. Enum a => a -> Int
fromEnum Color
bg Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
40)]
  where bf' :: [String] -> [String]
bf' | Bool
bf         =  (String
"01" String -> [String] -> [String]
forall a. a -> [a] -> [a]
:)
            | Bool
otherwise  =  [String] -> [String]
forall a. a -> a
id

inColor :: Color -> Bool -> Color -> String -> String
inColor :: Color -> Bool -> Color -> String -> String
inColor Color
c Bool
bf Color
bg String
txt = [String] -> String
esc (Color -> Bool -> Color -> [String]
col Color
c Bool
bf Color
bg) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
txt String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
esc [String
"00"]

bold :: String -> String
bold :: String -> String
bold = String -> String -> String -> String
ansi String
"1" String
"22"
-- italic    = ansi "3" "23"
-- underline = ansi "4" "24"
-- inverse   = ansi "7" "27"

ansi :: String -> String -> String -> String
ansi :: String -> String -> String -> String
ansi String
on String
off String
txt = [String] -> String
esc [String
on] String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
txt String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
esc [String
off]