UNPKG

jquery-load-json

Version:

jQuery plugin that enables developers to load JSON data from the server and load JSON object into the DOM.

1,383 lines (1,244 loc) 92.8 kB
/*-------------------------------------------------------------------------- * linq.js - LINQ for JavaScript * ver 2.2.0.2 (Jan. 21th, 2011) * * created and maintained by neuecc <ils@neue.cc> * licensed under Microsoft Public License(Ms-PL) * http://neue.cc/ * http://linqjs.codeplex.com/ *--------------------------------------------------------------------------*/ jQuery.extend({ Enumerable: (function (){ var Enumerable = function (getEnumerator) { this.GetEnumerator = getEnumerator; } // Generator Enumerable.Choice = function () // variable argument { var args = (arguments[0] instanceof Array) ? arguments[0] : arguments; return new Enumerable(function () { return new IEnumerator( Functions.Blank, function () { return this.Yield(args[Math.floor(Math.random() * args.length)]); }, Functions.Blank); }); } Enumerable.Cycle = function () // variable argument { var args = (arguments[0] instanceof Array) ? arguments[0] : arguments; return new Enumerable(function () { var index = 0; return new IEnumerator( Functions.Blank, function () { if (index >= args.length) index = 0; return this.Yield(args[index++]); }, Functions.Blank); }); } Enumerable.Empty = function () { return new Enumerable(function () { return new IEnumerator( Functions.Blank, function () { return false; }, Functions.Blank); }); } Enumerable.From = function (obj) { if (obj == null) { return Enumerable.Empty(); } if (obj instanceof Enumerable) { return obj; } if (typeof obj == Types.Number || typeof obj == Types.Boolean) { return Enumerable.Repeat(obj, 1); } if (typeof obj == Types.String) { return new Enumerable(function () { var index = 0; return new IEnumerator( Functions.Blank, function () { return (index < obj.length) ? this.Yield(obj.charAt(index++)) : false; }, Functions.Blank); }); } if (typeof obj != Types.Function) { // array or array like object if (typeof obj.length == Types.Number) { return new ArrayEnumerable(obj); } // JScript's IEnumerable if (!(obj instanceof Object) && Utils.IsIEnumerable(obj)) { return new Enumerable(function () { var isFirst = true; var enumerator; return new IEnumerator( function () { enumerator = new Enumerator(obj); }, function () { if (isFirst) isFirst = false; else enumerator.moveNext(); return (enumerator.atEnd()) ? false : this.Yield(enumerator.item()); }, Functions.Blank); }); } } // case function/object : Create KeyValuePair[] return new Enumerable(function () { var array = []; var index = 0; return new IEnumerator( function () { for (var key in obj) { if (!(obj[key] instanceof Function)) { array.push({ Key: key, Value: obj[key] }); } } }, function () { return (index < array.length) ? this.Yield(array[index++]) : false; }, Functions.Blank); }); }, Enumerable.Return = function (element) { return Enumerable.Repeat(element, 1); } // Overload:function(input, pattern) // Overload:function(input, pattern, flags) Enumerable.Matches = function (input, pattern, flags) { if (flags == null) flags = ""; if (pattern instanceof RegExp) { flags += (pattern.ignoreCase) ? "i" : ""; flags += (pattern.multiline) ? "m" : ""; pattern = pattern.source; } if (flags.indexOf("g") === -1) flags += "g"; return new Enumerable(function () { var regex; return new IEnumerator( function () { regex = new RegExp(pattern, flags) }, function () { var match = regex.exec(input); return (match) ? this.Yield(match) : false; }, Functions.Blank); }); } // Overload:function(start, count) // Overload:function(start, count, step) Enumerable.Range = function (start, count, step) { if (step == null) step = 1; return Enumerable.ToInfinity(start, step).Take(count); } // Overload:function(start, count) // Overload:function(start, count, step) Enumerable.RangeDown = function (start, count, step) { if (step == null) step = 1; return Enumerable.ToNegativeInfinity(start, step).Take(count); } // Overload:function(start, to) // Overload:function(start, to, step) Enumerable.RangeTo = function (start, to, step) { if (step == null) step = 1; return (start < to) ? Enumerable.ToInfinity(start, step).TakeWhile(function (i) { return i <= to; }) : Enumerable.ToNegativeInfinity(start, step).TakeWhile(function (i) { return i >= to; }) } // Overload:function(obj) // Overload:function(obj, num) Enumerable.Repeat = function (obj, num) { if (num != null) return Enumerable.Repeat(obj).Take(num); return new Enumerable(function () { return new IEnumerator( Functions.Blank, function () { return this.Yield(obj); }, Functions.Blank); }); } Enumerable.RepeatWithFinalize = function (initializer, finalizer) { initializer = Utils.CreateLambda(initializer); finalizer = Utils.CreateLambda(finalizer); return new Enumerable(function () { var element; return new IEnumerator( function () { element = initializer(); }, function () { return this.Yield(element); }, function () { if (element != null) { finalizer(element); element = null; } }); }); } // Overload:function(func) // Overload:function(func, count) Enumerable.Generate = function (func, count) { if (count != null) return Enumerable.Generate(func).Take(count); func = Utils.CreateLambda(func); return new Enumerable(function () { return new IEnumerator( Functions.Blank, function () { return this.Yield(func()); }, Functions.Blank); }); } // Overload:function() // Overload:function(start) // Overload:function(start, step) Enumerable.ToInfinity = function (start, step) { if (start == null) start = 0; if (step == null) step = 1; return new Enumerable(function () { var value; return new IEnumerator( function () { value = start - step }, function () { return this.Yield(value += step); }, Functions.Blank); }); } // Overload:function() // Overload:function(start) // Overload:function(start, step) Enumerable.ToNegativeInfinity = function (start, step) { if (start == null) start = 0; if (step == null) step = 1; return new Enumerable(function () { var value; return new IEnumerator( function () { value = start + step }, function () { return this.Yield(value -= step); }, Functions.Blank); }); } Enumerable.Unfold = function (seed, func) { func = Utils.CreateLambda(func); return new Enumerable(function () { var isFirst = true; var value; return new IEnumerator( Functions.Blank, function () { if (isFirst) { isFirst = false; value = seed; return this.Yield(value); } value = func(value); return this.Yield(value); }, Functions.Blank); }); } // Extension Methods Enumerable.prototype = { /* Projection and Filtering Methods */ // Overload:function(func) // Overload:function(func, resultSelector<element>) // Overload:function(func, resultSelector<element, nestLevel>) CascadeBreadthFirst: function (func, resultSelector) { var source = this; func = Utils.CreateLambda(func); resultSelector = Utils.CreateLambda(resultSelector); return new Enumerable(function () { var enumerator; var nestLevel = 0; var buffer = []; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { while (true) { if (enumerator.MoveNext()) { buffer.push(enumerator.Current()); return this.Yield(resultSelector(enumerator.Current(), nestLevel)); } var next = Enumerable.From(buffer).SelectMany(function (x) { return func(x); }); if (!next.Any()) { return false; } else { nestLevel++; buffer = []; Utils.Dispose(enumerator); enumerator = next.GetEnumerator(); } } }, function () { Utils.Dispose(enumerator); }); }); }, // Overload:function(func) // Overload:function(func, resultSelector<element>) // Overload:function(func, resultSelector<element, nestLevel>) CascadeDepthFirst: function (func, resultSelector) { var source = this; func = Utils.CreateLambda(func); resultSelector = Utils.CreateLambda(resultSelector); return new Enumerable(function () { var enumeratorStack = []; var enumerator; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { while (true) { if (enumerator.MoveNext()) { var value = resultSelector(enumerator.Current(), enumeratorStack.length); enumeratorStack.push(enumerator); enumerator = Enumerable.From(func(enumerator.Current())).GetEnumerator(); return this.Yield(value); } if (enumeratorStack.length <= 0) return false; Utils.Dispose(enumerator); enumerator = enumeratorStack.pop(); } }, function () { try { Utils.Dispose(enumerator); } finally { Enumerable.From(enumeratorStack).ForEach(function (s) { s.Dispose(); }) } }); }); }, Flatten: function () { var source = this; return new Enumerable(function () { var enumerator; var middleEnumerator = null; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { while (true) { if (middleEnumerator != null) { if (middleEnumerator.MoveNext()) { return this.Yield(middleEnumerator.Current()); } else { middleEnumerator = null; } } if (enumerator.MoveNext()) { if (enumerator.Current() instanceof Array) { Utils.Dispose(middleEnumerator); middleEnumerator = Enumerable.From(enumerator.Current()) .SelectMany(Functions.Identity) .Flatten() .GetEnumerator(); continue; } else { return this.Yield(enumerator.Current()); } } return false; } }, function () { try { Utils.Dispose(enumerator); } finally { Utils.Dispose(middleEnumerator); } }); }); }, Pairwise: function (selector) { var source = this; selector = Utils.CreateLambda(selector); return new Enumerable(function () { var enumerator; return new IEnumerator( function () { enumerator = source.GetEnumerator(); enumerator.MoveNext(); }, function () { var prev = enumerator.Current(); return (enumerator.MoveNext()) ? this.Yield(selector(prev, enumerator.Current())) : false; }, function () { Utils.Dispose(enumerator); }); }); }, // Overload:function(func) // Overload:function(seed,func<value,element>) // Overload:function(seed,func<value,element>,resultSelector) Scan: function (seed, func, resultSelector) { if (resultSelector != null) return this.Scan(seed, func).Select(resultSelector); var isUseSeed; if (func == null) { func = Utils.CreateLambda(seed); // arguments[0] isUseSeed = false; } else { func = Utils.CreateLambda(func); isUseSeed = true; } var source = this; return new Enumerable(function () { var enumerator; var value; var isFirst = true; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { if (isFirst) { isFirst = false; if (!isUseSeed) { if (enumerator.MoveNext()) { return this.Yield(value = enumerator.Current()); } } else { return this.Yield(value = seed); } } return (enumerator.MoveNext()) ? this.Yield(value = func(value, enumerator.Current())) : false; }, function () { Utils.Dispose(enumerator); }); }); }, // Overload:function(selector<element>) // Overload:function(selector<element,index>) Select: function (selector) { var source = this; selector = Utils.CreateLambda(selector); return new Enumerable(function () { var enumerator; var index = 0; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { return (enumerator.MoveNext()) ? this.Yield(selector(enumerator.Current(), index++)) : false; }, function () { Utils.Dispose(enumerator); }) }); }, // Overload:function(collectionSelector<element>) // Overload:function(collectionSelector<element,index>) // Overload:function(collectionSelector<element>,resultSelector) // Overload:function(collectionSelector<element,index>,resultSelector) SelectMany: function (collectionSelector, resultSelector) { var source = this; collectionSelector = Utils.CreateLambda(collectionSelector); if (resultSelector == null) resultSelector = function (a, b) { return b; } resultSelector = Utils.CreateLambda(resultSelector); return new Enumerable(function () { var enumerator; var middleEnumerator = undefined; var index = 0; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { if (middleEnumerator === undefined) { if (!enumerator.MoveNext()) return false; } do { if (middleEnumerator == null) { var middleSeq = collectionSelector(enumerator.Current(), index++); middleEnumerator = Enumerable.From(middleSeq).GetEnumerator(); } if (middleEnumerator.MoveNext()) { return this.Yield(resultSelector(enumerator.Current(), middleEnumerator.Current())); } Utils.Dispose(middleEnumerator); middleEnumerator = null; } while (enumerator.MoveNext()) return false; }, function () { try { Utils.Dispose(enumerator); } finally { Utils.Dispose(middleEnumerator); } }) }); }, // Overload:function(predicate<element>) // Overload:function(predicate<element,index>) Where: function (predicate) { predicate = Utils.CreateLambda(predicate); var source = this; return new Enumerable(function () { var enumerator; var index = 0; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { while (enumerator.MoveNext()) { if (predicate(enumerator.Current(), index++)) { return this.Yield(enumerator.Current()); } } return false; }, function () { Utils.Dispose(enumerator); }) }); }, OfType: function (type) { var typeName; switch (type) { case Number: typeName = Types.Number; break; case String: typeName = Types.String; break; case Boolean: typeName = Types.Boolean; break; case Function: typeName = Types.Function; break; default: typeName = null; break; } return (typeName === null) ? this.Where(function (x) { return x instanceof type }) : this.Where(function (x) { return typeof x === typeName }); }, // Overload:function(second,selector<outer,inner>) // Overload:function(second,selector<outer,inner,index>) Zip: function (second, selector) { selector = Utils.CreateLambda(selector); var source = this; return new Enumerable(function () { var firstEnumerator; var secondEnumerator; var index = 0; return new IEnumerator( function () { firstEnumerator = source.GetEnumerator(); secondEnumerator = Enumerable.From(second).GetEnumerator(); }, function () { if (firstEnumerator.MoveNext() && secondEnumerator.MoveNext()) { return this.Yield(selector(firstEnumerator.Current(), secondEnumerator.Current(), index++)); } return false; }, function () { try { Utils.Dispose(firstEnumerator); } finally { Utils.Dispose(secondEnumerator); } }) }); }, /* Join Methods */ // Overload:function (inner, outerKeySelector, innerKeySelector, resultSelector) // Overload:function (inner, outerKeySelector, innerKeySelector, resultSelector, compareSelector) Join: function (inner, outerKeySelector, innerKeySelector, resultSelector, compareSelector) { outerKeySelector = Utils.CreateLambda(outerKeySelector); innerKeySelector = Utils.CreateLambda(innerKeySelector); resultSelector = Utils.CreateLambda(resultSelector); compareSelector = Utils.CreateLambda(compareSelector); var source = this; return new Enumerable(function () { var outerEnumerator; var lookup; var innerElements = null; var innerCount = 0; return new IEnumerator( function () { outerEnumerator = source.GetEnumerator(); lookup = Enumerable.From(inner).ToLookup(innerKeySelector, Functions.Identity, compareSelector); }, function () { while (true) { if (innerElements != null) { var innerElement = innerElements[innerCount++]; if (innerElement !== undefined) { return this.Yield(resultSelector(outerEnumerator.Current(), innerElement)); } innerElement = null; innerCount = 0; } if (outerEnumerator.MoveNext()) { var key = outerKeySelector(outerEnumerator.Current()); innerElements = lookup.Get(key).ToArray(); } else { return false; } } }, function () { Utils.Dispose(outerEnumerator); }) }); }, // Overload:function (inner, outerKeySelector, innerKeySelector, resultSelector) // Overload:function (inner, outerKeySelector, innerKeySelector, resultSelector, compareSelector) GroupJoin: function (inner, outerKeySelector, innerKeySelector, resultSelector, compareSelector) { outerKeySelector = Utils.CreateLambda(outerKeySelector); innerKeySelector = Utils.CreateLambda(innerKeySelector); resultSelector = Utils.CreateLambda(resultSelector); compareSelector = Utils.CreateLambda(compareSelector); var source = this; return new Enumerable(function () { var enumerator = source.GetEnumerator(); var lookup = null; return new IEnumerator( function () { enumerator = source.GetEnumerator(); lookup = Enumerable.From(inner).ToLookup(innerKeySelector, Functions.Identity, compareSelector); }, function () { if (enumerator.MoveNext()) { var innerElement = lookup.Get(outerKeySelector(enumerator.Current())); return this.Yield(resultSelector(enumerator.Current(), innerElement)); } return false; }, function () { Utils.Dispose(enumerator); }) }); }, /* Set Methods */ All: function (predicate) { predicate = Utils.CreateLambda(predicate); var result = true; this.ForEach(function (x) { if (!predicate(x)) { result = false; return false; // break } }); return result; }, // Overload:function() // Overload:function(predicate) Any: function (predicate) { predicate = Utils.CreateLambda(predicate); var enumerator = this.GetEnumerator(); try { if (arguments.length == 0) return enumerator.MoveNext(); // case:function() while (enumerator.MoveNext()) // case:function(predicate) { if (predicate(enumerator.Current())) return true; } return false; } finally { Utils.Dispose(enumerator); } }, Concat: function (second) { var source = this; return new Enumerable(function () { var firstEnumerator; var secondEnumerator; return new IEnumerator( function () { firstEnumerator = source.GetEnumerator(); }, function () { if (secondEnumerator == null) { if (firstEnumerator.MoveNext()) return this.Yield(firstEnumerator.Current()); secondEnumerator = Enumerable.From(second).GetEnumerator(); } if (secondEnumerator.MoveNext()) return this.Yield(secondEnumerator.Current()); return false; }, function () { try { Utils.Dispose(firstEnumerator); } finally { Utils.Dispose(secondEnumerator); } }) }); }, Insert: function (index, second) { var source = this; return new Enumerable(function () { var firstEnumerator; var secondEnumerator; var count = 0; var isEnumerated = false; return new IEnumerator( function () { firstEnumerator = source.GetEnumerator(); secondEnumerator = Enumerable.From(second).GetEnumerator(); }, function () { if (count == index && secondEnumerator.MoveNext()) { isEnumerated = true; return this.Yield(secondEnumerator.Current()); } if (firstEnumerator.MoveNext()) { count++; return this.Yield(firstEnumerator.Current()); } if (!isEnumerated && secondEnumerator.MoveNext()) { return this.Yield(secondEnumerator.Current()); } return false; }, function () { try { Utils.Dispose(firstEnumerator); } finally { Utils.Dispose(secondEnumerator); } }) }); }, Alternate: function (value) { value = Enumerable.Return(value); return this.SelectMany(function (elem) { return Enumerable.Return(elem).Concat(value); }).TakeExceptLast(); }, // Overload:function(value) // Overload:function(value, compareSelector) Contains: function (value, compareSelector) { compareSelector = Utils.CreateLambda(compareSelector); var enumerator = this.GetEnumerator(); try { while (enumerator.MoveNext()) { if (compareSelector(enumerator.Current()) === value) return true; } return false; } finally { Utils.Dispose(enumerator) } }, DefaultIfEmpty: function (defaultValue) { var source = this; return new Enumerable(function () { var enumerator; var isFirst = true; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { if (enumerator.MoveNext()) { isFirst = false; return this.Yield(enumerator.Current()); } else if (isFirst) { isFirst = false; return this.Yield(defaultValue); } return false; }, function () { Utils.Dispose(enumerator); }) }); }, // Overload:function() // Overload:function(compareSelector) Distinct: function (compareSelector) { return this.Except(Enumerable.Empty(), compareSelector); }, // Overload:function(second) // Overload:function(second, compareSelector) Except: function (second, compareSelector) { compareSelector = Utils.CreateLambda(compareSelector); var source = this; return new Enumerable(function () { var enumerator; var keys; return new IEnumerator( function () { enumerator = source.GetEnumerator(); keys = new Dictionary(compareSelector); Enumerable.From(second).ForEach(function (key) { keys.Add(key); }); }, function () { while (enumerator.MoveNext()) { var current = enumerator.Current(); if (!keys.Contains(current)) { keys.Add(current); return this.Yield(current); } } return false; }, function () { Utils.Dispose(enumerator); }) }); }, // Overload:function(second) // Overload:function(second, compareSelector) Intersect: function (second, compareSelector) { compareSelector = Utils.CreateLambda(compareSelector); var source = this; return new Enumerable(function () { var enumerator; var keys; var outs; return new IEnumerator( function () { enumerator = source.GetEnumerator(); keys = new Dictionary(compareSelector); Enumerable.From(second).ForEach(function (key) { keys.Add(key); }); outs = new Dictionary(compareSelector); }, function () { while (enumerator.MoveNext()) { var current = enumerator.Current(); if (!outs.Contains(current) && keys.Contains(current)) { outs.Add(current); return this.Yield(current); } } return false; }, function () { Utils.Dispose(enumerator); }) }); }, // Overload:function(second) // Overload:function(second, compareSelector) SequenceEqual: function (second, compareSelector) { compareSelector = Utils.CreateLambda(compareSelector); var firstEnumerator = this.GetEnumerator(); try { var secondEnumerator = Enumerable.From(second).GetEnumerator(); try { while (firstEnumerator.MoveNext()) { if (!secondEnumerator.MoveNext() || compareSelector(firstEnumerator.Current()) !== compareSelector(secondEnumerator.Current())) { return false; } } if (secondEnumerator.MoveNext()) return false; return true; } finally { Utils.Dispose(secondEnumerator); } } finally { Utils.Dispose(firstEnumerator); } }, Union: function (second, compareSelector) { compareSelector = Utils.CreateLambda(compareSelector); var source = this; return new Enumerable(function () { var firstEnumerator; var secondEnumerator; var keys; return new IEnumerator( function () { firstEnumerator = source.GetEnumerator(); keys = new Dictionary(compareSelector); }, function () { var current; if (secondEnumerator === undefined) { while (firstEnumerator.MoveNext()) { current = firstEnumerator.Current(); if (!keys.Contains(current)) { keys.Add(current); return this.Yield(current); } } secondEnumerator = Enumerable.From(second).GetEnumerator(); } while (secondEnumerator.MoveNext()) { current = secondEnumerator.Current(); if (!keys.Contains(current)) { keys.Add(current); return this.Yield(current); } } return false; }, function () { try { Utils.Dispose(firstEnumerator); } finally { Utils.Dispose(secondEnumerator); } }) }); }, /* Ordering Methods */ OrderBy: function (keySelector) { return new OrderedEnumerable(this, keySelector, false); }, OrderByDescending: function (keySelector) { return new OrderedEnumerable(this, keySelector, true); }, Reverse: function () { var source = this; return new Enumerable(function () { var buffer; var index; return new IEnumerator( function () { buffer = source.ToArray(); index = buffer.length; }, function () { return (index > 0) ? this.Yield(buffer[--index]) : false; }, Functions.Blank) }); }, Shuffle: function () { var source = this; return new Enumerable(function () { var buffer; return new IEnumerator( function () { buffer = source.ToArray(); }, function () { if (buffer.length > 0) { var i = Math.floor(Math.random() * buffer.length); return this.Yield(buffer.splice(i, 1)[0]); } return false; }, Functions.Blank) }); }, /* Grouping Methods */ // Overload:function(keySelector) // Overload:function(keySelector,elementSelector) // Overload:function(keySelector,elementSelector,resultSelector) // Overload:function(keySelector,elementSelector,resultSelector,compareSelector) GroupBy: function (keySelector, elementSelector, resultSelector, compareSelector) { var source = this; keySelector = Utils.CreateLambda(keySelector); elementSelector = Utils.CreateLambda(elementSelector); if (resultSelector != null) resultSelector = Utils.CreateLambda(resultSelector); compareSelector = Utils.CreateLambda(compareSelector); return new Enumerable(function () { var enumerator; return new IEnumerator( function () { enumerator = source.ToLookup(keySelector, elementSelector, compareSelector) .ToEnumerable() .GetEnumerator(); }, function () { while (enumerator.MoveNext()) { return (resultSelector == null) ? this.Yield(enumerator.Current()) : this.Yield(resultSelector(enumerator.Current().Key(), enumerator.Current())); } return false; }, function () { Utils.Dispose(enumerator); }) }); }, // Overload:function(keySelector) // Overload:function(keySelector,elementSelector) // Overload:function(keySelector,elementSelector,resultSelector) // Overload:function(keySelector,elementSelector,resultSelector,compareSelector) PartitionBy: function (keySelector, elementSelector, resultSelector, compareSelector) { var source = this; keySelector = Utils.CreateLambda(keySelector); elementSelector = Utils.CreateLambda(elementSelector); compareSelector = Utils.CreateLambda(compareSelector); var hasResultSelector; if (resultSelector == null) { hasResultSelector = false; resultSelector = function (key, group) { return new Grouping(key, group) } } else { hasResultSelector = true; resultSelector = Utils.CreateLambda(resultSelector); } return new Enumerable(function () { var enumerator; var key; var compareKey; var group = []; return new IEnumerator( function () { enumerator = source.GetEnumerator(); if (enumerator.MoveNext()) { key = keySelector(enumerator.Current()); compareKey = compareSelector(key); group.push(elementSelector(enumerator.Current())); } }, function () { var hasNext; while ((hasNext = enumerator.MoveNext()) == true) { if (compareKey === compareSelector(keySelector(enumerator.Current()))) { group.push(elementSelector(enumerator.Current())); } else break; } if (group.length > 0) { var result = (hasResultSelector) ? resultSelector(key, Enumerable.From(group)) : resultSelector(key, group); if (hasNext) { key = keySelector(enumerator.Current()); compareKey = compareSelector(key); group = [elementSelector(enumerator.Current())]; } else group = []; return this.Yield(result); } return false; }, function () { Utils.Dispose(enumerator); }) }); }, BufferWithCount: function (count) { var source = this; return new Enumerable(function () { var enumerator; return new IEnumerator( function () { enumerator = source.GetEnumerator(); }, function () { var array = []; var index = 0; while (enumerator.MoveNext()) { array.push(enumerator.Current()); if (++index >= count) return this.Yield(array); } if (array.length > 0) return this.Yield(array); return false; }, function () { Utils.Dispose(enumerator); }) }); }, /* Aggregate Methods */ // Overload:function(func) // Overload:function(seed,func) // Overload:function(seed,func,resultSelector) Aggregate: function (seed, func, resultSelector) { return this.Scan(seed, func, resultSelector).Last(); }, // Overload:function() // Overload:function(selector) Average: function (selector) { selector = Utils.CreateLambda(selector); var sum = 0; var count = 0; this.ForEach(function (x) { sum += selector(x); ++count; }); return sum / count; }, // Overload:function() // Overload:function(predicate) Count: function (predicate) { predicate = (predicate == null) ? Functions.True : Utils.CreateLambda(predicate); var count = 0; this.ForEach(function (x, i) { if (predicate(x, i)) ++count; }); return count; }, // Overload:function() // Overload:function(selector) Max: function (selector) { if (selector == null) selector = Functions.Identity; return this.Select(selector).Aggregate(function (a, b) { return (a > b) ? a : b; }); }, // Overload:function() // Overload:function(selector) Min: function (selector) { if (selector == null) selector = Functions.Identity; return this.Select(selector).Aggregate(function (a, b) { return (a < b) ? a : b; }); }, MaxBy: function (keySelector) { keySelector = Utils.CreateLambda(keySelector); return this.Aggregate(function (a, b) { return (keySelector(a) > keySelector(b)) ? a : b }); }, MinBy: function (keySelector) { keySelector = Utils.CreateLambda(keySelector); return this.Aggregate(function (a, b) { return (keySelect