polardbxengine/router/tests/component/data/local_modules/itertools.js

101 lines
1.9 KiB
JavaScript

var log = new Duktape.Logger()
exports.take = function (times, iter) {
return new Duktape.Thread(function() {
var yield = Duktape.Thread.yield;
var resume = Duktape.Thread.resume;
var rounds = 0;
while (rounds++ < times) {
var v = resume(iter);
yield(v);
}
});
}
exports.repeat = function (obj) {
return new Duktape.Thread(function() {
var yield = Duktape.Thread.yield;
while (true) yield(obj);
});
}
// collect a iterable into a array
exports.collect = function (iter) {
var resume = Duktape.Thread.resume;
var ar = [];
while(true) {
v = resume(iter);
if (v === undefined) break;
ar.push(v);
}
return ar;
}
exports.chain = function (iters) {
return new Duktape.Thread(function() {
var yield = Duktape.Thread.yield;
var resume = Duktape.Thread.resume;
log.info(".chain()")
// we can't use for-in here, as it doesn't operate on ndx-order
// we can't use .forEach() is duktape doesn't allow yield in it
for (var ndx = 0; ndx < iters.length; ndx++) {
var iter = iters[ndx];
while (true) {
var elem = resume(iter);
if (elem === undefined) break;
yield(elem);
}
}
});
}
exports.cycle = function (iter) {
return new Duktape.Thread(function() {
var yield = Duktape.Thread.yield;
var resume = Duktape.Thread.resume;
var buffer = [];
while (true) {
var elem = resume(iter);
if (elem === undefined) break;
yield(elem);
buffer.push(elem);
}
if (buffer.length === 0) return;
var ndx = 0;
while (true) {
if (ndx >= buffer.length) ndx = 0;
log.info(".cycle()")
yield(buffer[ndx++]);
}
});
}
// return an iterable for an array
exports.iter_arr = function (arr) {
return new Duktape.Thread(function() {
var yield = Duktape.Thread.yield;
for (var ndx = 0; ndx < arr.length; ndx++) {
yield(arr[ndx]);
}
});
}