`std.algorithm.iteration.joiner` can now be used for bidirectional ranges $(REF joiner, std,algorithm,iteration) can now be requested to be a bidirectional range. --- import std.algorithm.iteration : joiner; import std.range : retro; [[1, 2], [3, 4]].joiner.retro; // [4, 3, 2, 1] --- A more complex example of inserting a format delimiter fully lazily: --- import std.algorithm.comparison : equal; import std.range : chain, cycle, iota, only, retro, take, zip; import std.format : format; static immutable number = "12345678"; static immutable delimiter = ","; auto formatted = number.retro .zip(3.iota.cycle.take(number.length)) .map!(z => chain(z[0].only, z[1] == 2 ? delimiter : null)) .joiner .retro; // "12,345,678" ---