UNPKG

@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
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); });