jspipe
Version:
JS/Pipe - coordinating asynchronous code without callbacks or chained functions
123 lines (104 loc) • 4.75 kB
JavaScript
function main(Pipe, job, timeout, lazyseq, sentinel) {
job(wrapGenerator.mark(function() {
var sorted, log, numbers, randomNumber, sortResult, sortedNumbers, sortTime, printLogMessages, receiveNumbers, sortNumbers;
return wrapGenerator(function($ctx) {
while (1) switch ($ctx.next) {
case 0:
sortNumbers = wrapGenerator.mark(function sortNumbers() {
var nums, start, end;
return wrapGenerator(function sortNumbers$($ctx) {
while (1) switch ($ctx.next) {
case 0:
$ctx.next = 2;
return numbers.get();
case 2:
nums = $ctx.sent;
start = Date.now();
nums.sort();
end = Date.now();
sorted.send({ numbers: nums,
time: end - start });
case 7:
case "end":
return $ctx.stop();
}
}, this);
});
receiveNumbers = wrapGenerator.mark(function receiveNumbers(pipe) {
var all, nums, start, n;
return wrapGenerator(function receiveNumbers$($ctx) {
while (1) switch ($ctx.next) {
case 0:
all = false, nums = [], start = Date.now();
case 1:
if (!!all) {
$ctx.next = 8;
break;
}
$ctx.next = 4;
return pipe.get();
case 4:
n = $ctx.sent;
if (n === sentinel) {
all = true;
} else {
nums.push(n);
}
$ctx.next = 1;
break;
case 8:
log.send('took ' + (Date.now() - start) + 'ms to receive ' + nums.length + ' random numbers');
$ctx.next = 11;
return numbers.put(nums);
case 11:
case "end":
return $ctx.stop();
}
}, this);
});
printLogMessages = wrapGenerator.mark(function printLogMessages() {
var text, p, logDiv;
return wrapGenerator(function printLogMessages$($ctx) {
while (1) switch ($ctx.next) {
case 0:
logDiv = document.getElementById('log');
case 1:
$ctx.next = 3;
return log.get();
case 3:
if (!(text = $ctx.sent)) {
$ctx.next = 9;
break;
}
p = document.createElement('p');
p.innerHTML = text;
logDiv.appendChild(p);
$ctx.next = 1;
break;
case 9:
case "end":
return $ctx.stop();
}
}, this);
});
sorted = new Pipe(), log = new Pipe(), numbers = new Pipe(), randomNumber = function(index) { return Math.random(); };
job(printLogMessages);
job(receiveNumbers, [lazyseq(100000, randomNumber)]);
job(sortNumbers);
$ctx.next = 9;
return sorted.get();
case 9:
sortResult = $ctx.sent;
sortedNumbers = sortResult.numbers;
sortTime = sortResult.time;
log.send('sort complete. took ' + sortTime + 'ms for ' + sortedNumbers.length + ' items.');
log.send('first: ' + sortedNumbers[0]);
log.send('last: ' + sortedNumbers[sortedNumbers.length-1]);
case 15:
case "end":
return $ctx.stop();
}
}, this);
}));
};
main(JSPipe.Pipe, JSPipe.job, JSPipe.timeout, JSPipe.lazyseq, JSPipe.sentinel);