to compose or hack?

rassoc rassoc at rassoc.org
Wed Jul 7 09:54:27 UTC 2021


On Wednesday, 7 July 2021 at 01:44:20 UTC, Steven Schveighoffer 
wrote:
> So I have this situation where I need to split a string, then 
> where the splits are, insert a string to go between the 
> elements making a new range, all without allocating (hopefully).
>

Without considering the more general case, isn't that just 
splitter-joiner?

```d
import std;

auto foo(string s, string sp, string j) @nogc {
	return s.splitter(sp).joiner(j);
}

void main() {
     foo("ab,cd,ef,gh", ",", "##").writeln; // => ab##cd##ef##gh
}
```

> Looking around phobos I found inside the documentation of 
> [roundRobin](https://dlang.org/phobos/std_range.html#.roundRobin) something that does *exactly* what I'm looking for.
>
> Except... the provided `interleave` function iterates the 
> original range twice, which means 2x the searching calls for 
> splitter. Why does it do this? Because `roundRobin` will keep 
> going as long as ANY range still has data left, so you need to 
> make the "interleaving" range stop when the first one stops.
>

Interesting! Tried it myself, shame that this doesn't quite work:

```d
import std;

auto foo(R)(string s, string sp, R r) @nogc {
     return s.splitter(sp).zip(r)
             .map!(a => a.expand.only)
             .joiner.dropBackOne.joiner; // not bidirectional
}

void main() {
     foo("ab,cd,ef,gh", ",", ["##", "**"].cycle).writeln;
}
```


More information about the Digitalmars-d-learn mailing list