On Wednesday, 7 July 2021 at 01:44:20 UTC, Steven Schveighoffer
wrote:
But it got me thinking, how often do people roll their own vs.
trying to compose using existing Phobos nuggets?
When there's not an obvious/simple way to do something by
composing ranges, I tend to just give up and write procedural
code instead. Yes, the resulting code is longer and more prone to
logic bugs, but there's no limit to what you can do and it's
easier to see what's going on at a lower level. I also don't tend
to let composed ranges leave the function they were created in, I
rather pass simple arrays around than complex objects depending
on multiple inputs from different sources.
I don't know what the destination of your range is so this might
not be applicable, but I'd probably end up writing a function
with an OutputRange like this:
```D
void putRangeInterleaved(O, R, E)(ref O sink, R range, E
separator) {
import std.range.primitives: put;
if (!range.empty) {
put(sink, range.front);
range.popFront();
}
foreach(ref elem; range) {
put(sink, separator);
put(sink, elem);
}
}
```
I'm not trying to discourage anyone from writing range code, I'm
just presenting this as an alternative in case it's useful.