packages feed

rainbow-0.32.0.0: tests/test8color.hs

module Main where

import Control.Arrow (second)
import Data.Function ((&))
import Rainbow
import qualified Data.ByteString as BS

effects :: [(String, Chunk a -> Chunk a)]
effects =
  [ ("bold", bold)
  , ("faint", faint)
  , ("italic", italic)
  , ("underline", underline)
  , ("blink", blink)
  , ("inverse", inverse)
  , ("invisible", invisible)
  , ("strikeout", strikeout)
  ]

colors :: [(String, Radiant)]
colors =
  [ ("(no color)", mempty)
  , ("black", black)
  , ("red", red)
  , ("green", green)
  , ("yellow", yellow)
  , ("blue", blue)
  , ("magenta", magenta)
  , ("cyan", cyan)
  , ("white", white)
  ]

maybeEffects :: [(String, Maybe (Chunk a -> Chunk a))]
maybeEffects = ("(no effect)", Nothing)
  : map (second Just) effects

{-
-- From
-- http://stackoverflow.com/a/22577148/1017252
combinations :: Int -> [a] -> [[a]]
combinations k xs = combinations' (length xs) k xs
  where combinations' n k' l@(y:ys)
          | k' == 0   = [[]]
          | k' >= n   = [l]
          | null l    = []
          | otherwise = map (y :) (combinations' (n - 1) (k' - 1) ys)
                            ++ combinations' (n - 1) k' ys 
-}

colorsAndEffects :: [[Chunk String]]
colorsAndEffects = do
  (fgColorName, fgColor) <- colors
  (bgColorName, bgColor) <- colors
  (effectName, mayEffect) <- maybeEffects
  let lbl = "foreground " ++ fgColorName ++ " background " ++ bgColorName
          ++ " effect " ++ effectName
  return $ [ chunk lbl & fore fgColor
             & back bgColor
             & maybe id id mayEffect
           , chunk "\n"
           ]

main :: IO ()
main
  = mapM_ BS.putStr
  . chunksToByteStrings toByteStringsColors8
  . concat
  $ colorsAndEffects