<div class="gmail_quote">2010/8/6 Adrian Matoga <span dir="ltr">&lt;<a href="mailto:epi@atari8.info">epi@atari8.info</a>&gt;</span><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Hi,<br>
<br>
Is there any off the shelf solution for iterating over a range by chunks?</blockquote><div><br>None that I know of.<br><br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

(should substitute [1, 2, 3], [4, 5, 6], [7, 8, 9], [10] for chunk in subsequent iterations)<br><br></blockquote><div><br>As a data point, why do you think it should produce [10] and not 
stop at [7,8,9]?<br><br>Here is what I cooked, it&#39;s still a bit rough around the edges. It has an optional step argument, to see how many elements to jump.<br><br>import std.range;<br>struct Chunks(R) if (isInputRange!R)<br>
{<br>    R range;<br>    size_t n; // chunk size<br>    size_t step; // how many elements to jump<br><br>    bool empty() @property { return range.empty;}<br>    ElementType!R[] front() @property { return array(take(range, n));} // inefficient if you call front() many times in a row<br>
    void popFront() @property { popFrontN(range, step);}<br><br>    static if (hasLength!R)<br>        size_t length() @property { return (range.length+step-1)/step;}<br>}<br><br>Chunks!R chunks(R)(R range, size_t n) if (isInputRange!R)<br>
{<br>    return Chunks!R(range, n, n); // default is step == n<br>}<br><br>Chunks!R chunks(R)(R range, size_t n, size_t step) if (isInputRange!R)<br>{<br>    return Chunks!R(range, n, step);<br>}<br> 

<br><br>Philippe<br></div></div>