    -----------------------------------------------------------------------------
    -- |
    -- 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
        , lookupPosixAsciiCharSet
        -- * Traditional POSIX ASCII \"classes\"
        , alnum, alpha, ascii, blank, cntrl, digit, graph, print, word, punct, space, upper, lower, xdigit
        ) where

    import Prelude hiding (print)
    import Data.Char
    import Data.CharSet
    import Data.HashMap.Lazy (HashMap)
    import qualified Data.HashMap.Lazy as HashMap

    alnum, alpha, ascii, blank, cntrl, digit, graph, print, word, punct, space, upper, lower, xdigit :: CharSet
    alnum = alpha `union` digit
    alpha = lower `union` upper
    ascii = range '\x00' '\x7f'
    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 :: HashMap String CharSet
    posixAscii = HashMap.fromList
        [ ("alnum", alnum)
        , ("alpha", alpha)
        , ("ascii", ascii)
        , ("blank", blank)
        , ("cntrl", cntrl)
        , ("digit", digit)
        , ("graph", graph)
        , ("print", print)
        , ("word",  word)
        , ("punct", punct)
        , ("space", space)
        , ("upper", upper)
        , ("lower", lower)
        , ("xdigit", xdigit)
        ]

    lookupPosixAsciiCharSet :: String -> Maybe CharSet
    lookupPosixAsciiCharSet s = HashMap.lookup (Prelude.map toLower s) posixAscii