ts-generic-collections-linq
Version:
TypeScript library provides strongly-typed, queryable collections.
2,122 lines (2,115 loc) • 50.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @template T
*/
class List {
/**
* @param {?=} array
*/
constructor(array = null) {
this.list = new Array();
if (array)
this.list = array;
}
/* IList */
/**
* @param {?} item
* @return {?}
*/
add(item) {
this.list.push(item);
}
/**
* @param {?} items
* @return {?}
*/
addRange(items) {
items.forEach((/**
* @param {?} x
* @return {?}
*/
x => this.add(x)));
}
/**
* @param {?} predicate
* @return {?}
*/
remove(predicate) {
/** @type {?} */
let temp = new Array();
this.list.forEach((/**
* @param {?} element
* @return {?}
*/
element => {
if (!predicate(element)) {
temp.push(element);
}
}));
this.list = temp;
}
/**
* @param {?} index
* @return {?}
*/
removeAt(index) {
this.list.splice(index, 1);
}
/**
* @return {?}
*/
clear() {
this.list = new Array();
}
/* IEnumerable */
/**
* @return {?}
*/
asEnumerable() {
return this;
}
/**
* @return {?}
*/
get length() {
return this.list.length;
}
/**
* @param {?} index
* @return {?}
*/
elementAt(index) {
try {
return this.list[index];
}
catch (e) {
return null;
}
}
/**
* @param {?=} predicate
* @return {?}
*/
any(predicate) {
if (!predicate) {
return this.list.length > 0;
}
for (let i = 0; i < this.list.length; i++) {
if (predicate(this.list[i])) {
return true;
}
}
return false;
}
/**
* @param {?=} predicate
* @return {?}
*/
all(predicate) {
if (!predicate) {
return this.list.length > 0;
}
for (let i = 0; i < this.list.length; i++) {
if (!predicate(this.list[i])) {
return false;
}
}
return true;
}
/**
* @param {?=} predicate
* @return {?}
*/
single(predicate = null) {
if (this.list.length <= 0) {
throw ITEM_NOT_FOUND_MSG;
}
if (predicate) {
/** @type {?} */
let item = this.singleOrDefault(predicate);
if (!item) {
throw ITEM_NOT_FOUND_MSG;
}
return item;
}
return this.list[0];
}
/**
* @param {?=} predicate
* @return {?}
*/
first(predicate = null) {
if (this.list.length <= 0) {
throw ITEM_NOT_FOUND_MSG;
}
if (predicate) {
/** @type {?} */
let item = this.firstOrDefault(predicate);
if (!item) {
throw ITEM_NOT_FOUND_MSG;
}
return item;
}
return this.list[0];
}
/**
* @param {?=} predicate
* @return {?}
*/
last(predicate = null) {
if (this.list.length <= 0) {
throw ITEM_NOT_FOUND_MSG;
}
if (predicate) {
/** @type {?} */
let item = this.lastOrDefault(predicate);
if (!item) {
throw ITEM_NOT_FOUND_MSG;
}
return item;
}
return this.list[this.list.length - 1];
}
/**
* @param {?} predicate
* @return {?}
*/
singleOrDefault(predicate) {
/** @type {?} */
let temp = new Array();
this.list.filter((/**
* @param {?} element
* @return {?}
*/
element => {
if (predicate(element)) {
temp.push(element);
}
}));
if (temp.length > 1) {
throw MULTIPLE_INSTANCES_FOUND_MSG;
}
if (temp.length <= 0) {
return null;
}
return temp[0];
}
/**
* @param {?} predicate
* @return {?}
*/
firstOrDefault(predicate) {
for (let i = 0; i < this.length; i++) {
/** @type {?} */
let item = this.list[i];
if (predicate(item)) {
return item;
}
}
return null;
}
/**
* @param {?} predicate
* @return {?}
*/
lastOrDefault(predicate) {
for (let i = this.length; i >= 0; i--) {
/** @type {?} */
let item = this.list[i - 1];
if (predicate(item)) {
return item;
}
}
return null;
}
/**
* @param {?} predicate
* @return {?}
*/
where(predicate) {
/** @type {?} */
let temp = new List();
this.list.filter((/**
* @param {?} element
* @return {?}
*/
element => {
if (predicate(element)) {
temp.add(element);
}
}));
return temp;
}
/**
* @template TResult
* @param {?} predicate
* @return {?}
*/
select(predicate) {
/** @type {?} */
let temp = new List();
this.forEach((/**
* @param {?} x
* @return {?}
*/
x => temp.add(predicate(x))));
return temp;
}
/**
* @param {?} predicate
* @return {?}
*/
forEach(predicate) {
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
x => predicate(x)));
}
/**
* @return {?}
*/
toArray() {
return this.list.slice();
}
/**
* @template TOuter, TMatch, TResult
* @param {?} outer
* @param {?} conditionInner
* @param {?} conditionOuter
* @param {?} select
* @param {?=} leftJoin
* @return {?}
*/
join(outer, conditionInner, conditionOuter, select, leftJoin = false) {
/** @type {?} */
let resultList = new List();
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
x => {
/** @type {?} */
let outerEntries = outer.toArray().filter((/**
* @param {?} y
* @return {?}
*/
y => conditionInner(x) === conditionOuter(y)));
if (leftJoin && outerEntries && outerEntries.length <= 0) {
resultList.add(select(x, null));
}
else {
outerEntries.forEach((/**
* @param {?} z
* @return {?}
*/
z => resultList.add(select(x, z))));
}
}));
return resultList;
}
/**
* @param {?} predicate
* @return {?}
*/
groupBy(predicate) {
/** @type {?} */
let groups = {};
this.list.forEach((/**
* @param {?} o
* @return {?}
*/
function (o) {
/** @type {?} */
var group = JSON.stringify(predicate(o));
groups[group] = groups[group] || [];
groups[group].push(o);
}));
/** @type {?} */
let g = Object.keys(groups).map((/**
* @param {?} group
* @return {?}
*/
function (group) {
/** @type {?} */
let a = group.substr(1, group.length - 2);
/** @type {?} */
let grp = new Group(new List(a.split(',')).select((/**
* @param {?} x
* @return {?}
*/
x => x.replace(/^(")?(.*?)(")?$/ig, "$2"))).toArray(), groups[group]);
return grp;
}));
return new List(g);
}
/**
* @template TResult
* @param {?} predicate
* @return {?}
*/
selectMany(predicate) {
return this.list.reduce((/**
* @param {?} out
* @param {?} inx
* @return {?}
*/
(out, inx) => {
/** @type {?} */
var items = predicate(inx);
out.addRange(items);
return out;
}), new List(new Array()));
}
/**
* @param {?} comparer
* @return {?}
*/
orderBy(comparer) {
/** @type {?} */
let temp = this.list.sort((/**
* @param {?} x
* @param {?} y
* @return {?}
*/
(x, y) => comparer.compare(x, y)));
return new List(temp);
}
/**
* @param {?} list
* @return {?}
*/
union(list) {
this.addRange(list.toArray());
return this;
}
/**
* @return {?}
*/
reverse() {
return new List(this.list.slice().reverse());
}
/**
* @param {?} comparer
* @return {?}
*/
distinct(comparer) {
/** @type {?} */
let uniques = new List();
this.forEach((/**
* @param {?} x
* @return {?}
*/
x => {
if (uniques.length > 0) {
if (!uniques.any((/**
* @param {?} y
* @return {?}
*/
y => comparer.equals(x, y)))) {
uniques.add(x);
}
}
else {
uniques.add(x);
}
}));
return uniques;
}
/**
* @param {?} no
* @return {?}
*/
skip(no) {
if (no > 0) {
return new List(this.list.slice(no, this.list.length - 1));
}
return this;
}
/**
* @param {?} no
* @return {?}
*/
take(no) {
if (no > 0) {
return new List(this.list.slice(0, no));
}
return this;
}
/**
* @param {?} predicate
* @return {?}
*/
sum(predicate) {
/** @type {?} */
let sum = 0;
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
x => sum = sum + predicate(x)));
return sum;
}
/**
* @param {?} predicate
* @return {?}
*/
avg(predicate) {
return this.sum(predicate) / this.length;
}
/**
* @param {?} predicate
* @return {?}
*/
min(predicate) {
/** @type {?} */
let min = 0;
/** @type {?} */
let i = 0;
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
x => {
if (i == 0) {
min = predicate(x);
}
else {
/** @type {?} */
let val = predicate(x);
if (val < min) {
min = val;
}
}
i++;
}));
return min;
}
/**
* @param {?} predicate
* @return {?}
*/
max(predicate) {
/** @type {?} */
let max = 0;
/** @type {?} */
let i = 0;
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
x => {
if (i == 0) {
max = predicate(x);
}
else {
/** @type {?} */
let val = predicate(x);
if (val > max) {
max = val;
}
}
i++;
}));
return max;
}
/**
* @param {?=} predicate
* @return {?}
*/
count(predicate = null) {
if (!predicate) {
return this.length;
}
/** @type {?} */
let count = 0;
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
x => {
if (predicate(x)) {
count++;
}
}));
return count;
}
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @template T
*/
class Group {
/**
* @param {?} groups
* @param {?} list
*/
constructor(groups, list) {
this.list = new List();
this.groups = groups;
this.list = new List(list);
}
}
/** @type {?} */
var objCompare = (/**
* @param {?} obj1
* @param {?} obj2
* @return {?}
*/
function (obj1, obj2) {
if ((typeof obj1 !== 'object' && typeof obj1 !== 'function') && (typeof obj2 !== 'object' && typeof obj2 !== 'function')) {
return obj1 === obj2;
}
//Loop through properties in object 1
for (var p in obj1) {
//Check property exists on both objects
if (obj1.hasOwnProperty(p) !== obj2.hasOwnProperty(p))
return false;
switch (typeof (obj1[p])) {
//Deep compare objects
case 'object':
if (!objCompare(obj1[p], obj2[p]))
return false;
break;
//Compare function code
case 'function':
if (typeof (obj2[p]) == 'undefined' || (p != 'compare' && obj1[p].toString() != obj2[p].toString()))
return false;
break;
//Compare values
default:
if (obj1[p] != obj2[p])
return false;
}
}
//Check object 2 for any extra properties
for (var p in obj2) {
if (typeof (obj1[p]) == 'undefined')
return false;
}
return true;
});
/** @type {?} */
const ITEM_NOT_FOUND_MSG = "Item does not exist.";
/** @type {?} */
const MULTIPLE_INSTANCES_FOUND_MSG = "Multiple instances of entity found.";
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @template TKey, TValue
*/
class Dictionary {
/**
* @param {?=} list
*/
constructor(list = null) {
this.list = new Array();
if (list) {
this.list = list;
}
}
/* IList */
/**
* @param {?} key
* @param {?} value
* @return {?}
*/
add(key, value) {
/** @type {?} */
let pair = new KeyValuePair(key, value);
if (this.containsKey(key)) {
throw "Duplicate key. Cannot add.";
}
this.list.push(pair);
}
/**
* @param {?} items
* @return {?}
*/
addRange(items) {
items.forEach((/**
* @param {?} x
* @return {?}
*/
x => this.add(x.key, x.value)));
}
/**
* @param {?} index
* @return {?}
*/
removeAt(index) {
this.list.splice(index, 1);
}
/**
* @return {?}
*/
clear() {
this.list = new Array();
}
/**
* @param {?} predicate
* @return {?}
*/
remove(predicate) {
/** @type {?} */
let temp = new Array();
this.list.forEach((/**
* @param {?} element
* @return {?}
*/
element => {
if (!predicate(element)) {
temp.push(element);
}
}));
this.list = temp;
}
/**
* @param {?} key
* @return {?}
*/
containsKey(key) {
return this.any((/**
* @param {?} x
* @return {?}
*/
x => objCompare(x.key, key)));
}
/**
* @param {?} value
* @return {?}
*/
containsValue(value) {
return this.any((/**
* @param {?} x
* @return {?}
*/
x => objCompare(x.value, value)));
}
/**
* @param {?} key
* @return {?}
*/
tryGetValue(key) {
/** @type {?} */
let item = this.singleOrDefault((/**
* @param {?} x
* @return {?}
*/
x => objCompare(x.key, key)));
if (item) {
return item.value;
}
return null;
}
/* IEnumerable */
/**
* @return {?}
*/
asEnumerable() {
return this;
}
/**
* @return {?}
*/
get length() {
return this.list.length;
}
/**
* @param {?} index
* @return {?}
*/
elementAt(index) {
try {
return this.list[index];
}
catch (e) {
return null;
}
}
/**
* @param {?=} predicate
* @return {?}
*/
any(predicate) {
if (!predicate) {
return this.list.length > 0;
}
for (let i = 0; i < this.list.length; i++) {
if (predicate(this.list[i])) {
return true;
}
}
return false;
}
/**
* @param {?=} predicate
* @return {?}
*/
all(predicate) {
if (!predicate) {
return this.list.length > 0;
}
for (let i = 0; i < this.list.length; i++) {
if (!predicate(this.list[i])) {
return false;
}
}
return true;
}
/**
* @param {?=} predicate
* @return {?}
*/
single(predicate = null) {
if (this.list.length <= 0) {
throw ITEM_NOT_FOUND_MSG;
}
if (predicate) {
/** @type {?} */
let item = this.singleOrDefault(predicate);
if (!item) {
throw ITEM_NOT_FOUND_MSG;
}
return item;
}
return this.list[0];
}
/**
* @param {?=} predicate
* @return {?}
*/
first(predicate = null) {
if (this.list.length <= 0) {
throw ITEM_NOT_FOUND_MSG;
}
if (predicate) {
/** @type {?} */
let item = this.firstOrDefault(predicate);
if (!item) {
throw ITEM_NOT_FOUND_MSG;
}
return item;
}
return this.list[0];
}
/**
* @param {?} predicate
* @return {?}
*/
last(predicate) {
if (this.list.length <= 0) {
throw ITEM_NOT_FOUND_MSG;
}
if (predicate) {
/** @type {?} */
let item = this.lastOrDefault(predicate);
if (!item) {
throw ITEM_NOT_FOUND_MSG;
}
return item;
}
return this.list[this.list.length - 1];
}
/**
* @param {?} predicate
* @return {?}
*/
singleOrDefault(predicate) {
/** @type {?} */
let temp = new Array();
this.list.filter((/**
* @param {?} element
* @return {?}
*/
element => {
if (predicate(element)) {
temp.push(element);
}
}));
if (temp.length > 1) {
throw MULTIPLE_INSTANCES_FOUND_MSG;
}
if (temp.length <= 0) {
return null;
}
return temp[0];
}
/**
* @param {?} predicate
* @return {?}
*/
firstOrDefault(predicate) {
for (let i = 0; i < this.length; i++) {
/** @type {?} */
let item = this.list[i];
if (predicate(item)) {
return item;
}
}
return null;
}
/**
* @param {?} predicate
* @return {?}
*/
lastOrDefault(predicate) {
for (let i = this.length; i >= 0; i--) {
/** @type {?} */
let item = this.list[i - 1];
if (predicate(item)) {
return item;
}
}
return null;
}
/**
* @param {?} predicate
* @return {?}
*/
where(predicate) {
/** @type {?} */
let temp = new Dictionary();
this.list.filter((/**
* @param {?} element
* @return {?}
*/
element => {
if (predicate(element)) {
temp.add(element.key, element.value);
}
}));
return temp;
}
/**
* @template TResult
* @param {?} predicate
* @return {?}
*/
select(predicate) {
/** @type {?} */
let temp = new List();
this.forEach((/**
* @param {?} x
* @return {?}
*/
x => temp.add(predicate(x))));
return temp;
}
/**
* @param {?} predicate
* @return {?}
*/
forEach(predicate) {
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
x => predicate(x)));
}
/**
* @return {?}
*/
toArray() {
return this.list.slice();
}
/**
* @template TOuter, TMatch, TResult
* @param {?} outer
* @param {?} conditionInner
* @param {?} conditionOuter
* @param {?} select
* @param {?=} leftJoin
* @return {?}
*/
join(outer, conditionInner, conditionOuter, select, leftJoin = false) {
/** @type {?} */
let resultList = new List();
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
x => {
/** @type {?} */
let outerEntries = outer.toArray().filter((/**
* @param {?} y
* @return {?}
*/
y => conditionInner(x) === conditionOuter(y)));
if (leftJoin && outerEntries && outerEntries.length <= 0) {
resultList.add(select(x, null));
}
else {
outerEntries.forEach((/**
* @param {?} z
* @return {?}
*/
z => resultList.add(select(x, z))));
}
}));
return resultList;
}
/**
* @param {?} predicate
* @return {?}
*/
groupBy(predicate) {
/** @type {?} */
let groups = {};
this.list.forEach((/**
* @param {?} o
* @return {?}
*/
function (o) {
/** @type {?} */
var group = JSON.stringify(predicate(o));
groups[group] = groups[group] || [];
groups[group].push(o);
}));
/** @type {?} */
let g = Object.keys(groups).map((/**
* @param {?} group
* @return {?}
*/
function (group) {
/** @type {?} */
let a = group.substr(1, group.length - 2);
/** @type {?} */
let grp = new Group(new List(a.split(',')).select((/**
* @param {?} x
* @return {?}
*/
x => x.replace(/^(")?(.*?)(")?$/ig, "$2"))).toArray(), groups[group]);
return grp;
}));
return new List(g);
}
/**
* @template TResult
* @param {?} predicate
* @return {?}
*/
selectMany(predicate) {
return this.list.reduce((/**
* @param {?} out
* @param {?} inx
* @return {?}
*/
(out, inx) => {
/** @type {?} */
var items = predicate(inx);
out.addRange(items);
return out;
}), new List(new Array()));
}
/**
* @param {?} comparer
* @return {?}
*/
orderBy(comparer) {
/** @type {?} */
let temp = this.list.sort((/**
* @param {?} x
* @param {?} y
* @return {?}
*/
(x, y) => comparer.compare(x, y)));
return new List(temp);
}
/**
* @param {?} comparer
* @return {?}
*/
distinct(comparer) {
/** @type {?} */
let uniques = new List();
this.forEach((/**
* @param {?} x
* @return {?}
*/
x => {
if (uniques.length > 0) {
if (!uniques.any((/**
* @param {?} y
* @return {?}
*/
y => comparer.equals(x, y)))) {
uniques.add(x);
}
}
else {
uniques.add(x);
}
}));
return uniques;
}
/**
* @param {?} list
* @return {?}
*/
union(list) {
this.addRange(list.toArray());
return this;
}
/**
* @return {?}
*/
reverse() {
return new List(this.list.slice().reverse());
}
/**
* @param {?} no
* @return {?}
*/
skip(no) {
if (no > 0) {
return new Dictionary(this.list.slice(no, this.list.length - 1));
}
return this;
}
/**
* @param {?} no
* @return {?}
*/
take(no) {
if (no > 0) {
return new Dictionary(this.list.slice(0, no));
}
return this;
}
/**
* @param {?} predicate
* @return {?}
*/
sum(predicate) {
/** @type {?} */
let sum = 0;
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
x => sum = sum + predicate(x)));
return sum;
}
/**
* @param {?} predicate
* @return {?}
*/
avg(predicate) {
return this.sum(predicate) / this.length;
}
/**
* @param {?} predicate
* @return {?}
*/
min(predicate) {
/** @type {?} */
let min = 0;
/** @type {?} */
let i = 0;
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
x => {
if (i == 0) {
min = predicate(x);
}
else {
/** @type {?} */
let val = predicate(x);
if (val < min) {
min = val;
}
}
i++;
}));
return min;
}
/**
* @param {?} predicate
* @return {?}
*/
max(predicate) {
/** @type {?} */
let max = 0;
/** @type {?} */
let i = 0;
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
x => {
if (i == 0) {
max = predicate(x);
}
else {
/** @type {?} */
let val = predicate(x);
if (val > max) {
max = val;
}
}
i++;
}));
return max;
}
/**
* @param {?=} predicate
* @return {?}
*/
count(predicate = null) {
if (!predicate) {
return this.length;
}
/** @type {?} */
let count = 0;
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
x => {
if (predicate(x)) {
count++;
}
}));
return count;
}
}
/**
* @template TKey, TValue
*/
class KeyValuePair {
/**
* @param {?} key
* @param {?} value
*/
constructor(key, value) {
this.key = key;
this.value = value;
}
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @template TKey
*/
class StringComparer {
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
compare(x, y) {
/** @type {?} */
var xKey = (/** @type {?} */ ((/** @type {?} */ (x))));
/** @type {?} */
var yKey = (/** @type {?} */ ((/** @type {?} */ (y))));
if (xKey > yKey) {
return 1;
}
else if (xKey == yKey) {
return 0;
}
else {
return -1;
}
}
}
/**
* @template TKey
*/
class NumberComparer {
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
compare(x, y) {
/** @type {?} */
var xKey = (/** @type {?} */ ((/** @type {?} */ (x))));
/** @type {?} */
var yKey = (/** @type {?} */ ((/** @type {?} */ (y))));
if (xKey > yKey) {
return 1;
}
else if (xKey == yKey) {
return 0;
}
else {
return -1;
}
}
}
/**
* @template TKey, TValue
*/
class SortedDictionary {
/**
* @param {?} comparer
* @param {?=} list
*/
constructor(comparer, list = null) {
this.list = new Array();
if (list) {
this.list = list;
}
this.comparer = comparer;
if (this.list && this.list.length > 0) {
if (this.comparer) {
this.list.sort((/**
* @param {?} x
* @param {?} y
* @return {?}
*/
(x, y) => this.comparer.compare(x.key, y.key)));
}
else {
/** @type {?} */
var value = this.list[0].key;
if (typeof value === "string") {
this.comparer = new StringComparer();
this.list = this.list.sort((/**
* @param {?} x
* @param {?} y
* @return {?}
*/
(x, y) => this.comparer.compare(x.key, y.key)));
}
else if (typeof value === "number") {
this.comparer = new NumberComparer();
this.list = this.list.sort((/**
* @param {?} x
* @param {?} y
* @return {?}
*/
(x, y) => this.comparer.compare(x.key, y.key)));
}
}
}
}
/* IList */
/**
* @param {?} key
* @param {?} value
* @return {?}
*/
add(key, value) {
/** @type {?} */
let pair = new KeyValuePair(key, value);
if (this.containsKey(key)) {
throw "Duplicate key. Cannot add.";
}
this.list.push(pair);
if (this.comparer) {
this.list = this.list.sort((/**
* @param {?} x
* @param {?} y
* @return {?}
*/
(x, y) => this.comparer.compare(x.key, y.key)));
}
}
/**
* @param {?} items
* @return {?}
*/
addRange(items) {
items.forEach((/**
* @param {?} x
* @return {?}
*/
x => this.add(x.key, x.value)));
}
/**
* @param {?} index
* @return {?}
*/
removeAt(index) {
this.list.splice(index, 1);
}
/**
* @return {?}
*/
clear() {
this.list = new Array();
}
/**
* @param {?} predicate
* @return {?}
*/
remove(predicate) {
/** @type {?} */
let temp = new Array();
this.list.forEach((/**
* @param {?} element
* @return {?}
*/
element => {
if (!predicate(element)) {
temp.push(element);
}
}));
this.list = temp;
}
/**
* @param {?} key
* @return {?}
*/
containsKey(key) {
return this.any((/**
* @param {?} x
* @return {?}
*/
x => objCompare(x.key, key)));
}
/**
* @param {?} value
* @return {?}
*/
containsValue(value) {
return this.any((/**
* @param {?} x
* @return {?}
*/
x => objCompare(x.value, value)));
}
/**
* @param {?} key
* @return {?}
*/
tryGetValue(key) {
/** @type {?} */
let item = this.singleOrDefault((/**
* @param {?} x
* @return {?}
*/
x => objCompare(x.key, key)));
if (item) {
return item.value;
}
return null;
}
/* IEnumerable */
/**
* @return {?}
*/
asEnumerable() {
return this;
}
/**
* @return {?}
*/
get length() {
return this.list.length;
}
/**
* @param {?} index
* @return {?}
*/
elementAt(index) {
try {
return this.list[index];
}
catch (e) {
return null;
}
}
/**
* @param {?=} predicate
* @return {?}
*/
any(predicate) {
if (!predicate) {
return this.list.length > 0;
}
for (let i = 0; i < this.list.length; i++) {
if (predicate(this.list[i])) {
return true;
}
}
return false;
}
/**
* @param {?=} predicate
* @return {?}
*/
all(predicate) {
if (!predicate) {
return this.list.length > 0;
}
for (let i = 0; i < this.list.length; i++) {
if (!predicate(this.list[i])) {
return false;
}
}
return true;
}
/**
* @param {?=} predicate
* @return {?}
*/
single(predicate = null) {
if (this.list.length <= 0) {
throw ITEM_NOT_FOUND_MSG;
}
if (predicate) {
/** @type {?} */
let item = this.singleOrDefault(predicate);
if (!item) {
throw ITEM_NOT_FOUND_MSG;
}
return item;
}
return this.list[0];
}
/**
* @param {?=} predicate
* @return {?}
*/
first(predicate = null) {
if (this.list.length <= 0) {
throw ITEM_NOT_FOUND_MSG;
}
if (predicate) {
/** @type {?} */
let item = this.firstOrDefault(predicate);
if (!item) {
throw ITEM_NOT_FOUND_MSG;
}
return item;
}
return this.list[0];
}
/**
* @param {?} predicate
* @return {?}
*/
last(predicate) {
if (this.list.length <= 0) {
throw ITEM_NOT_FOUND_MSG;
}
if (predicate) {
/** @type {?} */
let item = this.lastOrDefault(predicate);
if (!item) {
throw ITEM_NOT_FOUND_MSG;
}
return item;
}
return this.list[this.list.length - 1];
}
/**
* @param {?} predicate
* @return {?}
*/
singleOrDefault(predicate) {
/** @type {?} */
let temp = new Array();
this.list.filter((/**
* @param {?} element
* @return {?}
*/
element => {
if (predicate(element)) {
temp.push(element);
}
}));
if (temp.length > 1) {
throw MULTIPLE_INSTANCES_FOUND_MSG;
}
if (temp.length <= 0) {
return null;
}
return temp[0];
}
/**
* @param {?} predicate
* @return {?}
*/
firstOrDefault(predicate) {
for (let i = 0; i < this.length; i++) {
/** @type {?} */
let item = this.list[i];
if (predicate(item)) {
return item;
}
}
return null;
}
/**
* @param {?} predicate
* @return {?}
*/
lastOrDefault(predicate) {
for (let i = this.length; i >= 0; i--) {
/** @type {?} */
let item = this.list[i - 1];
if (predicate(item)) {
return item;
}
}
return null;
}
/**
* @param {?} predicate
* @return {?}
*/
where(predicate) {
/** @type {?} */
let temp = new Dictionary();
this.list.filter((/**
* @param {?} element
* @return {?}
*/
element => {
if (predicate(element)) {
temp.add(element.key, element.value);
}
}));
return temp;
}
/**
* @template TResult
* @param {?} predicate
* @return {?}
*/
select(predicate) {
/** @type {?} */
let temp = new List();
this.forEach((/**
* @param {?} x
* @return {?}
*/
x => temp.add(predicate(x))));
return temp;
}
/**
* @param {?} predicate
* @return {?}
*/
forEach(predicate) {
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
x => predicate(x)));
}
/**
* @return {?}
*/
toArray() {
return this.list.slice();
}
/**
* @template TOuter, TMatch, TResult
* @param {?} outer
* @param {?} conditionInner
* @param {?} conditionOuter
* @param {?} select
* @param {?=} leftJoin
* @return {?}
*/
join(outer, conditionInner, conditionOuter, select, leftJoin = false) {
/** @type {?} */
let resultList = new List();
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
x => {
/** @type {?} */
let outerEntries = outer.toArray().filter((/**
* @param {?} y
* @return {?}
*/
y => conditionInner(x) === conditionOuter(y)));
if (leftJoin && outerEntries && outerEntries.length <= 0) {
resultList.add(select(x, null));
}
else {
outerEntries.forEach((/**
* @param {?} z
* @return {?}
*/
z => resultList.add(select(x, z))));
}
}));
return resultList;
}
/**
* @param {?} predicate
* @return {?}
*/
groupBy(predicate) {
/** @type {?} */
let groups = {};
this.list.forEach((/**
* @param {?} o
* @return {?}
*/
function (o) {
/** @type {?} */
var group = JSON.stringify(predicate(o));
groups[group] = groups[group] || [];
groups[group].push(o);
}));
/** @type {?} */
let g = Object.keys(groups).map((/**
* @param {?} group
* @return {?}
*/
function (group) {
/** @type {?} */
let a = group.substr(1, group.length - 2);
/** @type {?} */
let grp = new Group(new List(a.split(',')).select((/**
* @param {?} x
* @return {?}
*/
x => x.replace(/^(")?(.*?)(")?$/ig, "$2"))).toArray(), groups[group]);
return grp;
}));
return new List(g);
}
/**
* @template TResult
* @param {?} predicate
* @return {?}
*/
selectMany(predicate) {
return this.list.reduce((/**
* @param {?} out
* @param {?} inx
* @return {?}
*/
(out, inx) => {
/** @type {?} */
var items = predicate(inx);
out.addRange(items);
return out;
}), new List(new Array()));
}
/**
* @param {?} comparer
* @return {?}
*/
orderBy(comparer) {
/** @type {?} */
let temp = this.list.sort((/**
* @param {?} x
* @param {?} y
* @return {?}
*/
(x, y) => comparer.compare(x, y)));
return new List(temp);
}
/**
* @param {?} comparer
* @return {?}
*/
distinct(comparer) {
/** @type {?} */
let uniques = new List();
this.forEach((/**
* @param {?} x
* @return {?}
*/
x => {
if (uniques.length > 0) {
if (!uniques.any((/**
* @param {?} y
* @return {?}
*/
y => comparer.equals(x, y)))) {
uniques.add(x);
}
}
else {
uniques.add(x);
}
}));
return uniques;
}
/**
* @param {?} list
* @return {?}
*/
union(list) {
this.addRange(list.toArray());
return this;
}
/**
* @return {?}
*/
reverse() {
return new List(this.list.slice().reverse());
}
/**
* @param {?} no
* @return {?}
*/
skip(no) {
if (no > 0) {
return new Dictionary(this.list.slice(no, this.list.length - 1));
}
return this;
}
/**
* @param {?} no
* @return {?}
*/
take(no) {
if (no > 0) {
return new Dictionary(this.list.slice(0, no));
}
return this;
}
/**
* @param {?} predicate
* @return {?}
*/
sum(predicate) {
/** @type {?} */
let sum = 0;
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
x => sum = sum + predicate(x)));
return sum;
}
/**
* @param {?} predicate
* @return {?}
*/
avg(predicate) {
return this.sum(predicate) / this.length;
}
/**
* @param {?} predicate
* @return {?}
*/
min(predicate) {
/** @type {?} */
let min = 0;
/** @type {?} */
let i = 0;
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
x => {
if (i == 0) {
min = predicate(x);
}
else {
/** @type {?} */
let val = predicate(x);
if (val < min) {
min = val;
}
}
i++;
}));
return min;
}
/**
* @param {?} predicate
* @return {?}
*/
max(predicate) {
/** @type {?} */
let max = 0;
/** @type {?} */
let i = 0;
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
x => {
if (i == 0) {
max = predicate(x);
}
else {
/** @type {?} */
let val = predicate(x);
if (val > max) {
max = val;
}
}
i++;
}));
return max;
}
/**
* @param {?=} predicate
* @return {?}
*/
count(predicate = null) {
if (!predicate) {
return this.length;
}
/** @type {?} */
let count = 0;
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
x => {
if (predicate(x)) {
count++;
}
}));
return count;
}
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @template T
*/
class Queue {
/**
* @param {?=} array
*/
constructor(array = null) {
this.list = new List();
if (array)
this.list = new List(array);
}
/**
* @return {?}
*/
clear() {
this.list.clear();
}
/**
* @param {?} item
* @return {?}
*/
contains(item) {
return this.list.any((/**
* @param {?} x
* @return {?}
*/
x => objCompare(x, item)));
}
/**
* @return {?}
*/
dequeue() {
if (this.list.length > 0) {
/** @type {?} */
var element = this.list.elementAt(0);
this.list.removeAt(0);
return element;
}
return null;
}
/**
* @param {?} item
* @return {?}
*/
enqueue(item) {
this.list.add(item);
}
/**
* @return {?}
*/
peek() {
if (this.list.length > 0) {
/** @type {?} */
var element = this.list.elementAt(0);
return element;
}
return null;
}
/**
* @param {?} predicate
* @return {?}
*/
forEach(predicate) {
this.list.forEach(predicate);
}
/**
* @return {?}
*/
toArray() {
return this.list.toArray();
}
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @template T
*/
class RandomizedQueue {
/**
* @param {?=} array
*/
constructor(array = null) {
this.list = new List();
this.peekIndex = -1;
if (array)
this.list = new List(array);
}
/**
* @return {?}
*/
clear() {
this.list.clear();
}
/**
* @param {?} item
* @return {?}
*/
contains(item) {
return this.list.any((/**
* @param {?} x
* @return {?}
*/
x => objCompare(x, item)));
}
/**
* @return {?}
*/
dequeue() {
if (this.list.length > 0) {
/** @type {?} */
var min = 0;
/** @type {?} */
var max = this.list.length;
/** @type {?} */
var index = this.peekIndex >= 0 ? this.peekIndex : Math.floor(Math.random() * (max - min)) + min;
/** @type {?} */
var element = this.list.elementAt(index);
this.list.removeAt(index);
this.peekIndex = -1;
return element;
}
return null;
}
/**
* @param {?} item
* @return {?}
*/
enqueue(item) {
this.list.add(item);
}
/**
* @return {?}
*/
peek() {
if (this.list.length > 0) {
/** @type {?} */
var min = 0;
/** @type {?} */
var max = this.list.length;
this.peekIndex = Math.floor(Math.random() * (max - min)) + min;
/** @type {?} */
var element = this.list.elementAt(this.peekIndex);
return element;
}
return null;
}
/**
* @param {?} predicate
* @return {?}
*/
forEach(predicate) {
this.list.forEach(predicate);
}
/**
* @return {?}
*/
toArray() {
return this.list.toArray();
}
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @template T
*/
class Stack {
/**
* @param {?=} array
*/
constructor(array = null) {
this.list = new List();
if (array)
this.list = new List(array);
}
/**
* @return {?}
*/
clear() {
this.list.clear();
}
/**
* @param {?} item
* @return {?}
*/
contains(item) {
return this.list.any((/**
* @param {?} x
* @return {?}
*/
x => objCompare(x, item)));
}
/**
* @return {?}
*/
pop() {
if (this.list.length > 0) {
/** @type {?} */
var element = this.list.elementAt(this.list.length - 1);
this.list.removeAt(this.list.length - 1);
return element;
}
return null;
}
/**
* @param {?} item
* @return {?}
*/
push(item) {
this.list.add(item);
}
/**
* @return {?}
*/
peek() {
if (this.list.length > 0) {
/** @type {?} */
var element = this.list.elementAt(this.list.length - 1);
return element;
}
return null;
}
/**
* @param {?} predicate
* @return {?}
*/
forEach(predic