{-# LANGUAGE FlexibleContexts #-}
module Text.Parsec.Rfc2822 where
import Text.Parsec.Rfc2234 hiding ( quoted_pair, quoted_string )
import Control.Monad ( replicateM, guard )
import Data.Char ( ord )
import Data.Functor
import Data.List ( intercalate )
import Data.Maybe ( catMaybes )
import Data.Monoid ( Monoid, mempty )
import Data.Time.Calendar.Compat
import Data.Time.LocalTime
import Text.Parsec hiding ( crlf )
{-# ANN module "HLint: ignore Use camelCase" #-}
maybeOption :: Stream s m Char => ParsecT s u m a -> ParsecT s u m (Maybe a)
maybeOption :: ParsecT s u m a -> ParsecT s u m (Maybe a)
maybeOption ParsecT s u m a
p = Maybe a -> ParsecT s u m (Maybe a) -> ParsecT s u m (Maybe a)
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option Maybe a
forall a. Maybe a
Nothing ((a -> Maybe a) -> ParsecT s u m a -> ParsecT s u m (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Maybe a
forall a. a -> Maybe a
Just ParsecT s u m a
p)
unfold :: Stream s m Char => ParsecT s u m a -> ParsecT s u m a
unfold :: ParsecT s u m a -> ParsecT s u m a
unfold = ParsecT s u m ()
-> ParsecT s u m () -> ParsecT s u m a -> ParsecT s u m a
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
cfws) (ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
cfws)
header :: Stream s m Char => String -> ParsecT s u m a -> ParsecT s u m a
String
n ParsecT s u m a
p =
let nameString :: ParsecT s u m ()
nameString = String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString (String
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
":") in ParsecT s u m ()
-> ParsecT s u m String -> ParsecT s u m a -> ParsecT s u m a
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between ParsecT s u m ()
forall u. ParsecT s u m ()
nameString ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
crlf ParsecT s u m a
p ParsecT s u m a -> String -> ParsecT s u m a
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> (String
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" header line")
obs_header :: Stream s m Char => String -> ParsecT s u m a -> ParsecT s u m a
String
n ParsecT s u m a
p = ParsecT s u m Char
-> ParsecT s u m String -> ParsecT s u m a -> ParsecT s u m a
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between ParsecT s u m Char
forall u. ParsecT s u m Char
nameString ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
crlf ParsecT s u m a
p ParsecT s u m a -> String -> ParsecT s u m a
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> (String
"obsolete " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" header line")
where nameString :: ParsecT s u m Char
nameString = String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
n ParsecT s u m () -> ParsecT s u m String -> ParsecT s u m String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT s u m Char -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
wsp ParsecT s u m String -> ParsecT s u m Char -> ParsecT s u m Char
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
':'
no_ws_ctl :: Stream s m Char => ParsecT s u m Char
no_ws_ctl :: ParsecT s u m Char
no_ws_ctl = (Char -> Bool) -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\Char
c -> Char -> Int
ord Char
c Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ([Int
1 .. Int
8] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
11, Int
12] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
14 .. Int
31] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
127]))
ParsecT s u m Char -> String -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"US-ASCII non-whitespace control character"
text :: Stream s m Char => ParsecT s u m Char
text :: ParsecT s u m Char
text = (Char -> Bool) -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\Char
c -> Char -> Int
ord Char
c Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ([Int
1 .. Int
9] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
11, Int
12] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
14 .. Int
127]))
ParsecT s u m Char -> String -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"US-ASCII character (excluding CR and LF)"
specials :: Stream s m Char => ParsecT s u m Char
specials :: ParsecT s u m Char
specials = String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
"()<>[]:;@,.\\\"" ParsecT s u m Char -> String -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"one of ()<>[]:;@,.\\\""
quoted_pair :: Stream s m Char => ParsecT s u m String
quoted_pair :: ParsecT s u m String
quoted_pair = ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
obs_qp ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do { Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\\'; Char
r <- ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
text; String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return [Char
'\\', Char
r] }
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"quoted pair"
fws :: Stream s m Char => ParsecT s u m String
fws :: ParsecT s u m String
fws = do [String]
r <- ParsecT s u m String -> ParsecT s u m [String]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT s u m String -> ParsecT s u m [String])
-> ParsecT s u m String -> ParsecT s u m [String]
forall a b. (a -> b) -> a -> b
$ [ParsecT s u m String] -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [ParsecT s u m String
forall u. ParsecT s u m String
blanks, ParsecT s u m String
forall u. ParsecT s u m String
linebreak]
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return ([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
r)
where
blanks :: ParsecT s u m String
blanks = ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
wsp
linebreak :: ParsecT s u m String
linebreak = ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m String -> ParsecT s u m String)
-> ParsecT s u m String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ do String
r1 <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
crlf
String
r2 <- ParsecT s u m String
forall u. ParsecT s u m String
blanks
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String
r1 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
r2)
ctext :: Stream s m Char => ParsecT s u m Char
ctext :: ParsecT s u m Char
ctext = ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
no_ws_ctl ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (Char -> Bool) -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\Char
c -> Char -> Int
ord Char
c Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ([Int
33 .. Int
39] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
42 .. Int
91] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
93 .. Int
126] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
128 .. Int
255]))
ParsecT s u m Char -> String -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"any regular character (excluding '(', ')', and '\\')"
comment :: Stream s m Char => ParsecT s u m String
= do Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'('
[String]
r1 <- ParsecT s u m String -> ParsecT s u m [String]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT s u m String
forall u. ParsecT s u m String
ccontent
String
r2 <- String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
fws
Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
')'
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String
"(" String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
r1 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
r2 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")")
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"comment"
where
ccontent :: ParsecT s u m String
ccontent = ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m String -> ParsecT s u m String)
-> ParsecT s u m String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ do String
r1 <- String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
fws
String
r2 <- [ParsecT s u m String] -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
ctext, ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
quoted_pair, ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
comment]
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String
r1 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
r2)
cfws :: Stream s m Char => ParsecT s u m String
cfws :: ParsecT s u m String
cfws = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ParsecT s u m [String] -> ParsecT s u m String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m [String]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ([ParsecT s u m String] -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
fws, ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
comment])
atext :: Stream s m Char => ParsecT s u m Char
atext :: ParsecT s u m Char
atext = ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
alpha ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
"!#$%&'*+-/=?^_`{|}~"
ParsecT s u m Char -> String -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"US-ASCII character (excluding controls, space, and specials)"
atom :: Stream s m Char => ParsecT s u m String
atom :: ParsecT s u m String
atom = ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold (ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
atext ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"atom")
dot_atom :: Stream s m Char => ParsecT s u m String
dot_atom :: ParsecT s u m String
dot_atom = ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold (ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
dot_atom_text ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"dot atom")
dot_atom_text :: Stream s m Char => ParsecT s u m String
dot_atom_text :: ParsecT s u m String
dot_atom_text = ([String] -> String)
-> ParsecT s u m [String] -> ParsecT s u m String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
".") (ParsecT s u m String
-> ParsecT s u m Char -> ParsecT s u m [String]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
sepBy1 (ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
atext) (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'.')) ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"dot atom content"
qtext :: Stream s m Char => ParsecT s u m Char
qtext :: ParsecT s u m Char
qtext = ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
no_ws_ctl ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (Char -> Bool) -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\Char
c -> Char -> Int
ord Char
c Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ([Int
33] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
35 .. Int
91] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
93 .. Int
126]))
ParsecT s u m Char -> String -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"US-ASCII character (excluding '\\', and '\"')"
qcontent :: Stream s m Char => ParsecT s u m String
qcontent :: ParsecT s u m String
qcontent = ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
qtext ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
quoted_pair ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"quoted string content"
quoted_string :: Stream s m Char => ParsecT s u m String
quoted_string :: ParsecT s u m String
quoted_string = ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold (do Char
_ <- ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
dquote
[String]
r1 <- ParsecT s u m String -> ParsecT s u m [String]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (String -> String -> String
forall a. [a] -> [a] -> [a]
(++) (String -> String -> String)
-> ParsecT s u m String -> ParsecT s u m (String -> String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
fws ParsecT s u m (String -> String)
-> ParsecT s u m String -> ParsecT s u m String
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
qcontent)
String
r2 <- String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
fws
Char
_ <- ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
dquote
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String
"\"" String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
r1 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
r2 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\""))
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"quoted string"
word :: Stream s m Char => ParsecT s u m String
word :: ParsecT s u m String
word = ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold (ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
atom ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
quoted_string) ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"word"
phrase :: Stream s m Char => ParsecT s u m [String]
phrase :: ParsecT s u m [String]
phrase = ParsecT s u m [String]
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m [String]
obs_phrase
utext :: Stream s m Char => ParsecT s u m Char
utext :: ParsecT s u m Char
utext = ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
no_ws_ctl ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (Char -> Bool) -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\Char
c -> Char -> Int
ord Char
c Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int
33 .. Int
126])
ParsecT s u m Char -> String -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"regular US-ASCII character (excluding '\\', and '\"')"
unstructured :: Stream s m Char => ParsecT s u m String
unstructured :: ParsecT s u m String
unstructured = do String
r1 <- String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
fws
[String]
r2 <- ParsecT s u m String -> ParsecT s u m [String]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ((:) (Char -> String -> String)
-> ParsecT s u m Char -> ParsecT s u m (String -> String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
utext ParsecT s u m (String -> String)
-> ParsecT s u m String -> ParsecT s u m String
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
fws)
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String
r1 String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
r2)
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"unstructured text"
date_time :: Stream s m Char => ParsecT s u m ZonedTime
date_time :: ParsecT s u m ZonedTime
date_time = do ParsecT s u m Char -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m DayOfWeek
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m DayOfWeek
day_of_week ParsecT s u m DayOfWeek -> ParsecT s u m Char -> ParsecT s u m Char
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
','))
Day
d <- ParsecT s u m Day
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Day
date
String
_ <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
fws
(TimeOfDay
td, TimeZone
z) <- ParsecT s u m (TimeOfDay, TimeZone)
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m (TimeOfDay, TimeZone)
time
ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
cfws
ZonedTime -> ParsecT s u m ZonedTime
forall (m :: * -> *) a. Monad m => a -> m a
return (LocalTime -> TimeZone -> ZonedTime
ZonedTime (Day -> TimeOfDay -> LocalTime
LocalTime Day
d TimeOfDay
td) TimeZone
z)
ParsecT s u m ZonedTime -> String -> ParsecT s u m ZonedTime
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"date/time specification"
day_of_week :: Stream s m Char => ParsecT s u m DayOfWeek
day_of_week :: ParsecT s u m DayOfWeek
day_of_week = ParsecT s u m DayOfWeek -> ParsecT s u m DayOfWeek
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m ()
-> ParsecT s u m ()
-> ParsecT s u m DayOfWeek
-> ParsecT s u m DayOfWeek
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
fws) (ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
fws) ParsecT s u m DayOfWeek
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m DayOfWeek
day_name ParsecT s u m DayOfWeek -> String -> ParsecT s u m DayOfWeek
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"name of a day-of-the-week")
ParsecT s u m DayOfWeek
-> ParsecT s u m DayOfWeek -> ParsecT s u m DayOfWeek
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m DayOfWeek
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m DayOfWeek
obs_day_of_week
day_name :: Stream s m Char => ParsecT s u m DayOfWeek
day_name :: ParsecT s u m DayOfWeek
day_name = [ParsecT s u m DayOfWeek] -> ParsecT s u m DayOfWeek
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [ String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"Mon" ParsecT s u m () -> DayOfWeek -> ParsecT s u m DayOfWeek
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> DayOfWeek
Monday
, ParsecT s u m DayOfWeek -> ParsecT s u m DayOfWeek
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"Tue" ParsecT s u m () -> DayOfWeek -> ParsecT s u m DayOfWeek
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> DayOfWeek
Tuesday)
, String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"Wed" ParsecT s u m () -> DayOfWeek -> ParsecT s u m DayOfWeek
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> DayOfWeek
Wednesday
, String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"Thu" ParsecT s u m () -> DayOfWeek -> ParsecT s u m DayOfWeek
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> DayOfWeek
Thursday
, String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"Fri" ParsecT s u m () -> DayOfWeek -> ParsecT s u m DayOfWeek
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> DayOfWeek
Friday
, ParsecT s u m DayOfWeek -> ParsecT s u m DayOfWeek
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"Sat" ParsecT s u m () -> DayOfWeek -> ParsecT s u m DayOfWeek
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> DayOfWeek
Saturday)
, String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"Sun" ParsecT s u m () -> DayOfWeek -> ParsecT s u m DayOfWeek
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> DayOfWeek
Sunday
]
ParsecT s u m DayOfWeek -> String -> ParsecT s u m DayOfWeek
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"name of a day-of-the-week"
date :: Stream s m Char => ParsecT s u m Day
date :: ParsecT s u m Day
date = do Int
d <- ParsecT s u m Int
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Int
day
Int
m <- ParsecT s u m Int
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Int
month
Int
y <- ParsecT s u m Int
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Int
year
Day -> ParsecT s u m Day
forall (m :: * -> *) a. Monad m => a -> m a
return (Integer -> Int -> Int -> Day
fromGregorian (Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y) Int
m Int
d)
ParsecT s u m Day -> String -> ParsecT s u m Day
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"date specification"
year :: Stream s m Char => ParsecT s u m Int
year :: ParsecT s u m Int
year = String -> Int
forall a. Read a => String -> a
read (String -> Int) -> ParsecT s u m String -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> ParsecT s u m Char -> ParsecT s u m String
forall s u (m :: * -> *) a.
Int -> ParsecT s u m a -> ParsecT s u m [a]
manyN Int
4 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit ParsecT s u m Int -> String -> ParsecT s u m Int
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"year"
month :: Stream s m Char => ParsecT s u m Int
month :: ParsecT s u m Int
month = ParsecT s u m Int -> ParsecT s u m Int
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m ()
-> ParsecT s u m () -> ParsecT s u m Int -> ParsecT s u m Int
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
fws) (ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
fws) ParsecT s u m Int
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Int
month_name ParsecT s u m Int -> String -> ParsecT s u m Int
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"month name") ParsecT s u m Int -> ParsecT s u m Int -> ParsecT s u m Int
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m Int
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Int
obs_month
month_name :: Stream s m Char => ParsecT s u m Int
month_name :: ParsecT s u m Int
month_name = [ParsecT s u m Int] -> ParsecT s u m Int
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [ ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"Jan") ParsecT s u m () -> Int -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Int
1
, String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"Feb" ParsecT s u m () -> Int -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Int
2
, ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"Mar") ParsecT s u m () -> Int -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Int
3
, ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"Apr") ParsecT s u m () -> Int -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Int
4
, String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"May" ParsecT s u m () -> Int -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Int
5
, ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"Jun") ParsecT s u m () -> Int -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Int
6
, String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"Jul" ParsecT s u m () -> Int -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Int
7
, String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"Aug" ParsecT s u m () -> Int -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Int
8
, String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"Sep" ParsecT s u m () -> Int -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Int
9
, String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"Oct" ParsecT s u m () -> Int -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Int
10
, String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"Nov" ParsecT s u m () -> Int -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Int
11
, String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
caseString String
"Dec" ParsecT s u m () -> Int -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Int
12
]
ParsecT s u m Int -> String -> ParsecT s u m Int
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"month name"
day_of_month :: Stream s m Char => ParsecT s u m Int
day_of_month :: ParsecT s u m Int
day_of_month = do Int
r <- (String -> Int) -> ParsecT s u m String -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> Int
forall a. Read a => String -> a
read (Int -> Int -> ParsecT s u m Char -> ParsecT s u m String
forall s u (m :: * -> *) a.
Int -> Int -> ParsecT s u m a -> ParsecT s u m [a]
manyNtoM Int
1 Int
2 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit)
Bool -> ParsecT s u m ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Int
r Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
1 Bool -> Bool -> Bool
&& Int
r Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
31)
Int -> ParsecT s u m Int
forall (m :: * -> *) a. Monad m => a -> m a
return Int
r
day :: Stream s m Char => ParsecT s u m Int
day :: ParsecT s u m Int
day = ParsecT s u m Int -> ParsecT s u m Int
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m Int
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Int
obs_day ParsecT s u m Int -> ParsecT s u m Int -> ParsecT s u m Int
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m Int
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Int
day_of_month ParsecT s u m Int -> String -> ParsecT s u m Int
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"day"
time :: Stream s m Char => ParsecT s u m (TimeOfDay, TimeZone)
time :: ParsecT s u m (TimeOfDay, TimeZone)
time = do TimeOfDay
t <- ParsecT s u m TimeOfDay
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m TimeOfDay
time_of_day
String
_ <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
fws
TimeZone
z <- ParsecT s u m TimeZone
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m TimeZone
zone
(TimeOfDay, TimeZone) -> ParsecT s u m (TimeOfDay, TimeZone)
forall (m :: * -> *) a. Monad m => a -> m a
return (TimeOfDay
t, TimeZone
z)
ParsecT s u m (TimeOfDay, TimeZone)
-> String -> ParsecT s u m (TimeOfDay, TimeZone)
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"time and zone specification"
time_of_day :: Stream s m Char => ParsecT s u m TimeOfDay
time_of_day :: ParsecT s u m TimeOfDay
time_of_day = do Int
h <- ParsecT s u m Int
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Int
hour
Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
':'
Int
m <- ParsecT s u m Int
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Int
minute
Int
s <- Int -> ParsecT s u m Int -> ParsecT s u m Int
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option Int
0 (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
':' ParsecT s u m Char -> ParsecT s u m Int -> ParsecT s u m Int
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT s u m Int
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Int
second)
TimeOfDay -> ParsecT s u m TimeOfDay
forall (m :: * -> *) a. Monad m => a -> m a
return (Int -> Int -> Pico -> TimeOfDay
TimeOfDay Int
h Int
m (Int -> Pico
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
s))
ParsecT s u m TimeOfDay -> String -> ParsecT s u m TimeOfDay
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"time specification"
hour :: Stream s m Char => ParsecT s u m Int
hour :: ParsecT s u m Int
hour = do Int
r <- (String -> Int) -> ParsecT s u m String -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> Int
forall a. Read a => String -> a
read (Int -> ParsecT s u m Char -> ParsecT s u m String
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM Int
2 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit)
Bool -> ParsecT s u m ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Int
r Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0 Bool -> Bool -> Bool
&& Int
r Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
24)
Int -> ParsecT s u m Int
forall (m :: * -> *) a. Monad m => a -> m a
return Int
r
ParsecT s u m Int -> String -> ParsecT s u m Int
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"hour"
minute :: Stream s m Char => ParsecT s u m Int
minute :: ParsecT s u m Int
minute = do Int
r <- (String -> Int) -> ParsecT s u m String -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> Int
forall a. Read a => String -> a
read (Int -> ParsecT s u m Char -> ParsecT s u m String
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM Int
2 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit)
Bool -> ParsecT s u m ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Int
r Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0 Bool -> Bool -> Bool
&& Int
r Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
60)
Int -> ParsecT s u m Int
forall (m :: * -> *) a. Monad m => a -> m a
return Int
r
ParsecT s u m Int -> String -> ParsecT s u m Int
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"minute"
second :: Stream s m Char => ParsecT s u m Int
second :: ParsecT s u m Int
second = ParsecT s u m Int
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Int
minute ParsecT s u m Int -> String -> ParsecT s u m Int
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"second"
zone :: Stream s m Char => ParsecT s u m TimeZone
zone :: ParsecT s u m TimeZone
zone = do Int
sign <- [ParsecT s u m Int] -> ParsecT s u m Int
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'+' ParsecT s u m Char -> Int -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Int
1, Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'-' ParsecT s u m Char -> Int -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> (-Int
1)]
Int
h <- ParsecT s u m Int
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Int
hour
Int
m <- ParsecT s u m Int
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Int
minute
TimeZone -> ParsecT s u m TimeZone
forall (m :: * -> *) a. Monad m => a -> m a
return (Int -> TimeZone
minutesToTimeZone (Int
sign Int -> Int -> Int
forall a. Num a => a -> a -> a
* ((Int
h Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
60) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
m)))
ParsecT s u m TimeZone
-> ParsecT s u m TimeZone -> ParsecT s u m TimeZone
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m TimeZone
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m TimeZone
obs_zone
data NameAddr = NameAddr { NameAddr -> Maybe String
nameAddr_name :: Maybe String
, NameAddr -> String
nameAddr_addr :: String
}
deriving (Int -> NameAddr -> String -> String
[NameAddr] -> String -> String
NameAddr -> String
(Int -> NameAddr -> String -> String)
-> (NameAddr -> String)
-> ([NameAddr] -> String -> String)
-> Show NameAddr
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [NameAddr] -> String -> String
$cshowList :: [NameAddr] -> String -> String
show :: NameAddr -> String
$cshow :: NameAddr -> String
showsPrec :: Int -> NameAddr -> String -> String
$cshowsPrec :: Int -> NameAddr -> String -> String
Show,NameAddr -> NameAddr -> Bool
(NameAddr -> NameAddr -> Bool)
-> (NameAddr -> NameAddr -> Bool) -> Eq NameAddr
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NameAddr -> NameAddr -> Bool
$c/= :: NameAddr -> NameAddr -> Bool
== :: NameAddr -> NameAddr -> Bool
$c== :: NameAddr -> NameAddr -> Bool
Eq)
address :: Stream s m Char => ParsecT s u m [NameAddr]
address :: ParsecT s u m [NameAddr]
address = ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (NameAddr -> [NameAddr]
forall (m :: * -> *) a. Monad m => a -> m a
return (NameAddr -> [NameAddr])
-> ParsecT s u m NameAddr -> ParsecT s u m [NameAddr]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m NameAddr
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m NameAddr
mailbox) ParsecT s u m [NameAddr]
-> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
group ParsecT s u m [NameAddr] -> String -> ParsecT s u m [NameAddr]
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"address"
mailbox :: Stream s m Char => ParsecT s u m NameAddr
mailbox :: ParsecT s u m NameAddr
mailbox = ParsecT s u m NameAddr -> ParsecT s u m NameAddr
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m NameAddr
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m NameAddr
name_addr ParsecT s u m NameAddr
-> ParsecT s u m NameAddr -> ParsecT s u m NameAddr
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (String -> NameAddr)
-> ParsecT s u m String -> ParsecT s u m NameAddr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Maybe String -> String -> NameAddr
NameAddr Maybe String
forall a. Maybe a
Nothing) ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
addr_spec ParsecT s u m NameAddr -> String -> ParsecT s u m NameAddr
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"mailbox"
name_addr :: Stream s m Char => ParsecT s u m NameAddr
name_addr :: ParsecT s u m NameAddr
name_addr = (Maybe String -> String -> NameAddr
NameAddr (Maybe String -> String -> NameAddr)
-> ParsecT s u m (Maybe String)
-> ParsecT s u m (String -> NameAddr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m (Maybe String)
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m (Maybe a)
maybeOption ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
display_name ParsecT s u m (String -> NameAddr)
-> ParsecT s u m String -> ParsecT s u m NameAddr
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
angle_addr) ParsecT s u m NameAddr -> String -> ParsecT s u m NameAddr
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"name address"
angle_addr :: Stream s m Char => ParsecT s u m String
angle_addr :: ParsecT s u m String
angle_addr = ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold (ParsecT s u m Char
-> ParsecT s u m Char
-> ParsecT s u m String
-> ParsecT s u m String
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'<') (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'>') ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
addr_spec) ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"angle address")
ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
obs_angle_addr
group :: Stream s m Char => ParsecT s u m [NameAddr]
group :: ParsecT s u m [NameAddr]
group = do String
_ <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
display_name
Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
':'
[NameAddr]
r <- [NameAddr] -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
mailbox_list
Char
_ <- ParsecT s u m Char -> ParsecT s u m Char
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold (ParsecT s u m Char -> ParsecT s u m Char)
-> ParsecT s u m Char -> ParsecT s u m Char
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
';'
[NameAddr] -> ParsecT s u m [NameAddr]
forall (m :: * -> *) a. Monad m => a -> m a
return [NameAddr]
r
ParsecT s u m [NameAddr] -> String -> ParsecT s u m [NameAddr]
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"address group"
display_name :: Stream s m Char => ParsecT s u m String
display_name :: ParsecT s u m String
display_name = ([String] -> String)
-> ParsecT s u m [String] -> ParsecT s u m String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [String] -> String
unwords ParsecT s u m [String]
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m [String]
phrase ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"display name"
mailbox_list :: Stream s m Char => ParsecT s u m [NameAddr]
mailbox_list :: ParsecT s u m [NameAddr]
mailbox_list = ParsecT s u m NameAddr
-> ParsecT s u m Char -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
sepBy ParsecT s u m NameAddr
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m NameAddr
mailbox (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
',') ParsecT s u m [NameAddr] -> String -> ParsecT s u m [NameAddr]
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"mailbox list"
address_list :: Stream s m Char => ParsecT s u m [NameAddr]
address_list :: ParsecT s u m [NameAddr]
address_list = [[NameAddr]] -> [NameAddr]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[NameAddr]] -> [NameAddr])
-> ParsecT s u m [[NameAddr]] -> ParsecT s u m [NameAddr]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
-> ParsecT s u m Char -> ParsecT s u m [[NameAddr]]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
sepBy ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
address (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
',') ParsecT s u m [NameAddr] -> String -> ParsecT s u m [NameAddr]
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"address list"
addr_spec :: Stream s m Char => ParsecT s u m String
addr_spec :: ParsecT s u m String
addr_spec = do String
r1 <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
local_part
Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'@'
String
r2 <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
domain
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String
r1 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"@" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
r2)
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"address specification"
local_part :: Stream s m Char => ParsecT s u m String
local_part :: ParsecT s u m String
local_part = ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
obs_local_part ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
dot_atom ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
quoted_string ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"address' local part"
domain :: Stream s m Char => ParsecT s u m String
domain :: ParsecT s u m String
domain = ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
obs_domain ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
dot_atom ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
domain_literal ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"address' domain part"
domain_literal :: Stream s m Char => ParsecT s u m String
domain_literal :: ParsecT s u m String
domain_literal = ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold (do [String]
r <- ParsecT s u m Char
-> ParsecT s u m Char
-> ParsecT s u m [String]
-> ParsecT s u m [String]
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'[') (ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
fws ParsecT s u m () -> ParsecT s u m Char -> ParsecT s u m Char
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
']') (ParsecT s u m String -> ParsecT s u m [String]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
fws ParsecT s u m () -> ParsecT s u m String -> ParsecT s u m String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
dcontent))
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String
"[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
r String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"]"))
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"domain literal"
dcontent :: Stream s m Char => ParsecT s u m String
dcontent :: ParsecT s u m String
dcontent = ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
dtext ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
quoted_pair ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"domain literal content"
dtext :: Stream s m Char => ParsecT s u m Char
dtext :: ParsecT s u m Char
dtext = ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
no_ws_ctl ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (Char -> Bool) -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\Char
c -> Char -> Int
ord Char
c Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ([Int
33 .. Int
90] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
94 .. Int
126]))
ParsecT s u m Char -> String -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"any ASCII character (excluding '[', ']', and '\\')"
data GenericMessage a = Message [Field] a deriving Int -> GenericMessage a -> String -> String
[GenericMessage a] -> String -> String
GenericMessage a -> String
(Int -> GenericMessage a -> String -> String)
-> (GenericMessage a -> String)
-> ([GenericMessage a] -> String -> String)
-> Show (GenericMessage a)
forall a. Show a => Int -> GenericMessage a -> String -> String
forall a. Show a => [GenericMessage a] -> String -> String
forall a. Show a => GenericMessage a -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [GenericMessage a] -> String -> String
$cshowList :: forall a. Show a => [GenericMessage a] -> String -> String
show :: GenericMessage a -> String
$cshow :: forall a. Show a => GenericMessage a -> String
showsPrec :: Int -> GenericMessage a -> String -> String
$cshowsPrec :: forall a. Show a => Int -> GenericMessage a -> String -> String
Show
message :: (Monoid s, Stream s m Char) => ParsecT s u m (GenericMessage s)
message :: ParsecT s u m (GenericMessage s)
message = [Field] -> s -> GenericMessage s
forall a. [Field] -> a -> GenericMessage a
Message ([Field] -> s -> GenericMessage s)
-> ParsecT s u m [Field] -> ParsecT s u m (s -> GenericMessage s)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [Field]
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m [Field]
fields ParsecT s u m (s -> GenericMessage s)
-> ParsecT s u m s -> ParsecT s u m (GenericMessage s)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> s -> ParsecT s u m s -> ParsecT s u m s
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option s
forall a. Monoid a => a
mempty (ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
crlf ParsecT s u m String -> ParsecT s u m s -> ParsecT s u m s
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT s u m s
forall s (m :: * -> *) u. (Monoid s, Monad m) => ParsecT s u m s
body)
body :: (Monoid s, Monad m) => ParsecT s u m s
body :: ParsecT s u m s
body = do s
v <- ParsecT s u m s
forall (m :: * -> *) s u. Monad m => ParsecT s u m s
getInput
s -> ParsecT s u m ()
forall (m :: * -> *) s u. Monad m => s -> ParsecT s u m ()
setInput s
forall a. Monoid a => a
mempty
s -> ParsecT s u m s
forall (m :: * -> *) a. Monad m => a -> m a
return s
v
data Field = OptionalField String String
| From [NameAddr]
| Sender NameAddr
| ReturnPath String
| ReplyTo [NameAddr]
| To [NameAddr]
| Cc [NameAddr]
| Bcc [NameAddr]
| MessageID String
| InReplyTo [String]
| References [String]
| Subject String
| String
| Keywords [[String]]
| Date ZonedTime
| ResentDate ZonedTime
| ResentFrom [NameAddr]
| ResentSender NameAddr
| ResentTo [NameAddr]
| ResentCc [NameAddr]
| ResentBcc [NameAddr]
| ResentMessageID String
| ResentReplyTo [NameAddr]
| Received ([(String,String)], ZonedTime)
| ObsReceived [(String,String)]
deriving (Int -> Field -> String -> String
[Field] -> String -> String
Field -> String
(Int -> Field -> String -> String)
-> (Field -> String) -> ([Field] -> String -> String) -> Show Field
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [Field] -> String -> String
$cshowList :: [Field] -> String -> String
show :: Field -> String
$cshow :: Field -> String
showsPrec :: Int -> Field -> String -> String
$cshowsPrec :: Int -> Field -> String -> String
Show)
fields :: Stream s m Char => ParsecT s u m [Field]
fields :: ParsecT s u m [Field]
fields = ParsecT s u m Field -> ParsecT s u m [Field]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT s u m Field -> ParsecT s u m [Field])
-> ParsecT s u m Field -> ParsecT s u m [Field]
forall a b. (a -> b) -> a -> b
$ [ParsecT s u m Field] -> ParsecT s u m Field
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [ ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
From ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
from)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (NameAddr -> Field
Sender (NameAddr -> Field)
-> ParsecT s u m NameAddr -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m NameAddr
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m NameAddr
sender)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Field
ReturnPath (String -> Field) -> ParsecT s u m String -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
return_path)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
ReplyTo ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
reply_to)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
To ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
to)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
Cc ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
cc)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
Bcc ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
bcc)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Field
MessageID (String -> Field) -> ParsecT s u m String -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
message_id)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([String] -> Field
InReplyTo ([String] -> Field)
-> ParsecT s u m [String] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [String]
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m [String]
in_reply_to)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([String] -> Field
References ([String] -> Field)
-> ParsecT s u m [String] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [String]
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m [String]
references)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Field
Subject (String -> Field) -> ParsecT s u m String -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
subject)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Field
Comments (String -> Field) -> ParsecT s u m String -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
comments)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([[String]] -> Field
Keywords ([[String]] -> Field)
-> ParsecT s u m [[String]] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [[String]]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [[String]]
keywords)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ZonedTime -> Field
Date (ZonedTime -> Field)
-> ParsecT s u m ZonedTime -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m ZonedTime
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m ZonedTime
orig_date)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ZonedTime -> Field
ResentDate (ZonedTime -> Field)
-> ParsecT s u m ZonedTime -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m ZonedTime
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m ZonedTime
resent_date)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
ResentFrom ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
resent_from)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (NameAddr -> Field
ResentSender (NameAddr -> Field)
-> ParsecT s u m NameAddr -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m NameAddr
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m NameAddr
resent_sender)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
ResentTo ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
resent_to)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
ResentCc ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
resent_cc)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
ResentBcc ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
resent_bcc)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Field
ResentMessageID (String -> Field) -> ParsecT s u m String -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
resent_msg_id)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (([(String, String)], ZonedTime) -> Field
Received (([(String, String)], ZonedTime) -> Field)
-> ParsecT s u m ([(String, String)], ZonedTime)
-> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m ([(String, String)], ZonedTime)
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m ([(String, String)], ZonedTime)
received)
, (String -> String -> Field) -> (String, String) -> Field
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry String -> String -> Field
OptionalField ((String, String) -> Field)
-> ParsecT s u m (String, String) -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m (String, String)
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m (String, String)
optional_field
]
orig_date :: Stream s m Char => ParsecT s u m ZonedTime
orig_date :: ParsecT s u m ZonedTime
orig_date = String -> ParsecT s u m ZonedTime -> ParsecT s u m ZonedTime
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Date" ParsecT s u m ZonedTime
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m ZonedTime
date_time
from :: Stream s m Char => ParsecT s u m [NameAddr]
from :: ParsecT s u m [NameAddr]
from = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"From" ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
mailbox_list
sender :: Stream s m Char => ParsecT s u m NameAddr
sender :: ParsecT s u m NameAddr
sender = String -> ParsecT s u m NameAddr -> ParsecT s u m NameAddr
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Sender" ParsecT s u m NameAddr
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m NameAddr
mailbox
reply_to :: Stream s m Char => ParsecT s u m [NameAddr]
reply_to :: ParsecT s u m [NameAddr]
reply_to = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Reply-To" ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
address_list
to :: Stream s m Char => ParsecT s u m [NameAddr]
to :: ParsecT s u m [NameAddr]
to = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"To" ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
address_list
cc :: Stream s m Char => ParsecT s u m [NameAddr]
cc :: ParsecT s u m [NameAddr]
cc = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Cc" ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
address_list
bcc :: Stream s m Char => ParsecT s u m [NameAddr]
bcc :: ParsecT s u m [NameAddr]
bcc = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Bcc" (ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
address_list ParsecT s u m [NameAddr]
-> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
cfws ParsecT s u m () -> [NameAddr] -> ParsecT s u m [NameAddr]
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> []))
message_id :: Stream s m Char => ParsecT s u m String
message_id :: ParsecT s u m String
message_id = String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Message-ID" ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
msg_id
in_reply_to :: Stream s m Char => ParsecT s u m [String]
in_reply_to :: ParsecT s u m [String]
in_reply_to = String -> ParsecT s u m [String] -> ParsecT s u m [String]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"In-Reply-To" (ParsecT s u m String -> ParsecT s u m [String]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
msg_id)
references :: Stream s m Char => ParsecT s u m [String]
references :: ParsecT s u m [String]
references = String -> ParsecT s u m [String] -> ParsecT s u m [String]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"References" (ParsecT s u m String -> ParsecT s u m [String]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
msg_id)
msg_id :: Stream s m Char => ParsecT s u m String
msg_id :: ParsecT s u m String
msg_id = ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold (do Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'<'
String
idl <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
id_left
Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'@'
String
idr <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
id_right
Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'>'
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String
"<" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
idl String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"@" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
idr String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
">")
)
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"message ID"
id_left :: Stream s m Char => ParsecT s u m String
id_left :: ParsecT s u m String
id_left = ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
dot_atom_text ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
no_fold_quote ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"left part of an message ID"
id_right :: Stream s m Char => ParsecT s u m String
id_right :: ParsecT s u m String
id_right = ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
dot_atom_text ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
no_fold_literal ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"right part of an message ID"
no_fold_quote :: Stream s m Char => ParsecT s u m String
no_fold_quote :: ParsecT s u m String
no_fold_quote = do Char
_ <- ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
dquote
[String]
r <- ParsecT s u m String -> ParsecT s u m [String]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
qtext ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
quoted_pair)
Char
_ <- ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
dquote
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String
"\"" String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
r String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\"")
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"non-folding quoted string"
no_fold_literal :: Stream s m Char => ParsecT s u m String
no_fold_literal :: ParsecT s u m String
no_fold_literal = do Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'['
[String]
r <- ParsecT s u m String -> ParsecT s u m [String]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
dtext ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
quoted_pair)
Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
']'
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String
"[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
r String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"]")
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"non-folding domain literal"
subject :: Stream s m Char => ParsecT s u m String
subject :: ParsecT s u m String
subject = String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Subject" ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
unstructured
comments :: Stream s m Char => ParsecT s u m String
= String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Comments" ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
unstructured
keywords :: Stream s m Char => ParsecT s u m [[String]]
keywords :: ParsecT s u m [[String]]
keywords = String -> ParsecT s u m [[String]] -> ParsecT s u m [[String]]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Keywords" ((:) ([String] -> [[String]] -> [[String]])
-> ParsecT s u m [String]
-> ParsecT s u m ([[String]] -> [[String]])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [String]
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m [String]
phrase ParsecT s u m ([[String]] -> [[String]])
-> ParsecT s u m [[String]] -> ParsecT s u m [[String]]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT s u m [String] -> ParsecT s u m [[String]]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
',' ParsecT s u m Char
-> ParsecT s u m [String] -> ParsecT s u m [String]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT s u m [String]
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m [String]
phrase))
resent_date :: Stream s m Char => ParsecT s u m ZonedTime
resent_date :: ParsecT s u m ZonedTime
resent_date = String -> ParsecT s u m ZonedTime -> ParsecT s u m ZonedTime
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Resent-Date" ParsecT s u m ZonedTime
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m ZonedTime
date_time
resent_from :: Stream s m Char => ParsecT s u m [NameAddr]
resent_from :: ParsecT s u m [NameAddr]
resent_from = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Resent-From" ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
mailbox_list
resent_sender :: Stream s m Char => ParsecT s u m NameAddr
resent_sender :: ParsecT s u m NameAddr
resent_sender = String -> ParsecT s u m NameAddr -> ParsecT s u m NameAddr
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Resent-Sender" ParsecT s u m NameAddr
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m NameAddr
mailbox
resent_to :: Stream s m Char => ParsecT s u m [NameAddr]
resent_to :: ParsecT s u m [NameAddr]
resent_to = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Resent-To" ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
address_list
resent_cc :: Stream s m Char => ParsecT s u m [NameAddr]
resent_cc :: ParsecT s u m [NameAddr]
resent_cc = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Resent-Cc" ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
address_list
resent_bcc :: Stream s m Char => ParsecT s u m [NameAddr]
resent_bcc :: ParsecT s u m [NameAddr]
resent_bcc = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Resent-Bcc" (ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
address_list ParsecT s u m [NameAddr]
-> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
cfws ParsecT s u m () -> [NameAddr] -> ParsecT s u m [NameAddr]
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> []))
ParsecT s u m [NameAddr] -> String -> ParsecT s u m [NameAddr]
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"Resent-Bcc: header line"
resent_msg_id :: Stream s m Char => ParsecT s u m String
resent_msg_id :: ParsecT s u m String
resent_msg_id = String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Resent-Message-ID" ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
msg_id
return_path :: Stream s m Char => ParsecT s u m String
return_path :: ParsecT s u m String
return_path = String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Return-Path" ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
path
path :: Stream s m Char => ParsecT s u m String
path :: ParsecT s u m String
path = ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold ( ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (do
Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'<'
String
r <- String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option String
"" ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
addr_spec
Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'>'
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String
"<" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
r String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
">")
)
ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
obs_path
)
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"return path spec"
received :: Stream s m Char => ParsecT s u m ([(String, String)], ZonedTime)
received :: ParsecT s u m ([(String, String)], ZonedTime)
received = String
-> ParsecT s u m ([(String, String)], ZonedTime)
-> ParsecT s u m ([(String, String)], ZonedTime)
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Received" (ParsecT s u m ([(String, String)], ZonedTime)
-> ParsecT s u m ([(String, String)], ZonedTime))
-> ParsecT s u m ([(String, String)], ZonedTime)
-> ParsecT s u m ([(String, String)], ZonedTime)
forall a b. (a -> b) -> a -> b
$ do [(String, String)]
r1 <- ParsecT s u m [(String, String)]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [(String, String)]
name_val_list
Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
';'
ZonedTime
r2 <- ParsecT s u m ZonedTime
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m ZonedTime
date_time
([(String, String)], ZonedTime)
-> ParsecT s u m ([(String, String)], ZonedTime)
forall (m :: * -> *) a. Monad m => a -> m a
return ([(String, String)]
r1, ZonedTime
r2)
name_val_list :: Stream s m Char => ParsecT s u m [(String, String)]
name_val_list :: ParsecT s u m [(String, String)]
name_val_list = ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
cfws ParsecT s u m ()
-> ParsecT s u m [(String, String)]
-> ParsecT s u m [(String, String)]
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT s u m (String, String) -> ParsecT s u m [(String, String)]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m (String, String)
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m (String, String)
name_val_pair
ParsecT s u m [(String, String)]
-> String -> ParsecT s u m [(String, String)]
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"list of name/value pairs"
name_val_pair :: Stream s m Char => ParsecT s u m (String, String)
name_val_pair :: ParsecT s u m (String, String)
name_val_pair = do String
r1 <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
item_name
String
_ <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
cfws
String
r2 <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
item_value
(String, String) -> ParsecT s u m (String, String)
forall (m :: * -> *) a. Monad m => a -> m a
return (String
r1, String
r2)
ParsecT s u m (String, String)
-> String -> ParsecT s u m (String, String)
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"a name/value pair"
item_name :: Stream s m Char => ParsecT s u m String
item_name :: ParsecT s u m String
item_name = do Char
r1 <- ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
alpha
String
r2 <- ParsecT s u m Char -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT s u m Char -> ParsecT s u m String)
-> ParsecT s u m Char -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ [ParsecT s u m Char] -> ParsecT s u m Char
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'-', ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
alpha, ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit]
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (Char
r1 Char -> String -> String
forall a. a -> [a] -> [a]
: String
r2)
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"name of a name/value pair"
item_value :: Stream s m Char => ParsecT s u m String
item_value :: ParsecT s u m String
item_value = [ParsecT s u m String] -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [ ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ParsecT s u m [String] -> ParsecT s u m String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m [String]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
angle_addr)
, ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
addr_spec
, ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
domain
, ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
msg_id
, ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
atom
]
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"value of a name/value pair"
{-# ANN optional_field "HLint: ignore Reduce duplication" #-}
optional_field :: Stream s m Char => ParsecT s u m (String, String)
optional_field :: ParsecT s u m (String, String)
optional_field = do String
n <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
field_name
Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
':'
String
b <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
unstructured
String
_ <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
crlf
(String, String) -> ParsecT s u m (String, String)
forall (m :: * -> *) a. Monad m => a -> m a
return (String
n, String
b)
ParsecT s u m (String, String)
-> String -> ParsecT s u m (String, String)
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"optional (unspecified) header line"
field_name :: Stream s m Char => ParsecT s u m String
field_name :: ParsecT s u m String
field_name = ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
ftext ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"header line name"
ftext :: Stream s m Char => ParsecT s u m Char
ftext :: ParsecT s u m Char
ftext = (Char -> Bool) -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\Char
c -> Char -> Int
ord Char
c Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ([Int
33 .. Int
57] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
59 .. Int
126]))
ParsecT s u m Char -> String -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"character (excluding controls, space, and ':')"
obs_qp :: Stream s m Char => ParsecT s u m String
obs_qp :: ParsecT s u m String
obs_qp = do Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\\'
Char
c <- (Char -> Bool) -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\Char
c -> Char -> Int
ord Char
c Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int
0 .. Int
127])
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return [Char
'\\', Char
c]
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"any quoted US-ASCII character"
obs_text :: Stream s m Char => ParsecT s u m String
obs_text :: ParsecT s u m String
obs_text = do String
r1 <- ParsecT s u m Char -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
lf
String
r2 <- ParsecT s u m Char -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
cr
[String]
r3 <- ParsecT s u m String -> ParsecT s u m [String]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT s u m String -> ParsecT s u m [String])
-> ParsecT s u m String -> ParsecT s u m [String]
forall a b. (a -> b) -> a -> b
$ do Char
r4 <- ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
obs_char
String
r5 <- ParsecT s u m Char -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
lf
String
r6 <- ParsecT s u m Char -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
cr
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (Char
r4 Char -> String -> String
forall a. a -> [a] -> [a]
: (String
r5 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
r6))
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String
r1 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
r2 String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
r3)
obs_char :: Stream s m Char => ParsecT s u m Char
obs_char :: ParsecT s u m Char
obs_char = (Char -> Bool) -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\Char
c -> Char -> Int
ord Char
c Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ([Int
0 .. Int
9] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
11, Int
12] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
14 .. Int
127]))
ParsecT s u m Char -> String -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"any ASCII character except CR and LF"
obs_utext :: Stream s m Char => ParsecT s u m String
obs_utext :: ParsecT s u m String
obs_utext = ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
obs_text
obs_phrase :: Stream s m Char => ParsecT s u m [String]
obs_phrase :: ParsecT s u m [String]
obs_phrase = do String
r1 <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
word
[String]
r2 <- ParsecT s u m String -> ParsecT s u m [String]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT s u m String -> ParsecT s u m [String])
-> ParsecT s u m String -> ParsecT s u m [String]
forall a b. (a -> b) -> a -> b
$ [ParsecT s u m String] -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [ ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
word
, String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"."
, ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
cfws ParsecT s u m String -> String -> ParsecT s u m String
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> []
]
[String] -> ParsecT s u m [String]
forall (m :: * -> *) a. Monad m => a -> m a
return (String
r1 String -> [String] -> [String]
forall a. a -> [a] -> [a]
: (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= []) [String]
r2)
obs_phrase_list :: Stream s m Char => ParsecT s u m [String]
obs_phrase_list :: ParsecT s u m [String]
obs_phrase_list = do [[String]]
r1 <- ParsecT s u m [String] -> ParsecT s u m [[String]]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT s u m [String] -> ParsecT s u m [[String]])
-> ParsecT s u m [String] -> ParsecT s u m [[String]]
forall a b. (a -> b) -> a -> b
$ do [String]
r <- [String] -> ParsecT s u m [String] -> ParsecT s u m [String]
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] ParsecT s u m [String]
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m [String]
phrase
Char
_ <- ParsecT s u m Char -> ParsecT s u m Char
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold (ParsecT s u m Char -> ParsecT s u m Char)
-> ParsecT s u m Char -> ParsecT s u m Char
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
','
[String] -> ParsecT s u m [String]
forall (m :: * -> *) a. Monad m => a -> m a
return ((String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= []) [String]
r)
[String]
r2 <- [String] -> ParsecT s u m [String] -> ParsecT s u m [String]
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] ParsecT s u m [String]
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m [String]
phrase
[String] -> ParsecT s u m [String]
forall (m :: * -> *) a. Monad m => a -> m a
return ([[String]] -> [String]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[String]]
r1 [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String]
r2)
ParsecT s u m [String]
-> ParsecT s u m [String] -> ParsecT s u m [String]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m [String]
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m [String]
phrase
obs_fws :: Stream s m Char => ParsecT s u m String
obs_fws :: ParsecT s u m String
obs_fws = do String
r1 <- ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
wsp
[String]
r2 <- ParsecT s u m String -> ParsecT s u m [String]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT s u m String -> ParsecT s u m [String])
-> ParsecT s u m String -> ParsecT s u m [String]
forall a b. (a -> b) -> a -> b
$ do String
r3 <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
crlf
String
r4 <- ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
wsp
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String
r3 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
r4)
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String
r1 String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
r2)
obs_day_of_week :: Stream s m Char => ParsecT s u m DayOfWeek
obs_day_of_week :: ParsecT s u m DayOfWeek
obs_day_of_week = ParsecT s u m DayOfWeek -> ParsecT s u m DayOfWeek
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold ParsecT s u m DayOfWeek
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m DayOfWeek
day_name ParsecT s u m DayOfWeek -> String -> ParsecT s u m DayOfWeek
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"day-of-the-week name"
obs_year :: Stream s m Char => ParsecT s u m Int
obs_year :: ParsecT s u m Int
obs_year = ParsecT s u m Int -> ParsecT s u m Int
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold (Int -> Int
forall a. (Ord a, Num a) => a -> a
normalize (Int -> Int) -> (String -> Int) -> String -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Int
forall a. Read a => String -> a
read (String -> Int) -> ParsecT s u m String -> ParsecT s u m Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> ParsecT s u m Char -> ParsecT s u m String
forall s u (m :: * -> *) a.
Int -> ParsecT s u m a -> ParsecT s u m [a]
manyN Int
2 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit) ParsecT s u m Int -> String -> ParsecT s u m Int
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"year"
where
normalize :: a -> a
normalize a
n | a
n a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
49 = a
2000 a -> a -> a
forall a. Num a => a -> a -> a
+ a
n
| a
n a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
999 = a
1900 a -> a -> a
forall a. Num a => a -> a -> a
+ a
n
| Bool
otherwise = a
n
obs_month :: Stream s m Char => ParsecT s u m Int
obs_month :: ParsecT s u m Int
obs_month = ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m Int -> ParsecT s u m Int
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
cfws ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
cfws ParsecT s u m Int
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Int
month_name ParsecT s u m Int -> String -> ParsecT s u m Int
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"month name"
obs_day :: Stream s m Char => ParsecT s u m Int
obs_day :: ParsecT s u m Int
obs_day = ParsecT s u m Int -> ParsecT s u m Int
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold ParsecT s u m Int
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Int
day_of_month ParsecT s u m Int -> String -> ParsecT s u m Int
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"day"
obs_hour :: Stream s m Char => ParsecT s u m Int
obs_hour :: ParsecT s u m Int
obs_hour = ParsecT s u m Int -> ParsecT s u m Int
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold ParsecT s u m Int
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Int
hour ParsecT s u m Int -> String -> ParsecT s u m Int
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"hour"
obs_minute :: Stream s m Char => ParsecT s u m Int
obs_minute :: ParsecT s u m Int
obs_minute = ParsecT s u m Int -> ParsecT s u m Int
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold ParsecT s u m Int
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Int
minute ParsecT s u m Int -> String -> ParsecT s u m Int
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"minute"
obs_second :: Stream s m Char => ParsecT s u m Int
obs_second :: ParsecT s u m Int
obs_second = ParsecT s u m Int -> ParsecT s u m Int
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold ParsecT s u m Int
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Int
second ParsecT s u m Int -> String -> ParsecT s u m Int
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"second"
obs_zone :: Stream s m Char => ParsecT s u m TimeZone
obs_zone :: ParsecT s u m TimeZone
obs_zone = [ParsecT s u m TimeZone] -> ParsecT s u m TimeZone
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [ String -> Int -> ParsecT s u m TimeZone
parseZone String
"UT" Int
0
, String -> Int -> ParsecT s u m TimeZone
parseZone String
"GMT" Int
0
, String -> Int -> ParsecT s u m TimeZone
parseZone String
"EST" (-Int
5)
, String -> Int -> ParsecT s u m TimeZone
parseZone String
"EDT" (-Int
4)
, String -> Int -> ParsecT s u m TimeZone
parseZone String
"CST" (-Int
6)
, String -> Int -> ParsecT s u m TimeZone
parseZone String
"CDT" (-Int
5)
, String -> Int -> ParsecT s u m TimeZone
parseZone String
"MST" (-Int
7)
, String -> Int -> ParsecT s u m TimeZone
parseZone String
"MDT" (-Int
6)
, String -> Int -> ParsecT s u m TimeZone
parseZone String
"PST" (-Int
8)
, String -> Int -> ParsecT s u m TimeZone
parseZone String
"PDT" (-Int
7)
, do Char
r <- String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf [Char
'A' .. Char
'I']
Int -> ParsecT s u m TimeZone
mkZone (Char -> Int
ord Char
r Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
64)
ParsecT s u m TimeZone -> String -> ParsecT s u m TimeZone
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"military zone spec"
, do Char
r <- String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf [Char
'K' .. Char
'M']
Int -> ParsecT s u m TimeZone
mkZone (Char -> Int
ord Char
r Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
65)
ParsecT s u m TimeZone -> String -> ParsecT s u m TimeZone
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"military zone spec"
, do Char
r <- String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf [Char
'N' .. Char
'Y']
Int -> ParsecT s u m TimeZone
mkZone (-(Char -> Int
ord Char
r Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
77))
ParsecT s u m TimeZone -> String -> ParsecT s u m TimeZone
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"military zone spec"
, String -> Int -> ParsecT s u m TimeZone
parseZone String
"Z" Int
0 ParsecT s u m TimeZone -> String -> ParsecT s u m TimeZone
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"military zone spec"
]
where
parseZone :: String -> Int -> ParsecT s u m TimeZone
parseZone String
n Int
o = ParsecT s u m TimeZone -> ParsecT s u m TimeZone
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
n ParsecT s u m String
-> ParsecT s u m TimeZone -> ParsecT s u m TimeZone
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Int -> ParsecT s u m TimeZone
mkZone Int
o)
mkZone :: Int -> ParsecT s u m TimeZone
mkZone = TimeZone -> ParsecT s u m TimeZone
forall (f :: * -> *) a. Applicative f => a -> f a
pure (TimeZone -> ParsecT s u m TimeZone)
-> (Int -> TimeZone) -> Int -> ParsecT s u m TimeZone
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> TimeZone
hoursToTimeZone
obs_angle_addr :: Stream s m Char => ParsecT s u m String
obs_angle_addr :: ParsecT s u m String
obs_angle_addr = ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold (do Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'<'
[String]
_ <- [String] -> ParsecT s u m [String] -> ParsecT s u m [String]
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [] ParsecT s u m [String]
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m [String]
obs_route
String
addr <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
addr_spec
Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'>'
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String
"<" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
addr String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
">")
)
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"obsolete angle address"
obs_route :: Stream s m Char => ParsecT s u m [String]
obs_route :: ParsecT s u m [String]
obs_route = ParsecT s u m [String] -> ParsecT s u m [String]
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold (ParsecT s u m [String]
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m [String]
obs_domain_list ParsecT s u m [String]
-> ParsecT s u m Char -> ParsecT s u m [String]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
':') ParsecT s u m [String] -> String -> ParsecT s u m [String]
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"route of an obsolete angle address"
obs_domain_list :: Stream s m Char => ParsecT s u m [String]
obs_domain_list :: ParsecT s u m [String]
obs_domain_list = do Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'@'
String
r1 <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
domain
[String]
r2 <- ParsecT s u m String -> ParsecT s u m [String]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT s u m String -> ParsecT s u m [String])
-> ParsecT s u m String -> ParsecT s u m [String]
forall a b. (a -> b) -> a -> b
$ do String
_ <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
cfws ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
","
ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
cfws
Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'@'
ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
domain
[String] -> ParsecT s u m [String]
forall (m :: * -> *) a. Monad m => a -> m a
return (String
r1 String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String]
r2)
ParsecT s u m [String] -> String -> ParsecT s u m [String]
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"route of an obsolete angle address"
obs_local_part :: Stream s m Char => ParsecT s u m String
obs_local_part :: ParsecT s u m String
obs_local_part = do String
r1 <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
word
[String]
r2 <- ParsecT s u m String -> ParsecT s u m [String]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT s u m String -> ParsecT s u m [String])
-> ParsecT s u m String -> ParsecT s u m [String]
forall a b. (a -> b) -> a -> b
$ do String
_ <- String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"."
String
r <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
word
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (Char
'.' Char -> String -> String
forall a. a -> [a] -> [a]
: String
r)
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String
r1 String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
r2)
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"local part of an address"
obs_domain :: Stream s m Char => ParsecT s u m String
obs_domain :: ParsecT s u m String
obs_domain = do String
r1 <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
atom
[String]
r2 <- ParsecT s u m String -> ParsecT s u m [String]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT s u m String -> ParsecT s u m [String])
-> ParsecT s u m String -> ParsecT s u m [String]
forall a b. (a -> b) -> a -> b
$ do String
_ <- String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"."
String
r <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
atom
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (Char
'.' Char -> String -> String
forall a. a -> [a] -> [a]
: String
r)
String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String
r1 String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
r2)
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"domain part of an address"
obs_mbox_list :: Stream s m Char => ParsecT s u m [NameAddr]
obs_mbox_list :: ParsecT s u m [NameAddr]
obs_mbox_list = do [Maybe NameAddr]
r1 <- ParsecT s u m (Maybe NameAddr) -> ParsecT s u m [Maybe NameAddr]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT s u m (Maybe NameAddr) -> ParsecT s u m [Maybe NameAddr])
-> ParsecT s u m (Maybe NameAddr) -> ParsecT s u m [Maybe NameAddr]
forall a b. (a -> b) -> a -> b
$ ParsecT s u m (Maybe NameAddr) -> ParsecT s u m (Maybe NameAddr)
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m (Maybe NameAddr) -> ParsecT s u m (Maybe NameAddr))
-> ParsecT s u m (Maybe NameAddr) -> ParsecT s u m (Maybe NameAddr)
forall a b. (a -> b) -> a -> b
$ do Maybe NameAddr
r <- ParsecT s u m NameAddr -> ParsecT s u m (Maybe NameAddr)
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m (Maybe a)
maybeOption ParsecT s u m NameAddr
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m NameAddr
mailbox
Char
_ <- ParsecT s u m Char -> ParsecT s u m Char
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
unfold (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
',')
Maybe NameAddr -> ParsecT s u m (Maybe NameAddr)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe NameAddr
r
Maybe NameAddr
r2 <- ParsecT s u m NameAddr -> ParsecT s u m (Maybe NameAddr)
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m (Maybe a)
maybeOption ParsecT s u m NameAddr
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m NameAddr
mailbox
[NameAddr] -> ParsecT s u m [NameAddr]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Maybe NameAddr] -> [NameAddr]
forall a. [Maybe a] -> [a]
catMaybes ([Maybe NameAddr]
r1 [Maybe NameAddr] -> [Maybe NameAddr] -> [Maybe NameAddr]
forall a. [a] -> [a] -> [a]
++ [Maybe NameAddr
r2]))
ParsecT s u m [NameAddr] -> String -> ParsecT s u m [NameAddr]
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"obsolete syntax for a list of mailboxes"
obs_addr_list :: Stream s m Char => ParsecT s u m [NameAddr]
obs_addr_list :: ParsecT s u m [NameAddr]
obs_addr_list = do [Maybe [NameAddr]]
r1 <- ParsecT s u m (Maybe [NameAddr])
-> ParsecT s u m [Maybe [NameAddr]]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT s u m (Maybe [NameAddr])
-> ParsecT s u m [Maybe [NameAddr]])
-> ParsecT s u m (Maybe [NameAddr])
-> ParsecT s u m [Maybe [NameAddr]]
forall a b. (a -> b) -> a -> b
$ ParsecT s u m (Maybe [NameAddr])
-> ParsecT s u m (Maybe [NameAddr])
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m (Maybe [NameAddr])
-> ParsecT s u m (Maybe [NameAddr]))
-> ParsecT s u m (Maybe [NameAddr])
-> ParsecT s u m (Maybe [NameAddr])
forall a b. (a -> b) -> a -> b
$ do Maybe [NameAddr]
r <- ParsecT s u m [NameAddr] -> ParsecT s u m (Maybe [NameAddr])
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m (Maybe a)
maybeOption ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
address
ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
cfws
Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
','
ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
cfws
Maybe [NameAddr] -> ParsecT s u m (Maybe [NameAddr])
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe [NameAddr]
r
Maybe [NameAddr]
r2 <- ParsecT s u m [NameAddr] -> ParsecT s u m (Maybe [NameAddr])
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m (Maybe a)
maybeOption ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
address
[NameAddr] -> ParsecT s u m [NameAddr]
forall (m :: * -> *) a. Monad m => a -> m a
return ([[NameAddr]] -> [NameAddr]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([Maybe [NameAddr]] -> [[NameAddr]]
forall a. [Maybe a] -> [a]
catMaybes ([Maybe [NameAddr]]
r1 [Maybe [NameAddr]] -> [Maybe [NameAddr]] -> [Maybe [NameAddr]]
forall a. [a] -> [a] -> [a]
++ [Maybe [NameAddr]
r2])))
ParsecT s u m [NameAddr] -> String -> ParsecT s u m [NameAddr]
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"obsolete syntax for a list of addresses"
obs_fields :: Stream s m Char => ParsecT s u m [Field]
obs_fields :: ParsecT s u m [Field]
obs_fields = ParsecT s u m Field -> ParsecT s u m [Field]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT s u m Field -> ParsecT s u m [Field])
-> ParsecT s u m Field -> ParsecT s u m [Field]
forall a b. (a -> b) -> a -> b
$ [ParsecT s u m Field] -> ParsecT s u m Field
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [ ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
From ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
obs_from)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (NameAddr -> Field
Sender (NameAddr -> Field)
-> ParsecT s u m NameAddr -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m NameAddr
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m NameAddr
obs_sender)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Field
ReturnPath (String -> Field) -> ParsecT s u m String -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
obs_return)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
ReplyTo ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
obs_reply_to)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
To ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
obs_to)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
Cc ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
obs_cc)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
Bcc ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
obs_bcc)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Field
MessageID (String -> Field) -> ParsecT s u m String -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
obs_message_id)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([String] -> Field
InReplyTo ([String] -> Field)
-> ParsecT s u m [String] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [String]
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m [String]
obs_in_reply_to)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([String] -> Field
References ([String] -> Field)
-> ParsecT s u m [String] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [String]
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m [String]
obs_references)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Field
Subject (String -> Field) -> ParsecT s u m String -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
obs_subject)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Field
Comments (String -> Field) -> ParsecT s u m String -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
obs_comments)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([[String]] -> Field
Keywords ([[String]] -> Field)
-> ([String] -> [[String]]) -> [String] -> Field
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> [[String]]
forall (m :: * -> *) a. Monad m => a -> m a
return ([String] -> Field)
-> ParsecT s u m [String] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [String]
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m [String]
obs_keywords)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ZonedTime -> Field
Date (ZonedTime -> Field)
-> ParsecT s u m ZonedTime -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m ZonedTime
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m ZonedTime
obs_orig_date)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ZonedTime -> Field
ResentDate (ZonedTime -> Field)
-> ParsecT s u m ZonedTime -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m ZonedTime
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m ZonedTime
obs_resent_date)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
ResentFrom ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
obs_resent_from)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (NameAddr -> Field
ResentSender (NameAddr -> Field)
-> ParsecT s u m NameAddr -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m NameAddr
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m NameAddr
obs_resent_send)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
ResentTo ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
obs_resent_to)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
ResentCc ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
obs_resent_cc)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
ResentBcc ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
obs_resent_bcc)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Field
ResentMessageID (String -> Field) -> ParsecT s u m String -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
obs_resent_mid)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([NameAddr] -> Field
ResentReplyTo ([NameAddr] -> Field)
-> ParsecT s u m [NameAddr] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
obs_resent_reply)
, ParsecT s u m Field -> ParsecT s u m Field
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([(String, String)] -> Field
ObsReceived ([(String, String)] -> Field)
-> ParsecT s u m [(String, String)] -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m [(String, String)]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [(String, String)]
obs_received)
, (String -> String -> Field) -> (String, String) -> Field
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry String -> String -> Field
OptionalField ((String, String) -> Field)
-> ParsecT s u m (String, String) -> ParsecT s u m Field
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m (String, String)
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m (String, String)
obs_optional
]
obs_orig_date :: Stream s m Char => ParsecT s u m ZonedTime
obs_orig_date :: ParsecT s u m ZonedTime
obs_orig_date = String -> ParsecT s u m ZonedTime -> ParsecT s u m ZonedTime
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"Date" ParsecT s u m ZonedTime
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m ZonedTime
date_time
obs_from :: Stream s m Char => ParsecT s u m [NameAddr]
obs_from :: ParsecT s u m [NameAddr]
obs_from = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"From" ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
mailbox_list
obs_sender :: Stream s m Char => ParsecT s u m NameAddr
obs_sender :: ParsecT s u m NameAddr
obs_sender = String -> ParsecT s u m NameAddr -> ParsecT s u m NameAddr
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"Sender" ParsecT s u m NameAddr
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m NameAddr
mailbox
obs_reply_to :: Stream s m Char => ParsecT s u m [NameAddr]
obs_reply_to :: ParsecT s u m [NameAddr]
obs_reply_to = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"Reply-To" ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
mailbox_list
obs_to :: Stream s m Char => ParsecT s u m [NameAddr]
obs_to :: ParsecT s u m [NameAddr]
obs_to = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"To" ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
address_list
obs_cc :: Stream s m Char => ParsecT s u m [NameAddr]
obs_cc :: ParsecT s u m [NameAddr]
obs_cc = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"Cc" ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
address_list
obs_bcc :: Stream s m Char => ParsecT s u m [NameAddr]
obs_bcc :: ParsecT s u m [NameAddr]
obs_bcc = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
header String
"Bcc" (ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
address_list ParsecT s u m [NameAddr]
-> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
cfws ParsecT s u m () -> [NameAddr] -> ParsecT s u m [NameAddr]
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> []))
obs_message_id :: Stream s m Char => ParsecT s u m String
obs_message_id :: ParsecT s u m String
obs_message_id = String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"Message-ID" ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
msg_id
obs_in_reply_to :: Stream s m Char => ParsecT s u m [String]
obs_in_reply_to :: ParsecT s u m [String]
obs_in_reply_to = String -> ParsecT s u m [String] -> ParsecT s u m [String]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"In-Reply-To" (ParsecT s u m [String] -> ParsecT s u m [String])
-> ParsecT s u m [String] -> ParsecT s u m [String]
forall a b. (a -> b) -> a -> b
$ do [String]
r <- ParsecT s u m String -> ParsecT s u m [String]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ((ParsecT s u m [String]
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m [String]
phrase ParsecT s u m [String] -> String -> ParsecT s u m String
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> []) ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
msg_id )
[String] -> ParsecT s u m [String]
forall (m :: * -> *) a. Monad m => a -> m a
return ((String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= []) [String]
r)
obs_references :: Stream s m Char => ParsecT s u m [String]
obs_references :: ParsecT s u m [String]
obs_references = String -> ParsecT s u m [String] -> ParsecT s u m [String]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"References" (ParsecT s u m [String] -> ParsecT s u m [String])
-> ParsecT s u m [String] -> ParsecT s u m [String]
forall a b. (a -> b) -> a -> b
$ do [String]
r <- ParsecT s u m String -> ParsecT s u m [String]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ((ParsecT s u m [String]
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m [String]
phrase ParsecT s u m [String] -> String -> ParsecT s u m String
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> []) ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
msg_id)
[String] -> ParsecT s u m [String]
forall (m :: * -> *) a. Monad m => a -> m a
return ((String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= []) [String]
r)
obs_id_left :: Stream s m Char => ParsecT s u m String
obs_id_left :: ParsecT s u m String
obs_id_left = ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
local_part ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"left part of an message ID"
obs_id_right :: Stream s m Char => ParsecT s u m String
obs_id_right :: ParsecT s u m String
obs_id_right = ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
domain ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"right part of an message ID"
obs_subject :: Stream s m Char => ParsecT s u m String
obs_subject :: ParsecT s u m String
obs_subject = String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"Subject" ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
unstructured
obs_comments :: Stream s m Char => ParsecT s u m String
= String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"Comments" ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
unstructured
obs_keywords :: Stream s m Char => ParsecT s u m [String]
obs_keywords :: ParsecT s u m [String]
obs_keywords = String -> ParsecT s u m [String] -> ParsecT s u m [String]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"Keywords" ParsecT s u m [String]
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m [String]
obs_phrase_list
obs_resent_from :: Stream s m Char => ParsecT s u m [NameAddr]
obs_resent_from :: ParsecT s u m [NameAddr]
obs_resent_from = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"Resent-From" ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
mailbox_list
obs_resent_send :: Stream s m Char => ParsecT s u m NameAddr
obs_resent_send :: ParsecT s u m NameAddr
obs_resent_send = String -> ParsecT s u m NameAddr -> ParsecT s u m NameAddr
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"Resent-Sender" ParsecT s u m NameAddr
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m NameAddr
mailbox
obs_resent_date :: Stream s m Char => ParsecT s u m ZonedTime
obs_resent_date :: ParsecT s u m ZonedTime
obs_resent_date = String -> ParsecT s u m ZonedTime -> ParsecT s u m ZonedTime
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"Resent-Date" ParsecT s u m ZonedTime
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m ZonedTime
date_time
obs_resent_to :: Stream s m Char => ParsecT s u m [NameAddr]
obs_resent_to :: ParsecT s u m [NameAddr]
obs_resent_to = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"Resent-To" ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
mailbox_list
obs_resent_cc :: Stream s m Char => ParsecT s u m [NameAddr]
obs_resent_cc :: ParsecT s u m [NameAddr]
obs_resent_cc = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"Resent-Cc" ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
mailbox_list
obs_resent_bcc :: Stream s m Char => ParsecT s u m [NameAddr]
obs_resent_bcc :: ParsecT s u m [NameAddr]
obs_resent_bcc = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"Bcc" (ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
address_list ParsecT s u m [NameAddr]
-> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT s u m String -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
cfws ParsecT s u m () -> [NameAddr] -> ParsecT s u m [NameAddr]
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> []))
obs_resent_mid :: Stream s m Char => ParsecT s u m String
obs_resent_mid :: ParsecT s u m String
obs_resent_mid = String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"Resent-Message-ID" ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
msg_id
obs_resent_reply :: Stream s m Char => ParsecT s u m [NameAddr]
obs_resent_reply :: ParsecT s u m [NameAddr]
obs_resent_reply = String -> ParsecT s u m [NameAddr] -> ParsecT s u m [NameAddr]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"Resent-Reply-To" ParsecT s u m [NameAddr]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [NameAddr]
address_list
obs_return :: Stream s m Char => ParsecT s u m String
obs_return :: ParsecT s u m String
obs_return = String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"Return-Path" ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
path
obs_received :: Stream s m Char => ParsecT s u m [(String, String)]
obs_received :: ParsecT s u m [(String, String)]
obs_received = String
-> ParsecT s u m [(String, String)]
-> ParsecT s u m [(String, String)]
forall s (m :: * -> *) u a.
Stream s m Char =>
String -> ParsecT s u m a -> ParsecT s u m a
obs_header String
"Received" ParsecT s u m [(String, String)]
forall s (m :: * -> *) u.
Stream s m Char =>
ParsecT s u m [(String, String)]
name_val_list
obs_path :: Stream s m Char => ParsecT s u m String
obs_path :: ParsecT s u m String
obs_path = ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
obs_angle_addr
obs_optional :: Stream s m Char => ParsecT s u m (String, String)
obs_optional :: ParsecT s u m (String, String)
obs_optional = do String
n <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
field_name
String
_ <- ParsecT s u m Char -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
wsp
Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
':'
String
b <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
unstructured
String
_ <- ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
crlf
(String, String) -> ParsecT s u m (String, String)
forall (m :: * -> *) a. Monad m => a -> m a
return (String
n, String
b)
ParsecT s u m (String, String)
-> String -> ParsecT s u m (String, String)
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"optional (unspecified) header line"