From fbed82b896dce61eba467fd63e9c27f70240aa7e Mon Sep 17 00:00:00 2001 From: Lviat Yi Date: Sun, 19 May 2024 01:59:35 +0800 Subject: [PATCH 1/5] revert: revert iterator.js:14-22 --- test/iterator.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/test/iterator.js b/test/iterator.js index 60c04e1..f9c2b3f 100644 --- a/test/iterator.js +++ b/test/iterator.js @@ -11,16 +11,13 @@ test("for..of", function () { deepEqual(actual, [1, 2, 3]); }); -test("Symbol.iterator", function () { - let actual = [1, 2, 3, 4]; +test("Symbol.iterator", function () +{ + let actual = [1,2,3,4]; let expected = Array.from(Enumerable.from(actual)); deepEqual(actual, expected); - let actual2 = actual.map(function (x) { - return x * 2 - }); // [2,4,6,8]; - expected = Enumerable.from(actual).select(function (x) { - return x * 2 - }); + let actual2 = actual.map(function(x) { return x * 2 }); // [2,4,6,8]; + expected = Enumerable.from(actual).select(function(x) { return x * 2 }); deepEqual(actual2, Array.from(expected)); }); From 7b927661c15b07ab2fa350b59506c116548e22d5 Mon Sep 17 00:00:00 2001 From: Lviat Yi Date: Sun, 19 May 2024 10:03:48 +0800 Subject: [PATCH 2/5] feat: add test for iterable object rename origin test to "from iterator object" --- test/iterator.js | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/test/iterator.js b/test/iterator.js index f9c2b3f..3c52e44 100644 --- a/test/iterator.js +++ b/test/iterator.js @@ -36,7 +36,27 @@ test("from Iterable", function () { deepEqual(actual, ["abc", "def"]); }); -test("from Symbol.iterator", function () { +test("from Iterable object", function () { + const map = new Map(); + + map.set(1, 2); + map.set(2, 4); + + deepEqual(Enumerable + .from(map) + .select(item => ({key: item[0], value: item[1]})) + .select(item=>item.key) + .toArray(), + [1, 2]); + + let actual = []; + for (var a of map) { + actual.push(a[0]); + } + deepEqual(actual, [1, 2]); +}); + +test("from Iterator object", function () { const n = { // This is just a simple replacement for the data structure that needs to be traversed. // It may actually be a tree or other data structure implemented by a custom traversal. From c405da430358102abb01492b4fb8861029777563 Mon Sep 17 00:00:00 2001 From: Lviat Yi Date: Sun, 19 May 2024 10:05:59 +0800 Subject: [PATCH 3/5] feat: add support for iterable object --- linq.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/linq.js b/linq.js index 4a16065..a034fc7 100644 --- a/linq.js +++ b/linq.js @@ -323,6 +323,20 @@ Enumerable.from = function (obj) { } // iterable object + if (typeof Symbol !== 'undefined' && typeof obj[Symbol.iterator] !== 'undefined') { + let iterator; + return new Enumerable(function () { + return new IEnumerator( + function () { iterator = obj[Symbol.iterator]()}, + function () { + var next = iterator.next(); + return (next.done ? false : (this.yieldReturn(next.value))); + }, + Functions.Blank); + }); + } + + // iterator object if (typeof Symbol !== 'undefined' && typeof obj.next !== 'undefined') { return new Enumerable(function () { return new IEnumerator( From 976e193a8b2f3d0dbc5a3ea1932b684810a56800 Mon Sep 17 00:00:00 2001 From: Lviat Yi Date: Sun, 19 May 2024 10:06:55 +0800 Subject: [PATCH 4/5] feat: update .d.ts for Iterable --- linq.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/linq.d.ts b/linq.d.ts index 9fff437..6500783 100644 --- a/linq.d.ts +++ b/linq.d.ts @@ -20,6 +20,7 @@ declare namespace Enumerable { export function from(obj: string): IEnumerable; export function from(obj: T[]): IEnumerable; export function from(obj: Iterator): IEnumerable; + export function from(obj: Iterable): IEnumerable; export function from(obj: { length: number;[x: number]: T; }): IEnumerable; export function from(obj: Record): IEnumerable<{ key: K; value: T }>; export function make(element: T): IEnumerable; From e656166722ce19c60f7b5beb628d08451957d5d1 Mon Sep 17 00:00:00 2001 From: Lviat Yi Date: Sun, 19 May 2024 10:08:32 +0800 Subject: [PATCH 5/5] feat: rename tester name to from Generator for a clearer meaning --- test/iterator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/iterator.js b/test/iterator.js index 3c52e44..214be9f 100644 --- a/test/iterator.js +++ b/test/iterator.js @@ -21,7 +21,7 @@ test("Symbol.iterator", function () deepEqual(actual2, Array.from(expected)); }); -test("from Iterable", function () { +test("from Generator", function () { function* words() { yield "abc"; yield "def";