Hello Cafe.<div>Consider code, that takes input from handle until special substring matched:</div><div><br></div><div>&gt; matchInf a res s | a `isPrefixOf` s = reverse res</div><div><div>&gt; matchInf a res (c:cs)                   = matchInf a (c:res) cs</div>
<div>&gt; hTakeWhileNotFound str hdl = hGetContents hdl &gt;&gt;= return.matchInf str []</div></div><div><br></div><div>It is simple, but the handle is closed after running. That is not good, because I want to reuse this function. </div>
<div>Code can be rewritten without hGetContent, but it is much less comprehensible:</div><div><br></div><div><div>hTakeWhileNotFound str hdl = fmap reverse$ findStr str hdl [0] []</div><div> where</div><div>   findStr str hdl indeces acc = do </div>
<div>     c &lt;- hGetChar hdl</div><div>     let newIndeces = [ i+1 | i &lt;- indeces, i &lt; length str, str!!i == c]</div><div>     if length str `elem` newIndeces</div><div>       then return (c : acc)</div><div>       else findStr str hdl (0 : newIndeces) (c : acc)</div>
</div><div><br></div><div>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?</div>