Commit 5ad37e3b31cf1f1a77238959463e16017c811c59

Copy optionMaybe combinator from latest parsec into the source
code to avoid build failure on ghc 6.6.1.
  
11{- |
22 Module : Text.ParserCombinators.Parsec.Rfc2822
3 Copyright : (c) 2007 by Peter Simons
3 Copyright : (c) 2008 Peter Simons
44 License : BSD3
55
66 Maintainer : simons@cryp.to
1111 RFC2822, \"Internet Message Format\",
1212 <http://www.faqs.org/rfcs/rfc2822.html>.
1313
14 /Please note:/ The module is a mess. I keep it around as
15 a reminder that it needs to be rewritten, mostly.
16 Nevertheless, some parsers -- like 'date_time', for
17 example -- are genuinely useful.
14 /Please note:/ The module is not particularly well tested.
1815-}
1916
2017module Text.ParserCombinators.Parsec.Rfc2822 where
2118
22import Text.ParserCombinators.Parsec
19import System.Time
2320import Data.Char ( ord )
2421import Data.List ( intersperse )
25import System.Time
26import Text.ParserCombinators.Parsec.Rfc2234
27 hiding ( quoted_pair, quoted_string )
22import Control.Monad ( liftM )
23import Text.ParserCombinators.Parsec
24import Text.ParserCombinators.Parsec.Rfc2234 hiding ( quoted_pair, quoted_string )
2825
29data NameAddr = NameAddr { nameAddr_name :: Maybe String
30 , nameAddr_addr :: String }
31 deriving (Show,Eq)
32
3326-- * Useful parser combinators
3427
28-- |Return @Nothing@ if the given parser doesn't match. This
29-- combinator is included in the latest parsec distribution as
30-- @optionMaybe@, but ghc-6.6.1 apparently doesn't have it.
31
32maybeOption :: GenParser tok st a -> GenParser tok st (Maybe a)
33maybeOption p = option Nothing (liftM Just p)
34
3535-- |@unfold@ @=@ @between (optional cfws) (optional cfws)@
3636
3737unfold :: CharParser a b -> CharParser a b
399399
400400-- * Address Specification (section 3.4)
401401
402-- |A NameAddr is composed of an optional realname a mandatory
403-- e-mail 'address'.
404
405data NameAddr = NameAddr { nameAddr_name :: Maybe String
406 , nameAddr_addr :: String
407 }
408 deriving (Show,Eq)
409
402410-- |Parse a single 'mailbox' or an address 'group' and return the
403411-- address(es).
404412
425425-- and return the address.
426426
427427name_addr :: CharParser a NameAddr
428name_addr = do name <- optionMaybe display_name
428name_addr = do name <- maybeOption display_name
429429 addr <- angle_addr
430430 return (NameAddr name addr)
431431 <?> "name address"
11691169-- Strange, isn't it?
11701170
11711171obs_mbox_list :: CharParser a [NameAddr]
1172obs_mbox_list = do r1 <- many1 (try (do r <- optionMaybe mailbox
1172obs_mbox_list = do r1 <- many1 (try (do r <- maybeOption mailbox
11731173 unfold $ char ','
11741174 return r))
1175 r2 <- optionMaybe mailbox
1175 r2 <- maybeOption mailbox
11761176 return [x | Just x <- r1 ++ [r2]]
11771177 <?> "obsolete syntax for a list of mailboxes"
11781178
11831183-- information is lost.
11841184
11851185obs_addr_list :: CharParser a [NameAddr]
1186obs_addr_list = do r1 <- many1 (try (do r <- optionMaybe address
1186obs_addr_list = do r1 <- many1 (try (do r <- maybeOption address
11871187 optional cfws
11881188 char ','
11891189 optional cfws
11901190 return r))
1191 r2 <- optionMaybe address
1191 r2 <- maybeOption address
11921192 return (concat [x | Just x <- r1 ++ [r2]])
11931193 <?> "obsolete syntax for a list of addresses"
11941194