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 repeatWhile_ = repeatWhile_1;
/**
 * Repeats this `STM` effect while its result satisfies the specified
 * predicate. **WARNING**: `repeatWhile` 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 `retryWhile` instead if you don't need to maintain transaction
 *     state for repeats.
 *   - Ensure repeating the STM effect will eventually not satisfy the
 *     predicate.
 *   - Consider using the Blocking thread pool for execution of the
 *     transaction.
 *
 * @tsplus fluent ets/STM repeatWhile
 */

function repeatWhile_1(self, f) {
  return tsplus_module_2.flatMap_(self, a => f(a) ? repeatWhile_1(self, f) : tsplus_module_1.succeedNow(a));
}
/**
 * Repeats this `STM` effect while its result satisfies the specified
 * predicate. **WARNING**: `repeatWhile` 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 `retryWhile` instead if you don't need to maintain transaction
 *     state for repeats.
 *   - Ensure repeating the STM effect will eventually not satisfy the
 *     predicate.
 *   - Consider using the Blocking thread pool for execution of the
 *     transaction.
 *
 * @tsplus static ets/STM/Aspects repeatWhile
 */


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