'use strict'; const { AigleWhilst, WhilstTester } = require('./whilst'); class DoWhilst extends AigleWhilst { constructor(test, iterator) { super(test, iterator); } _iterate(value) { this._next(value); return this._promise; } } module.exports = { doWhilst, DoWhilst }; /** * @param {*} [value] * @param {Function} iterator * @param {Function} tester * @return {Aigle} Returns an Aigle instance * @example * let count = 0; * const order = []; * const tester = num => { * order.push(`t:${num}`); * return Aigle.delay(10) * .then(() => num !== 4); * }; * const iterator = () => { * const num = ++count; * order.push(`i:${num}`); * return Aigle.delay(10) * .then(() => num); * }; * Aigle.doWhilst(iterator, tester) * .then(value => { * console.log(value); // 4 * console.log(count); // 4 * console.log(order); // [ 'i:1', 't:1', 'i:2', 't:2', 'i:3', 't:3', 'i:4', 't:4' ] * }); * * @example * const order = []; * const tester = num => { * order.push(`t:${num}`); * return Aigle.delay(10) * .then(() => num !== 4); * }; * const iterator = count => { * const num = ++count; * order.push(`i:${num}`); * return Aigle.delay(10) * .then(() => num); * }; * Aigle.doWhilst(0, iterator, tester) * .then(value => { * console.log(value); // 4 * console.log(order); // [ 'i:1', 't:1', 'i:2', 't:2', 'i:3', 't:3', 'i:4', 't:4' ] * }); */ function doWhilst(value, iterator, tester) { if (typeof tester !== 'function') { tester = iterator; iterator = value; value = undefined; } return new DoWhilst(new WhilstTester(tester), iterator)._iterate(value); }