std.range.chunk without length

Stephan Schiffels stephan_schiffels at mac.com
Thu Feb 13 02:12:58 PST 2014


On Thursday, 31 October 2013 at 10:35:54 UTC, Stephan Schiffels 
wrote:
> On Wednesday, 30 October 2013 at 20:43:54 UTC, qznc wrote:
>> On Wednesday, 30 October 2013 at 00:20:12 UTC, Stephan 
>> Schiffels wrote:
>>> Hi,
>>>
>>> I'd like a version of std.range.chunk that does not require 
>>> the range to have the "length" property.
>>>
>>> As an example, consider a file that you would like parse by 
>>> lines and always lump together four lines, i.e.
>>>
>>> import std.stdio;
>>> void main() {
>>> auto range = File("test.txt", "r").byLine();
>>> foreach(c; range.chunks(4)) { //doesn't compile
>>>   writefln("%s %s", c[0], c[1]);
>>> }
>>> }
>>
>> Your wish was granted. Monarchdodra was sent back in time [0], 
>> so it is already fixed in HEAD. You could try the dmd beta [1].
>>
>>
>> [0] https://github.com/D-Programming-Language/phobos/pull/992
>> [1] 
>> http://forum.dlang.org/thread/526DD8C5.2040402@digitalmars.com
>
> Ah, awesome! Should have updated my github clone then.
> Thanks,
> Stephan

Sorry for the late follow up, but it turns out that 
std.range.chunks needs a ForwardRange, and hence does not work on 
File.byLine(). The referenced pull request claims that it does in 
the comments, but of course the current implementation needs a 
"save()" function which doesn't exist for the byLine range.

It would be actually easy to implement chunks without the "save" 
function, by using an internal buffer, which would however make 
this algorithm's memory burden linear in the chunk size. Would 
that be acceptable? If so, I'd be happy to make that change and 
push it.

Stephan


More information about the Digitalmars-d-learn mailing list