module Rainbow.Types.Generators where

import Data.Monoid.Generators
import qualified Rainbow.Types as T
import Test.QuickCheck
import Control.Monad
import Data.Text.Generators
import Prelude.Generators
import Prelude hiding (last, maybe)


enum8 :: Gen T.Enum8
enum8 = elements [minBound..maxBound]

color8 :: Gen T.Color8
color8 = fmap T.Color8 $ maybe enum8

color256 :: Gen T.Color256
color256 = fmap T.Color256 $ maybe (elements [minBound..maxBound])

background8 :: Gen T.Background8
background8 = last color8

background256 :: Gen T.Background256
background256 = last color256

foreground8 :: Gen T.Foreground8
foreground8 = last color8

foreground256 :: Gen T.Foreground256
foreground256 = last color256

styleCommon :: Gen T.StyleCommon
styleCommon = liftM4 T.StyleCommon g g g g
  where
    g = last arbitrary

style8 :: Gen T.Style8
style8 = liftM3 T.Style8 g g styleCommon
  where
    g = last color8

style256 :: Gen T.Style256
style256 = liftM3 T.Style256 g g styleCommon
  where
    g = last color256

textSpec :: Gen T.TextSpec
textSpec = liftM2 T.TextSpec style8 style256

chunk :: Gen T.Chunk
chunk = liftM2 T.Chunk textSpec (listOf (text arbitrary))