| 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) | 
|   } | 
| }) |