https://issues.dlang.org/show_bug.cgi?id=10930
Seb <[email protected]> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |[email protected] --- Comment #7 from Seb <[email protected]> --- This applied on top of https://github.com/dlang/phobos/pull/6017 will make it work: diff --git a/std/array.d b/std/array.d index 3a44612cb..207b1280d 100644 --- a/std/array.d +++ b/std/array.d @@ -2120,21 +2120,21 @@ if (isInputRange!RoR && $(REF map, std,algorithm,iteration) which can act as a lazy replace +/ E[] replace(E, R1, R2)(E[] subject, R1 from, R2 to) -if (isDynamicArray!(E[]) && isForwardRange!R1 && isForwardRange!R2 - && (hasLength!R2 || isSomeString!R2)) +if (isDynamicArray!(E[])) { import std.algorithm.searching : find; import std.range : dropOne; - if (from.empty) return subject; + static if (isInputRange!R1) + if (from.empty) return subject; - auto balance = find(subject, from.save); + auto balance = find(subject, from); if (balance.empty) return subject; auto app = appender!(E[])(); app.put(subject[0 .. subject.length - balance.length]); - app.put(to.save); + app.put(to); // replacing an element in an array is different to a range replacement static if (is(Unqual!E : Unqual!R1)) replaceInto(app, balance.dropOne, from, to); @@ -2158,6 +2158,11 @@ if (isDynamicArray!(E[]) && isForwardRange!R1 && isForwardRange!R2 assert([3, 3, 4, 3].replace([3, 3], [1, 1, 1]) == [1, 1, 1, 4, 3]); } +@safe unittest +{ + assert([0, 1, 2].replace(1, 4) == [0, 4, 2]); +} + // https://issues.dlang.org/show_bug.cgi?id=18215 @safe unittest { @@ -2181,28 +2186,29 @@ if (isDynamicArray!(E[]) && isForwardRange!R1 && isForwardRange!R2 /// ditto void replaceInto(E, Sink, R1, R2)(Sink sink, E[] subject, R1 from, R2 to) -if (isOutputRange!(Sink, E) && isDynamicArray!(E[]) - && isForwardRange!R1 && isForwardRange!R2 - && (hasLength!R2 || isSomeString!R2)) +if (isOutputRange!(Sink, E) && isDynamicArray!(E[])) { import std.algorithm.searching : find; import std.range : dropOne; - if (from.empty) + static if (isInputRange!R1) { - sink.put(subject); - return; + if (from.empty) + { + sink.put(subject); + return; + } } for (;;) { - auto balance = find(subject, from.save); + auto balance = find(subject, from); if (balance.empty) { sink.put(subject); break; } sink.put(subject[0 .. subject.length - balance.length]); - sink.put(to.save); + sink.put(to); // replacing an element in an array is different to a range replacement static if (is(Unqual!E : Unqual!R1)) subject = balance.dropOne; Of course constraints need be set, but to be fair currently there aren't any for this --
