import * as tsplus_module_1 from "@effect/core/stm/STM/operations/succeedNow";
import * as tsplus_module_2 from "@effect/core/stm/STM/operations/flatMap";
export const repeatUntil_ = repeatUntil_1;
/**
 * Repeats this `STM` effect until its result satisfies the specified
 * predicate. **WARNING**: `repeatUntil` uses a busy loop to repeat the
 * effect and will consume a thread until it completes (it cannot yield). This
 * is because STM describes a single atomic transaction which must either
 * complete, retry or fail a transaction before yielding back to the ZIO
 * Runtime.
 *   - Use `retryUntil` instead if you don't need to maintain transaction
 *     state for repeats.
 *   - Ensure repeating the STM effect will eventually satisfy the predicate.
 *   - Consider using the Blocking thread pool for execution of the
 *     transaction.
 *
 * @tsplus fluent ets/STM repeatUntil
 */

function repeatUntil_1(self, f) {
  return tsplus_module_2.flatMap_(self, a => f(a) ? tsplus_module_1.succeedNow(a) : repeatUntil_1(self, f));
}
/**
 * Repeats this `STM` effect until its result satisfies the specified
 * predicate. **WARNING**: `repeatUntil` uses a busy loop to repeat the
 * effect and will consume a thread until it completes (it cannot yield). This
 * is because STM describes a single atomic transaction which must either
 * complete, retry or fail a transaction before yielding back to the ZIO
 * Runtime.
 *   - Use `retryUntil` instead if you don't need to maintain transaction
 *     state for repeats.
 *   - Ensure repeating the STM effect will eventually satisfy the predicate.
 *   - Consider using the Blocking thread pool for execution of the
 *     transaction.
 *
 * @tsplus static ets/STM/Aspects repeatUntil
 */


export const repeatUntil = f => self => repeatUntil_(self, f);
//# sourceMappingURL=repeatUntil.mjs.map