module System.Console.Rainbow.Colors.Shrinkers where

import Test.QuickCheck
import qualified System.Console.Rainbow.Colors as C
import qualified System.Console.Terminfo.Color as TC

color8Named :: [C.Color8]
color8Named =
  [ C.c8_black
  , C.c8_red
  , C.c8_green
  , C.c8_yellow
  , C.c8_blue
  , C.c8_magenta
  , C.c8_cyan
  , C.c8_white
  ]

color256Named :: [C.Color256]
color256Named =
  [ C.c256_black
  , C.c256_red
  , C.c256_green
  , C.c256_yellow
  , C.c256_blue
  , C.c256_magenta
  , C.c256_cyan
  , C.c256_white
  ]

color8 :: C.Color8 -> [C.Color8]
color8 c = case C.unColor8 c of
  Nothing -> []
  Just t -> case t of
    TC.ColorNumber n -> C.c8_default : color8Named ++ rest
      where
        rest = map get . shrinkIntegral $ n
        get i = case lookup i C.c8_all of
          Nothing -> error "color8 shrink failed"
          Just x -> x
    _ -> [C.c8_default]

color256 :: C.Color256 -> [C.Color256]
color256 c = case C.unColor256 c of
  Nothing -> []
  Just t -> case t of
    TC.ColorNumber n -> C.c256_default : color256Named ++ rest
      where
        rest = map get . shrinkIntegral $ n
        get i = case lookup i C.c256_all of
          Nothing -> error "color256 shrink failed"
          Just x -> x
    _ -> [C.c256_default]