module Char (
isAscii, isControl, isPrint, isSpace, isUpper, isLower,
isAlpha, isDigit, isHexDigit, isAlphanum, toUpper, toLower ) where
isAscii, isControl, isPrint, isSpace, isUpper,
isLower, isAlpha, isDigit, isHexDigit, isAlphanum :: Char -> Bool
toUpper, toLower :: Char -> Char
|
These utilities are self-documenting.
module Char (
isAscii, isControl, isPrint, isSpace, isUpper, isLower,
isAlpha, isDigit, isHexDigit, isAlphanum, toUpper, toLower ) where
isAscii, isControl, isPrint, isSpace, isUpper,
isLower, isAlpha, isDigit, isHexDigit, isAlphanum :: Char -> Bool
isAscii c = fromEnum c < 128
isControl c = c < ' ' || c >= '\DEL' && c <= '\x9f'
isPrint c = not (isControl c)
-- This includes non-breaking space
isSpace c = c `elem` " \t\n\r\f\v\xa0"
-- The upper case ISO characters have the multiplication sign dumped
-- randomly in the middle of the range. Go figure.
isUpper c = c >= 'A' && c <= 'Z' ||
c >= '\xC0' && c <= '\xD6' ||
c >= '\xD8' && c <= '\xDE'
-- The lower case ISO characters have the division sign dumped
-- randomly in the middle of the range. Go figure.
isLower c = c >= 'a' && c <= 'z' ||
c >= '\xDF' && c <= '\xF6' ||
c >= '\xF8' && c <= '\xFF'
isAlpha c = isUpper c || isLower c
isDigit c = c >= '0' && c <= '9'
isHexDigit c = isDigit c || c >= 'A' && c <= 'F' ||
c >= 'a' && c <= 'f'
isAlphanum c = isAlpha c || isDigit c
-- These almost work for ISO-Latin-1 (except for =DF <-> =FF)
toUpper, toLower :: Char -> Char
toUpper c | isLower c = toEnum (fromEnum c - fromEnum 'a'
+ fromEnum 'A')
| otherwise = c
toLower c | isUpper c = toEnum (fromEnum c - fromEnum 'A'
+ fromEnum 'a')
| otherwise = c