From 5b2236f74c6448baa61ecfc231adaf589f73325b Mon Sep 17 00:00:00 2001 From: Eugene Sadovoi Date: Wed, 20 Jul 2016 20:05:13 -0400 Subject: [PATCH 1/8] Update linq.ts --- lib/linq.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linq.ts b/lib/linq.ts index 031c6d4..245f354 100644 --- a/lib/linq.ts +++ b/lib/linq.ts @@ -678,7 +678,7 @@ class EnumerableImpl implements Enumerable, Iterable, IEnumerable { public Take(take: number): Enumerable { - this._target = Generator.TakeWhile(this._target, (a, n) => take > n); + this._target = Generator.TakeWhile(this._target, (a: T, n: number) => take > n); return this; } From e046b78cd1ff89fd9c030a878ff1b374f3d033ae Mon Sep 17 00:00:00 2001 From: Eugene Sadovoi Date: Wed, 20 Jul 2016 20:17:45 -0400 Subject: [PATCH 2/8] 2.2.12 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 41ce6df..ae35523 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "linq-es2015", - "version": "2.2.11", + "version": "2.2.12", "description": "Complete implementation of LINQ (ECMAScript 2015 Language Specification)", "main": "lib/linq.js", "typings": "lib/linq.d.ts", From 704eb8954f6e4abc6336de61d981fbb347efc4b2 Mon Sep 17 00:00:00 2001 From: Eugene Sadovoi Date: Thu, 21 Jul 2016 15:29:08 +0000 Subject: [PATCH 3/8] Fixes #15 --- lib/enumerable.ts | 8 ++++ lib/generators.ts | 46 +++++++++++++++++++++++ lib/linq.ts | 7 ++++ test/data.ts | 22 +++++++++++ test/deferred.ts | 95 +++++++++++++++++++++++++++++++++++++++++++---- 5 files changed, 170 insertions(+), 8 deletions(-) diff --git a/lib/enumerable.ts b/lib/enumerable.ts index 4f08c6f..8916664 100644 --- a/lib/enumerable.ts +++ b/lib/enumerable.ts @@ -303,6 +303,14 @@ export interface Enumerable extends Iterable, IEnumerable { * var e = asEnumerable([0, 1, 2, 3, 4, 5, 6, 7]).Min() */ Min(transform?: (x: T) => number): number; + + /** + * Filters the elements of an IEnumerable based on a specified type. + * @param Object to check InstanceOf against. + * @example + * var e = asEnumerable([0, 1, 2, 3, 4, 5, 6, 7]).OfType(myObject) + */ + OfType(type: any): Enumerable; /** * Sorts the elements of a sequence in ascending order by using a specified diff --git a/lib/generators.ts b/lib/generators.ts index ff2c1a4..02bdece 100644 --- a/lib/generators.ts +++ b/lib/generators.ts @@ -13,6 +13,9 @@ // under the License. +import * as Constant from "./utilities"; + + export function* Forward(target: Array) { yield* target; } @@ -65,6 +68,49 @@ export function* DistinctFast(target: Iterable) { } +export function* OfType(target: Iterable, obj: any) { + if (Number === obj) { + for (let value of target) { + if (Constant.CONST_NUMBER == typeof(value)) { + yield value; + } else if (value instanceof obj) { + yield value; + } + } + } else if (Boolean === obj) { + for (let value of target) { + if (Constant.CONST_BOOLEAN == typeof(value)) { + yield value; + } else if (value instanceof obj) { + yield value; + } + } + } else if (String === obj) { + for (let value of target) { + if (Constant.CONST_STRING == typeof(value)) { + yield value; + } else if (value instanceof obj) { + yield value; + } + } + } else if (Symbol === obj) { + for (let value of target) { + if (Constant.CONST_SYMBOL == typeof(value)) { + yield value; + } else if (value instanceof obj) { + yield value; + } + } + } else { + for (let value of target) { + if (value instanceof obj) { + yield value; + } + } + } +} + + export function* Where(target: Iterable, predicate: (x: T, i: number) => Boolean) { let index = 0; for (let value of target) { diff --git a/lib/linq.ts b/lib/linq.ts index 245f354..46bb28f 100644 --- a/lib/linq.ts +++ b/lib/linq.ts @@ -132,6 +132,7 @@ class EnumerableImpl implements Enumerable, Iterable, IEnumerable { (this as any)['groupJoin'] = this.GroupJoin; (this as any)['intersect'] = this.Intersect; (this as any)['join'] = this.Join; + (this as any)['ofType'] = this.OfType; (this as any)['orderBy'] = this.OrderBy; (this as any)['orderByDescend'] = this.OrderByDescending; (this as any)['thenBy'] = this.ThenBy; @@ -571,6 +572,12 @@ class EnumerableImpl implements Enumerable, Iterable, IEnumerable { return this as any as Enumerable; } + + public OfType(obj: any): Enumerable { + this._target = Generator.OfType(this._target, obj); + return this; + } + public OrderBy(keySelect: (x: T) => K = Constant.selfFn, equal: (a: K, b: K) => number = (a, b) => a - b): diff --git a/test/data.ts b/test/data.ts index 4142707..05ac886 100644 --- a/test/data.ts +++ b/test/data.ts @@ -57,4 +57,26 @@ var daisy = { Name: "Daisy", Age: 4, Owner: magnus }; export var people = [magnus, terry, charlotte]; export var pets = [barley, boots, whiskers, daisy]; +export var mix = [ + 0, + new Number(1), + "This is a simple string", + new String(), + new String("String created with constructor"), + new Date(), + true, + Symbol.iterator, + 2, + false, + { Name: "asd"}, + simpleArray, + un1, + new Boolean(true), + pets, + new Boolean(false), + 3, + function(){} + ]; + + /** Copyright (c) ENikS. All rights reserved. */ diff --git a/test/deferred.ts b/test/deferred.ts index ebac704..1281200 100644 --- a/test/deferred.ts +++ b/test/deferred.ts @@ -12,7 +12,7 @@ // License for the specific language governing permissions and limitations // under the License. -import {simpleArray, oddArray, jsn, un1, un2, people, pets} from "./data"; +import {simpleArray, oddArray, jsn, un1, un2, people, pets, mix} from "./data"; import {assert} from "chai"; import Linq from "../lib/linq"; @@ -239,24 +239,103 @@ describe('Deferred Execution -', function () { - // Union + // Except - it('Union()', function () { - var iterable = Linq([0, 1, 2, 3, 4, 5, 6, 7]).Union([5, 6, 7, 8, 9]); + it('Except()', function () { + var iterable = Linq(simpleArray).Except([0, 2, 4, 6, 11]); var iterator = iterable[Symbol.iterator]() - assert.equal(0, iterator.next().value); assert.equal(1, iterator.next().value); - assert.equal(2, iterator.next().value); assert.equal(3, iterator.next().value); - assert.equal(4, iterator.next().value); assert.equal(5, iterator.next().value); - assert.equal(6, iterator.next().value); assert.equal(7, iterator.next().value); assert.equal(8, iterator.next().value); assert.equal(9, iterator.next().value); + assert.equal(10, iterator.next().value); + assert.isTrue(iterator.next().done); + }); + + + + // OfType + + it('OfType() - Number', function () { + + var iterable = Linq(mix).OfType(Number); + var iterator = iterable[Symbol.iterator](); + assert.equal(iterator.next().value, 0); + assert.equal(iterator.next().value, 1); + assert.equal(iterator.next().value, 2); + assert.equal(iterator.next().value, 3); + assert.isTrue(iterator.next().done); + }); + + it('OfType() - Boolean', function () { + + var iterable = Linq(mix).OfType(Boolean); + var iterator = iterable[Symbol.iterator](); + assert.equal(iterator.next().value, true); + assert.equal(iterator.next().value, false); + assert.equal(iterator.next().value, true); + assert.equal(iterator.next().value, false); + assert.isTrue(iterator.next().done); + }); + + it('OfType() - String', function () { + + var iterable = Linq(mix).OfType(String); + var iterator = iterable[Symbol.iterator](); + assert.equal(iterator.next().value, mix[2]); + assert.equal(iterator.next().value, mix[3]); + assert.equal(iterator.next().value, mix[4]); assert.isTrue(iterator.next().done); }); + it('OfType() - Date', function () { + + var iterable = Linq(mix).OfType(Date); + var iterator = iterable[Symbol.iterator](); + assert.equal(iterator.next().value, mix[5]); + assert.isTrue(iterator.next().done); + }); + + it('OfType() - Symbol', function () { + + var iterable = Linq(mix).OfType(Symbol); + var iterator = iterable[Symbol.iterator](); + assert.equal(iterator.next().value, mix[7]); + assert.isTrue(iterator.next().done); + }); + + it('OfType() - Function', function () { + + var iterable = Linq(mix).OfType(Function); + var iterator = iterable[Symbol.iterator](); + assert.equal(iterator.next().value, mix[17]); + assert.isTrue(iterator.next().done); + }); + + it('OfType() - Object', function () { + + var iterable = Linq(mix).OfType(Object); + var iterator = iterable[Symbol.iterator](); + assert.equal(iterator.next().value, 1); + assert.equal(iterator.next().value, mix[3]); + assert.equal(iterator.next().value, mix[4]); + assert.equal(iterator.next().value, mix[5]); + assert.equal(iterator.next().value, mix[10]); + assert.equal(iterator.next().value, mix[11]); + assert.equal(iterator.next().value, mix[12]); + assert.equal(iterator.next().value, mix[13]); + assert.equal(iterator.next().value, mix[14]); + assert.equal(iterator.next().value, mix[15]); + assert.equal(iterator.next().value, mix[17]); + assert.isTrue(iterator.next().done); + }); + + + + + // Union it('Union() - Keyed', function () { var iterable = Linq(un1).Union(un2, (o) => o.id); From 372ba4cb34858193c87f865183ffa2f111e6fbfb Mon Sep 17 00:00:00 2001 From: Eugene Sadovoi Date: Thu, 21 Jul 2016 15:29:37 +0000 Subject: [PATCH 4/8] 2.3.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ae35523..7d1ea8f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "linq-es2015", - "version": "2.2.12", + "version": "2.3.0", "description": "Complete implementation of LINQ (ECMAScript 2015 Language Specification)", "main": "lib/linq.js", "typings": "lib/linq.d.ts", From 2f037d62d0e566938fafcc9968514f8a5ea3d476 Mon Sep 17 00:00:00 2001 From: Eugene Sadovoi Date: Thu, 21 Jul 2016 17:02:43 +0000 Subject: [PATCH 5/8] Optimizing space --- lib/generators.ts | 33 +++++---------------------------- lib/linq.ts | 24 +++++++++++++++++++++++- 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/lib/generators.ts b/lib/generators.ts index 02bdece..8043dff 100644 --- a/lib/generators.ts +++ b/lib/generators.ts @@ -68,34 +68,10 @@ export function* DistinctFast(target: Iterable) { } -export function* OfType(target: Iterable, obj: any) { - if (Number === obj) { +export function* OfType(target: Iterable, obj: any, typeName: string) { + if (typeName){ for (let value of target) { - if (Constant.CONST_NUMBER == typeof(value)) { - yield value; - } else if (value instanceof obj) { - yield value; - } - } - } else if (Boolean === obj) { - for (let value of target) { - if (Constant.CONST_BOOLEAN == typeof(value)) { - yield value; - } else if (value instanceof obj) { - yield value; - } - } - } else if (String === obj) { - for (let value of target) { - if (Constant.CONST_STRING == typeof(value)) { - yield value; - } else if (value instanceof obj) { - yield value; - } - } - } else if (Symbol === obj) { - for (let value of target) { - if (Constant.CONST_SYMBOL == typeof(value)) { + if (typeName == typeof(value)) { yield value; } else if (value instanceof obj) { yield value; @@ -111,7 +87,8 @@ export function* OfType(target: Iterable, obj: any) { } -export function* Where(target: Iterable, predicate: (x: T, i: number) => Boolean) { +export function* Where(target: Iterable, + predicate: (x: T, i: number) => Boolean) { let index = 0; for (let value of target) { if (!predicate(value, index++)) continue; diff --git a/lib/linq.ts b/lib/linq.ts index 46bb28f..c42b0cf 100644 --- a/lib/linq.ts +++ b/lib/linq.ts @@ -574,7 +574,29 @@ class EnumerableImpl implements Enumerable, Iterable, IEnumerable { public OfType(obj: any): Enumerable { - this._target = Generator.OfType(this._target, obj); + let typeName: string; + switch (obj) { + case Number: + typeName = Constant.CONST_NUMBER; + break; + + case Boolean: + typeName = Constant.CONST_BOOLEAN; + break; + + case String: + typeName = Constant.CONST_STRING; + break; + + case Symbol: + typeName = Constant.CONST_SYMBOL; + break; + + default: + typeName = undefined; + } + + this._target = Generator.OfType(this._target, obj, typeName); return this; } From f2cea506137f94d919d6d4438560150f3d2f42b1 Mon Sep 17 00:00:00 2001 From: Eugene Sadovoi Date: Thu, 21 Jul 2016 17:02:55 +0000 Subject: [PATCH 6/8] 2.3.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7d1ea8f..5c496fa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "linq-es2015", - "version": "2.3.0", + "version": "2.3.1", "description": "Complete implementation of LINQ (ECMAScript 2015 Language Specification)", "main": "lib/linq.js", "typings": "lib/linq.d.ts", From 63c81a380d6b989176578c13705f3edf2ecf5ea2 Mon Sep 17 00:00:00 2001 From: Eugene Sadovoi Date: Thu, 21 Jul 2016 17:05:27 +0000 Subject: [PATCH 7/8] Optimizing space --- lib/generators.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/generators.ts b/lib/generators.ts index 8043dff..8035123 100644 --- a/lib/generators.ts +++ b/lib/generators.ts @@ -13,8 +13,6 @@ // under the License. -import * as Constant from "./utilities"; - export function* Forward(target: Array) { yield* target; From e9297849a4678d32c4d0b5756b3b4a80b3fd23c8 Mon Sep 17 00:00:00 2001 From: Eugene Sadovoi Date: Thu, 21 Jul 2016 13:30:44 -0400 Subject: [PATCH 8/8] Update deferred.ts --- test/deferred.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/deferred.ts b/test/deferred.ts index 1281200..d9b1a0b 100644 --- a/test/deferred.ts +++ b/test/deferred.ts @@ -337,6 +337,22 @@ describe('Deferred Execution -', function () { // Union + it('Union()', function () { + var iterable = Linq([0, 1, 2, 3, 4, 5, 6, 7]).Union([5, 6, 7, 8, 9]); + var iterator = iterable[Symbol.iterator]() + assert.equal(0, iterator.next().value); + assert.equal(1, iterator.next().value); + assert.equal(2, iterator.next().value); + assert.equal(3, iterator.next().value); + assert.equal(4, iterator.next().value); + assert.equal(5, iterator.next().value); + assert.equal(6, iterator.next().value); + assert.equal(7, iterator.next().value); + assert.equal(8, iterator.next().value); + assert.equal(9, iterator.next().value); + assert.isTrue(iterator.next().done); + }); + it('Union() - Keyed', function () { var iterable = Linq(un1).Union(un2, (o) => o.id); var iterator = iterable[Symbol.iterator]()