On 2015-01-10 at 21:58, bearophile wrote:
Needles is not an array type, it's a type tuple, so withOneOfThese doesn't 
accept an array of strings. [...]
So if you really want to pack the strings in some kind of unity, you can do 
this as workaround: [...]

I would suggest create a function that does the same thing as endsWith(Range, 
Needles...) but instead of Needles expanded as a list of arguments it takes in 
a range of them. In fact I was surprised that there was no such function in 
std.algorithm present. Therefore I have written endsWithAny for this purpose a 
moment ago. Is it any good? Please correct if necessary.




import std.array;
import std.string;
import std.stdio;
import std.range;

uint endsWithAny(alias pred = "a == b", Range, Needles)(Range haystack, Needles 
needles)
    if (isBidirectionalRange!Range && isInputRange!Needles &&
    is(typeof(.endsWith!pred(haystack, needles.front)) : bool))
{
    foreach (i, e; needles)
        if (endsWith!pred(haystack, e))
            return i + 1;
    return 0;
}


void main(string[] args)
{
    string[] test = ["1", "two", "three!"];
    auto a = "arghtwo".endsWithAny(test);
    writefln("%s", a);
}

unittest
{
    string[] hs = ["no-one", "thee", "there were three", "two"];
    string[] tab = ["one", "two", "three"];
    assert(endsWithAny(hs[0], tab) == 1);
    assert(endsWithAny(hs[1], tab) == 0);
    assert(endsWithAny(hs[2], tab) == 3);
    assert(endsWithAny(hs[3], tab) == 2);
}

Reply via email to