R.I.P foreach_reverse

foreach_reverseが消える.で,通常のRangeはretroで反転できるので何の問題もないけど,opApplyはどうすればいいのん?という.

auto myretro(Range)(Range range)
{
    static if (__traits(compiles, range.opApplyReverse))
        return &range.opApplyReverse;
    else
        return retro(range);
}

今ラッパー書くならこんな感じ?こうすれば

class Foo
{
    int[] array;

    this(int[] array) { this.array = array; }

    int opApply(int delegate(ref int) dg)
    {
        int result;

        for (uint i; i < array.length; i++)
        {
            result = dg(array[i]);
            if (result)
                break;
        }

        return result;
    }

    int opApplyReverse(int delegate(ref int) dg)
    {
        int result;

        for (uint i = array.length; i > 0; i--)
        {
            result = dg(array[i - 1]);
            if (result)
                break;
        }

        return result;
    }
}

void main()
{
    auto foo = new Foo([1, 2]);

    foreach (elem;         foo)  { writeln(elem); }
    foreach (elem; myretro(foo)) { writeln(elem); }
}

でも一応ちゃんと動く.しかし今までそうして来たとはいえ「Rangeインターフェイスを満たせばretroで逆走査できる」に比べopApplyReverseを毎回定義するのは面倒に感じる.しかしあくまでシンタックスシュガーのopApply(Reverse)をRangeが全て満たしてないのも事実(foreach (a, b, c; range) {}とか出来ない).Andreiはどうするつもりなんだろうか…