How to extend the generator class?

I tried to filter out the generator and expected that such universal functionality should be defined anywhere in JavaScript, because it is defined for arrays, but I cannot find it. So I tried to determine this. But I can not expand the built-in generators.

I have an example generator

function make_nums ()
{
  let nums = {};
  nums[Symbol.iterator] = function* () {
    yield 1;
    yield 2;
    yield 3;
  };
  return nums;
}

generating some numbers.

[...make_nums()] // => Array [ 1, 2, 3 ]

If I create an array, I can filter the array using the function filterfor arrays.

[...make_nums()].filter(n => n > 1) // => Array [ 2, 3 ]

But I do not want to build an array. Instead, I want to take an old generator and build a new filter generator. For this, I wrote the following function.

function filtered (generator, filter)
{
  let g = {};
  g[Symbol.iterator] = function* () {
    for (let value of generator)
      if (filter(value))
        yield value;
  };
  return g;
}

which can be used to accomplish what I want.

[...filtered (make_nums(), n => n > 1)] // => Array [ 2, 3 ]

, , filter Array. , , .

MDN , Generator.prototype , , , . - Generator.prototype,

ReferenceError:

Generator?

+4
2

, , ,

const genproto = Object.getPrototypeOf(function*(){});

filter():

Object.defineProperty(genproto, "filter", {
  value: function*(predicate) {
    for (let value of this())
      if (predicate(value)) yield value;
  }
});

:

console.log([... function*() {
    for (let i = 0; i < 10; i++) yield i;
  }.filter(value => value % 2 === 0)
]);

[0, 2, 4, 6, 8].

: , -. , , .filter() .

+2

, Generator Iterable. , Generator, Iterable. , Iterable, , JavaScript , , .

, .

class Iterable {
  constructor (generator) {
    this[Symbol.iterator] = generator;
  }
}

Iterable.prototype.filter = function (predicate) {
  let iterable = this;
  return new Iterable (function* () {
    for (let value of iterable)
      if (predicate (value))
        yield value;
  });
};

Iterables

make_nums = new Iterable(function* () { yield 1; yield 2; yield 3; });

[...make_nums] // => Array [ 1, 2, 3 ]

[...make_nums.filter(n => n > 1)] // => Array [ 2, 3 ]
+2

Source: https://habr.com/ru/post/1689967/


All Articles