HaskellNet 0.4.2 → 0.4.3
raw patch · 5 files changed
+52/−27 lines, 5 filesdep ~basePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base
API changes (from Hackage documentation)
Files
- CHANGELOG +7/−0
- HaskellNet.cabal +1/−1
- example/imap.hs +5/−5
- src/Network/HaskellNet/IMAP/Parsers.hs +6/−5
- src/Text/Packrat/Parse.hs +33/−16
CHANGELOG view
@@ -1,3 +1,10 @@+0.4.2 -> 0.4.3 (2015-04-06)+---------------------------++ - Parser for IMAP LIST to return mailbox names unquoted+ (see https://github.com/jtdaugherty/HaskellNet/issues/34)+ - Update to build with GHC 7.10.1+ 0.4.1 -> 0.4.2 --------------
HaskellNet.cabal view
@@ -4,7 +4,7 @@ SMTP, and IMAP protocols. NOTE: this package will be split into smaller, protocol-specific packages in the future.-Version: 0.4.2+Version: 0.4.3 Copyright: (c) 2006 Jun Mukai Author: Jun Mukai Maintainer: Jonathan Daugherty <cygnus@foobox.com>,
example/imap.hs view
@@ -1,6 +1,6 @@-import System.IO+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}+ import Network.HaskellNet.IMAP-import qualified Data.ByteString.Char8 as BS import Control.Monad imapServer = "imap.mail.org"@@ -11,8 +11,8 @@ con <- connectIMAP imapServer login con username password mboxes <- list con- mapM print mboxes+ mapM_ print mboxes select con "INBOX" msgs <- search con [ALLs]- mapM_ (\x -> print x) (take 4 msgs)- forM_ (take 4msgs) (\x -> fetch con x >>= print)+ mapM_ print (take 4 msgs)+ forM_ (take 4msgs) (fetch con >=> print)
src/Network/HaskellNet/IMAP/Parsers.hs view
@@ -110,7 +110,7 @@ Parser pSearch = do untagged <- many (pSearchLine <|> pOtherLine) resp <- Parser pDone- let (mboxUp, searchRes) = mkMboxUpdate untagged + let (mboxUp, searchRes) = mkMboxUpdate untagged return (resp, mboxUp, concat searchRes) @@ -165,7 +165,7 @@ ; char ')' ; return $ PERMANENTFLAGS fs } , string "READ-ONLY" >> return READ_ONLY- , string "READ-WRITE" >> return READ_WRITE + , string "READ-WRITE" >> return READ_WRITE , string "TRYCREATE" >> return TRYCREATE , do { string "UNSEEN" >> space ; num <- many1 digit@@ -229,11 +229,12 @@ pListLine :: String -> Parser RespDerivs (Either a ([Attribute], String, MailboxName))-pListLine list = +pListLine list = do string "* " >> string list >> space attrs <- parseAttrs sep <- parseSep mbox <- parseMailbox+ anyChar `manyTill` crlfP return $ Right (attrs, sep, mbox) where parseAttr = do char '\\'@@ -248,7 +249,7 @@ char ')' return attrs parseSep = space >> char '"' >> anyChar `manyTill` char '"'- parseMailbox = space >> anyChar `manyTill` crlfP+ parseMailbox = space >> char '"' >> anyChar `manyTill` char '"' pStatusLine :: Parser RespDerivs (Either a [(MailboxStatus, Integer)]) pStatusLine =@@ -294,7 +295,7 @@ ; fs <- pFlag `sepBy` space ; char ')' ; return $ \mbox ->- mbox { _isFlagWritable = + mbox { _isFlagWritable = Keyword "*" `elem` fs , _permanentFlags = filter (/= Keyword "*") fs } }
src/Text/Packrat/Parse.hs view
@@ -11,6 +11,8 @@ import Text.Packrat.Pos import Control.Monad+import Control.Applicative (Applicative(..))+import qualified Control.Applicative as A -- Data types @@ -37,10 +39,21 @@ infixl 1 <?> infixl 1 <?!> -instance Derivs d => Monad (Parser d) where +instance Derivs d => Functor (Parser d) where+ f `fmap` (Parser p1) = Parser $ parse . p1+ where parse (Parsed val rem err) =+ let val2 = f val+ in Parsed val2 rem err+ parse (NoParse err) = NoParse err++instance Derivs d => Applicative (Parser d) where+ pure x = Parser (\dvs -> Parsed x dvs (nullError dvs))+ (<*>) = ap++instance Derivs d => Monad (Parser d) where (Parser p1) >>= f = Parser parse where parse dvs = first (p1 dvs)- first (Parsed val rem err) = + first (Parsed val rem err) = let Parser p2 = f val in second err (p2 rem) first (NoParse err) = NoParse err@@ -48,17 +61,21 @@ Parsed val rem (joinErrors err1 err) second err1 (NoParse err) = NoParse (joinErrors err1 err)- return x = Parser (\dvs -> Parsed x dvs (nullError dvs))+ return = pure fail msg = Parser (\dvs -> NoParse (msgError (dvPos dvs) msg)) +instance Derivs d => A.Alternative (Parser d) where+ empty = Parser $ NoParse . nullError+ (<|>) = (<|>)+ instance Derivs d => MonadPlus (Parser d) where- mzero = Parser (\dvs -> NoParse $ nullError dvs)- mplus = (<|>)+ mzero = A.empty+ mplus = (A.<|>) (<|>) :: Derivs d => Parser d v -> Parser d v -> Parser d v (Parser p1) <|> (Parser p2) = Parser parse where parse dvs = first dvs (p1 dvs)- first _ (result @ (Parsed _ _ _)) = result+ first _ (result @ (Parsed {})) = result first dvs (NoParse err) = second err (p2 dvs) second err1 (Parsed val rem err) = Parsed val rem (joinErrors err1 err)@@ -76,7 +93,7 @@ notFollowedBy :: (Derivs d, Show v) => Parser d v -> Parser d () notFollowedBy (Parser p) = Parser parse- where parse dvs = case (p dvs) of+ where parse dvs = case p dvs of Parsed val _ _ -> NoParse (msgError (dvPos dvs) ("unexpected " ++ show val))@@ -86,7 +103,7 @@ optional p = (do v <- p; return (Just v)) <|> return Nothing option :: Derivs d => v -> Parser d v -> Parser d v-option v p = (do v' <- p; return v') <|> return v+option v p = p <|> return v many :: Derivs d => Parser d v -> Parser d [v] many p = (do { v <- p; vs <- many p; return (v : vs) } )@@ -96,7 +113,7 @@ many1 p = do { v <- p; vs <- many p; return (v : vs) } count :: Derivs d => Int -> Parser d v -> Parser d [v]-count n p = sequence $ replicate n p+count = replicateM sepBy1 :: Derivs d => Parser d v -> Parser d vsep -> Parser d [v] sepBy1 p psep = do v <- p@@ -233,11 +250,11 @@ ParseError p1 _ <= ParseError p2 _ = p1 <= p2 ParseError p1 _ >= ParseError p2 _ = p1 >= p2 -- Special behavior: "max" joins two errors- max p1 p2 = joinErrors p1 p2+ max = joinErrors min _ _ = undefined instance Show ParseError where- show (ParseError pos []) = + show (ParseError pos []) = show pos ++ ": unknown error" show (ParseError pos msgs) = expectmsg expects ++ messages msgs where expects = getExpects msgs@@ -265,14 +282,14 @@ anyChar = Parser dvChar char :: Derivs d => Char -> Parser d Char-char ch = satisfy anyChar (\c -> c == ch) <?> show ch+char ch = satisfy anyChar (== ch) <?> show ch oneOf :: Derivs d => [Char] -> Parser d Char-oneOf chs = satisfy anyChar (\c -> c `elem` chs)+oneOf chs = satisfy anyChar (`elem` chs) <?> ("one of the characters " ++ show chs) noneOf :: Derivs d => [Char] -> Parser d Char-noneOf chs = satisfy anyChar (\c -> not (c `elem` chs))+noneOf chs = satisfy anyChar (`notElem` chs) <?> ("any character not in " ++ show chs) @@ -332,7 +349,7 @@ getDerivs = Parser (\dvs -> Parsed dvs dvs (nullError dvs)) setDerivs :: Derivs d => d -> Parser d ()-setDerivs newdvs = Parser (\dvs -> Parsed () newdvs (nullError dvs))+setDerivs newdvs = Parser (Parsed () newdvs . nullError) getPos :: Derivs d => Parser d Pos getPos = Parser (\dvs -> Parsed (dvPos dvs) dvs (nullError dvs))@@ -344,5 +361,5 @@ dvString d = case dvChar d of NoParse _ -> []- Parsed c rem _ -> (c : dvString rem)+ Parsed c rem _ -> c : dvString rem