Оператор слайса для итератора - PullRequest
0 голосов
/ 10 апреля 2019

Я ищу способ нарезать итератор, но не могу найти правильный способ сделать это, используя существующий стандартный метод / функцию.

Вот что я хочу сделать:

// Suppose I have this generator:
function* range(n){
  for (let i = 0; i < n; i += 1){
    yield i;
  }
}

// This is obviously not desirable as we create a large array:
console.log(Array.from(range(100)).slice(2, 5));
// -> [ 2, 3, 4 ]

// What I'm looking for is an existing function that would be equivalent to this: 
function* islice(iterable, start, end){
  if (!end){
    end = start;
    start = 0;
  }
  dropfirsts(iterable, start);
  yield* firsts(iterable, end-start);
}

function dropfirsts(iterable, n){
  for (let i of range(n)){ 
    if (iterable.next().done) return;
  }
}

function* firsts(iterable, n){
  for (let j of range(n)){
    const item = iterable.next();
    if (item.done) return;
    yield item.value;
  }
}

console.log(Array.from(islice(range(10), 2, 5)));
// -> [ 2, 3, 4 ]

Обратите внимание, что я не ищу полной реализации функции islice, вместо этого я ищу эквивалент этой функции в стандартной библиотеке.

...