{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Data.IMF.Syntax
(
ci
, CI
, mk
, original
, wsp
, fws
, optionalFWS
, optionalCFWS
, crlf
, vchar
, word
, quotedString
, dotAtomText
, dotAtom
, localPart
, domainLiteral
, IsChar(..)
, char
, CharParsing(..)
, SM
, isAtext
, isQtext
, isVchar
, isWsp
, (<<>>)
, foldMany
, foldMany1
, foldMany1Sep
, skipTill
, takeTill'
, skipTillString
, takeTillString
) where
import Prelude hiding (takeWhile)
import Control.Applicative ((<|>), Alternative, liftA2, many, optional, some)
import Control.Monad (void)
import qualified Data.Attoparsec.ByteString as A
import qualified Data.Attoparsec.Internal as A
import qualified Data.Attoparsec.Internal.Types as AT
import qualified Data.Attoparsec.Text as AText
import qualified Data.ByteString as B
import Data.ByteString.Internal (c2w, w2c)
import Data.ByteString.Search (indices)
import Data.CaseInsensitive (CI, FoldCase, mk, original)
import Data.Char (chr)
import Data.Foldable (fold)
import Data.Functor (($>))
import Data.List.NonEmpty (NonEmpty, fromList, intersperse)
import Data.Semigroup.Foldable (fold1)
import qualified Data.Text as T
import Data.Word (Word8)
type SM a = Monoid a
class IsChar a where
toChar :: a -> Char
fromChar :: Char -> a
instance IsChar Char where
toChar :: Char -> Char
toChar = Char -> Char
forall a. a -> a
id
fromChar :: Char -> Char
fromChar = Char -> Char
forall a. a -> a
id
instance IsChar Word8 where
toChar :: Word8 -> Char
toChar = Word8 -> Char
w2c
fromChar :: Char -> Word8
fromChar = Char -> Word8
c2w
class IsChar a => CharParsing f s a | s -> a, a -> f s where
singleton :: Char -> s
satisfy :: (Char -> Bool) -> (f s) a
takeWhile :: (Char -> Bool) -> (f s) s
takeWhile1 :: (Char -> Bool) -> (f s) s
instance CharParsing AT.Parser B.ByteString Word8 where
singleton :: Char -> ByteString
singleton = Word8 -> ByteString
B.singleton (Word8 -> ByteString) -> (Char -> Word8) -> Char -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Word8
c2w
satisfy :: (Char -> Bool) -> Parser ByteString Word8
satisfy Char -> Bool
f = (Word8 -> Bool) -> Parser ByteString Word8
A.satisfy (Char -> Bool
f (Char -> Bool) -> (Word8 -> Char) -> Word8 -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Char
w2c)
takeWhile :: (Char -> Bool) -> Parser ByteString ByteString
takeWhile Char -> Bool
f = (Word8 -> Bool) -> Parser ByteString ByteString
A.takeWhile (Char -> Bool
f (Char -> Bool) -> (Word8 -> Char) -> Word8 -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Char
w2c)
takeWhile1 :: (Char -> Bool) -> Parser ByteString ByteString
takeWhile1 Char -> Bool
f = (Word8 -> Bool) -> Parser ByteString ByteString
A.takeWhile1 (Char -> Bool
f (Char -> Bool) -> (Word8 -> Char) -> Word8 -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Char
w2c)
instance CharParsing AT.Parser T.Text Char where
singleton :: Char -> Text
singleton = Char -> Text
T.singleton
satisfy :: (Char -> Bool) -> Parser Text Char
satisfy = (Char -> Bool) -> Parser Text Char
AText.satisfy
takeWhile :: (Char -> Bool) -> Parser Text Text
takeWhile = (Char -> Bool) -> Parser Text Text
AText.takeWhile
takeWhile1 :: (Char -> Bool) -> Parser Text Text
takeWhile1 = (Char -> Bool) -> Parser Text Text
AText.takeWhile1
char :: CharParsing f s a => Char -> (f s) a
char :: Char -> f s a
char Char
c = (Char -> Bool) -> f s a
forall (f :: * -> * -> *) s a.
CharParsing f s a =>
(Char -> Bool) -> f s a
satisfy (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
c)
isWsp :: IsChar c => c -> Bool
isWsp :: c -> Bool
isWsp = String -> Char -> Bool
AText.inClass String
"\t " (Char -> Bool) -> (c -> Char) -> c -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. c -> Char
forall a. IsChar a => a -> Char
toChar
wsp :: CharParsing f s a => (f s) a
wsp :: f s a
wsp = (Char -> Bool) -> f s a
forall (f :: * -> * -> *) s a.
CharParsing f s a =>
(Char -> Bool) -> f s a
satisfy Char -> Bool
forall c. IsChar c => c -> Bool
isWsp
isVchar :: IsChar c => c -> Bool
isVchar :: c -> Bool
isVchar c
c =
let c' :: Char
c' = c -> Char
forall a. IsChar a => a -> Char
toChar c
c
in Char
c' Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Int -> Char
chr Int
0x21 Bool -> Bool -> Bool
&& Char
c' Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Int -> Char
chr Int
0x7e
vchar :: CharParsing f s a => (f s) a
vchar :: f s a
vchar = (Char -> Bool) -> f s a
forall (f :: * -> * -> *) s a.
CharParsing f s a =>
(Char -> Bool) -> f s a
satisfy Char -> Bool
forall c. IsChar c => c -> Bool
isVchar
dquote :: CharParsing f s a => (f s) a
dquote :: f s a
dquote = Char -> f s a
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> f s a
char Char
'"'
quotedPair :: (Alternative (f s)) => CharParsing f s a => (f s) a
quotedPair :: f s a
quotedPair = Char -> f s a
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> f s a
char Char
'\\' f s a -> f s a -> f s a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (f s a
forall (f :: * -> * -> *) s a. CharParsing f s a => f s a
vchar f s a -> f s a -> f s a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> f s a
forall (f :: * -> * -> *) s a. CharParsing f s a => f s a
wsp)
isQtext :: IsChar c => c -> Bool
isQtext :: c -> Bool
isQtext c
c' =
let c :: Char
c = c -> Char
forall a. IsChar a => a -> Char
toChar c
c'
in
Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Int -> Char
chr Int
33
Bool -> Bool -> Bool
|| (Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Int -> Char
chr Int
35 Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Int -> Char
chr Int
91)
Bool -> Bool -> Bool
|| (Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Int -> Char
chr Int
93 Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Int -> Char
chr Int
126)
quotedString :: (Alternative (f s), CharParsing f s a, SM s) => (f s) s
quotedString :: f s s
quotedString =
f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
optionalCFWS f s s -> f s a -> f s a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> f s a
forall (f :: * -> * -> *) s a. CharParsing f s a => f s a
dquote
f s a -> f s s -> f s s
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> f s s -> f s s
forall m (f :: * -> *). (Monoid m, Alternative f) => f m -> f m
foldMany (f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
optionalFWS f s s -> f s s -> f s s
forall m (f :: * -> *).
(Semigroup m, Applicative f) =>
f m -> f m -> f m
<<>> f s s
qcontent) f s s -> f s s -> f s s
forall m (f :: * -> *).
(Semigroup m, Applicative f) =>
f m -> f m -> f m
<<>> f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
optionalFWS
f s s -> f s a -> f s s
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* f s a
forall (f :: * -> * -> *) s a. CharParsing f s a => f s a
dquote f s s -> f s s -> f s s
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
optionalCFWS
where
qcontent :: f s s
qcontent =
(Char -> s
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> s
singleton (Char -> s) -> (a -> Char) -> a -> s
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Char
forall a. IsChar a => a -> Char
toChar (a -> s) -> f s a -> f s s
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Char -> Bool) -> f s a
forall (f :: * -> * -> *) s a.
CharParsing f s a =>
(Char -> Bool) -> f s a
satisfy Char -> Bool
forall c. IsChar c => c -> Bool
isQtext)
f s s -> f s s -> f s s
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Char -> s
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> s
singleton (Char -> s) -> (a -> Char) -> a -> s
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Char
forall a. IsChar a => a -> Char
toChar (a -> s) -> f s a -> f s s
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f s a
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a) =>
f s a
quotedPair)
isAtext :: IsChar c => c -> Bool
isAtext :: c -> Bool
isAtext = String -> Char -> Bool
AText.inClass String
"-A-Za-z0-9!#$%&'*+/=?^_`{|}~" (Char -> Bool) -> (c -> Char) -> c -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. c -> Char
forall a. IsChar a => a -> Char
toChar
atext :: CharParsing f s a => (f s) a
atext :: f s a
atext = (Char -> Bool) -> f s a
forall (f :: * -> * -> *) s a.
CharParsing f s a =>
(Char -> Bool) -> f s a
satisfy Char -> Bool
forall c. IsChar c => c -> Bool
isAtext
crlf :: (Alternative (f s)) => CharParsing f s a => (f s) ()
crlf :: f s ()
crlf = f s a -> f s ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ((Char -> f s a
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> f s a
char Char
'\r' f s a -> f s a -> f s a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> f s a
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> f s a
char Char
'\n') f s a -> f s a -> f s a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Char -> f s a
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> f s a
char Char
'\n')
fws :: (Alternative (f s), CharParsing f s a) => (f s) s
fws :: f s s
fws =
f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a) =>
f s s
obsFWS
f s s -> f s s -> f s s
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
f s () -> f s (Maybe ())
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional ((Char -> Bool) -> f s s
forall (f :: * -> * -> *) s a.
CharParsing f s a =>
(Char -> Bool) -> f s s
takeWhile Char -> Bool
forall c. IsChar c => c -> Bool
isWsp f s s -> f s () -> f s ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> f s ()
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a) =>
f s ()
crlf) f s (Maybe ()) -> f s s -> f s s
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (Char -> Bool) -> f s s
forall (f :: * -> * -> *) s a.
CharParsing f s a =>
(Char -> Bool) -> f s s
takeWhile1 Char -> Bool
forall c. IsChar c => c -> Bool
isWsp f s s -> s -> f s s
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Char -> s
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> s
singleton Char
' '
obsFWS :: (Alternative (f s), CharParsing f s a) => (f s) s
obsFWS :: f s s
obsFWS = f s a -> f s [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
some (f s () -> f s (Maybe ())
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional f s ()
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a) =>
f s ()
crlf f s (Maybe ()) -> f s a -> f s a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> f s a
forall (f :: * -> * -> *) s a. CharParsing f s a => f s a
wsp) f s [a] -> s -> f s s
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Char -> s
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> s
singleton Char
' '
optionalFWS :: (Alternative (f s), CharParsing f s a, Monoid s) => (f s) s
optionalFWS :: f s s
optionalFWS = f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a) =>
f s s
fws f s s -> f s s -> f s s
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> s -> f s s
forall (f :: * -> *) a. Applicative f => a -> f a
pure s
forall a. Monoid a => a
mempty
isCtext :: Char -> Bool
isCtext :: Char -> Bool
isCtext Char
c =
Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Int -> Char
chr Int
33 Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Int -> Char
chr Int
39
Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Int -> Char
chr Int
42 Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Int -> Char
chr Int
91
Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Int -> Char
chr Int
93 Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Int -> Char
chr Int
126
ccontent :: (Alternative (f s), CharParsing f s a, SM s) => (f s) s
ccontent :: f s s
ccontent = (Char -> s
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> s
singleton (Char -> s) -> (a -> Char) -> a -> s
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Char
forall a. IsChar a => a -> Char
toChar (a -> s) -> f s a -> f s s
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Char -> Bool) -> f s a
forall (f :: * -> * -> *) s a.
CharParsing f s a =>
(Char -> Bool) -> f s a
satisfy Char -> Bool
isCtext) f s s -> f s s -> f s s
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
comment
comment :: (Alternative (f s), CharParsing f s a, SM s) => (f s) s
=
Char -> f s a
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> f s a
char Char
'(' f s a -> f s s -> f s s
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> f s s -> f s s
forall m (f :: * -> *). (Monoid m, Alternative f) => f m -> f m
foldMany (f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
optionalFWS f s s -> f s s -> f s s
forall m (f :: * -> *).
(Semigroup m, Applicative f) =>
f m -> f m -> f m
<<>> f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
ccontent) f s s -> f s s -> f s s
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
optionalFWS f s s -> f s a -> f s s
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> f s a
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> f s a
char Char
')'
cfws :: (Alternative (f s), CharParsing f s a, SM s) => (f s) s
cfws :: f s s
cfws =
((f s s -> f s s
forall m (f :: * -> *). (Semigroup m, Alternative f) => f m -> f m
foldMany1 (f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
optionalFWS f s s -> f s s -> f s s
forall m (f :: * -> *).
(Semigroup m, Applicative f) =>
f m -> f m -> f m
<<>> f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
comment) f s s -> f s s -> f s s
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
optionalFWS) f s s -> s -> f s s
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Char -> s
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> s
singleton Char
' ')
f s s -> f s s -> f s s
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a) =>
f s s
fws
optionalCFWS :: (Alternative (f s), CharParsing f s a, SM s) => (f s) s
optionalCFWS :: f s s
optionalCFWS = f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
cfws f s s -> f s s -> f s s
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> s -> f s s
forall (f :: * -> *) a. Applicative f => a -> f a
pure s
forall a. Monoid a => a
mempty
atom :: (Alternative (f s), CharParsing f s a, SM s) => (f s) s
atom :: f s s
atom = f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
optionalCFWS f s s -> f s s -> f s s
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> f s s -> f s s
forall m (f :: * -> *). (Semigroup m, Alternative f) => f m -> f m
foldMany1 (Char -> s
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> s
singleton (Char -> s) -> (a -> Char) -> a -> s
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Char
forall a. IsChar a => a -> Char
toChar (a -> s) -> f s a -> f s s
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f s a
forall (f :: * -> * -> *) s a. CharParsing f s a => f s a
atext) f s s -> f s s -> f s s
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
optionalCFWS
word :: (Alternative (f s), CharParsing f s a, SM s) => (f s) s
word :: f s s
word = f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
atom f s s -> f s s -> f s s
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
quotedString
dotAtomText :: (Alternative (f s), CharParsing f s a) => (f s) (NonEmpty s)
dotAtomText :: f s (NonEmpty s)
dotAtomText = [s] -> NonEmpty s
forall a. [a] -> NonEmpty a
fromList ([s] -> NonEmpty s) -> f s [s] -> f s (NonEmpty s)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((Char -> Bool) -> f s s
forall (f :: * -> * -> *) s a.
CharParsing f s a =>
(Char -> Bool) -> f s s
takeWhile1 Char -> Bool
forall c. IsChar c => c -> Bool
isAtext f s s -> f s a -> f s [s]
forall (f :: * -> *) a s. Alternative f => f a -> f s -> f [a]
`A.sepBy1` Char -> f s a
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> f s a
char Char
'.')
dotAtom :: (Alternative (f s), CharParsing f s a, SM s) => (f s) (NonEmpty s)
dotAtom :: f s (NonEmpty s)
dotAtom = f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
optionalCFWS f s s -> f s (NonEmpty s) -> f s (NonEmpty s)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> f s (NonEmpty s)
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a) =>
f s (NonEmpty s)
dotAtomText f s (NonEmpty s) -> f s s -> f s (NonEmpty s)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
optionalCFWS
localPart :: (Alternative (f s), CharParsing f s a, SM s) => (f s) s
localPart :: f s s
localPart = (NonEmpty s -> s
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold (NonEmpty s -> s) -> (NonEmpty s -> NonEmpty s) -> NonEmpty s -> s
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> NonEmpty s -> NonEmpty s
forall a. a -> NonEmpty a -> NonEmpty a
intersperse (Char -> s
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> s
singleton Char
'.') (NonEmpty s -> s) -> f s (NonEmpty s) -> f s s
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f s (NonEmpty s)
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s (NonEmpty s)
dotAtom) f s s -> f s s -> f s s
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
quotedString
isDtext :: Char -> Bool
isDtext :: Char -> Bool
isDtext Char
c = (Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Int -> Char
chr Int
33 Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Int -> Char
chr Int
90) Bool -> Bool -> Bool
|| (Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Int -> Char
chr Int
94 Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Int -> Char
chr Int
126)
dText :: CharParsing f s a => (f s) a
dText :: f s a
dText = (Char -> Bool) -> f s a
forall (f :: * -> * -> *) s a.
CharParsing f s a =>
(Char -> Bool) -> f s a
satisfy Char -> Bool
isDtext
domainLiteral :: (Alternative (f s), CharParsing f s a, SM s) => (f s) s
domainLiteral :: f s s
domainLiteral =
f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
optionalCFWS f s s -> f s a -> f s a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> f s a
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> f s a
char Char
'['
f s a -> f s s -> f s s
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> f s s -> f s s
forall m (f :: * -> *). (Monoid m, Alternative f) => f m -> f m
foldMany (f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
optionalFWS f s s -> f s s -> f s s
forall m (f :: * -> *).
(Semigroup m, Applicative f) =>
f m -> f m -> f m
<<>> (Char -> s
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> s
singleton (Char -> s) -> (a -> Char) -> a -> s
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Char
forall a. IsChar a => a -> Char
toChar (a -> s) -> f s a -> f s s
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f s a
forall (f :: * -> * -> *) s a. CharParsing f s a => f s a
dText) f s s -> f s s -> f s s
forall m (f :: * -> *).
(Semigroup m, Applicative f) =>
f m -> f m -> f m
<<>> f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
optionalFWS)
f s s -> f s a -> f s s
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> f s a
forall (f :: * -> * -> *) s a. CharParsing f s a => Char -> f s a
char Char
']' f s s -> f s s -> f s s
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* f s s
forall (f :: * -> * -> *) s a.
(Alternative (f s), CharParsing f s a, SM s) =>
f s s
optionalFWS
ci :: FoldCase s => A.Parser s -> A.Parser (CI s)
ci :: Parser s -> Parser (CI s)
ci = (s -> CI s) -> Parser s -> Parser (CI s)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap s -> CI s
forall s. FoldCase s => s -> CI s
mk
(<<>>) :: (Semigroup m, Applicative f) => f m -> f m -> f m
<<>> :: f m -> f m -> f m
(<<>>) = (m -> m -> m) -> f m -> f m -> f m
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 m -> m -> m
forall a. Semigroup a => a -> a -> a
(<>)
foldMany :: (Monoid m, Alternative f) => f m -> f m
foldMany :: f m -> f m
foldMany = ([m] -> m) -> f [m] -> f m
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [m] -> m
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold (f [m] -> f m) -> (f m -> f [m]) -> f m -> f m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f m -> f [m]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many
foldMany1 :: (Semigroup m, Alternative f) => f m -> f m
foldMany1 :: f m -> f m
foldMany1 = ([m] -> m) -> f [m] -> f m
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (NonEmpty m -> m
forall (t :: * -> *) m. (Foldable1 t, Semigroup m) => t m -> m
fold1 (NonEmpty m -> m) -> ([m] -> NonEmpty m) -> [m] -> m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [m] -> NonEmpty m
forall a. [a] -> NonEmpty a
fromList) (f [m] -> f m) -> (f m -> f [m]) -> f m -> f m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f m -> f [m]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
A.many1
foldMany1Sep :: (Semigroup m, Alternative f) => m -> f m -> f m
foldMany1Sep :: m -> f m -> f m
foldMany1Sep m
sep = ([m] -> m) -> f [m] -> f m
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (NonEmpty m -> m
forall (t :: * -> *) m. (Foldable1 t, Semigroup m) => t m -> m
fold1 (NonEmpty m -> m) -> ([m] -> NonEmpty m) -> [m] -> m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m -> NonEmpty m -> NonEmpty m
forall a. a -> NonEmpty a -> NonEmpty a
intersperse m
sep (NonEmpty m -> NonEmpty m)
-> ([m] -> NonEmpty m) -> [m] -> NonEmpty m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [m] -> NonEmpty m
forall a. [a] -> NonEmpty a
fromList) (f [m] -> f m) -> (f m -> f [m]) -> f m -> f m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f m -> f [m]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
A.many1
skipTill :: A.Parser a -> A.Parser ()
skipTill :: Parser a -> Parser ()
skipTill = Parser ByteString Int -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString Int -> Parser ())
-> (Parser a -> Parser ByteString Int) -> Parser a -> Parser ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser a -> Parser ByteString Int
forall a. Parser a -> Parser ByteString Int
spanTill
position :: AT.Parser i Int
position :: Parser i Int
position = (forall r.
State i
-> Pos
-> More
-> Failure i (State i) r
-> Success i (State i) Int r
-> IResult i r)
-> Parser i Int
forall i a.
(forall r.
State i
-> Pos
-> More
-> Failure i (State i) r
-> Success i (State i) a r
-> IResult i r)
-> Parser i a
AT.Parser ((forall r.
State i
-> Pos
-> More
-> Failure i (State i) r
-> Success i (State i) Int r
-> IResult i r)
-> Parser i Int)
-> (forall r.
State i
-> Pos
-> More
-> Failure i (State i) r
-> Success i (State i) Int r
-> IResult i r)
-> Parser i Int
forall a b. (a -> b) -> a -> b
$ \State i
t Pos
pos More
more Failure i (State i) r
_lose Success i (State i) Int r
suc -> Success i (State i) Int r
suc State i
t Pos
pos More
more (Pos -> Int
AT.fromPos Pos
pos)
spanTill :: A.Parser a -> A.Parser Int
spanTill :: Parser a -> Parser ByteString Int
spanTill Parser a
p = (Int -> Int -> Int)
-> Parser ByteString Int
-> Parser ByteString Int
-> Parser ByteString Int
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 ((Int -> Int -> Int) -> Int -> Int -> Int
forall a b c. (a -> b -> c) -> b -> a -> c
flip (-)) Parser ByteString Int
forall i. Parser i Int
position Parser ByteString Int
q
where
q :: Parser ByteString Int
q = Parser ByteString Int
forall i. Parser i Int
position Parser ByteString Int -> Parser a -> Parser ByteString Int
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser a
p Parser ByteString Int
-> Parser ByteString Int -> Parser ByteString Int
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser ByteString Word8
A.anyWord8 Parser ByteString Word8
-> Parser ByteString Int -> Parser ByteString Int
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ByteString Int
q
seek :: Int -> A.Parser ()
seek :: Int -> Parser ()
seek Int
pos = (forall r.
State ByteString
-> Pos
-> More
-> Failure ByteString (State ByteString) r
-> Success ByteString (State ByteString) () r
-> IResult ByteString r)
-> Parser ()
forall i a.
(forall r.
State i
-> Pos
-> More
-> Failure i (State i) r
-> Success i (State i) a r
-> IResult i r)
-> Parser i a
AT.Parser ((forall r.
State ByteString
-> Pos
-> More
-> Failure ByteString (State ByteString) r
-> Success ByteString (State ByteString) () r
-> IResult ByteString r)
-> Parser ())
-> (forall r.
State ByteString
-> Pos
-> More
-> Failure ByteString (State ByteString) r
-> Success ByteString (State ByteString) () r
-> IResult ByteString r)
-> Parser ()
forall a b. (a -> b) -> a -> b
$ \State ByteString
t Pos
_pos More
more Failure ByteString (State ByteString) r
_lose Success ByteString (State ByteString) () r
win -> Success ByteString (State ByteString) () r
win State ByteString
t (Int -> Pos
AT.Pos Int
pos) More
more ()
takeTill' :: A.Parser a -> A.Parser B.ByteString
takeTill' :: Parser a -> Parser ByteString ByteString
takeTill' Parser a
p = do
Int
pos <- Parser ByteString Int
forall i. Parser i Int
position
Int
off <- Parser a -> Parser ByteString Int
forall a. Parser a -> Parser ByteString Int
spanTill Parser a
p
Int
newPos <- Parser ByteString Int
forall i. Parser i Int
position
Int -> Parser ()
seek Int
pos Parser ()
-> Parser ByteString ByteString -> Parser ByteString ByteString
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Int -> Parser ByteString ByteString
A.take Int
off Parser ByteString ByteString
-> Parser () -> Parser ByteString ByteString
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Int -> Parser ()
seek Int
newPos
spanTillString :: B.ByteString -> A.Parser Int
spanTillString :: ByteString -> Parser ByteString Int
spanTillString ByteString
pat
| ByteString -> Bool
B.null ByteString
pat = Parser ByteString Int
forall i. Parser i Int
position
| Bool
otherwise = Parser ByteString Int
forall i. Parser i Int
position Parser ByteString Int
-> (Int -> Parser ByteString Int) -> Parser ByteString Int
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Int -> Parser ByteString Int
go
where
search :: ByteString -> [Int]
search = ByteString -> ByteString -> [Int]
indices ByteString
pat
go :: Int -> Parser ByteString Int
go Int
start = do
Int
pos <- Parser ByteString Int
forall i. Parser i Int
position
ByteString
buf <- Parser ByteString ByteString
takeBuffer
case ByteString -> [Int]
search ByteString
buf of
(Int
offset:[Int]
_) ->
Int -> Parser ()
seek (Int
pos Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
offset Int -> Int -> Int
forall a. Num a => a -> a -> a
+ ByteString -> Int
B.length ByteString
pat) Parser () -> Int -> Parser ByteString Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Int
pos Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
offset Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
start
[Int]
_ ->
Int -> Parser ()
seek (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
start (ByteString -> Int
B.length ByteString
buf Int -> Int -> Int
forall a. Num a => a -> a -> a
- ByteString -> Int
B.length ByteString
pat)) Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall t. Chunk t => Parser t ()
A.demandInput Parser () -> Parser ByteString Int -> Parser ByteString Int
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Int -> Parser ByteString Int
go Int
start
skipTillString :: B.ByteString -> A.Parser ()
skipTillString :: ByteString -> Parser ()
skipTillString = Parser ByteString Int -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser ByteString Int -> Parser ())
-> (ByteString -> Parser ByteString Int) -> ByteString -> Parser ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Parser ByteString Int
spanTillString
takeTillString :: B.ByteString -> A.Parser B.ByteString
takeTillString :: ByteString -> Parser ByteString ByteString
takeTillString ByteString
pat = do
Int
pos <- Parser ByteString Int
forall i. Parser i Int
position
Int
off <- ByteString -> Parser ByteString Int
spanTillString ByteString
pat
Int
newPos <- Parser ByteString Int
forall i. Parser i Int
position
Int -> Parser ()
seek Int
pos Parser ()
-> Parser ByteString ByteString -> Parser ByteString ByteString
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Int -> Parser ByteString ByteString
A.take Int
off Parser ByteString ByteString
-> Parser () -> Parser ByteString ByteString
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Int -> Parser ()
seek Int
newPos
takeBuffer :: A.Parser B.ByteString
takeBuffer :: Parser ByteString ByteString
takeBuffer = do
Int
start <- Parser ByteString Int
forall i. Parser i Int
position
Int
end <- Parser ByteString Int
forall t. Chunk t => Parser t Int
bufSize
Int -> Parser ByteString ByteString
A.take (Int
end Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
start)
bufSize :: forall t. AT.Chunk t => AT.Parser t Int
bufSize :: Parser t Int
bufSize = (forall r.
State t
-> Pos
-> More
-> Failure t (State t) r
-> Success t (State t) Int r
-> IResult t r)
-> Parser t Int
forall i a.
(forall r.
State i
-> Pos
-> More
-> Failure i (State i) r
-> Success i (State i) a r
-> IResult i r)
-> Parser i a
AT.Parser ((forall r.
State t
-> Pos
-> More
-> Failure t (State t) r
-> Success t (State t) Int r
-> IResult t r)
-> Parser t Int)
-> (forall r.
State t
-> Pos
-> More
-> Failure t (State t) r
-> Success t (State t) Int r
-> IResult t r)
-> Parser t Int
forall a b. (a -> b) -> a -> b
$
\State t
t Pos
pos More
more Failure t (State t) r
_lose Success t (State t) Int r
win ->
Success t (State t) Int r
win State t
t Pos
pos More
more
(Pos -> Int
AT.fromPos (Pos -> Int) -> Pos -> Int
forall a b. (a -> b) -> a -> b
$ t -> State t -> Pos
forall c. Chunk c => c -> State c -> Pos
AT.atBufferEnd (t
forall a. HasCallStack => a
undefined :: t) State t
t)