Skip to content

ES5 compatible implementation of LINQ and lazily executed enumerables for typescript.

License

Notifications You must be signed in to change notification settings

rjrudman/TSLinq

Repository files navigation

TSLinq

Version Build Status dependencies Status devDependencies Status Downloads

Details

TSLinq is an ES5 compatible port of .NET's LINQ library which tries to be as true to the original as possible.

TSLinq utilises lazily evaluated Enumerable<T>'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<TKey, TValue>() which supports collision handling, proper identity hashing by default and custom equality comparers.

Install

npm install tslinq

Usage

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 ]

Using ES6 generator functions

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 ]

Using manually created generator functions

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 ]

Using Dictionary<TKey, TValue>

Basic implementation

const objectA: any = {};
const objectB: any = {};

const dictionary = new Dictionary<any, number>();
dictionary.Add(objectA, 5);
dictionary.Add(objectB, 10);

dictionary.Get(objectA); // Returns 5
dictionary.Get(objectB); // Returns 10

Using a custom equality comparer

const objectA: any = {};
const objectB: any = {};

const equalityComparer = {
    Equals: (left: any, right: any) => true,
    GetHashCode: (item: any) => JSON.stringify(item)
};

const dictionary = new Dictionary<any, number>(equalityComparer);
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
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<any, number>(equalityComparer);
dictionary.Add(objectA, 5);
dictionary.Add(objectB, 10); // Does not throw - collisions are properly handled,
                             // And we then check for identity equality

About

ES5 compatible implementation of LINQ and lazily executed enumerables for typescript.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published