packages feed

spy-0.13: src/Spy/Color.hs

module Spy.Color (
    green
  , red
  , yellow
  , Color(..)
  , Mode(..)
  , bold
  , ansi
) where

data Color = Black | Blue | Green | Cyan | Purple | Red | Brown |
             LightGray | DarkGray | LightBlue | LightGreen | LightCyan |
             LightRed | LightPurple | Yellow | White deriving (Show, Eq, Ord)

data Mode = Foreground | Background deriving (Show, Eq, Ord)

-- | Return the String wrapped with ANSI escape codes to turn the
-- foreground red
--
-- >>> red "test"
-- "\ESC[0;31mtest\ESC[0m"
green, red, yellow :: String -> String
green = ansi Foreground Green
red = ansi Foreground Red
yellow = ansi Foreground Yellow


-- | Return the given String with ANSI escape codes for bold
-- >>> bold "test"
-- "\ESC[1mtest\ESC[0m"
bold :: String -> String
bold s = "\x1b[1m" ++ s ++ "\x1b[0m"

ansi :: Mode -> Color -> String -> String
ansi m c s = "\x1b["++ toCode m c ++ "m" ++ s ++ "\x1b[0m"



-- |
-- >>> toCode Foreground Green
-- "0;32"
--
-- >>> toCode Background LightPurple
-- "1;45"
toCode :: Mode -> Color -> String
toCode m Black        = asAnsi m 0 0
toCode m Blue         = asAnsi m 0 4
toCode m Green        = asAnsi m 0 2
toCode m Cyan         = asAnsi m 0 6
toCode m Purple       = asAnsi m 0 5
toCode m Red          = asAnsi m 0 1
toCode m Brown        = asAnsi m 0 3
toCode m LightGray    = asAnsi m 0 7
toCode m DarkGray     = asAnsi m 1 0
toCode m LightBlue    = asAnsi m 1 4
toCode m LightGreen   = asAnsi m 1 2
toCode m LightCyan    = asAnsi m 1 6
toCode m LightRed     = asAnsi m 1 1
toCode m LightPurple  = asAnsi m 1 5
toCode m Yellow       = asAnsi m 1 3
toCode m White        = asAnsi m 1 7

asAnsi :: Mode -> Int -> Int -> String
asAnsi Foreground = foreground
asAnsi Background = background

background, foreground :: Int -> Int -> String
foreground l r = show l ++ ";3" ++ show r

background l r = show l ++ ";4" ++ show r