prompt.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. var Chainsaw = require('chainsaw');
  2. var Lazy = require('lazy');
  3. module.exports = Prompt;
  4. function Prompt (stream) {
  5. var waiting = [];
  6. var lines = [];
  7. var lazy = Lazy(stream).lines.map(String)
  8. .forEach(function (line) {
  9. if (waiting.length) {
  10. var w = waiting.shift();
  11. w(line);
  12. }
  13. else lines.push(line);
  14. })
  15. ;
  16. var vars = {};
  17. return Chainsaw(function (saw) {
  18. this.getline = function (f) {
  19. var g = function (line) {
  20. saw.nest(f, line, vars);
  21. };
  22. if (lines.length) g(lines.shift());
  23. else waiting.push(g);
  24. };
  25. this.do = function (cb) {
  26. saw.nest(cb, vars);
  27. };
  28. });
  29. }
  30. var util = require('util');
  31. if (__filename === process.argv[1]) {
  32. var stdin = process.openStdin();
  33. Prompt(stdin)
  34. .do(function () {
  35. util.print('x = ');
  36. })
  37. .getline(function (line, vars) {
  38. vars.x = parseInt(line, 10);
  39. })
  40. .do(function () {
  41. util.print('y = ');
  42. })
  43. .getline(function (line, vars) {
  44. vars.y = parseInt(line, 10);
  45. })
  46. .do(function (vars) {
  47. if (vars.x + vars.y < 10) {
  48. util.print('z = ');
  49. this.getline(function (line) {
  50. vars.z = parseInt(line, 10);
  51. })
  52. }
  53. else {
  54. vars.z = 0;
  55. }
  56. })
  57. .do(function (vars) {
  58. console.log('x + y + z = ' + (vars.x + vars.y + vars.z));
  59. process.exit();
  60. })
  61. ;
  62. }