/// <reference path="enumerable.ts" />

namespace exjs {
    function reverseEnumerator<T>(prev: IEnumerable<T>): IEnumerator<T> {
        var a: T[];
        var i = 0;
        var e = {
            current: undefined,
            moveNext: function (): boolean {
                if (!a) {
                    a = en(prev).toArray();
                    i = a.length;
                }
                i--;
                e.current = a[i];
                return i >= 0;
            }
        };
        return e;
    }

    Enumerable.prototype.reverse = function<T>(): IEnumerableEx<T> {
        var e = new Enumerable<T>();
        e.getEnumerator = () => reverseEnumerator(<IEnumerable<T>>this);
        return e;
    };
    if (List)
        List.prototype.reverse = Enumerable.prototype.reverse;
}