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