'use strict';
const { DoWhilst } = require('./doWhilst');
const { UntilTester } = require('./until');
module.exports = doUntil;
/**
* @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.doUntil(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.doUntil(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 doUntil(value, iterator, tester) {
if (typeof tester !== 'function') {
tester = iterator;
iterator = value;
value = undefined;
}
return new DoWhilst(new UntilTester(tester), iterator)._iterate(value);
}