/** * Repeats this effect until its value satisfies the specified effectful * predicate or until the first failure. * * @tsplus static effect/core/io/Effect.Aspects repeatUntilEffect * @tsplus pipeable effect/core/io/Effect repeatUntilEffect */ export function repeatUntilEffect( f: (a: A) => Effect ) { return (self: Effect): Effect => self.flatMap((a) => f(a).flatMap((b) => b ? Effect.succeed(a) : Effect.yieldNow.zipRight(self.repeatUntilEffect(f)) ) ) }