UNPKG

veffect

Version:

powerful TypeScript validation library built on the robust foundation of Effect combining exceptional type safety, high performance, and developer experience. Taking inspiration from Effect's functional principles, VEffect delivers a balanced approach tha

1,389 lines (1,283 loc) 42.2 kB
/** * @since 2.0.0 */ import type * as Cause from "./Cause.js" import type * as Chunk from "./Chunk.js" import type * as Context from "./Context.js" import type * as Cron from "./Cron.js" import type * as Duration from "./Duration.js" import type * as Effect from "./Effect.js" import type * as Either from "./Either.js" import type { LazyArg } from "./Function.js" import * as internal from "./internal/schedule.js" import type * as Option from "./Option.js" import type { Pipeable } from "./Pipeable.js" import type { Predicate } from "./Predicate.js" import type * as ScheduleDecision from "./ScheduleDecision.js" import type * as Intervals from "./ScheduleIntervals.js" import type * as Types from "./Types.js" /** * @since 2.0.0 * @category symbols */ export const ScheduleTypeId: unique symbol = internal.ScheduleTypeId /** * @since 2.0.0 * @category symbols */ export type ScheduleTypeId = typeof ScheduleTypeId /** * @since 2.0.0 * @category symbols */ export const ScheduleDriverTypeId: unique symbol = internal.ScheduleDriverTypeId /** * @since 2.0.0 * @category symbols */ export type ScheduleDriverTypeId = typeof ScheduleDriverTypeId /** * A `Schedule<Out, In, R>` defines a recurring schedule, which consumes * values of type `In`, and which returns values of type `Out`. * * Schedules are defined as a possibly infinite set of intervals spread out over * time. Each interval defines a window in which recurrence is possible. * * When schedules are used to repeat or retry effects, the starting boundary of * each interval produced by a schedule is used as the moment when the effect * will be executed again. * * Schedules compose in the following primary ways: * * - Union: performs the union of the intervals of two schedules * - Intersection: performs the intersection of the intervals of two schedules * - Sequence: concatenates the intervals of one schedule onto another * * In addition, schedule inputs and outputs can be transformed, filtered (to * terminate a schedule early in response to some input or output), and so * forth. * * A variety of other operators exist for transforming and combining schedules, * and the companion object for `Schedule` contains all common types of * schedules, both for performing retrying, as well as performing repetition. * * @category model * @since 2.0.0 */ export interface Schedule<out Out, in In = unknown, out R = never> extends Schedule.Variance<Out, In, R>, Pipeable { /** * Initial State */ readonly initial: any /** * Schedule Step */ step( now: number, input: In, state: any ): Effect.Effect<readonly [any, Out, ScheduleDecision.ScheduleDecision], never, R> } /** * @since 2.0.0 */ export declare namespace Schedule { /** * @since 2.0.0 * @category models */ export interface Variance<out Out, in In, out R> { readonly [ScheduleTypeId]: { readonly _Out: Types.Covariant<Out> readonly _In: Types.Contravariant<In> readonly _R: Types.Covariant<R> } } /** * @since 2.0.0 */ export interface DriverVariance<out Out, in In, out R> { readonly [ScheduleDriverTypeId]: { readonly _Out: Types.Covariant<Out> readonly _In: Types.Contravariant<In> readonly _R: Types.Covariant<R> } } } /** * @since 2.0.0 * @category models */ export interface ScheduleDriver<out Out, in In = unknown, out R = never> extends Schedule.DriverVariance<Out, In, R> { readonly state: Effect.Effect<unknown> readonly last: Effect.Effect<Out, Cause.NoSuchElementException> readonly reset: Effect.Effect<void> next(input: In): Effect.Effect<Out, Option.Option<never>, R> } /** * Constructs a new `Schedule` with the specified `initial` state and the * specified `step` function. * * @since 2.0.0 * @category constructors */ export const makeWithState: <S, In, Out, R = never>( initial: S, step: ( now: number, input: In, state: S ) => Effect.Effect<readonly [S, Out, ScheduleDecision.ScheduleDecision], never, R> ) => Schedule<Out, In, R> = internal.makeWithState /** * Returns a new schedule with the given delay added to every interval defined * by this schedule. * * @since 2.0.0 * @category utils */ export const addDelay: { <Out>(f: (out: Out) => Duration.DurationInput): <In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R> <Out, In, R>(self: Schedule<Out, In, R>, f: (out: Out) => Duration.DurationInput): Schedule<Out, In, R> } = internal.addDelay /** * Returns a new schedule with the given effectfully computed delay added to * every interval defined by this schedule. * * @since 2.0.0 * @category utils */ export const addDelayEffect: { <Out, R2>( f: (out: Out) => Effect.Effect<Duration.DurationInput, never, R2> ): <In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R2 | R> <Out, In, R, R2>( self: Schedule<Out, In, R>, f: (out: Out) => Effect.Effect<Duration.DurationInput, never, R2> ): Schedule<Out, In, R | R2> } = internal.addDelayEffect /** * The same as `andThenEither`, but merges the output. * * @since 2.0.0 * @category sequencing */ export const andThen: { <Out2, In2, R2>( that: Schedule<Out2, In2, R2> ): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<Out2 | Out, In & In2, R2 | R> <Out, In, R, Out2, In2, R2>( self: Schedule<Out, In, R>, that: Schedule<Out2, In2, R2> ): Schedule<Out | Out2, In & In2, R | R2> } = internal.andThen /** * Returns a new schedule that first executes this schedule to completion, and * then executes the specified schedule to completion. * * @since 2.0.0 * @category sequencing */ export const andThenEither: { <Out2, In2, R2>( that: Schedule<Out2, In2, R2> ): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<Either.Either<Out2, Out>, In & In2, R2 | R> <Out, In, R, Out2, In2, R2>( self: Schedule<Out, In, R>, that: Schedule<Out2, In2, R2> ): Schedule<Either.Either<Out2, Out>, In & In2, R | R2> } = internal.andThenEither /** * Returns a new schedule that maps this schedule to a constant output. * * @since 2.0.0 * @category mapping */ export const as: { <Out2>(out: Out2): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<Out2, In, R> <Out, In, R, Out2>(self: Schedule<Out, In, R>, out: Out2): Schedule<Out2, In, R> } = internal.as /** * Returns a new schedule that maps the output of this schedule to unit. * * @since 2.0.0 * @category constructors */ export const asUnit: <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<void, In, R> = internal.asUnit /** * Returns a new schedule that has both the inputs and outputs of this and the * specified schedule. * * @since 2.0.0 * @category utils */ export const bothInOut: { <Out2, In2, R2>( that: Schedule<Out2, In2, R2> ): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<[Out, Out2], readonly [In, In2], R2 | R> <Out, In, R, Out2, In2, R2>( self: Schedule<Out, In, R>, that: Schedule<Out2, In2, R2> ): Schedule<[Out, Out2], readonly [In, In2], R | R2> } = internal.bothInOut /** * Returns a new schedule that passes each input and output of this schedule * to the specified function, and then determines whether or not to continue * based on the return value of the function. * * @since 2.0.0 * @category utils */ export const check: { <In, Out>(test: (input: In, output: Out) => boolean): <R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R> <Out, In, R>(self: Schedule<Out, In, R>, test: (input: In, output: Out) => boolean): Schedule<Out, In, R> } = internal.check /** * Returns a new schedule that passes each input and output of this schedule * to the specified function, and then determines whether or not to continue * based on the return value of the function. * * @since 2.0.0 * @category utils */ export const checkEffect: { <In, Out, R2>( test: (input: In, output: Out) => Effect.Effect<boolean, never, R2> ): <R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R2 | R> <Out, In, R, R2>( self: Schedule<Out, In, R>, test: (input: In, output: Out) => Effect.Effect<boolean, never, R2> ): Schedule<Out, In, R | R2> } = internal.checkEffect /** * A schedule that recurs anywhere, collecting all inputs into a `Chunk`. * * @since 2.0.0 * @category constructors */ export const collectAllInputs: <A>() => Schedule<Chunk.Chunk<A>, A> = internal.collectAllInputs /** * Returns a new schedule that collects the outputs of this one into a chunk. * * @since 2.0.0 * @category utils */ export const collectAllOutputs: <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<Chunk.Chunk<Out>, In, R> = internal.collectAllOutputs /** * A schedule that recurs until the condition f fails, collecting all inputs * into a list. * * @since 2.0.0 * @category utils */ export const collectUntil: <A>(f: Predicate<A>) => Schedule<Chunk.Chunk<A>, A> = internal.collectUntil /** * A schedule that recurs until the effectful condition f fails, collecting * all inputs into a list. * * @since 2.0.0 * @category utils */ export const collectUntilEffect: <A, R>( f: (a: A) => Effect.Effect<boolean, never, R> ) => Schedule<Chunk.Chunk<A>, A, R> = internal.collectUntilEffect /** * A schedule that recurs as long as the condition f holds, collecting all * inputs into a list. * * @since 2.0.0 * @category utils */ export const collectWhile: <A>(f: Predicate<A>) => Schedule<Chunk.Chunk<A>, A> = internal.collectWhile /** * A schedule that recurs as long as the effectful condition holds, collecting * all inputs into a list. * * @category utils * @since 2.0.0 */ export const collectWhileEffect: <A, R>( f: (a: A) => Effect.Effect<boolean, never, R> ) => Schedule<Chunk.Chunk<A>, A, R> = internal.collectWhileEffect /** * Returns the composition of this schedule and the specified schedule, by * piping the output of this one into the input of the other. Effects * described by this schedule will always be executed before the effects * described by the second schedule. * * @since 2.0.0 * @category utils */ export const compose: { <Out2, Out, R2>(that: Schedule<Out2, Out, R2>): <In, R>(self: Schedule<Out, In, R>) => Schedule<Out2, In, R2 | R> <Out, In, R, Out2, R2>(self: Schedule<Out, In, R>, that: Schedule<Out2, Out, R2>): Schedule<Out2, In, R | R2> } = internal.compose /** * Returns a new schedule that deals with a narrower class of inputs than this * schedule. * * @since 2.0.0 * @category mapping */ export const mapInput: { <In, In2>(f: (in2: In2) => In): <Out, R>(self: Schedule<Out, In, R>) => Schedule<Out, In2, R> <Out, In, R, In2>(self: Schedule<Out, In, R>, f: (in2: In2) => In): Schedule<Out, In2, R> } = internal.mapInput /** * Transforms the context being provided to this schedule with the * specified function. * * @since 2.0.0 * @category context */ export const mapInputContext: { <R0, R>( f: (env0: Context.Context<R0>) => Context.Context<R> ): <Out, In>(self: Schedule<Out, In, R>) => Schedule<Out, In, R0> <Out, In, R, R0>( self: Schedule<Out, In, R>, f: (env0: Context.Context<R0>) => Context.Context<R> ): Schedule<Out, In, R0> } = internal.mapInputContext /** * Returns a new schedule that deals with a narrower class of inputs than this * schedule. * * @since 2.0.0 * @category mapping */ export const mapInputEffect: { <In2, In, R2>( f: (in2: In2) => Effect.Effect<In, never, R2> ): <Out, R>(self: Schedule<Out, In, R>) => Schedule<Out, In2, R2 | R> <Out, In, R, In2, R2>( self: Schedule<Out, In, R>, f: (in2: In2) => Effect.Effect<In, never, R2> ): Schedule<Out, In2, R | R2> } = internal.mapInputEffect /** * A schedule that always recurs, which counts the number of recurrences. * * @since 2.0.0 * @category constructors */ export const count: Schedule<number> = internal.count /** * Cron schedule that recurs every `minute` that matches the schedule. * * It triggers at zero second of the minute. Producing the timestamps of the cron window. * * NOTE: `expression` parameter is validated lazily. Must be a valid cron expression. * * @since 2.0.0 * @category constructors */ export const cron: (expression: string | Cron.Cron) => Schedule<[number, number]> = internal.cron /** * Cron-like schedule that recurs every specified `day` of month. Won't recur * on months containing less days than specified in `day` param. * * It triggers at zero hour of the day. Producing a count of repeats: 0, 1, 2. * * NOTE: `day` parameter is validated lazily. Must be in range 1...31. * * @since 2.0.0 * @category constructors */ export const dayOfMonth: (day: number) => Schedule<number> = internal.dayOfMonth /** * Cron-like schedule that recurs every specified `day` of each week. It * triggers at zero hour of the week. Producing a count of repeats: 0, 1, 2. * * NOTE: `day` parameter is validated lazily. Must be in range 1 (Monday)...7 * (Sunday). * * @since 2.0.0 * @category constructors */ export const dayOfWeek: (day: number) => Schedule<number> = internal.dayOfWeek /** * Returns a new schedule with the specified effectfully computed delay added * before the start of each interval produced by this schedule. * * @since 2.0.0 * @category utils */ export const delayed: { ( f: (duration: Duration.Duration) => Duration.DurationInput ): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R> <Out, In, R>( self: Schedule<Out, In, R>, f: (duration: Duration.Duration) => Duration.DurationInput ): Schedule<Out, In, R> } = internal.delayed /** * Returns a new schedule with the specified effectfully computed delay added * before the start of each interval produced by this schedule. * * @since 2.0.0 * @category constructors */ export const delayedEffect: { <R2>( f: (duration: Duration.Duration) => Effect.Effect<Duration.DurationInput, never, R2> ): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R2 | R> <Out, In, R, R2>( self: Schedule<Out, In, R>, f: (duration: Duration.Duration) => Effect.Effect<Duration.DurationInput, never, R2> ): Schedule<Out, In, R | R2> } = internal.delayedEffect /** * Takes a schedule that produces a delay, and returns a new schedule that * uses this delay to further delay intervals in the resulting schedule. * * @since 2.0.0 * @category constructors */ export const delayedSchedule: <In, R>( schedule: Schedule<Duration.Duration, In, R> ) => Schedule<Duration.Duration, In, R> = internal.delayedSchedule /** * Returns a new schedule that outputs the delay between each occurence. * * @since 2.0.0 * @category constructors */ export const delays: <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<Duration.Duration, In, R> = internal.delays /** * Returns a new schedule that maps both the input and output. * * @since 2.0.0 * @category mapping */ export const mapBoth: { <In2, In, Out, Out2>( options: { readonly onInput: (in2: In2) => In; readonly onOutput: (out: Out) => Out2 } ): <R>(self: Schedule<Out, In, R>) => Schedule<Out2, In2, R> <Out, In, R, In2, Out2>( self: Schedule<Out, In, R>, options: { readonly onInput: (in2: In2) => In; readonly onOutput: (out: Out) => Out2 } ): Schedule<Out2, In2, R> } = internal.mapBoth /** * Returns a new schedule that maps both the input and output. * * @since 2.0.0 * @category mapping */ export const mapBothEffect: { <In2, In, R2, Out, R3, Out2>( options: { readonly onInput: (input: In2) => Effect.Effect<In, never, R2> readonly onOutput: (out: Out) => Effect.Effect<Out2, never, R3> } ): <R>(self: Schedule<Out, In, R>) => Schedule<Out2, In2, R2 | R3 | R> <Out, In, R, In2, R2, Out2, R3>( self: Schedule<Out, In, R>, options: { readonly onInput: (input: In2) => Effect.Effect<In, never, R2> readonly onOutput: (out: Out) => Effect.Effect<Out2, never, R3> } ): Schedule<Out2, In2, R | R2 | R3> } = internal.mapBothEffect /** * Returns a driver that can be used to step the schedule, appropriately * handling sleeping. * * @since 2.0.0 * @category getter */ export const driver: <Out, In, R>( self: Schedule<Out, In, R> ) => Effect.Effect<ScheduleDriver<Out, In, R>> = internal.driver /** * A schedule that can recur one time, the specified amount of time into the * future. * * @since 2.0.0 * @category constructors */ export const duration: (duration: Duration.DurationInput) => Schedule<Duration.Duration> = internal.duration /** * Returns a new schedule that performs a geometric union on the intervals * defined by both schedules. * * @since 2.0.0 * @category alternatives */ export const either: { <Out2, In2, R2>( that: Schedule<Out2, In2, R2> ): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<[Out, Out2], In & In2, R2 | R> <Out, In, R, Out2, In2, R2>( self: Schedule<Out, In, R>, that: Schedule<Out2, In2, R2> ): Schedule<[Out, Out2], In & In2, R | R2> } = internal.either /** * The same as `either` followed by `map`. * * @since 2.0.0 * @category alternatives */ export const eitherWith: { <Out2, In2, R2>( that: Schedule<Out2, In2, R2>, f: (x: Intervals.Intervals, y: Intervals.Intervals) => Intervals.Intervals ): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<[Out, Out2], In & In2, R2 | R> <Out, In, R, Out2, In2, R2>( self: Schedule<Out, In, R>, that: Schedule<Out2, In2, R2>, f: (x: Intervals.Intervals, y: Intervals.Intervals) => Intervals.Intervals ): Schedule<[Out, Out2], In & In2, R | R2> } = internal.eitherWith /** * A schedule that occurs everywhere, which returns the total elapsed duration * since the first step. * * @since 2.0.0 * @category constructors */ export const elapsed: Schedule<Duration.Duration> = internal.elapsed /** * Returns a new schedule that will run the specified finalizer as soon as the * schedule is complete. Note that unlike `Effect.ensuring`, this method does not * guarantee the finalizer will be run. The `Schedule` may not initialize or * the driver of the schedule may not run to completion. However, if the * `Schedule` ever decides not to continue, then the finalizer will be run. * * @since 2.0.0 * @category finalization */ export const ensuring: { <X>(finalizer: Effect.Effect<X, never, never>): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R> <Out, In, R, X>(self: Schedule<Out, In, R>, finalizer: Effect.Effect<X, never, never>): Schedule<Out, In, R> } = internal.ensuring /** * A schedule that always recurs, but will wait a certain amount between * repetitions, given by `base * factor.pow(n)`, where `n` is the number of * repetitions so far. Returns the current duration between recurrences. * * @since 2.0.0 * @category constructors */ export const exponential: ( base: Duration.DurationInput, factor?: number ) => Schedule<Duration.Duration> = internal.exponential /** * A schedule that always recurs, increasing delays by summing the preceding * two delays (similar to the fibonacci sequence). Returns the current * duration between recurrences. * * @since 2.0.0 * @category constructors */ export const fibonacci: (one: Duration.DurationInput) => Schedule<Duration.Duration> = internal.fibonacci /** * A schedule that recurs on a fixed interval. Returns the number of * repetitions of the schedule so far. * * If the action run between updates takes longer than the interval, then the * action will be run immediately, but re-runs will not "pile up". * * ``` * |-----interval-----|-----interval-----|-----interval-----| * |---------action--------||action|-----|action|-----------| * ``` * * @since 2.0.0 * @category constructors */ export const fixed: (interval: Duration.DurationInput) => Schedule<number> = internal.fixed /** * A schedule that always recurs, producing a count of repeats: 0, 1, 2. * * @since 2.0.0 * @category constructors */ export const forever: Schedule<number> = internal.forever /** * A schedule that recurs once with the specified delay. * * @since 2.0.0 * @category constructors */ export const fromDelay: (delay: Duration.DurationInput) => Schedule<Duration.Duration> = internal.fromDelay /** * A schedule that recurs once for each of the specified durations, delaying * each time for the length of the specified duration. Returns the length of * the current duration between recurrences. * * @since 2.0.0 * @category constructors */ export const fromDelays: ( delay: Duration.DurationInput, ...delays: Array<Duration.DurationInput> ) => Schedule<Duration.Duration> = internal.fromDelays /** * A schedule that always recurs, mapping input values through the specified * function. * * @since 2.0.0 * @category constructors */ export const fromFunction: <A, B>(f: (a: A) => B) => Schedule<B, A> = internal.fromFunction /** * Cron-like schedule that recurs every specified `hour` of each day. It * triggers at zero minute of the hour. Producing a count of repeats: 0, 1, 2. * * NOTE: `hour` parameter is validated lazily. Must be in range 0...23. * * @since 2.0.0 * @category constructors */ export const hourOfDay: (hour: number) => Schedule<number> = internal.hourOfDay /** * A schedule that always recurs, which returns inputs as outputs. * * @since 2.0.0 * @category constructors */ export const identity: <A>() => Schedule<A, A> = internal.identity /** * Returns a new schedule that performs a geometric intersection on the * intervals defined by both schedules. * * @since 2.0.0 * @category utils */ export const intersect: { <Out2, In2, R2>( that: Schedule<Out2, In2, R2> ): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<[Out, Out2], In & In2, R2 | R> <Out, In, R, Out2, In2, R2>( self: Schedule<Out, In, R>, that: Schedule<Out2, In2, R2> ): Schedule<[Out, Out2], In & In2, R | R2> } = internal.intersect /** * Returns a new schedule that combines this schedule with the specified * schedule, continuing as long as both schedules want to continue and merging * the next intervals according to the specified merge function. * * @since 2.0.0 * @category utils */ export const intersectWith: { <Out2, In2, R2>( that: Schedule<Out2, In2, R2>, f: (x: Intervals.Intervals, y: Intervals.Intervals) => Intervals.Intervals ): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<[Out, Out2], In & In2, R2 | R> <Out, In, R, Out2, In2, R2>( self: Schedule<Out, In, R>, that: Schedule<Out2, In2, R2>, f: (x: Intervals.Intervals, y: Intervals.Intervals) => Intervals.Intervals ): Schedule<[Out, Out2], In & In2, R | R2> } = internal.intersectWith /** * Returns a new schedule that randomly modifies the size of the intervals of * this schedule. * * Defaults `min` to `0.8` and `max` to `1.2`. * * The new interval size is between `min * old interval size` and `max * old * interval size`. * * @since 2.0.0 * @category constructors */ export const jittered: <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R> = internal.jittered /** * Returns a new schedule that randomly modifies the size of the intervals of * this schedule. * * The new interval size is between `min * old interval size` and `max * old * interval size`. * * @since 2.0.0 * @category constructors */ export const jitteredWith: { ( options: { min?: number | undefined; max?: number | undefined } ): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R> <Out, In, R>( self: Schedule<Out, In, R>, options: { min?: number | undefined; max?: number | undefined } ): Schedule<Out, In, R> } = internal.jitteredWith /** * A schedule that always recurs, but will repeat on a linear time interval, * given by `base * n` where `n` is the number of repetitions so far. Returns * the current duration between recurrences. * * @since 2.0.0 * @category constructors */ export const linear: (base: Duration.DurationInput) => Schedule<Duration.Duration> = internal.linear /** * Returns a new schedule that maps the output of this schedule through the * specified function. * * @since 2.0.0 * @category mapping */ export const map: { <Out, Out2>(f: (out: Out) => Out2): <In, R>(self: Schedule<Out, In, R>) => Schedule<Out2, In, R> <Out, In, R, Out2>(self: Schedule<Out, In, R>, f: (out: Out) => Out2): Schedule<Out2, In, R> } = internal.map /** * Returns a new schedule that maps the output of this schedule through the * specified effectful function. * * @since 2.0.0 * @category mapping */ export const mapEffect: { <Out, Out2, R2>( f: (out: Out) => Effect.Effect<Out2, never, R2> ): <In, R>(self: Schedule<Out, In, R>) => Schedule<Out2, In, R2 | R> <Out, In, R, Out2, R2>( self: Schedule<Out, In, R>, f: (out: Out) => Effect.Effect<Out2, never, R2> ): Schedule<Out2, In, R | R2> } = internal.mapEffect /** * Cron-like schedule that recurs every specified `minute` of each hour. It * triggers at zero second of the minute. Producing a count of repeats: 0, 1, * 2. * * NOTE: `minute` parameter is validated lazily. Must be in range 0...59. * * @since 2.0.0 * @category constructors */ export const minuteOfHour: (minute: number) => Schedule<number> = internal.minuteOfHour /** * Returns a new schedule that modifies the delay using the specified * function. * * @since 2.0.0 * @category utils */ export const modifyDelay: { <Out>( f: (out: Out, duration: Duration.Duration) => Duration.DurationInput ): <In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R> <Out, In, R>( self: Schedule<Out, In, R>, f: (out: Out, duration: Duration.Duration) => Duration.DurationInput ): Schedule<Out, In, R> } = internal.modifyDelay /** * Returns a new schedule that modifies the delay using the specified * effectual function. * * @since 2.0.0 * @category utils */ export const modifyDelayEffect: { <Out, R2>( f: (out: Out, duration: Duration.Duration) => Effect.Effect<Duration.DurationInput, never, R2> ): <In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R2 | R> <Out, In, R, R2>( self: Schedule<Out, In, R>, f: (out: Out, duration: Duration.Duration) => Effect.Effect<Duration.DurationInput, never, R2> ): Schedule<Out, In, R | R2> } = internal.modifyDelayEffect /** * Returns a new schedule that applies the current one but runs the specified * effect for every decision of this schedule. This can be used to create * schedules that log failures, decisions, or computed values. * * @since 2.0.0 * @category utils */ export const onDecision: { <Out, X, R2>( f: (out: Out, decision: ScheduleDecision.ScheduleDecision) => Effect.Effect<X, never, R2> ): <In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R2 | R> <Out, In, R, X, R2>( self: Schedule<Out, In, R>, f: (out: Out, decision: ScheduleDecision.ScheduleDecision) => Effect.Effect<X, never, R2> ): Schedule<Out, In, R | R2> } = internal.onDecision /** * A schedule that recurs one time. * * @since 2.0.0 * @category constructors */ export const once: Schedule<void> = internal.once /** * Returns a new schedule that passes through the inputs of this schedule. * * @since 2.0.0 * @category utils */ export const passthrough: <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<In, In, R> = internal.passthrough /** * Returns a new schedule with its context provided to it, so the * resulting schedule does not require any context. * * @since 2.0.0 * @category context */ export const provideContext: { <R>(context: Context.Context<R>): <Out, In>(self: Schedule<Out, In, R>) => Schedule<Out, In, never> <Out, In, R>(self: Schedule<Out, In, R>, context: Context.Context<R>): Schedule<Out, In, never> } = internal.provideContext /** * Returns a new schedule with the single service it requires provided to it. * If the schedule requires multiple services use `provideContext` * instead. * * @since 2.0.0 * @category context */ export const provideService: { <T extends Context.Tag<any, any>>( tag: T, service: Context.Tag.Service<T> ): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, Exclude<R, Context.Tag.Identifier<T>>> <Out, In, R, T extends Context.Tag<any, any>>( self: Schedule<Out, In, R>, tag: T, service: Context.Tag.Service<T> ): Schedule<Out, In, Exclude<R, Context.Tag.Identifier<T>>> } = internal.provideService /** * A schedule that recurs for until the predicate evaluates to true. * * @since 2.0.0 * @category utils */ export const recurUntil: <A>(f: Predicate<A>) => Schedule<A, A> = internal.recurUntil /** * A schedule that recurs for until the predicate evaluates to true. * * @since 2.0.0 * @category utils */ export const recurUntilEffect: <A, R>(f: (a: A) => Effect.Effect<boolean, never, R>) => Schedule<A, A, R> = internal.recurUntilEffect /** * A schedule that recurs for until the input value becomes applicable to * partial function and then map that value with given function. * * @since 2.0.0 * @category utils */ export const recurUntilOption: <A, B>(pf: (a: A) => Option.Option<B>) => Schedule<Option.Option<B>, A> = internal.recurUntilOption /** * A schedule that recurs during the given duration. * * @since 2.0.0 * @category utils */ export const recurUpTo: (duration: Duration.DurationInput) => Schedule<Duration.Duration> = internal.recurUpTo /** * A schedule that recurs for as long as the predicate evaluates to true. * * @since 2.0.0 * @category utils */ export const recurWhile: <A>(f: Predicate<A>) => Schedule<A, A> = internal.recurWhile /** * A schedule that recurs for as long as the effectful predicate evaluates to * true. * * @since 2.0.0 * @category utils */ export const recurWhileEffect: <A, R>(f: (a: A) => Effect.Effect<boolean, never, R>) => Schedule<A, A, R> = internal.recurWhileEffect /** * A schedule spanning all time, which can be stepped only the specified * number of times before it terminates. * * @category constructors * @since 2.0.0 */ export const recurs: (n: number) => Schedule<number> = internal.recurs /** * Returns a new schedule that folds over the outputs of this one. * * @since 2.0.0 * @category folding */ export const reduce: { <Out, Z>(zero: Z, f: (z: Z, out: Out) => Z): <In, R>(self: Schedule<Out, In, R>) => Schedule<Z, In, R> <Out, In, R, Z>(self: Schedule<Out, In, R>, zero: Z, f: (z: Z, out: Out) => Z): Schedule<Z, In, R> } = internal.reduce /** * Returns a new schedule that effectfully folds over the outputs of this one. * * @since 2.0.0 * @category folding */ export const reduceEffect: { <Z, Out, R2>( zero: Z, f: (z: Z, out: Out) => Effect.Effect<Z, never, R2> ): <In, R>(self: Schedule<Out, In, R>) => Schedule<Z, In, R2 | R> <Out, In, R, Z, R2>( self: Schedule<Out, In, R>, zero: Z, f: (z: Z, out: Out) => Effect.Effect<Z, never, R2> ): Schedule<Z, In, R | R2> } = internal.reduceEffect /** * Returns a new schedule that loops this one continuously, resetting the * state when this schedule is done. * * @since 2.0.0 * @category constructors */ export const repeatForever: Schedule<number> = internal.forever /** * Returns a new schedule that outputs the number of repetitions of this one. * * @since 2.0.0 * @category utils */ export const repetitions: <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<number, In, R> = internal.repetitions /** * Return a new schedule that automatically resets the schedule to its initial * state after some time of inactivity defined by `duration`. * * @since 2.0.0 * @category utils */ export const resetAfter: { (duration: Duration.DurationInput): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R> <Out, In, R>(self: Schedule<Out, In, R>, duration: Duration.DurationInput): Schedule<Out, In, R> } = internal.resetAfter /** * Resets the schedule when the specified predicate on the schedule output * evaluates to true. * * @since 2.0.0 * @category utils */ export const resetWhen: { <Out>(f: Predicate<Out>): <In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R> <Out, In, R>(self: Schedule<Out, In, R>, f: Predicate<Out>): Schedule<Out, In, R> } = internal.resetWhen /** * Runs a schedule using the provided inputs, and collects all outputs. * * @since 2.0.0 * @category destructors */ export const run: { <In>( now: number, input: Iterable<In> ): <Out, R>(self: Schedule<Out, In, R>) => Effect.Effect<Chunk.Chunk<Out>, never, R> <Out, In, R>(self: Schedule<Out, In, R>, now: number, input: Iterable<In>): Effect.Effect<Chunk.Chunk<Out>, never, R> } = internal.run /** * Cron-like schedule that recurs every specified `second` of each minute. It * triggers at zero nanosecond of the second. Producing a count of repeats: 0, * 1, 2. * * NOTE: `second` parameter is validated lazily. Must be in range 0...59. * * @since 2.0.0 * @category constructors */ export const secondOfMinute: (second: number) => Schedule<number> = internal.secondOfMinute /** * Returns a schedule that recurs continuously, each repetition spaced the * specified duration from the last run. * * @since 2.0.0 * @category constructors */ export const spaced: (duration: Duration.DurationInput) => Schedule<number> = internal.spaced /** * A schedule that does not recur, it just stops. * * @since 2.0.0 * @category constructors */ export const stop: Schedule<void> = internal.stop /** * Returns a schedule that repeats one time, producing the specified constant * value. * * @since 2.0.0 * @category constructors */ export const succeed: <A>(value: A) => Schedule<A> = internal.succeed /** * Returns a schedule that repeats one time, producing the specified constant * value. * * @category constructors * @since 2.0.0 */ export const sync: <A>(evaluate: LazyArg<A>) => Schedule<A> = internal.sync /** * Returns a new schedule that effectfully processes every input to this * schedule. * * @since 2.0.0 * @category sequencing */ export const tapInput: { <In2, X, R2>( f: (input: In2) => Effect.Effect<X, never, R2> ): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In & In2, R2 | R> <Out, In, R, In2, X, R2>( self: Schedule<Out, In, R>, f: (input: In2) => Effect.Effect<X, never, R2> ): Schedule<Out, In & In2, R | R2> } = internal.tapInput /** * Returns a new schedule that effectfully processes every output from this * schedule. * * @since 2.0.0 * @category sequencing */ export const tapOutput: { <XO extends Out, X, R2, Out>( f: (out: XO) => Effect.Effect<X, never, R2> ): <In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R2 | R> <Out, In, R, XO extends Out, X, R2>( self: Schedule<Out, In, R>, f: (out: XO) => Effect.Effect<X, never, R2> ): Schedule<Out, In, R | R2> } = internal.tapOutput /** * Unfolds a schedule that repeats one time from the specified state and * iterator. * * @since 2.0.0 * @category constructors */ export const unfold: <A>(initial: A, f: (a: A) => A) => Schedule<A> = internal.unfold /** * Returns a new schedule that performs a geometric union on the intervals * defined by both schedules. * * @since 2.0.0 * @category utils */ export const union: { <Out2, In2, R2>( that: Schedule<Out2, In2, R2> ): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<[Out, Out2], In & In2, R2 | R> <Out, In, R, Out2, In2, R2>( self: Schedule<Out, In, R>, that: Schedule<Out2, In2, R2> ): Schedule<[Out, Out2], In & In2, R | R2> } = internal.union /** * Returns a new schedule that combines this schedule with the specified * schedule, continuing as long as either schedule wants to continue and * merging the next intervals according to the specified merge function. * * @since 2.0.0 * @category utils */ export const unionWith: { <Out2, In2, R2>( that: Schedule<Out2, In2, R2>, f: (x: Intervals.Intervals, y: Intervals.Intervals) => Intervals.Intervals ): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<[Out, Out2], In & In2, R2 | R> <Out, In, R, Out2, In2, R2>( self: Schedule<Out, In, R>, that: Schedule<Out2, In2, R2>, f: (x: Intervals.Intervals, y: Intervals.Intervals) => Intervals.Intervals ): Schedule<[Out, Out2], In & In2, R | R2> } = internal.unionWith /** * Returns a new schedule that continues until the specified predicate on the * input evaluates to true. * * @since 2.0.0 * @category utils */ export const untilInput: { <In>(f: Predicate<In>): <Out, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R> <Out, In, R>(self: Schedule<Out, In, R>, f: Predicate<In>): Schedule<Out, In, R> } = internal.untilInput /** * Returns a new schedule that continues until the specified effectful * predicate on the input evaluates to true. * * @since 2.0.0 * @category utils */ export const untilInputEffect: { <In, R2>( f: (input: In) => Effect.Effect<boolean, never, R2> ): <Out, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R2 | R> <Out, In, R, R2>( self: Schedule<Out, In, R>, f: (input: In) => Effect.Effect<boolean, never, R2> ): Schedule<Out, In, R | R2> } = internal.untilInputEffect /** * Returns a new schedule that continues until the specified predicate on the * output evaluates to true. * * @since 2.0.0 * @category utils */ export const untilOutput: { <Out>(f: Predicate<Out>): <In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R> <Out, In, R>(self: Schedule<Out, In, R>, f: Predicate<Out>): Schedule<Out, In, R> } = internal.untilOutput /** * Returns a new schedule that continues until the specified effectful * predicate on the output evaluates to true. * * @since 2.0.0 * @category utils */ export const untilOutputEffect: { <Out, R2>( f: (out: Out) => Effect.Effect<boolean, never, R2> ): <In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R2 | R> <Out, In, R, R2>( self: Schedule<Out, In, R>, f: (out: Out) => Effect.Effect<boolean, never, R2> ): Schedule<Out, In, R | R2> } = internal.untilOutputEffect /** * A schedule that recurs during the given duration. * * @since 2.0.0 * @category utils */ export const upTo: { (duration: Duration.DurationInput): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R> <Out, In, R>(self: Schedule<Out, In, R>, duration: Duration.DurationInput): Schedule<Out, In, R> } = internal.upTo /** * Returns a new schedule that continues for as long the specified predicate * on the input evaluates to true. * * @since 2.0.0 * @category utils */ export const whileInput: { <In>(f: Predicate<In>): <Out, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R> <Out, In, R>(self: Schedule<Out, In, R>, f: Predicate<In>): Schedule<Out, In, R> } = internal.whileInput /** * Returns a new schedule that continues for as long the specified effectful * predicate on the input evaluates to true. * * @since 2.0.0 * @category utils */ export const whileInputEffect: { <In, R2>( f: (input: In) => Effect.Effect<boolean, never, R2> ): <Out, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R2 | R> <Out, In, R, R2>( self: Schedule<Out, In, R>, f: (input: In) => Effect.Effect<boolean, never, R2> ): Schedule<Out, In, R | R2> } = internal.whileInputEffect /** * Returns a new schedule that continues for as long the specified predicate * on the output evaluates to true. * * @since 2.0.0 * @category utils */ export const whileOutput: { <Out>(f: Predicate<Out>): <In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R> <Out, In, R>(self: Schedule<Out, In, R>, f: Predicate<Out>): Schedule<Out, In, R> } = internal.whileOutput /** * Returns a new schedule that continues for as long the specified effectful * predicate on the output evaluates to true. * * @since 2.0.0 * @category utils */ export const whileOutputEffect: { <Out, R2>( f: (out: Out) => Effect.Effect<boolean, never, R2> ): <In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In, R2 | R> <Out, In, R, R2>( self: Schedule<Out, In, R>, f: (out: Out) => Effect.Effect<boolean, never, R2> ): Schedule<Out, In, R | R2> } = internal.whileOutputEffect /** * A schedule that divides the timeline to `interval`-long windows, and sleeps * until the nearest window boundary every time it recurs. * * For example, `windowed(Duration.seconds(10))` would produce a schedule as * follows: * * ``` * 10s 10s 10s 10s * |----------|----------|----------|----------| * |action------|sleep---|act|-sleep|action----| * ``` * * @since 2.0.0 * @category constructors */ export const windowed: (interval: Duration.DurationInput) => Schedule<number> = internal.windowed /** * The same as `intersect` but ignores the right output. * * @since 2.0.0 * @category zipping */ export const zipLeft: { <Out2, In2, R2>( that: Schedule<Out2, In2, R2> ): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<Out, In & In2, R2 | R> <Out, In, R, Out2, In2, R2>( self: Schedule<Out, In, R>, that: Schedule<Out2, In2, R2> ): Schedule<Out, In & In2, R | R2> } = internal.zipLeft /** * The same as `intersect` but ignores the left output. * * @since 2.0.0 * @category zipping */ export const zipRight: { <Out2, In2, R2>( that: Schedule<Out2, In2, R2> ): <Out, In, R>(self: Schedule<Out, In, R>) => Schedule<Out2, In & In2, R2 | R> <Out, In, R, Out2, In2, R2>( self: Schedule<Out, In, R>, that: Schedule<Out2, In2, R2> ): Schedule<Out2, In & In2, R | R2> } = internal.zipRight /** * Equivalent to `intersect` followed by `map`. * * @since 2.0.0 * @category zipping */ export const zipWith: { <Out2, In2, R2, Out, Out3>( that: Schedule<Out2, In2, R2>, f: (out: Out, out2: Out2) => Out3 ): <In, R>(self: Schedule<Out, In, R>) => Schedule<Out3, In & In2, R2 | R> <Out, In, R, Out2, In2, R2, Out3>( self: Schedule<Out, In, R>, that: Schedule<Out2, In2, R2>, f: (out: Out, out2: Out2) => Out3 ): Schedule<Out3, In & In2, R | R2> } = internal.zipWith