module Text.Ascii
(
IsAscii(..)
, isAscii
, Ascii
, maybeAscii
, ascii
, isControl
, isPrintable
, isWhiteSpace
, isSpaceOrTab
, isLower
, isUpper
, toLower
, toUpper
, isAlpha
, isDigit
, isNzDigit
, isAlphaNum
, fromDigit
, fromNzDigit
, unsafeFromDigit
, isOctDigit
, isNzOctDigit
, fromOctDigit
, fromNzOctDigit
, unsafeFromOctDigit
, isUpHexDigit
, isNzUpHexDigit
, fromUpHexDigit
, fromNzUpHexDigit
, unsafeFromUpHexDigit
, isLowHexDigit
, isNzLowHexDigit
, fromLowHexDigit
, fromNzLowHexDigit
, unsafeFromLowHexDigit
, isHexDigit
, isNzHexDigit
, fromHexDigit
, fromNzHexDigit
, unsafeFromHexDigit
, isControl8
, isPrintable8
, isWhiteSpace8
, isSpaceOrTab8
, isLower8
, isUpper8
, toLower8
, toUpper8
, isAlpha8
, isDigit8
, isNzDigit8
, isAlphaNum8
, fromDigit8
, fromNzDigit8
, unsafeFromDigit8
, isOctDigit8
, isNzOctDigit8
, fromOctDigit8
, fromNzOctDigit8
, unsafeFromOctDigit8
, isUpHexDigit8
, isNzUpHexDigit8
, fromUpHexDigit8
, fromNzUpHexDigit8
, unsafeFromUpHexDigit8
, isLowHexDigit8
, isNzLowHexDigit8
, fromLowHexDigit8
, fromNzLowHexDigit8
, unsafeFromLowHexDigit8
, isHexDigit8
, isNzHexDigit8
, fromHexDigit8
, fromNzHexDigit8
, unsafeFromHexDigit8
) where
import Data.Checked
import Data.Char (ord, chr)
import Data.Word (Word8)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as BL
import qualified Data.Text as TS
import qualified Data.Text.Lazy as TL
data IsAscii = IsAscii
instance Property IsAscii Word8 where
holds _ = (< 128)
instance Property IsAscii BS.ByteString where
holds _ = BS.all isAscii
instance Property IsAscii BL.ByteString where
holds _ = BL.all isAscii
instance Property IsAscii Char where
holds _ = (< 128) . ord
instance Property IsAscii α ⇒ Property IsAscii [α] where
holds _ = all isAscii
instance Property IsAscii TS.Text where
holds _ = TS.all isAscii
instance Property IsAscii TL.Text where
holds _ = TL.all isAscii
isAscii ∷ Property IsAscii v ⇒ v → Bool
isAscii = holds IsAscii
type Ascii α = Checked IsAscii α
maybeAscii ∷ Char → Maybe Word8
maybeAscii c | isAscii c = Just $ ascii c
| otherwise = Nothing
ascii ∷ Char → Word8
ascii = fromIntegral . ord
isControl ∷ Char → Bool
isControl c = w < 32 || w == 127
where w = ord c
isPrintable ∷ Char → Bool
isPrintable c = w >= 32 && w < 127
where w = ord c
isWhiteSpace ∷ Char → Bool
isWhiteSpace c = c == ' ' || (w >= 9 && w <= 13)
where w = ord c
isSpaceOrTab ∷ Char → Bool
isSpaceOrTab c = c == ' ' || c == '\t'
isLower ∷ Char → Bool
isLower c = c >= 'a' && c <= 'z'
isUpper ∷ Char → Bool
isUpper c = c >= 'A' && c <= 'Z'
toLower ∷ Char → Char
toLower c | isUpper c = chr (ord c + 32)
| otherwise = c
toUpper ∷ Char → Char
toUpper c | isLower c = chr (ord c 32)
| otherwise = c
isAlpha ∷ Char → Bool
isAlpha c = isUpper c || isLower c
isDigit ∷ Char → Bool
isDigit c = c >= '0' && c <= '9'
isNzDigit ∷ Char → Bool
isNzDigit c = c >= '1' && c <= '9'
isAlphaNum ∷ Char → Bool
isAlphaNum c = isDigit c || isAlpha c
fromDigit ∷ Num a ⇒ Char → Maybe a
fromDigit c | isDigit c = Just $ unsafeFromDigit c
| otherwise = Nothing
fromNzDigit ∷ Num a ⇒ Char → Maybe a
fromNzDigit c | isNzDigit c = Just $ unsafeFromDigit c
| otherwise = Nothing
unsafeFromDigit ∷ Num a ⇒ Char → a
unsafeFromDigit c = fromIntegral (ord c ord '0')
isOctDigit ∷ Char → Bool
isOctDigit c = c >= '0' && c <= '7'
isNzOctDigit ∷ Char → Bool
isNzOctDigit c = c >= '1' && c <= '7'
fromOctDigit ∷ Num a ⇒ Char → Maybe a
fromOctDigit c | isOctDigit c = Just $ unsafeFromOctDigit c
| otherwise = Nothing
fromNzOctDigit ∷ Num a ⇒ Char → Maybe a
fromNzOctDigit c | isNzOctDigit c = Just $ unsafeFromOctDigit c
| otherwise = Nothing
unsafeFromOctDigit ∷ Num a ⇒ Char → a
unsafeFromOctDigit = unsafeFromDigit
isLowAF ∷ Char → Bool
isLowAF c = c >= 'a' && c <= 'f'
fromLowAF ∷ Num a ⇒ Char → a
fromLowAF c = fromIntegral (ord c ord 'a' + 10)
isLowHexDigit ∷ Char → Bool
isLowHexDigit c = isDigit c || isLowAF c
isNzLowHexDigit ∷ Char → Bool
isNzLowHexDigit c = isNzDigit c || isLowAF c
fromLowHexDigit ∷ Num a ⇒ Char → Maybe a
fromLowHexDigit c | isDigit c = Just $ unsafeFromDigit c
| isLowAF c = Just $ fromLowAF c
| otherwise = Nothing
fromNzLowHexDigit ∷ Num a ⇒ Char → Maybe a
fromNzLowHexDigit c | isNzDigit c = Just $ unsafeFromDigit c
| isLowAF c = Just $ fromLowAF c
| otherwise = Nothing
unsafeFromLowHexDigit ∷ Num a ⇒ Char → a
unsafeFromLowHexDigit c | c < 'a' = unsafeFromDigit c
| otherwise = fromLowAF c
isUpAF ∷ Char → Bool
isUpAF c = c >= 'A' && c <= 'F'
fromUpAF ∷ Num a ⇒ Char → a
fromUpAF c = fromIntegral (ord c ord 'A' + 10)
isUpHexDigit ∷ Char → Bool
isUpHexDigit c = isDigit c || isUpAF c
isNzUpHexDigit ∷ Char → Bool
isNzUpHexDigit c = isNzDigit c || isUpAF c
fromUpHexDigit ∷ Num a ⇒ Char → Maybe a
fromUpHexDigit c | isDigit c = Just $ unsafeFromDigit c
| isUpAF c = Just $ fromUpAF c
| otherwise = Nothing
fromNzUpHexDigit ∷ Num a ⇒ Char → Maybe a
fromNzUpHexDigit c | isNzDigit c = Just $ unsafeFromDigit c
| isUpAF c = Just $ fromUpAF c
| otherwise = Nothing
unsafeFromUpHexDigit ∷ Num a ⇒ Char → a
unsafeFromUpHexDigit c | c < 'A' = unsafeFromDigit c
| otherwise = fromUpAF c
isHexDigit ∷ Char → Bool
isHexDigit c = isDigit c || isUpAF c || isLowAF c
isNzHexDigit ∷ Char → Bool
isNzHexDigit c = isNzDigit c || isUpAF c || isLowAF c
fromHexDigit ∷ Num a ⇒ Char → Maybe a
fromHexDigit c | isDigit c = Just $ unsafeFromDigit c
| isUpAF c = Just $ fromUpAF c
| isLowAF c = Just $ fromLowAF c
| otherwise = Nothing
fromNzHexDigit ∷ Num a ⇒ Char → Maybe a
fromNzHexDigit c | isNzDigit c = Just $ unsafeFromDigit c
| isUpAF c = Just $ fromUpAF c
| isLowAF c = Just $ fromLowAF c
| otherwise = Nothing
unsafeFromHexDigit ∷ Num a ⇒ Char → a
unsafeFromHexDigit c | c < 'A' = unsafeFromDigit c
| c < 'a' = fromUpAF c
| otherwise = fromLowAF c
isControl8 ∷ Word8 → Bool
isControl8 w = w < 32 || w == 127
isPrintable8 ∷ Word8 → Bool
isPrintable8 w = w >= 32 && w < 127
isWhiteSpace8 ∷ Word8 → Bool
isWhiteSpace8 w = w == ascii ' ' || w >= 9 && w <= 13
isSpaceOrTab8 ∷ Word8 → Bool
isSpaceOrTab8 w = w == ascii ' ' || w == ascii '\t'
isLower8 ∷ Word8 → Bool
isLower8 w = w >= ascii 'a' && w <= ascii 'z'
isUpper8 ∷ Word8 → Bool
isUpper8 w = w >= ascii 'A' && w <= ascii 'Z'
toLower8 ∷ Word8 → Word8
toLower8 w | isUpper8 w = w + 32
| otherwise = w
toUpper8 ∷ Word8 → Word8
toUpper8 w | isLower8 w = w 32
| otherwise = w
isAlpha8 ∷ Word8 → Bool
isAlpha8 w = isUpper8 w || isLower8 w
isDigit8 ∷ Word8 → Bool
isDigit8 w = w >= ascii '0' && w <= ascii '9'
isNzDigit8 ∷ Word8 → Bool
isNzDigit8 w = w >= ascii '1' && w <= ascii '9'
isAlphaNum8 ∷ Word8 → Bool
isAlphaNum8 w = isDigit8 w || isAlpha8 w
fromDigit8 ∷ Num a ⇒ Word8 → Maybe a
fromDigit8 w | isDigit8 w = Just $ unsafeFromDigit8 w
| otherwise = Nothing
fromNzDigit8 ∷ Num a ⇒ Word8 → Maybe a
fromNzDigit8 w | isNzDigit8 w = Just $ unsafeFromDigit8 w
| otherwise = Nothing
unsafeFromDigit8 ∷ Num a ⇒ Word8 → a
unsafeFromDigit8 w = fromIntegral (w ascii '0')
isOctDigit8 ∷ Word8 → Bool
isOctDigit8 w = w >= ascii '0' && w <= ascii '7'
isNzOctDigit8 ∷ Word8 → Bool
isNzOctDigit8 w = w >= ascii '1' && w <= ascii '7'
fromOctDigit8 ∷ Num a ⇒ Word8 → Maybe a
fromOctDigit8 w | isOctDigit8 w = Just $ unsafeFromOctDigit8 w
| otherwise = Nothing
fromNzOctDigit8 ∷ Num a ⇒ Word8 → Maybe a
fromNzOctDigit8 w | isNzOctDigit8 w = Just $ unsafeFromOctDigit8 w
| otherwise = Nothing
unsafeFromOctDigit8 ∷ Num a ⇒ Word8 → a
unsafeFromOctDigit8 = unsafeFromDigit8
isLowAF8 ∷ Word8 → Bool
isLowAF8 w = w >= ascii 'a' && w <= ascii 'f'
fromLowAF8 ∷ Num a ⇒ Word8 → a
fromLowAF8 w = fromIntegral (w ascii 'a' + 10)
isLowHexDigit8 ∷ Word8 → Bool
isLowHexDigit8 w = isDigit8 w || isLowAF8 w
isNzLowHexDigit8 ∷ Word8 → Bool
isNzLowHexDigit8 w = isNzDigit8 w || isLowAF8 w
fromLowHexDigit8 ∷ Num a ⇒ Word8 → Maybe a
fromLowHexDigit8 w | isDigit8 w = Just $ unsafeFromDigit8 w
| isLowAF8 w = Just $ fromLowAF8 w
| otherwise = Nothing
fromNzLowHexDigit8 ∷ Num a ⇒ Word8 → Maybe a
fromNzLowHexDigit8 w | isNzDigit8 w = Just $ unsafeFromDigit8 w
| isLowAF8 w = Just $ fromLowAF8 w
| otherwise = Nothing
unsafeFromLowHexDigit8 ∷ Num a ⇒ Word8 → a
unsafeFromLowHexDigit8 w | w < ascii 'a' = unsafeFromDigit8 w
| otherwise = fromLowAF8 w
isUpAF8 ∷ Word8 → Bool
isUpAF8 w = w >= ascii 'A' && w <= ascii 'F'
fromUpAF8 ∷ Num a ⇒ Word8 → a
fromUpAF8 w = fromIntegral (w ascii 'A' + 10)
isUpHexDigit8 ∷ Word8 → Bool
isUpHexDigit8 w = isDigit8 w || isUpAF8 w
isNzUpHexDigit8 ∷ Word8 → Bool
isNzUpHexDigit8 w = isNzDigit8 w || isUpAF8 w
fromUpHexDigit8 ∷ Num a ⇒ Word8 → Maybe a
fromUpHexDigit8 w | isDigit8 w = Just $ unsafeFromDigit8 w
| isUpAF8 w = Just $ fromUpAF8 w
| otherwise = Nothing
fromNzUpHexDigit8 ∷ Num a ⇒ Word8 → Maybe a
fromNzUpHexDigit8 w | isNzDigit8 w = Just $ unsafeFromDigit8 w
| isUpAF8 w = Just $ fromUpAF8 w
| otherwise = Nothing
unsafeFromUpHexDigit8 ∷ Num a ⇒ Word8 → a
unsafeFromUpHexDigit8 w | w < ascii 'A' = unsafeFromDigit8 w
| otherwise = fromUpAF8 w
isHexDigit8 ∷ Word8 → Bool
isHexDigit8 w = isDigit8 w || isUpAF8 w || isLowAF8 w
isNzHexDigit8 ∷ Word8 → Bool
isNzHexDigit8 w = isNzDigit8 w || isUpAF8 w || isLowAF8 w
fromHexDigit8 ∷ Num a ⇒ Word8 → Maybe a
fromHexDigit8 w | isDigit8 w = Just $ unsafeFromDigit8 w
| isUpAF8 w = Just $ fromUpAF8 w
| isLowAF8 w = Just $ fromLowAF8 w
| otherwise = Nothing
fromNzHexDigit8 ∷ Num a ⇒ Word8 → Maybe a
fromNzHexDigit8 w | isNzDigit8 w = Just $ unsafeFromDigit8 w
| isUpAF8 w = Just $ fromUpAF8 w
| isLowAF8 w = Just $ fromLowAF8 w
| otherwise = Nothing
unsafeFromHexDigit8 ∷ Num a ⇒ Word8 → a
unsafeFromHexDigit8 w | w < ascii 'A' = unsafeFromDigit8 w
| w < ascii 'a' = fromUpAF8 w
| otherwise = fromLowAF8 w