| var readline = require('readline') | |
| var Promise = require('any-promise') | |
| var objectAssign = require('object-assign') | |
| var Interface = readline.Interface | |
| 
 | |
| function wrapCompleter (completer) { | |
|   if (completer.length === 2) return completer | |
| 
 | |
|   return function (line, cb) { | |
|     var result = completer(line) | |
| 
 | |
|     if (typeof result.then !== 'function') { | |
|       return cb(null, result) | |
|     } | |
| 
 | |
|     result.catch(cb).then(function (result) { | |
|       process.nextTick(function () { cb(null, result) }) | |
|     }) | |
|   } | |
| } | |
| 
 | |
| function InterfaceAsPromised (input, output, completer, terminal) { | |
|   if (arguments.length === 1) { | |
|     var options = input | |
| 
 | |
|     if (typeof options.completer === 'function') { | |
|       options = objectAssign({}, options, { | |
|         completer: wrapCompleter(options.completer) | |
|       }) | |
|     } | |
| 
 | |
|     Interface.call(this, options) | |
|   } else { | |
|     if (typeof completer === 'function') { | |
|       completer = wrapCompleter(completer) | |
|     } | |
| 
 | |
|     Interface.call(this, input, output, completer, terminal) | |
|   } | |
| } | |
| 
 | |
| InterfaceAsPromised.prototype = Object.create(Interface.prototype) | |
| 
 | |
| InterfaceAsPromised.prototype.question = function (question, callback) { | |
|   if (typeof callback === 'function') { | |
|     return Interface.prototype.question.call(this, question, callback) | |
|   } | |
| 
 | |
|   var self = this | |
|   return new Promise(function (resolve) { | |
|     Interface.prototype.question.call(self, question, resolve) | |
|   }) | |
| } | |
| 
 | |
| objectAssign(exports, readline, { | |
|   Interface: InterfaceAsPromised, | |
|   createInterface: function (input, output, completer, terminal) { | |
|     if (arguments.length === 1) { | |
|       return new InterfaceAsPromised(input) | |
|     } | |
| 
 | |
|     return new InterfaceAsPromised(input, output, completer, terminal) | |
|   } | |
| })
 |