@paraboly/pwc-multi-filter
Version:
A wrapper over pwc-tabview and pwc-filter. Provides means of dynamically managing multiple filters via a single component.
1,122 lines (1,121 loc) • 113 kB
JavaScript
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
function createCommonjsModule(fn, module) {
return module = { exports: {} }, fn(module, module.exports), module.exports;
}
var linq = createCommonjsModule(function (module) {
/*--------------------------------------------------------------------------
* linq.js - LINQ for JavaScript
* licensed under MIT License
*------------------------------------------------------------------------*/
(function (root, undefined$1) {
// ReadOnly Function
var Functions = {
Identity: function (x) { return x; },
True: function () { return true; },
Blank: function () { }
};
// const Type
var Types = {
Boolean: typeof true,
Number: typeof 0,
String: typeof "",
Object: typeof {},
Undefined: typeof undefined$1,
Function: typeof function () { }
};
// createLambda cache
var funcCache = { "": Functions.Identity };
// private utility methods
var Utils = {
// Create anonymous function from lambda expression string
createLambda: function (expression) {
if (expression == null)
return Functions.Identity;
if (typeof expression === Types.String) {
// get from cache
var f = funcCache[expression];
if (f != null) {
return f;
}
if (expression.indexOf("=>") === -1) {
var regexp = new RegExp("[$]+", "g");
var maxLength = 0;
var match;
while ((match = regexp.exec(expression)) != null) {
var paramNumber = match[0].length;
if (paramNumber > maxLength) {
maxLength = paramNumber;
}
}
var argArray = [];
for (var i = 1; i <= maxLength; i++) {
var dollar = "";
for (var j = 0; j < i; j++) {
dollar += "$";
}
argArray.push(dollar);
}
var args = Array.prototype.join.call(argArray, ",");
f = new Function(args, "return " + expression);
funcCache[expression] = f;
return f;
}
else {
var expr = expression.match(/^[(\s]*([^()]*?)[)\s]*=>(.*)/);
f = new Function(expr[1], "return " + expr[2]);
funcCache[expression] = f;
return f;
}
}
return expression;
},
isIEnumerable: function (obj) {
if (typeof Enumerator !== Types.Undefined) {
try {
new Enumerator(obj); // check JScript(IE)'s Enumerator
return true;
}
catch (e) { }
}
return false;
},
// IE8's defineProperty is defined but cannot use, therefore check defineProperties
defineProperty: (Object.defineProperties != null)
? function (target, methodName, value) {
Object.defineProperty(target, methodName, {
enumerable: false,
configurable: true,
writable: true,
value: value
});
}
: function (target, methodName, value) {
target[methodName] = value;
},
compare: function (a, b) {
return (a === b) ? 0
: (a > b) ? 1
: -1;
},
dispose: function (obj) {
if (obj != null)
obj.dispose();
},
hasNativeIteratorSupport: function () {
return typeof Symbol !== 'undefined' && typeof Symbol.iterator !== 'undefined';
}
};
// IEnumerator State
var State = { Before: 0, Running: 1, After: 2 };
// "Enumerator" is conflict JScript's "Enumerator"
var IEnumerator = function (initialize, tryGetNext, dispose) {
var yielder = new Yielder();
var state = State.Before;
this.current = yielder.current;
this.moveNext = function () {
try {
switch (state) {
case State.Before:
state = State.Running;
initialize();
// fall through
case State.Running:
if (tryGetNext.apply(yielder)) {
return true;
}
else {
this.dispose();
return false;
}
case State.After:
return false;
}
}
catch (e) {
this.dispose();
throw e;
}
};
this.dispose = function () {
if (state != State.Running)
return;
try {
dispose();
}
finally {
state = State.After;
}
};
};
// for tryGetNext
var Yielder = function () {
var current = null;
this.current = function () { return current; };
this.yieldReturn = function (value) {
current = value;
return true;
};
this.yieldBreak = function () {
return false;
};
};
// Enumerable constuctor
var Enumerable = function (getEnumerator) {
this.getEnumerator = getEnumerator;
};
// Utility
Enumerable.Utils = {}; // container
Enumerable.Utils.createLambda = function (expression) {
return Utils.createLambda(expression);
};
Enumerable.Utils.createEnumerable = function (getEnumerator) {
return new Enumerable(getEnumerator);
};
Enumerable.Utils.createEnumerator = function (initialize, tryGetNext, dispose) {
return new IEnumerator(initialize, tryGetNext, dispose);
};
Enumerable.Utils.extendTo = function (type) {
var typeProto = type.prototype;
var enumerableProto;
if (type === Array) {
enumerableProto = ArrayEnumerable.prototype;
Utils.defineProperty(typeProto, "getSource", function () {
return this;
});
}
else {
enumerableProto = Enumerable.prototype;
Utils.defineProperty(typeProto, "getEnumerator", function () {
return Enumerable.from(this).getEnumerator();
});
}
for (var methodName in enumerableProto) {
var func = enumerableProto[methodName];
// already extended
if (typeProto[methodName] == func)
continue;
// already defined(example Array#reverse/join/forEach...)
if (typeProto[methodName] != null) {
methodName = methodName + "ByLinq";
if (typeProto[methodName] == func)
continue; // recheck
}
if (func instanceof Function) {
Utils.defineProperty(typeProto, methodName, func);
}
}
};
// Generator
Enumerable.choice = function () {
var args = arguments;
return new Enumerable(function () {
return new IEnumerator(function () {
args = (args[0] instanceof Array) ? args[0]
: (args[0].getEnumerator != null) ? args[0].toArray()
: args;
}, function () {
return this.yieldReturn(args[Math.floor(Math.random() * args.length)]);
}, Functions.Blank);
});
};
Enumerable.cycle = function () {
var args = arguments;
return new Enumerable(function () {
var index = 0;
return new IEnumerator(function () {
args = (args[0] instanceof Array) ? args[0]
: (args[0].getEnumerator != null) ? args[0].toArray()
: args;
}, function () {
if (index >= args.length)
index = 0;
return this.yieldReturn(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.yieldReturn(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);
}
// iterable object
if (typeof Symbol !== 'undefined' && typeof obj[Symbol.iterator] !== 'undefined') {
return new Enumerable(function () {
return new IEnumerator(Functions.Blank, function () {
var next = obj.next();
return (next.done ? false : (this.yieldReturn(next.value)));
}, Functions.Blank);
});
}
// 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.yieldReturn(enumerator.item());
}, Functions.Blank);
});
}
// WinMD IIterable<T>
if (typeof Windows === Types.Object && typeof obj.first === Types.Function) {
return new Enumerable(function () {
var isFirst = true;
var enumerator;
return new IEnumerator(function () { enumerator = obj.first(); }, function () {
if (isFirst)
isFirst = false;
else
enumerator.moveNext();
return (enumerator.hasCurrent) ? this.yieldReturn(enumerator.current) : this.yieldBreak();
}, 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) {
var value = obj[key];
if (!(value instanceof Function) && Object.prototype.hasOwnProperty.call(obj, key)) {
array.push({ key: key, value: value });
}
}
}, function () {
return (index < array.length)
? this.yieldReturn(array[index++])
: false;
}, Functions.Blank);
});
},
Enumerable.make = 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.yieldReturn(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 new Enumerable(function () {
var value;
var index = 0;
return new IEnumerator(function () { value = start - step; }, function () {
return (index++ < count)
? this.yieldReturn(value += step)
: this.yieldBreak();
}, Functions.Blank);
});
};
// Overload:function(start, count)
// Overload:function(start, count, step)
Enumerable.rangeDown = function (start, count, step) {
if (step == null)
step = 1;
return new Enumerable(function () {
var value;
var index = 0;
return new IEnumerator(function () { value = start + step; }, function () {
return (index++ < count)
? this.yieldReturn(value -= step)
: this.yieldBreak();
}, Functions.Blank);
});
};
// Overload:function(start, to)
// Overload:function(start, to, step)
Enumerable.rangeTo = function (start, to, step) {
if (step == null)
step = 1;
if (start < to) {
return new Enumerable(function () {
var value;
return new IEnumerator(function () { value = start - step; }, function () {
var next = value += step;
return (next <= to)
? this.yieldReturn(next)
: this.yieldBreak();
}, Functions.Blank);
});
}
else {
return new Enumerable(function () {
var value;
return new IEnumerator(function () { value = start + step; }, function () {
var next = value -= step;
return (next >= to)
? this.yieldReturn(next)
: this.yieldBreak();
}, Functions.Blank);
});
}
};
// Overload:function(element)
// Overload:function(element, count)
Enumerable.repeat = function (element, count) {
if (count != null)
return Enumerable.repeat(element).take(count);
return new Enumerable(function () {
return new IEnumerator(Functions.Blank, function () { return this.yieldReturn(element); }, 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.yieldReturn(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.yieldReturn(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.yieldReturn(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.yieldReturn(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.yieldReturn(value);
}
value = func(value);
return this.yieldReturn(value);
}, Functions.Blank);
});
};
Enumerable.defer = function (enumerableFactory) {
return new Enumerable(function () {
var enumerator;
return new IEnumerator(function () { enumerator = Enumerable.from(enumerableFactory()).getEnumerator(); }, function () {
return (enumerator.moveNext())
? this.yieldReturn(enumerator.current())
: this.yieldBreak();
}, function () {
Utils.dispose(enumerator);
});
});
};
// Extension Methods
/* Projection and Filtering Methods */
// Overload:function(func)
// Overload:function(func, resultSelector<element>)
// Overload:function(func, resultSelector<element, nestLevel>)
Enumerable.prototype.traverseBreadthFirst = 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.yieldReturn(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>)
Enumerable.prototype.traverseDepthFirst = 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.yieldReturn(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(); });
}
});
});
};
Enumerable.prototype.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.yieldReturn(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.yieldReturn(enumerator.current());
}
}
return false;
}
}, function () {
try {
Utils.dispose(enumerator);
}
finally {
Utils.dispose(middleEnumerator);
}
});
});
};
Enumerable.prototype.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.yieldReturn(selector(prev, enumerator.current()))
: false;
}, function () { Utils.dispose(enumerator); });
});
};
// Overload:function(func)
// Overload:function(seed,func<value,element>)
Enumerable.prototype.scan = function (seed, func) {
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.yieldReturn(value = enumerator.current());
}
}
else {
return this.yieldReturn(value = seed);
}
}
return (enumerator.moveNext())
? this.yieldReturn(value = func(value, enumerator.current()))
: false;
}, function () { Utils.dispose(enumerator); });
});
};
// Overload:function(selector<element>)
// Overload:function(selector<element,index>)
Enumerable.prototype.select = function (selector) {
selector = Utils.createLambda(selector);
if (selector.length <= 1) {
return new WhereSelectEnumerable(this, null, selector);
}
else {
var source = this;
return new Enumerable(function () {
var enumerator;
var index = 0;
return new IEnumerator(function () { enumerator = source.getEnumerator(); }, function () {
return (enumerator.moveNext())
? this.yieldReturn(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)
Enumerable.prototype.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$1;
var index = 0;
return new IEnumerator(function () { enumerator = source.getEnumerator(); }, function () {
if (middleEnumerator === undefined$1) {
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.yieldReturn(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>)
Enumerable.prototype.where = function (predicate) {
predicate = Utils.createLambda(predicate);
if (predicate.length <= 1) {
return new WhereEnumerable(this, predicate);
}
else {
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.yieldReturn(enumerator.current());
}
}
return false;
}, function () { Utils.dispose(enumerator); });
});
}
};
// Overload:function(selector<element>)
// Overload:function(selector<element,index>)
Enumerable.prototype.choose = function (selector) {
selector = Utils.createLambda(selector);
var source = this;
return new Enumerable(function () {
var enumerator;
var index = 0;
return new IEnumerator(function () { enumerator = source.getEnumerator(); }, function () {
while (enumerator.moveNext()) {
var result = selector(enumerator.current(), index++);
if (result != null) {
return this.yieldReturn(result);
}
}
return this.yieldBreak();
}, function () { Utils.dispose(enumerator); });
});
};
Enumerable.prototype.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; });
};
// mutiple arguments, last one is selector, others are enumerable
Enumerable.prototype.zip = function () {
var args = arguments;
var selector = Utils.createLambda(arguments[arguments.length - 1]);
var source = this;
// optimized case:argument is 2
if (arguments.length == 2) {
var second = arguments[0];
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.yieldReturn(selector(firstEnumerator.current(), secondEnumerator.current(), index++));
}
return false;
}, function () {
try {
Utils.dispose(firstEnumerator);
}
finally {
Utils.dispose(secondEnumerator);
}
});
});
}
else {
return new Enumerable(function () {
var enumerators;
var index = 0;
return new IEnumerator(function () {
var array = Enumerable.make(source)
.concat(Enumerable.from(args).takeExceptLast().select(Enumerable.from))
.select(function (x) { return x.getEnumerator(); })
.toArray();
enumerators = Enumerable.from(array);
}, function () {
if (enumerators.all(function (x) { return x.moveNext(); })) {
var array = enumerators
.select(function (x) { return x.current(); })
.toArray();
array.push(index++);
return this.yieldReturn(selector.apply(null, array));
}
else {
return this.yieldBreak();
}
}, function () {
Enumerable.from(enumerators).forEach(Utils.dispose);
});
});
}
};
// mutiple arguments
Enumerable.prototype.merge = function () {
var args = arguments;
var source = this;
return new Enumerable(function () {
var enumerators;
var index = -1;
return new IEnumerator(function () {
enumerators = Enumerable.make(source)
.concat(Enumerable.from(args).select(Enumerable.from))
.select(function (x) { return x.getEnumerator(); })
.toArray();
}, function () {
while (enumerators.length > 0) {
index = (index >= enumerators.length - 1) ? 0 : index + 1;
var enumerator = enumerators[index];
if (enumerator.moveNext()) {
return this.yieldReturn(enumerator.current());
}
else {
enumerator.dispose();
enumerators.splice(index--, 1);
}
}
return this.yieldBreak();
}, function () {
Enumerable.from(enumerators).forEach(Utils.dispose);
});
});
};
/* Join Methods */
// Overload:function (inner, outerKeySelector, innerKeySelector, resultSelector)
// Overload:function (inner, outerKeySelector, innerKeySelector, resultSelector, compareSelector)
Enumerable.prototype.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$1) {
return this.yieldReturn(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)
Enumerable.prototype.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.yieldReturn(resultSelector(enumerator.current(), innerElement));
}
return false;
}, function () { Utils.dispose(enumerator); });
});
};
/* Set Methods */
Enumerable.prototype.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)
Enumerable.prototype.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);
}
};
Enumerable.prototype.isEmpty = function () {
return !this.any();
};
// multiple arguments
Enumerable.prototype.concat = function () {
var source = this;
if (arguments.length == 1) {
var second = arguments[0];
return new Enumerable(function () {
var firstEnumerator;
var secondEnumerator;
return new IEnumerator(function () { firstEnumerator = source.getEnumerator(); }, function () {
if (secondEnumerator == null) {
if (firstEnumerator.moveNext())
return this.yieldReturn(firstEnumerator.current());
secondEnumerator = Enumerable.from(second).getEnumerator();
}
if (secondEnumerator.moveNext())
return this.yieldReturn(secondEnumerator.current());
return false;
}, function () {
try {
Utils.dispose(firstEnumerator);
}
finally {
Utils.dispose(secondEnumerator);
}
});
});
}
else {
var args = arguments;
return new Enumerable(function () {
var enumerators;
return new IEnumerator(function () {
enumerators = Enumerable.make(source)
.concat(Enumerable.from(args).select(Enumerable.from))
.select(function (x) { return x.getEnumerator(); })
.toArray();
}, function () {
while (enumerators.length > 0) {
var enumerator = enumerators[0];
if (enumerator.moveNext()) {
return this.yieldReturn(enumerator.current());
}
else {
enumerator.dispose();
enumerators.splice(0, 1);
}
}
return this.yieldBreak();
}, function () {
Enumerable.from(enumerators).forEach(Utils.dispose);
});
});
}
};
Enumerable.prototype.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.yieldReturn(secondEnumerator.current());
}
if (firstEnumerator.moveNext()) {
count++;
return this.yieldReturn(firstEnumerator.current());
}
if (!isEnumerated && secondEnumerator.moveNext()) {
return this.yieldReturn(secondEnumerator.current());
}
return false;
}, function () {
try {
Utils.dispose(firstEnumerator);
}
finally {
Utils.dispose(secondEnumerator);
}
});
});
};
Enumerable.prototype.alternate = function (alternateValueOrSequence) {
var source = this;
return new Enumerable(function () {
var buffer;
var enumerator;
var alternateSequence;
var alternateEnumerator;
return new IEnumerator(function () {
if (alternateValueOrSequence instanceof Array || alternateValueOrSequence.getEnumerator != null) {
alternateSequence = Enumerable.from(Enumerable.from(alternateValueOrSequence).toArray()); // freeze
}
else {
alternateSequence = Enumerable.make(alternateValueOrSequence);
}
enumerator = source.getEnumerator();
if (enumerator.moveNext())
buffer = enumerator.current();
}, function () {
while (true) {
if (alternateEnumerator != null) {
if (alternateEnumerator.moveNext()) {
return this.yieldReturn(alternateEnumerator.current());
}
else {
alternateEnumerator = null;
}
}
if (buffer == null && enumerator.moveNext()) {
buffer = enumerator.current(); // hasNext
alternateEnumerator = alternateSequence.getEnumerator();
continue; // GOTO
}
else if (buffer != null) {
var retVal = buffer;
buffer = null;
return this.yieldReturn(retVal);
}
return this.yieldBreak();
}
}, function () {
try {
Utils.dispose(enumerator);
}
finally {
Utils.dispose(alternateEnumerator);
}
});
});
};
// Overload:function(value)
// Overload:function(value, compareSelector)
Enumerable.prototype.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);
}
};
Enumerable.prototype.defaultIfEmpty = function (defaultValue) {
var source = this;
if (defaultValue === undefined$1)
defaultValue = null;
return new Enumerable(function () {
var enumerator;
var isFirst = true;
return new IEnumerator(function () { enumerator = source.getEnumerator(); }, function () {
if (enumerator.moveNext()) {
isFirst = false;
return this.yieldReturn(enumerator.current());
}
else if (isFirst) {
isFirst = false;
return this.yieldReturn(defaultValue);
}
return false;
}, function () { Utils.dispose(enumerator); });