ES5 compatable implementation of LINQ and lazily executed enumerables for typescript.
npm install tslinq




TSLinq utilises lazily evaluated Enumerable's, rather than eager evaluation found in other libraries. In addition, it supports ES6 generators allowing for powerful data manipulation.
Ships with a fully functional implementation of Dictionary which supports collision handling, proper identity hashing by default and custom equality comparers.
```
npm install tslinq
`typescript
import { Enumerable } from 'tslinq'
let things = Enumerable.Of([1, 2, 3])
.Select(a => a + 2)
.Where(a => a < 5)
.Distinct()
.ToArray();
console.log(things);
// Outputs [ 3, 4 ]
`
`typescript
function* GetNumbers() {
let i = 0;
while(true) {
yield i++;
}
}
let FirstTenNumbers = Enumerable.Of(GetNumbers)
.Take(10)
.ToArray();
console.log(FirstTenNumbers);
// Outputs [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
`
`typescript
let i = 0;
const generator = () => {
return {
next: function () {
if (i >= 3) {
throw new Error('Generator should not be invoked when the enumerable hasn\'t been materialized');
}
return { done: false, value: i++ };
}
};
};
const result =
Enumerable.Of(generator)
.Take(3)
.ToArray();
console.log(result);
// Outputs [ 0, 1, 2 ]
`
#### Basic implementation
`typescript
const objectA: any = {};
const objectB: any = {};
const dictionary = new Dictionary
dictionary.Add(objectA, 5);
dictionary.Add(objectB, 10);
dictionary.Get(objectA); // Returns 5
dictionary.Get(objectB); // Returns 10
`
#### Using a custom equality comparer
`typescript
const objectA: any = {};
const objectB: any = {};
const equalityComparer = {
Equals: (left: any, right: any) => true,
GetHashCode: (item: any) => JSON.stringify(item)
};
const dictionary = new Dictionary
dictionary.Add(objectA, 5);
dictionary.Add(objectB, 10); // Throws an exception, key already exists, as the JSON strings match,
// and we always return true when comparing
`
`typescript
const objectA: any = {};
const objectB: any = {};
const equalityComparer = {
Equals: (left: any, right: any) => left === right,
GetHashCode: (item: any) => JSON.stringify(item)
};
const dictionary = new Dictionary
dictionary.Add(objectA, 5);
dictionary.Add(objectB, 10); // Does not throw - collisions are properly handled,
// And we then check for identity equality
``