pythonic
имитирует поведение Python range
наилучшим образом, используя генераторы JS (yield
), поддерживающие варианты использования range(stop)
и range(start, stop, step)
. Кроме того, функция pythonic
range
возвращает пользовательский встроенный объект Generator
, который поддерживает map
и filter
, так что можно создать такие однострочные строки, как:
import {range} from 'pythonic';
// ...
const results = range(5).map(wouldBeInvokedFiveTimes);
// `results` is now an array containing elements from
// 5 calls to wouldBeInvokedFiveTimes
Установка с использованием npm
:
npm install --save pythonic
Вот код в pythonic
для диапазона:
function range(...args) {
if (args.length < 2) {
return new Generator(rangeGeneratorWithStop(...args));
}
return new Generator(rangeGeneratorWithSartAndStopAndStep(...args));
}
const rangeGeneratorWithStop = stop => function * () {
for (let i = 0; i < stop; i++) {
yield i;
}
};
const rangeGeneratorWithSartAndStopAndStep = (start, stop, step = 1) => function * () {
for (let i = start; i < stop; i += step) {
yield i;
}
};
function range(...args) {
if (args.length < 2) {
return new Generator(rangeGeneratorWithStop(...args));
}
return new Generator(rangeGeneratorWithSartAndStopAndStep(...args));
}
class Generator {
constructor(generatorFn) {
this[Symbol.iterator] = generatorFn;
}
map(callbackFn) {
const result = [];
for (const element of this) {
result.push(callbackFn(element));
}
return result;
}
filter(callbackFn) {
const result = [];
for (const element of this) {
if (callbackFn(element)) {
result.push(element);
}
}
return result;
}
toArray() {
return Array.from(this);
}
}
Раскрытие информации Я автор и сопровождающий Pythonic