August 10, 2015
Although it is a bit of a corner case, I would argue that the following behaviour is buggy:

    assert(findSplit!(reverseArgs!canFind)("078.12.13-4.5", ".-") == tuple("078", ".1", "2.13-4.5"));

To understand why, consider the following more explicit code:

    void main()
    {
        static bool oneOf(dchar a, string b)
        {
            bool r = false;

            foreach(c; b)
            {
                if(c == a)
                {
                    r = true;
                    break;
                }
            }

            writefln(`matching a='%s' b="%s" returns %s`, a, b, r);

            return r;
        }

        auto s = findSplit!oneOf("078.12.13-4.5", ".-");

        writefln("%s %s %s", s[0], s[1], s[2]);
    }

Output:

    matching a='0' b=".-" returns false
    matching a='7' b=".-" returns false
    matching a='8' b=".-" returns false
    matching a='.' b=".-" returns true
    078 .1 2.13-4.5

The findSplit documentation says: "result[1] is the portion of haystack that matches needle". Yet, the only character for which the predicate returned true was '.'. Therefore, that should be the only part of result[1]. The alternative would be to clarify and change the documentation, I guess.

BTW 1: it's not very clear what the predicate arguments are / can be, unless I missed some part of the docs. Apparently, findSplit tries to use both `bool function(dchar, dchar)` and `bool function(dchar, string)`, IIRC.

BTW 2: Any particular reason for binaryReverseArgs to exist, instead of always just using reverseArgs?