UNPKG

linqcontainers

Version:

Linq-Collections (ES5): [IEnumerable, IQueryable, ...] + [List, Dictionary, Stack, ... + readonly]

512 lines 19.4 kB
"use strict"; // - // Created by Ivan Sanz (@isc30) // Copyright © 2017 Ivan Sanz Carasa. All rights reserved. // - var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); // region IMPORTS // tslint:disable-next-line:max-line-length var Enumerables_1 = require("./Enumerables"); var Comparers_1 = require("./Comparers"); // endregion // region EnumerableCollection var EnumerableCollection = /** @class */ (function () { function EnumerableCollection() { } EnumerableCollection.prototype.toList = function () { return new List(this.toArray()); }; EnumerableCollection.prototype.toDictionary = function (keySelector, valueSelector) { return Dictionary.fromArray(this.toArray(), keySelector, valueSelector); }; EnumerableCollection.prototype.reverse = function () { return new Enumerables_1.ReverseEnumerable(this.asEnumerable()); }; EnumerableCollection.prototype.concat = function (other) { var others = []; for (var _i = 1; _i < arguments.length; _i++) { others[_i - 1] = arguments[_i]; } return (_a = this.asEnumerable()).concat.apply(_a, [other].concat(others)); var _a; }; EnumerableCollection.prototype.contains = function (element) { return this.any(function (e) { return e === element; }); }; EnumerableCollection.prototype.where = function (predicate) { return new Enumerables_1.ConditionalEnumerable(this.asEnumerable(), predicate); }; EnumerableCollection.prototype.select = function (selector) { return new Enumerables_1.TransformEnumerable(this.asEnumerable(), selector); }; EnumerableCollection.prototype.selectMany = function (selector) { var selectToEnumerable = function (e) { var ie = selector(e); return Array.isArray(ie) ? new Enumerables_1.ArrayEnumerable(ie) : ie.asEnumerable(); }; return this .select(selectToEnumerable).toArray() .reduce(function (p, c) { return new Enumerables_1.ConcatEnumerable(p, c); }, Enumerables_1.Enumerable.empty()); }; EnumerableCollection.prototype.elementAt = function (index) { var element = this.elementAtOrDefault(index); if (element === undefined) { throw new Error("Out of bounds"); } return element; }; EnumerableCollection.prototype.except = function (other) { return this.asEnumerable().except(other); }; EnumerableCollection.prototype.first = function (predicate) { var element; if (predicate !== undefined) { element = this.firstOrDefault(predicate); } else { element = this.firstOrDefault(); } if (element === undefined) { throw new Error("Sequence contains no elements"); } return element; }; EnumerableCollection.prototype.groupBy = function (keySelector, valueSelector) { var array = this.toArray(); var dictionary = new Dictionary(); for (var i = 0; i < array.length; ++i) { var key = keySelector(array[i]); var value = valueSelector !== undefined ? valueSelector(array[i]) : array[i]; if (!dictionary.containsKey(key)) { dictionary.set(key, new List()); } dictionary.get(key).push(value); } return dictionary.asEnumerable(); }; EnumerableCollection.prototype.last = function (predicate) { var element; if (predicate !== undefined) { element = this.lastOrDefault(predicate); } else { element = this.lastOrDefault(); } if (element === undefined) { throw new Error("Sequence contains no elements"); } return element; }; EnumerableCollection.prototype.single = function (predicate) { var element; if (predicate !== undefined) { element = this.singleOrDefault(predicate); } else { element = this.singleOrDefault(); } if (element === undefined) { throw new Error("Sequence contains no elements"); } return element; }; EnumerableCollection.prototype.singleOrDefault = function (predicate) { if (predicate !== undefined) { return this.asEnumerable().singleOrDefault(predicate); } return this.asEnumerable().singleOrDefault(); }; EnumerableCollection.prototype.distinct = function (keySelector) { return new Enumerables_1.UniqueEnumerable(this.asEnumerable(), keySelector); }; EnumerableCollection.prototype.min = function (selector) { if (selector !== undefined) { // Don't copy iterators return new Enumerables_1.TransformEnumerable(this.asEnumerable(), selector).min(); } return this.aggregate(function (previous, current) { return (previous !== undefined && previous < current) ? previous : current; }); }; EnumerableCollection.prototype.orderBy = function (keySelector, comparer) { return new Enumerables_1.OrderedEnumerable(this.asEnumerable(), Comparers_1.createComparer(keySelector, true, comparer)); }; EnumerableCollection.prototype.orderByDescending = function (keySelector) { return new Enumerables_1.OrderedEnumerable(this.asEnumerable(), Comparers_1.createComparer(keySelector, false, undefined)); }; EnumerableCollection.prototype.max = function (selector) { if (selector !== undefined) { // Don't copy iterators return new Enumerables_1.TransformEnumerable(this.asEnumerable(), selector).max(); } return this.aggregate(function (previous, current) { return (previous !== undefined && previous > current) ? previous : current; }); }; EnumerableCollection.prototype.sum = function (selector) { return this.aggregate(function (previous, current) { return previous + selector(current); }, 0); }; EnumerableCollection.prototype.skip = function (amount) { return new Enumerables_1.RangeEnumerable(this.asEnumerable(), amount, undefined); }; EnumerableCollection.prototype.take = function (amount) { return new Enumerables_1.RangeEnumerable(this.asEnumerable(), undefined, amount); }; EnumerableCollection.prototype.union = function (other) { return new Enumerables_1.UniqueEnumerable(this.concat(other)); }; EnumerableCollection.prototype.aggregate = function (aggregator, initialValue) { if (initialValue !== undefined) { return this.asEnumerable().aggregate(aggregator, initialValue); } return this.asEnumerable().aggregate(aggregator); }; EnumerableCollection.prototype.any = function (predicate) { if (predicate !== undefined) { return this.asEnumerable().any(predicate); } return this.asEnumerable().any(); }; EnumerableCollection.prototype.all = function (predicate) { return this.asEnumerable().all(predicate); }; EnumerableCollection.prototype.average = function (selector) { return this.asEnumerable().average(selector); }; EnumerableCollection.prototype.count = function (predicate) { if (predicate !== undefined) { return this.asEnumerable().count(predicate); } return this.asEnumerable().count(); }; EnumerableCollection.prototype.elementAtOrDefault = function (index) { return this.asEnumerable().elementAtOrDefault(index); }; EnumerableCollection.prototype.firstOrDefault = function (predicate) { if (predicate !== undefined) { return this.asEnumerable().firstOrDefault(predicate); } return this.asEnumerable().firstOrDefault(); }; EnumerableCollection.prototype.lastOrDefault = function (predicate) { if (predicate !== undefined) { return this.asEnumerable().lastOrDefault(predicate); } return this.asEnumerable().lastOrDefault(); }; EnumerableCollection.prototype.forEach = function (action) { return this.asEnumerable().forEach(action); }; return EnumerableCollection; }()); exports.EnumerableCollection = EnumerableCollection; // endregion // region ArrayQueryable var ArrayQueryable = /** @class */ (function (_super) { __extends(ArrayQueryable, _super); function ArrayQueryable(elements) { if (elements === void 0) { elements = []; } var _this = _super.call(this) || this; _this.source = elements; return _this; } ArrayQueryable.prototype.asArray = function () { return this.source; }; ArrayQueryable.prototype.toArray = function () { return [].concat(this.source); }; ArrayQueryable.prototype.toList = function () { return new List(this.toArray()); }; ArrayQueryable.prototype.asEnumerable = function () { return new Enumerables_1.ArrayEnumerable(this.source); }; ArrayQueryable.prototype.aggregate = function (aggregator, initialValue) { if (initialValue !== undefined) { return this.source.reduce(aggregator, initialValue); } return this.source.reduce(aggregator); }; ArrayQueryable.prototype.any = function (predicate) { if (predicate !== undefined) { return this.source.some(predicate); } return this.source.length > 0; }; ArrayQueryable.prototype.all = function (predicate) { return this.source.every(predicate); }; ArrayQueryable.prototype.average = function (selector) { if (this.count() === 0) { throw new Error("Sequence contains no elements"); } var sum = 0; for (var i = 0, end = this.source.length; i < end; ++i) { sum += selector(this.source[i]); } return sum / this.source.length; }; ArrayQueryable.prototype.count = function (predicate) { if (predicate !== undefined) { return this.source.filter(predicate).length; } return this.source.length; }; ArrayQueryable.prototype.elementAtOrDefault = function (index) { if (index < 0) { throw new Error("Negative index is forbiden"); } return this.source[index]; }; ArrayQueryable.prototype.firstOrDefault = function (predicate) { if (predicate !== undefined) { return this.source.filter(predicate)[0]; } return this.source[0]; }; ArrayQueryable.prototype.groupBy = function (keySelector, valueSelector) { var array = this.asArray(); var dictionary = new Dictionary(); for (var i = 0; i < array.length; ++i) { var key = keySelector(array[i]); var value = valueSelector !== undefined ? valueSelector(array[i]) : array[i]; if (!dictionary.containsKey(key)) { dictionary.set(key, new List()); } dictionary.get(key).push(value); } return dictionary.asEnumerable(); }; ArrayQueryable.prototype.lastOrDefault = function (predicate) { if (predicate !== undefined) { var records = this.source.filter(predicate); return records[records.length - 1]; } return this.source[this.source.length - 1]; }; ArrayQueryable.prototype.forEach = function (action) { for (var i = 0, end = this.source.length; i < end; ++i) { action(this.source[i], i); } }; return ArrayQueryable; }(EnumerableCollection)); exports.ArrayQueryable = ArrayQueryable; var List = /** @class */ (function (_super) { __extends(List, _super); function List() { return _super !== null && _super.apply(this, arguments) || this; } List.prototype.copy = function () { return new List(this.toArray()); }; List.prototype.asReadOnly = function () { return this; }; List.prototype.clear = function () { this.source = []; }; List.prototype.remove = function (element) { var newSource = []; for (var i = 0, end = this.source.length; i < end; ++i) { if (this.source[i] !== element) { newSource.push(this.source[i]); } } this.source = newSource; }; List.prototype.removeAt = function (index) { if (index < 0 || this.source[index] === undefined) { throw new Error("Out of bounds"); } return this.source.splice(index, 1)[0]; }; List.prototype.get = function (index) { return this.source[index]; }; List.prototype.push = function (element) { return this.source.push(element); }; List.prototype.pushRange = function (elements) { if (!Array.isArray(elements)) { elements = elements.toArray(); } return this.source.push.apply(this.source, elements); }; List.prototype.pushFront = function (element) { return this.source.unshift(element); }; List.prototype.pop = function () { return this.source.pop(); }; List.prototype.popFront = function () { return this.source.shift(); }; List.prototype.set = function (index, element) { if (index < 0) { throw new Error("Out of bounds"); } this.source[index] = element; }; List.prototype.insert = function (index, element) { if (index < 0 || index > this.source.length) { throw new Error("Out of bounds"); } this.source.splice(index, 0, element); }; List.prototype.indexOf = function (element) { return this.source.indexOf(element); }; return List; }(ArrayQueryable)); exports.List = List; var Stack = /** @class */ (function (_super) { __extends(Stack, _super); function Stack() { return _super !== null && _super.apply(this, arguments) || this; } Stack.prototype.copy = function () { return new Stack(this.toArray()); }; Stack.prototype.clear = function () { this.source = []; }; Stack.prototype.peek = function () { return this.source[this.source.length - 1]; }; Stack.prototype.pop = function () { return this.source.pop(); }; Stack.prototype.push = function (element) { return this.source.push(element); }; return Stack; }(ArrayQueryable)); exports.Stack = Stack; var Dictionary = /** @class */ (function (_super) { __extends(Dictionary, _super); function Dictionary(keyValuePairs) { var _this = _super.call(this) || this; _this.clear(); if (keyValuePairs !== undefined) { for (var i = 0; i < keyValuePairs.length; ++i) { var pair = keyValuePairs[i]; _this.set(pair.key, pair.value); } } return _this; } Dictionary.fromArray = function (array, keySelector, valueSelector) { var keyValuePairs = array.map(function (v) { return { key: keySelector(v), value: valueSelector(v), }; }); return new Dictionary(keyValuePairs); }; Dictionary.fromJsObject = function (object) { var keys = new List(Object.getOwnPropertyNames(object)); var keyValues = keys.select(function (k) { return ({ key: k, value: object[k] }); }); return new Dictionary(keyValues.toArray()); }; Dictionary.prototype.copy = function () { return new Dictionary(this.toArray()); }; Dictionary.prototype.asReadOnly = function () { return this; }; Dictionary.prototype.asEnumerable = function () { return new Enumerables_1.ArrayEnumerable(this.toArray()); }; Dictionary.prototype.toArray = function () { var _this = this; return this.getKeys().select(function (p) { return { key: p, value: _this.dictionary[p], }; }).toArray(); }; Dictionary.prototype.clear = function () { this.dictionary = {}; }; Dictionary.prototype.containsKey = function (key) { return this.dictionary.hasOwnProperty(key); }; Dictionary.prototype.containsValue = function (value) { var keys = this.getKeysFast(); for (var i = 0; i < keys.length; ++i) { if (this.dictionary[keys[i]] === value) { return true; } } return false; }; Dictionary.prototype.getKeys = function () { var _this = this; var keys = this.getKeysFast(); return new List(keys.map(function (k) { return _this.keyType === "number" ? parseFloat(k) : k; })); }; Dictionary.prototype.getKeysFast = function () { return Object.getOwnPropertyNames(this.dictionary); }; Dictionary.prototype.getValues = function () { var keys = this.getKeysFast(); var result = new Array(keys.length); for (var i = 0; i < keys.length; ++i) { result[i] = this.dictionary[keys[i]]; } return new List(result); }; Dictionary.prototype.remove = function (key) { if (this.containsKey(key)) { delete this.dictionary[key]; } }; Dictionary.prototype.get = function (key) { if (!this.containsKey(key)) { throw new Error("Key doesn't exist: " + key); } return this.dictionary[key]; }; Dictionary.prototype.set = function (key, value) { if (this.containsKey(key)) { throw new Error("Key already exists: " + key); } this.setOrUpdate(key, value); }; Dictionary.prototype.setOrUpdate = function (key, value) { if (this.keyType === undefined) { this.keyType = typeof key; } this.dictionary[key] = value; }; return Dictionary; }(EnumerableCollection)); exports.Dictionary = Dictionary; // endregion //# sourceMappingURL=Collections.js.map