101 lines
1.9 KiB
JavaScript
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]);
|
|
}
|
|
});
|
|
}
|
|
|