module Text.ParserCombinators.PArrow.CharSet where

import Data.Char

-- | Character sets
data CharSet = CS_Any        -- ^ All characters
             | CS_Word       -- ^ alphanum and \'_\'
             | CS_Whitespace -- ^ whitespace
             | CS_Digit      -- ^ digits
             | CS_Alpha      -- ^ Alphabetical
             | CS_Alnum      -- ^ alpha or digit
             | CS_Ascii      -- ^ <=127
             | CS_Lower      -- ^ Lower
             | CS_Upper      -- ^ Upper
               deriving(Eq)

instance Show CharSet where
    show CS_Any        = "."
    show CS_Word       = "\\w"
    show CS_Whitespace = "\\s"
    show CS_Digit      = "\\d"
    show CS_Alpha      = "{alpha}"
    show CS_Alnum      = "{alnum}"
    show CS_Ascii      = "{ascii}"
    show CS_Lower      = "{lower}"
    show CS_Upper      = "{upper}"


-- | List of the Chars contained in a CharSet.
csetValue :: CharSet -> [Char]
csetValue CS_Any = fmap chr [0..255]
csetValue CS_Word       = ('_':csetValue CS_Alnum)
csetValue CS_Whitespace = " \t\r\n"
csetValue CS_Digit      = "0123456789"
csetValue CS_Ascii      = fmap chr [0..127]
csetValue CS_Alpha      = filter isAlpha $ csetValue CS_Any
csetValue CS_Alnum      = csetValue CS_Digit ++ csetValue CS_Alpha
csetValue CS_Lower      = filter isLower $ csetValue CS_Alpha
csetValue CS_Upper      = filter isUpper $ csetValue CS_Alpha