<div dir="ltr">The important issue here is that, when using =$, $=, and =$=, leftovers will discarded. To see this more clearly, realize that the first line of sink is equivalent to:<div><br></div><div><div>  out1 &lt;- C.injectLeftovers CT.lines C.&gt;+&gt; CL.head</div>

<div><br></div><div>So any leftovers from lines are lost once you move past that line. In order to get this to work, stick the consume inside the same composition:</div><div><br></div><div><div>sink = C.injectLeftovers CT.lines C.&gt;+&gt; do</div>

<div>    out1 &lt;- CL.head</div><div>    out2 &lt;- CL.consume</div><div>    return (out1, T.unlines out2)</div></div><div><br></div><div>Or:</div><div><br></div><div><div>sink = CT.lines C.=$ do</div><div>    out1 &lt;- CL.head</div>

<div>    out2 &lt;- CL.consume</div><div>    return (out1, T.unlines out2)</div></div><div><br></div><div>Michael</div><br><div class="gmail_quote">On Sat, Oct 27, 2012 at 9:20 PM, Myles C. Maxfield <span dir="ltr">&lt;<a href="mailto:myles.maxfield@gmail.com" target="_blank">myles.maxfield@gmail.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hey,<br>
Say I have a stream of Data.Text.Text objects flowing through a<br>
conduit, where the divisions between successive Data.Text.Text items<br>
occur at arbitrary boundaries (maybe the source is sourceFile $=<br>
decode utf8). I&#39;d like to create a Sink that returns a tuple of (the<br>
first line, the rest of the input).<br>
<br>
My first attempt at this looks like this:<br>
<br>
sink = do<br>
  out1 &lt;- CT.lines C.=$ CL.head<br>
  out2 &lt;- CL.consume<br>
  return (out1, T.concat out2)<br>
<br>
However, the following input provides:<br>
<br>
runIdentity $ CL.sourceList [&quot;abc\nde&quot;, &quot;f\nghi&quot;] C.$$ sink<br>
(Just &quot;abc&quot;,&quot;f\nghi&quot;)<br>
<br>
But what I really want is<br>
(Just &quot;abc&quot;, &quot;\ndef\nghi&quot;)<br>
<br>
I think this is due to the auto-termination you mention in [1]. My<br>
guess is that when CT.lines yields the first value, (CL.head then also<br>
yields it,) and execution is auto-terminated before CT.lines gets a<br>
chance to specify any leftovers.<br>
<br>
How can I write this sink? (I know I can just use CL.consume and<br>
T.break (== &#39;\n&#39;), but I&#39;m not interested in that. I&#39;m trying to<br>
figure out how to get the behavior I&#39;m looking for with conduits.)<br>
<br>
Thanks,<br>
Myles<br>
<br>
[1] <a href="http://hackage.haskell.org/packages/archive/conduit/0.5.2.7/doc/html/Data-Conduit.html" target="_blank">http://hackage.haskell.org/packages/archive/conduit/0.5.2.7/doc/html/Data-Conduit.html</a><br>
</blockquote></div><br></div></div>