-----------------------------------------------------------------------------
-- |
-- Module      :  Data.CharSet.Posix.Ascii
-- Copyright   :  (c) Edward Kmett 2010
-- License     :  BSD3
-- Maintainer  :  ekmett@gmail.com
-- Stability   :  experimental
-- Portability :  portable
--
-------------------------------------------------------------------------------

module Data.CharSet.Posix.Ascii
    ( posixAscii
    -- * POSIX ASCII \"classes\"
    , alnum, alpha, blank, cntrl, digit, graph, print, word, punct, space, upper, lower, xdigit
    ) where

import Prelude hiding (print)
import Data.CharSet
import Data.Map (Map)
import qualified Data.Map as Map

alnum, alpha, blank, cntrl, digit, graph, print, word, punct, space, upper, lower, xdigit :: CharSet
alnum = alpha `union` digit
alpha = lower `union` upper
blank = fromList " \t"
cntrl = insert '\x7f' $ range '\x00' '\x1f'
digit = range '0' '9'
lower = range 'a' 'z'
upper = range 'A' 'Z'
graph = range '\x21' '\x7e'
print = insert '\x20' graph
word  = insert '_' alnum
punct = fromList "-!\"#$%&'()*+,./:;<=>?@[\\]^_`{|}~"
space = fromList " \t\r\n\v\f"
xdigit = digit `union` range 'a' 'f' `union` range 'A' 'F'

-- :digit:, etc.
posixAscii :: Map String CharSet
posixAscii = Map.fromList
    [ ("alnum", alnum)
    , ("alpha", alpha)
    , ("blank", blank)
    , ("cntrl", cntrl)
    , ("digit", digit)
    , ("graph", graph) 
    , ("print", print)
    , ("word",  word)
    , ("punct", punct)
    , ("space", space)
    , ("upper", upper)
    , ("lower", lower)
    , ("xdigit", xdigit)
    ]