'use strict'
var stream = require('stream')
var stdin = process.stdin
var stdout = process.stdout
// 本実装
stream.prototype.addLineSwitch = function (outputs, controller) {
var input = this
var output_trash = new stream.Writable()
output_trash._write = function () {}
var rl = require('readline').createInterface(input, output_trash)
rl.on('line', function (line) {
var output = outputs[controller(line, outputs)]
if (output) output.write(new Buffer(line + '\n'))
})
}
// 複数のストリーム出力を1つのストリーム(標準出力)でテスト出来るようにするためのもの
stream.prototype.markingWrap = function (id) {
var neo_stream = new stream.Writable()
var raw_stream = this
neo_stream._write = function (raw_chunk, encoding, callback) {
var neo_chunk = new Buffer(id + ': ' + raw_chunk)
raw_stream.write(neo_chunk, encoding, callback)
}
return neo_stream
}
// 標準出力をラップしてそれぞれ新しいストリームを作る
var output_num = stdout.markingWrap(' number-stream')
var output_alp = stdout.markingWrap(' alphabet-stream')
var output_def = stdout.markingWrap(' default-stream')
// 出力先とコントローラーの設定
var outputs = {num: output_num, alp: output_alp, def: output_def}
var controller = function (line, outputs) {
if (line.match(/^\d+$/)) return 'num'
if (line.match(/^\w+$/)) return 'alp'
return 'def'
}
// controller内で、outputsオブジェクトのキーや、outputs配列のインデックスを返すとそこに出力される
// また、それらを返さずにcontroller内でもっと自由な制御をすることも可能
// 標準入力にスイッチリスナを追加
stdin.addLineSwitch(outputs, controller)