On Thursday, 15 January 2015 at 19:30:21 UTC, Tobias Pankrath
wrote:
On Thursday, 15 January 2015 at 19:24:16 UTC, Nordlöw wrote:
On Thursday, 15 January 2015 at 13:13:57 UTC, Nordlöw wrote:
I just discovered that zip has StoppingPolicy so why does
auto commonPrefixLength(R...)(R ranges) if (ranges.length ==
2)
{
import std.range: zip;
return zip!((a, b) => a[0] != b[1])(ranges);
}
I did a silly mistake. The correct version is
auto commonPrefixLength(S, T)(S a, T b)
{
import std.range: zip, StoppingPolicy;
import std.algorithm: countUntil, count;
const hit = zip(a, b).countUntil!(ab => ab[0] != ab[1]);
return hit == -1 ? zip(a, b).count : hit;
}
This however needs to process zip(a, b) how do I avoid the
extra count?
If countUntil returned zip(a, b).count upon failure I would
have been done...
What's wrong with commonPrefix(..).length?
Only works if all input arguments have length property.
I would have implemented countUntil() to return
-length
upon failure instead of
-1
.
Then I could have just returned abs of the return value from
commonUntil.
However
auto commonPrefixLengthAlt(S, T)(S a, T b) @safe pure @nogc
nothrow
{
import std.algorithm: commonPrefix, count;
return commonPrefix(a, b).count;
}
works on dmd git master!
Limited to 2 arguments, though, but I'm find with that for now :)