From 704eb8954f6e4abc6336de61d981fbb347efc4b2 Mon Sep 17 00:00:00 2001 From: Eugene Sadovoi Date: Thu, 21 Jul 2016 15:29:08 +0000 Subject: [PATCH] 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);