iterama
Version:
Composable functional (async) iterable helpers
57 lines (41 loc) • 1.11 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.takeAsync = void 0;
var _circularr = _interopRequireDefault(require("circularr"));
var _iterate = require("./iterate");
const takeFirstAsync = n => iterable => ({
async *[Symbol.asyncIterator]() {
if (n <= 0) {
return;
}
let i = 0;
for await (const value of iterable) {
yield value;
if (++i >= n) {
break;
}
}
}
});
const takeLastAsync = n => iterable => ({
async *[Symbol.asyncIterator]() {
const last = new _circularr.default(n);
let numValues = 0;
for await (const value of iterable) {
last.shift(value);
numValues++;
}
const iterator = (0, _iterate.iterate)(last);
const offset = last.length - numValues;
for (let i = 0; i < offset; i++) {
iterator.next();
}
for (const value of iterator) {
yield value;
}
}
});
const takeAsync = n => n < 0 ? takeLastAsync(-n) : takeFirstAsync(n);
exports.takeAsync = takeAsync;