On 2/19/16 5:22 AM, Kagamin wrote:
On Thursday, 18 February 2016 at 18:27:28 UTC, Steven Schveighoffer wrote:
The philosophy that I settled on is to create an iopipe that extends
one "item" at a time, even if more are available. Then, apply the
range interface on that.

When I first started to write byLine, I made it a range. Then I
thought, "what if you wanted to iterate by 2 lines at a time, or
iterate by one line at a time, but see the last 2 for context?", well,
then that would be another type, and I'd have to abstract out the
functionality of line searching.

You mean window has current element and context - lookahead and
lookbehind? I stumbled across this article
http://blog.jooq.org/2016/01/06/2016-will-be-the-year-remembered-as-when-java-finally-had-window-functions/
it suggests that such window abstraction is generally useful for data
analysis.

window doesn't have any "current" pointer. The window itself is the current data. But with byLine, you could potentially remember where the last N lines were delineated. Hm...

auto byLineWithContext(size_t extraLines = 1, Chain)(Chain c)
{
   auto input = byLine(c);
   static struct ByLineWithContext
   {
      typeof(input) chain;
      size_t[extraLines] prevLines;
      auto front() { return chain.window[prevLines[$-1] .. $]; }
      void popFront()
      {
          auto offset = prevLines[0];
          foreach(i; 0 .. prevLines.length-1)
          {
              prevLines[i] = prevLines[i+1] - offset;
          }
          prevLines[$-1] = chain.window.length - offset;
          chain.release(offset);
          chain.extend(0); // extend in the next line
      }
      void empty()
      {
          return chain.window.length != prevLines[$-1];
      }
      // previous line of context (i = 0 is the oldest context line)
      auto contextLine(size_t i)
      {
          assert(i < prevLines.length);
          return chain.window[i == 0 ? 0 : prevLines[i-1] .. prevLines[i])
      }
   }
   return ByLineWithContext(input);
}

It's an interesting transition to think about looking at an entire buffer of data instead of some pointer to a single point in a stream as the primitive that you have.

-Steve

Reply via email to