fork download
  1. 'use strict'
  2.  
  3. var stream = require('stream')
  4. var stdin = process.stdin
  5. var stdout = process.stdout
  6.  
  7.  
  8. // 本実装
  9. stream.prototype.addLineSwitch = function (outputs, controller) {
  10. var input = this
  11. var output_trash = new stream.Writable()
  12. output_trash._write = function () {}
  13. var rl = require('readline').createInterface(input, output_trash)
  14. rl.on('line', function (line) {
  15. var output = outputs[controller(line, outputs)]
  16. if (output) output.write(new Buffer(line + '\n'))
  17. })
  18. }
  19.  
  20.  
  21. // 複数のストリーム出力を1つのストリーム(標準出力)でテスト出来るようにするためのもの
  22. stream.prototype.markingWrap = function (id) {
  23. var neo_stream = new stream.Writable()
  24. var raw_stream = this
  25. neo_stream._write = function (raw_chunk, encoding, callback) {
  26. var neo_chunk = new Buffer(id + ': ' + raw_chunk)
  27. raw_stream.write(neo_chunk, encoding, callback)
  28. }
  29. return neo_stream
  30. }
  31.  
  32.  
  33. // 標準出力をラップしてそれぞれ新しいストリームを作る
  34. var output_num = stdout.markingWrap(' number-stream')
  35. var output_alp = stdout.markingWrap(' alphabet-stream')
  36. var output_def = stdout.markingWrap(' default-stream')
  37.  
  38.  
  39. // 出力先とコントローラーの設定
  40. var outputs = {num: output_num, alp: output_alp, def: output_def}
  41. var controller = function (line, outputs) {
  42. if (line.match(/^\d+$/)) return 'num'
  43. if (line.match(/^\w+$/)) return 'alp'
  44. return 'def'
  45. }
  46. // controller内で、outputsオブジェクトのキーや、outputs配列のインデックスを返すとそこに出力される
  47. // また、それらを返さずにcontroller内でもっと自由な制御をすることも可能
  48.  
  49.  
  50. // 標準入力にスイッチリスナを追加
  51. stdin.addLineSwitch(outputs, controller)
  52.  
Not running #stdin #stdout 0s 0KB
stdin
###コンソール表示見本###

abc
  alphabet-stream: abc
123
    number-stream: 123
!"#
   default-stream: !"#
stdout
Standard output is empty