[Haskell-cafe] [Pipes] Can pipes solve this problem? How?
michael at snoyman.com
Thu Aug 16 10:29:45 CEST 2012
On Wed, Aug 15, 2012 at 9:54 PM, Daniel Hlynskyi <abcz2.uprola at gmail.com>wrote:
> Hello Cafe.
> Consider code, that takes input from handle until special substring
> > matchInf a res s | a `isPrefixOf` s = reverse res
> > matchInf a res (c:cs) = matchInf a (c:res) cs
> > hTakeWhileNotFound str hdl = hGetContents hdl >>= return.matchInf str 
> It is simple, but the handle is closed after running. That is not good,
> because I want to reuse this function.
> Code can be rewritten without hGetContent, but it is much less
> hTakeWhileNotFound str hdl = fmap reverse$ findStr str hdl  
> findStr str hdl indeces acc = do
> c <- hGetChar hdl
> let newIndeces = [ i+1 | i <- indeces, i < length str, str!!i == c]
> if length str `elem` newIndeces
> then return (c : acc)
> else findStr str hdl (0 : newIndeces) (c : acc)
> So, the question is - can pipes (any package of them) be the Holy Grail in
> this situation, to both keep simple code and better deal with handles (do
> not close them specifically)? How?
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
This is essentially what we do in wai-extra for multipart body parsing.
This code uses `conduit`.
The tricky part is that you have to remember that the substring you're
looking for might be spread across multiple chunks, so you need to take
that into account. A simple approach would be:
* If the search string is a substring of the current chunk, success.
* If the end of the current chunk is a prefix of the search string, grab
the next chunk, append the two, and repeat. (Note: there are more efficient
approaches than appending.)
* Otherwise, skip to the next chunk.
* If no more chunks available, the substring was not found.
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Haskell-Cafe