mihaifm / linq

linq.js - LINQ for JavaScript

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ES6 Iterable

xmedeko opened this issue · comments

As a former C# developer I like your library. Just want to know, any plans to use ES6 Iterable instead of custom Enumerable? If you want to support old browsers, would it be possible to have Enumerables to use Iterables under the hood for modern browsers? Also relates to #51

Thanks

Iterable interface for the Enumerable object has been added in this pull request #62, in the sense that you can do for..of on an Enumerable object.

But I suppose you're looking for a way to initialize Enumerable from an Iterable object, as described in #51? I think it can be done. I'll see if I can add the feature, that issue kinda slipped below the radar.

Yes, one solution would be both Iterable and Enumerable to be easily interchangeable. I.e. implement #51 like Enumerable.from(someIterable()).where(...).

But I think, better solution would be to Enumerable be Iterable directly? I.e. change getEnumerator to [Symbol.iterator], moveNext() to next()? It would be more JavaScriptish and maybe more efficient. Also, this way the library would be more easy to adopt for JS guys without C# background. The old methods may stay for BC. The problem may be compatibility with the old browsers, but IMO it would need just define to some Symbol.iterator.

This is now resolved: 540699b. Can you help verifying the fix?

You can now initialize the Enumerable from an iterable object, so the scenario from #51 should now work:

function* words() {
    yield "abc";
    yield "def";
}

console.log(Enumerable.from(words()).toArray()); // ["abc", "def"]

Symbol.iterator was available before, so Enumerable is also an Iterable object where the code requires. Now it works both ways (initialize from Iterable and become an Iterable):

for (var a of Enumerable.from(words())) {
    console.log(a);
}

The good part is that it doesn't use an array internally, so it works with infinte iterables...which is pretty sweet.

function* countToInfinity() {
    var index = 0;
    while (true)
        yield index++;
}

Enumerable.from(countToInfinity()).where(v => v%2 == 0).forEach(x => console.log(x));

This will display all even numbers to infinity.

Yeah, it works perfect, thanks.

Just you can use Utils.hasNativeIteratorSupport() in Enumerable.from:

            // iterable object
            if (Utils.hasNativeIteratorSupport) {
            // orig code: if (typeof Symbol !== 'undefined' && typeof obj[Symbol.iterator] !== 'undefined') {

Cool. Not quite the same, hasNativeIteratorSupport checks the global Symbol object, basically a feature check for the browser/node. The new code checks the object we're initializing from, making sure it's iterable.

I'll publish to npm later today, thanks for helping out with this.

Ah, I see, thanks for explanation.