[Haskell-cafe] Brainstorming on how to parse IMAP
Malcolm Wallace
Malcolm.Wallace at cs.york.ac.uk
Mon Aug 4 06:10:42 EDT 2008
> 1) Ideally I could parse stuff lazily. I have tried this with FTP and
> it is more complex than it seems at first, due to making sure you
> never, never, never consume too much data.
PolyParse has lazy variants of its combinators, which would probably be
of use here.
Software:
http://hackage.haskell.org/cgi-bin/hackage-scripts/package/polyparse
Paper:
http://www-users.cs.york.ac.uk/~malcolm/partialparse.html
> 2) Avoiding Strings wherever possible.
PolyParse is completely independent of token type. There is a
rudimentary module implementing the combinators on top of ByteString.
(Not currently exposed in the package interface, BTW.) I'm sure it would
not be difficult to build on top of LazyByteString also. Patches
gratefully accepted.
> 3) Avoiding complex buffering schemes where I have to manually buffer
> data packets.
Provided the parser is lazy enough, the buffering would be done at the
level of Lazy ByteString (but I don't know whether LBS is suitable for
network-reading or not).
> Thoughts and ideas?
> A283 SEARCH {4} {21}
> TEXTstring not in mailbox
Assuming the first line can be read strictly, and the remainder should
be lazy, the parser might look something like this:
searchResult = do n <- qnumber
word "SEARCH"
extents <- many1 (braces number)
return SearchResult n `apply`
(mapAF (\m-> exactly m char) extents)
where
-- embed map in an applicative functor
mapAF :: (a -> Parser b) -> [a] -> Parser [b]
mapAF p [] = return []
mapAF p (x:xs) = return (:) `apply` p x `apply` mapAF p xs
Regards,
Malcolm
More information about the Haskell-Cafe
mailing list