﻿JSLINQ.fn.Take = function(count)
{
    var newArray = new Array();

    for (var i = 0; i < count && i < this.items.length; i++)
    {
        newArray[newArray.length] = this.items[i];
    }

    return new JSLINQ(newArray);
};

JSLINQ.fn.TakeWhile = function(clause)
{
    for (var count = 0; count < this.items.length; count++)
    {
        var item = this.items[count];

        if (clause.call(item, item) === false)
        {
            return this.Take(count);
        }
    }

    return this;
};

JSLINQ.fn.Skip = function(count)
{
    var newArray = new Array();

    for (var i = count; i < this.items.length; i++)
    {
        newArray[newArray.length] = this.items[i];
    }

    return new JSLINQ(newArray);
};

JSLINQ.fn.SkipWhile = function(clause)
{
    for (var count = 0; count < this.items.length; count++)
    {
        var item = this.items[count];

        if (clause.call(item, item) === false)
        {
            return this.Skip(count);
        }
    }

    return JSLINQ(new Array());
};

JSLINQ.fn.ForEach = function(callback)
{
    var i = 0;

    for (var value = this.items[0];
         i < this.items.length && callback.call(value, value, i) !== false;
         value = this.items[++i])
    {
    }

    return this;
};
