Thread overview
How to iterate over range two items at a time
Feb 17
Adnan
Feb 17
mipri
Feb 17
mipri
Feb 17
Mitacha
Feb 17
Adnan
Feb 17
Basile B.
February 17
What is the equivalent of Rust's chunks_exact()[1] method in D? I want to iterate over a spitted string two chunks at a time.


[1] https://doc.rust-lang.org/beta/std/primitive.slice.html#method.chunks_exact
February 17
On Monday, 17 February 2020 at 05:04:02 UTC, Adnan wrote:
> What is the equivalent of Rust's chunks_exact()[1] method in D? I want to iterate over a spitted string two chunks at a time.
>
>
> [1] https://doc.rust-lang.org/beta/std/primitive.slice.html#method.chunks_exact

$ rdmd --eval '"hello world".chunks(2).each!writeln'
he
ll
o
wo
rl
d

$ rdmd --eval '"hello world".chunks(2).map!"a.array.length".each!writeln'
2
2
2
2
2
1

Note the .array; each chunk is a range type.

$ rdmd --eval 'typeid("hello world".chunks(2).take(1)).writeln'
std.range.Take!(Chunks!string).Take

February 17
On Monday, 17 February 2020 at 05:04:02 UTC, Adnan wrote:
> What is the equivalent of Rust's chunks_exact()[1] method in D? I want to iterate over a spitted string two chunks at a time.
>
>
> [1] https://doc.rust-lang.org/beta/std/primitive.slice.html#method.chunks_exact

And, after actually reading the Rust doc, I see that you want
to iterate over a string two chars at a time while discarding
any remaining 1-length chunk.

There isn't an equivalent of that.

A quick one is

auto chunks_exact(R)(R r, size_t n) {
    return r.take(r.length - r.length%n).chunks(n);
}

but to get the exact same behavior you'll want to return a
range type that stores the final chunk.
February 17
On Monday, 17 February 2020 at 05:04:02 UTC, Adnan wrote:
> What is the equivalent of Rust's chunks_exact()[1] method in D? I want to iterate over a spitted string two chunks at a time.
>
>
> [1] https://doc.rust-lang.org/beta/std/primitive.slice.html#method.chunks_exact

It sounds similar to `slide` https://dlang.org/phobos/std_range.html#slide
February 17
On Monday, 17 February 2020 at 07:50:02 UTC, Mitacha wrote:
> On Monday, 17 February 2020 at 05:04:02 UTC, Adnan wrote:
>> What is the equivalent of Rust's chunks_exact()[1] method in D? I want to iterate over a spitted string two chunks at a time.
>>
>>
>> [1] https://doc.rust-lang.org/beta/std/primitive.slice.html#method.chunks_exact
>
> It sounds similar to `slide` https://dlang.org/phobos/std_range.html#slide

The key difference here is that slide seems to overlap, which is a big no-no for my current problem.

I have just gone with a classic for loop. Error prone, but just works.
February 17
On Monday, 17 February 2020 at 09:41:35 UTC, Adnan wrote:
> On Monday, 17 February 2020 at 07:50:02 UTC, Mitacha wrote:
>> On Monday, 17 February 2020 at 05:04:02 UTC, Adnan wrote:
>>> What is the equivalent of Rust's chunks_exact()[1] method in D? I want to iterate over a spitted string two chunks at a time.
>>>
>>>
>>> [1] https://doc.rust-lang.org/beta/std/primitive.slice.html#method.chunks_exact
>>
>> It sounds similar to `slide` https://dlang.org/phobos/std_range.html#slide
>
> The key difference here is that slide seems to overlap, which is a big no-no for my current problem.
>
> I have just gone with a classic for loop. Error prone, but just works.

Yeah your analysis is right. slide is specifically made to overlapp, if overlapping is not needed slide is not needed.