On 2014-03-27 15:33, Meta wrote:
On Thursday, 27 March 2014 at 13:23:27 UTC, monarch_dodra wrote:
"fold" (from what I understood) is what you call "foldl". It was
discussed to not introduce "foldr", as it's just
"fold!(binaryReverseArgs!Fun)(range.retro);".

Rolls right off the tongue. We seriously need a better alias for
binaryReverseArgs.

Is it even necessary to specifically have a binary version of that?
This seems to be a working generalization of binaryReverseArgs:

template reverseArgs(alias pred)
{
    import std.typetuple : Reverse;
    auto reverseArgs(Args...)(Args args)
        if (is(typeof(pred(Reverse!args))))
    {
        return pred(Reverse!args);
    }
}

unittest
{
    import std.functional;
    alias gt = reverseArgs!(binaryFun!("a < b"));
    assert(gt(2, 1) && !gt(1, 1));
    int x = 42;
    bool xyz(int a, int b) { return a * x < b / x; }
    auto foo = &xyz;
    foo(4, 5);
    alias zyx = reverseArgs!(foo);
    assert(zyx(5, 4) == foo(4, 5));

    int abc(int a, int b, int c) { return a * b + c; }
    alias cba = reverseArgs!abc;
    assert(abc(91, 17, 32) == cba(32, 17, 91));
}

On the same note, binaryFun and unaryFun seem to me unnecessary specializations of a more general 'fun' template. Philippe Sigaud has an implementation in his dranges called naryFun (https://github.com/PhilippeSigaud/dranges). That code has apparently not been touched for at least two years, so YMMV.

--
  Simen

Reply via email to