{-# LANGUAGE RankNTypes #-}
module Text.Cassette.Char where
import Control.Category ((.))
import Data.Char
import Prelude hiding ((.))
import Text.Cassette.Combinator
import Text.Cassette.Prim
oneOf :: [Char] -> PP Char
oneOf :: [Char] -> PP Char
oneOf [Char]
xs = (Char -> Bool) -> PP Char
satisfy (Char -> [Char] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Char]
xs)
noneOf :: [Char] -> PP Char
noneOf :: [Char] -> PP Char
noneOf [Char]
xs = (Char -> Bool) -> PP Char
satisfy (Bool -> Bool
not (Bool -> Bool) -> (Char -> Bool) -> Char -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Char -> [Char] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Char]
xs))
skip :: (Char -> Bool) -> Char -> PP0
skip :: (Char -> Bool) -> Char -> PP0
skip Char -> Bool
p Char
x = Char -> PP Char -> PP0
forall a. a -> PP a -> PP0
unset Char
x (PP Char -> PP0) -> PP Char -> PP0
forall a b. (a -> b) -> a -> b
$ (Char -> Bool) -> PP Char
satisfy Char -> Bool
p
skipSpace :: PP0
skipSpace :: PP0
skipSpace = [Char] -> PP [Char] -> PP0
forall a. a -> PP a -> PP0
unset [Char]
"" (PP [Char] -> PP0) -> PP [Char] -> PP0
forall a b. (a -> b) -> a -> b
$ PP Char -> PP [Char]
forall a. PP a -> PP [a]
many ((Char -> Bool) -> PP Char
satisfy Char -> Bool
isSpace)
optSpace :: PP0
optSpace :: PP0
optSpace = [Char] -> PP [Char] -> PP0
forall a. a -> PP a -> PP0
unset [Char]
" " (PP [Char] -> PP0) -> PP [Char] -> PP0
forall a b. (a -> b) -> a -> b
$ PP Char -> PP [Char]
forall a. PP a -> PP [a]
many ((Char -> Bool) -> PP Char
satisfy Char -> Bool
isSpace)
sepSpace :: PP0
sepSpace :: PP0
sepSpace = K7 Tr r r
PP0
space K7 Tr r r -> K7 Tr r r -> K7 Tr r r
forall b c a. K7 Tr b c -> K7 Tr a b -> K7 Tr a c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. K7 Tr r r
PP0
skipSpace
space :: PP0
space :: PP0
space = Char -> PP0
char Char
' '
newline :: PP0
newline :: PP0
newline = Char -> PP0
char Char
'\n'
tab :: PP0
tab :: PP0
tab = Char -> PP0
char Char
'\t'
upper, lower, alphaNum, letter, digit, hexDigit, octDigit, anyChar :: PP Char
upper :: PP Char
upper = (Char -> Bool) -> PP Char
satisfy Char -> Bool
isUpper
lower :: PP Char
lower = (Char -> Bool) -> PP Char
satisfy Char -> Bool
isLower
alphaNum :: PP Char
alphaNum = (Char -> Bool) -> PP Char
satisfy Char -> Bool
isAlphaNum
letter :: PP Char
letter = (Char -> Bool) -> PP Char
satisfy Char -> Bool
isAlpha
digit :: PP Char
digit = (Char -> Bool) -> PP Char
satisfy Char -> Bool
isDigit
hexDigit :: PP Char
hexDigit = (Char -> Bool) -> PP Char
satisfy Char -> Bool
isHexDigit
octDigit :: PP Char
octDigit = (Char -> Bool) -> PP Char
satisfy Char -> Bool
isOctDigit
anyChar :: PP Char
anyChar = (Char -> Bool) -> PP Char
satisfy (Bool -> Char -> Bool
forall a b. a -> b -> a
const Bool
True)
char :: Char -> PP0
char :: Char -> PP0
char Char
x = [Char] -> PP0
string [Char
x]