{-# OPTIONS_GHC -Wno-incomplete-patterns #-}
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
module Parsley.Char (
satisfy, char, item,
string, token,
oneOf, noneOf,
digit, letter, letterOrDigit
) where
import Prelude hiding (traverse)
import Data.Char (isAlpha, isAlphaNum)
import Data.List (sort)
import Parsley.Applicative (($>), traverse)
import Parsley.Defunctionalized (Defunc(LIFTED, RANGES))
import Parsley.Internal (Parser, makeQ)
import Parsley.ParserOps (satisfy)
import qualified Parsley.Internal as Internal (try)
string :: String -> Parser String
string :: String -> Parser String
string = forall a b. (a -> Parser b) -> [a] -> Parser [b]
traverse Char -> Parser Char
char
oneOf :: [Char] -> Parser Char
oneOf :: String -> Parser Char
oneOf = forall (rep :: Type -> Type).
ParserOps rep =>
rep (Char -> Bool) -> Parser Char
satisfy forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> [(Char, Char)] -> Defunc (Char -> Bool)
RANGES Bool
True forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [(Char, Char)]
ranges
noneOf :: [Char] -> Parser Char
noneOf :: String -> Parser Char
noneOf = forall (rep :: Type -> Type).
ParserOps rep =>
rep (Char -> Bool) -> Parser Char
satisfy forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> [(Char, Char)] -> Defunc (Char -> Bool)
RANGES Bool
False forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [(Char, Char)]
ranges
ranges :: [Char] -> [(Char, Char)]
ranges :: String -> [(Char, Char)]
ranges [] = []
ranges (forall a. Ord a => [a] -> [a]
sort -> Char
c:String
cs) = Char -> Int -> String -> [(Char, Char)]
go Char
c (forall a. Enum a => a -> Int
fromEnum Char
c) String
cs
where
go :: Char -> Int -> [Char] -> [(Char, Char)]
go :: Char -> Int -> String -> [(Char, Char)]
go Char
lower Int
prev [] = [(Char
lower, forall a. Enum a => Int -> a
toEnum Int
prev)]
go Char
lower Int
prev (Char
c:String
cs)
| Int
i <- forall a. Enum a => a -> Int
fromEnum Char
c, Int
i forall a. Eq a => a -> a -> Bool
== Int
prev forall a. Num a => a -> a -> a
+ Int
1 = Char -> Int -> String -> [(Char, Char)]
go Char
lower Int
i String
cs
| Bool
otherwise = (Char
lower, forall a. Enum a => Int -> a
toEnum Int
prev) forall a. a -> [a] -> [a]
: Char -> Int -> String -> [(Char, Char)]
go Char
c (forall a. Enum a => a -> Int
fromEnum Char
c) String
cs
token :: String -> Parser String
token :: String -> Parser String
token = forall a. Parser a -> Parser a
Internal.try forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Parser String
string
char :: Char -> Parser Char
char :: Char -> Parser Char
char Char
c = forall (rep :: Type -> Type).
ParserOps rep =>
rep (Char -> Bool) -> Parser Char
satisfy (Bool -> [(Char, Char)] -> Defunc (Char -> Bool)
RANGES Bool
True [(Char
c, Char
c)]) forall (rep :: Type -> Type) a b.
ParserOps rep =>
Parser a -> rep b -> Parser b
$> forall a. (Show a, Lift a, Typeable a) => a -> Defunc a
LIFTED Char
c
item :: Parser Char
item :: Parser Char
item = forall (rep :: Type -> Type).
ParserOps rep =>
rep (Char -> Bool) -> Parser Char
satisfy (Bool -> [(Char, Char)] -> Defunc (Char -> Bool)
RANGES Bool
False [])
isDigit :: Defunc (Char -> Bool)
isDigit :: Defunc (Char -> Bool)
isDigit = Bool -> [(Char, Char)] -> Defunc (Char -> Bool)
RANGES Bool
True [(Char
'0', Char
'9')]
digit :: Parser Char
digit :: Parser Char
digit = forall (rep :: Type -> Type).
ParserOps rep =>
rep (Char -> Bool) -> Parser Char
satisfy Defunc (Char -> Bool)
isDigit
letter :: Parser Char
letter :: Parser Char
letter = forall (rep :: Type -> Type).
ParserOps rep =>
rep (Char -> Bool) -> Parser Char
satisfy (forall (q :: Type -> Type) a. Quapplicative q => a -> Code a -> q a
makeQ Char -> Bool
isAlpha [||isAlpha||])
letterOrDigit :: Parser Char
letterOrDigit :: Parser Char
letterOrDigit = forall (rep :: Type -> Type).
ParserOps rep =>
rep (Char -> Bool) -> Parser Char
satisfy (forall (q :: Type -> Type) a. Quapplicative q => a -> Code a -> q a
makeQ Char -> Bool
isAlphaNum [||isAlphaNum||])