| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 | 
							- 'use strict';
 
- var assert = require('assert');
 
- var _ = {
 
-   isNumber: require('lodash/isNumber'),
 
-   filter: require('lodash/filter'),
 
-   map: require('lodash/map'),
 
-   find: require('lodash/find'),
 
- };
 
- var Separator = require('./separator');
 
- var Choice = require('./choice');
 
- /**
 
-  * Choices collection
 
-  * Collection of multiple `choice` object
 
-  * @constructor
 
-  * @param {Array} choices  All `choice` to keep in the collection
 
-  */
 
- module.exports = class Choices {
 
-   constructor(choices, answers) {
 
-     this.choices = choices.map((val) => {
 
-       if (val.type === 'separator') {
 
-         if (!(val instanceof Separator)) {
 
-           val = new Separator(val.line);
 
-         }
 
-         return val;
 
-       }
 
-       return new Choice(val, answers);
 
-     });
 
-     this.realChoices = this.choices
 
-       .filter(Separator.exclude)
 
-       .filter((item) => !item.disabled);
 
-     Object.defineProperty(this, 'length', {
 
-       get() {
 
-         return this.choices.length;
 
-       },
 
-       set(val) {
 
-         this.choices.length = val;
 
-       },
 
-     });
 
-     Object.defineProperty(this, 'realLength', {
 
-       get() {
 
-         return this.realChoices.length;
 
-       },
 
-       set() {
 
-         throw new Error('Cannot set `realLength` of a Choices collection');
 
-       },
 
-     });
 
-   }
 
-   /**
 
-    * Get a valid choice from the collection
 
-    * @param  {Number} selector  The selected choice index
 
-    * @return {Choice|Undefined} Return the matched choice or undefined
 
-    */
 
-   getChoice(selector) {
 
-     assert(_.isNumber(selector));
 
-     return this.realChoices[selector];
 
-   }
 
-   /**
 
-    * Get a raw element from the collection
 
-    * @param  {Number} selector  The selected index value
 
-    * @return {Choice|Undefined} Return the matched choice or undefined
 
-    */
 
-   get(selector) {
 
-     assert(_.isNumber(selector));
 
-     return this.choices[selector];
 
-   }
 
-   /**
 
-    * Match the valid choices against a where clause
 
-    * @param  {Object} whereClause Lodash `where` clause
 
-    * @return {Array}              Matching choices or empty array
 
-    */
 
-   where(whereClause) {
 
-     return _.filter(this.realChoices, whereClause);
 
-   }
 
-   /**
 
-    * Pluck a particular key from the choices
 
-    * @param  {String} propertyName Property name to select
 
-    * @return {Array}               Selected properties
 
-    */
 
-   pluck(propertyName) {
 
-     return _.map(this.realChoices, propertyName);
 
-   }
 
-   // Expose usual Array methods
 
-   indexOf() {
 
-     return this.choices.indexOf.apply(this.choices, arguments);
 
-   }
 
-   forEach() {
 
-     return this.choices.forEach.apply(this.choices, arguments);
 
-   }
 
-   filter() {
 
-     return this.choices.filter.apply(this.choices, arguments);
 
-   }
 
-   reduce() {
 
-     return this.choices.reduce.apply(this.choices, arguments);
 
-   }
 
-   find(func) {
 
-     return _.find(this.choices, func);
 
-   }
 
-   push() {
 
-     var objs = _.map(arguments, (val) => new Choice(val));
 
-     this.choices.push.apply(this.choices, objs);
 
-     this.realChoices = this.choices
 
-       .filter(Separator.exclude)
 
-       .filter((item) => !item.disabled);
 
-     return this.choices;
 
-   }
 
- };
 
 
  |