Truly lazy ranges, transient .front, and std.range.Generator

Joseph Rushton Wakeling via Digitalmars-d digitalmars-d at puremagic.com
Tue Aug 18 12:23:18 PDT 2015


On 17/08/15 00:33, Alex Parrill via Digitalmars-d wrote:
> On Saturday, 15 August 2015 at 10:06:13 UTC, Joseph Rushton Wakeling wrote:
>> ...
>
> I had this issue recently when reading from a command-line-style TCP connection;
> I needed to read the line up to the \n separator, but consuming the separator
> meant waiting for the next byte that would never arrive unless a new command was
> sent.
>
> So I made a wrapper range that evaluates the wrapped range's popFront only when
> front/empty is first called ("just in time"). Source code here:
> https://gist.github.com/ColonelThirtyTwo/0dfe76520efcda02d848
>
> You can throw it in a UFCS chain anywhere except (for some reason) after
> something that takes a delegate template parameter like map. For example:
>
>      auto reader = SocketReader(socket).joiner.jitRange.map!(byt => cast(char)
> byt);

Interesting, thanks for sharing that.  I'm not at all surprised that an IO-based 
range should have similar issues to the one I describe; a comparable use-case I 
was thinking of was reading bytes from /dev/urandom.

My own concern was whether there was any sort of generic functionality for 
constructing lazy-front ranges like this; I'll share more on my own approach 
replying to Harald Zealot below.


More information about the Digitalmars-d mailing list