/** * @since 2.0.0 */ import type * as Cause from "./Cause.js" import type * as Channel from "./Channel.js" import type * as Chunk from "./Chunk.js" import type * as Context from "./Context.js" import type * as Deferred from "./Deferred.js" import type * as Duration from "./Duration.js" import type * as Effect from "./Effect.js" import type * as Either from "./Either.js" import type { ExecutionPlan } from "./ExecutionPlan.js" import type * as Exit from "./Exit.js" import type { LazyArg } from "./Function.js" import type * as GroupBy from "./GroupBy.js" import type { TypeLambda } from "./HKT.js" import * as groupBy_ from "./internal/groupBy.js" import * as internal from "./internal/stream.js" import type * as Layer from "./Layer.js" import type * as Option from "./Option.js" import type * as Order from "./Order.js" import type { Pipeable } from "./Pipeable.js" import type { Predicate, Refinement } from "./Predicate.js" import type * as PubSub from "./PubSub.js" import type * as Queue from "./Queue.js" import type { Runtime } from "./Runtime.js" import type * as Schedule from "./Schedule.js" import type * as Scope from "./Scope.js" import type * as Sink from "./Sink.js" import type * as Emit from "./StreamEmit.js" import type * as HaltStrategy from "./StreamHaltStrategy.js" import type * as Take from "./Take.js" import type { TPubSub } from "./TPubSub.js" import type { TDequeue } from "./TQueue.js" import type * as Tracer from "./Tracer.js" import type { Covariant, NoInfer, TupleOf } from "./Types.js" import type * as Unify from "./Unify.js" /** * @since 2.0.0 * @category symbols */ export const StreamTypeId: unique symbol = internal.StreamTypeId /** * @since 2.0.0 * @category symbols */ export type StreamTypeId = typeof StreamTypeId /** * A `Stream` is a description of a program that, when evaluated, may * emit zero or more values of type `A`, may fail with errors of type `E`, and * uses an context of type `R`. One way to think of `Stream` is as a * `Effect` program that could emit multiple values. * * `Stream` is a purely functional *pull* based stream. Pull based streams offer * inherent laziness and backpressure, relieving users of the need to manage * buffers between operators. As an optimization, `Stream` does not emit * single values, but rather an array of values. This allows the cost of effect * evaluation to be amortized. * * `Stream` forms a monad on its `A` type parameter, and has error management * facilities for its `E` type parameter, modeled similarly to `Effect` (with * some adjustments for the multiple-valued nature of `Stream`). These aspects * allow for rich and expressive composition of streams. * * @since 2.0.0 * @category models */ export interface Stream extends Stream.Variance, Pipeable { [Unify.typeSymbol]?: unknown [Unify.unifySymbol]?: StreamUnify [Unify.ignoreSymbol]?: StreamUnifyIgnore } /** * @since 2.0.0 * @category models */ export interface StreamUnify extends Effect.EffectUnify { Stream?: () => A[Unify.typeSymbol] extends Stream | infer _ ? Stream : never } /** * @category models * @since 2.0.0 */ export interface StreamUnifyIgnore extends Effect.EffectUnifyIgnore { Effect?: true } /** * @since 2.0.0 * @category models */ declare module "./Effect.js" { interface Effect extends Stream {} } /** * @category type lambdas * @since 2.0.0 */ export interface StreamTypeLambda extends TypeLambda { readonly type: Stream } /** * @since 2.0.0 */ export declare namespace Stream { /** * @since 2.0.0 * @category models */ export interface Variance { readonly [StreamTypeId]: VarianceStruct } /** * @since 3.4.0 * @category models */ export interface VarianceStruct { readonly _A: Covariant readonly _E: Covariant readonly _R: Covariant } /** * @since 3.4.0 * @category type-level */ export type Success> = [T] extends [Stream] ? _A : never /** * @since 3.4.0 * @category type-level */ export type Error> = [T] extends [Stream] ? _E : never /** * @since 3.4.0 * @category type-level */ export type Context> = [T] extends [Stream] ? _R : never /** * @since 2.0.0 * @category models * @deprecated use Types.TupleOf instead */ export type DynamicTuple = N extends N ? number extends N ? Array : DynamicTupleOf : never /** * @since 2.0.0 * @category models * @deprecated use Types.TupleOf instead */ export type DynamicTupleOf> = R["length"] extends N ? R : DynamicTupleOf } /** * The default chunk size used by the various combinators and constructors of * `Stream`. * * @since 2.0.0 * @category constants */ export const DefaultChunkSize: number = internal.DefaultChunkSize /** * Collects each underlying Chunk of the stream into a new chunk, and emits it * on each pull. * * @since 2.0.0 * @category utils */ export const accumulate: (self: Stream) => Stream, E, R> = internal.accumulate /** * Re-chunks the elements of the stream by accumulating each underlying chunk. * * @since 2.0.0 * @category utils */ export const accumulateChunks: (self: Stream) => Stream = internal.accumulateChunks /** * Creates a stream from a single value that will get cleaned up after the * stream is consumed. * * @example * ```ts * import { Console, Effect, Stream } from "effect" * * // Simulating File operations * const open = (filename: string) => * Effect.gen(function*() { * yield* Console.log(`Opening ${filename}`) * return { * getLines: Effect.succeed(["Line 1", "Line 2", "Line 3"]), * close: Console.log(`Closing ${filename}`) * } * }) * * const stream = Stream.acquireRelease( * open("file.txt"), * (file) => file.close * ).pipe(Stream.flatMap((file) => file.getLines)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // Opening file.txt * // Closing file.txt * // { _id: 'Chunk', values: [ [ 'Line 1', 'Line 2', 'Line 3' ] ] } * ``` * * @since 2.0.0 * @category constructors */ export const acquireRelease: ( acquire: Effect.Effect, release: (resource: A, exit: Exit.Exit) => Effect.Effect ) => Stream = internal.acquireRelease /** * Aggregates elements of this stream using the provided sink for as long as * the downstream operators on the stream are busy. * * This operator divides the stream into two asynchronous "islands". Operators * upstream of this operator run on one fiber, while downstream operators run * on another. Whenever the downstream fiber is busy processing elements, the * upstream fiber will feed elements into the sink until it signals * completion. * * Any sink can be used here, but see `Sink.foldWeightedEffect` and * `Sink.foldUntilEffect` for sinks that cover the common usecases. * * @since 2.0.0 * @category utils */ export const aggregate: { /** * Aggregates elements of this stream using the provided sink for as long as * the downstream operators on the stream are busy. * * This operator divides the stream into two asynchronous "islands". Operators * upstream of this operator run on one fiber, while downstream operators run * on another. Whenever the downstream fiber is busy processing elements, the * upstream fiber will feed elements into the sink until it signals * completion. * * Any sink can be used here, but see `Sink.foldWeightedEffect` and * `Sink.foldUntilEffect` for sinks that cover the common usecases. * * @since 2.0.0 * @category utils */ (sink: Sink.Sink): (self: Stream) => Stream /** * Aggregates elements of this stream using the provided sink for as long as * the downstream operators on the stream are busy. * * This operator divides the stream into two asynchronous "islands". Operators * upstream of this operator run on one fiber, while downstream operators run * on another. Whenever the downstream fiber is busy processing elements, the * upstream fiber will feed elements into the sink until it signals * completion. * * Any sink can be used here, but see `Sink.foldWeightedEffect` and * `Sink.foldUntilEffect` for sinks that cover the common usecases. * * @since 2.0.0 * @category utils */ (self: Stream, sink: Sink.Sink): Stream } = internal.aggregate /** * Like {@link aggregateWithinEither}, but only returns the `Right` results. * * @since 2.0.0 * @category utils */ export const aggregateWithin: { /** * Like {@link aggregateWithinEither}, but only returns the `Right` results. * * @since 2.0.0 * @category utils */ ( sink: Sink.Sink, schedule: Schedule.Schedule, R3> ): (self: Stream) => Stream /** * Like {@link aggregateWithinEither}, but only returns the `Right` results. * * @since 2.0.0 * @category utils */ ( self: Stream, sink: Sink.Sink, schedule: Schedule.Schedule, R3> ): Stream } = internal.aggregateWithin /** * Aggregates elements using the provided sink until it completes, or until * the delay signalled by the schedule has passed. * * This operator divides the stream into two asynchronous islands. Operators * upstream of this operator run on one fiber, while downstream operators run * on another. Elements will be aggregated by the sink until the downstream * fiber pulls the aggregated value, or until the schedule's delay has passed. * * Aggregated elements will be fed into the schedule to determine the delays * between pulls. * * @since 2.0.0 * @category utils */ export const aggregateWithinEither: { /** * Aggregates elements using the provided sink until it completes, or until * the delay signalled by the schedule has passed. * * This operator divides the stream into two asynchronous islands. Operators * upstream of this operator run on one fiber, while downstream operators run * on another. Elements will be aggregated by the sink until the downstream * fiber pulls the aggregated value, or until the schedule's delay has passed. * * Aggregated elements will be fed into the schedule to determine the delays * between pulls. * * @since 2.0.0 * @category utils */ ( sink: Sink.Sink, schedule: Schedule.Schedule, R3> ): (self: Stream) => Stream, E2 | E, R2 | R3 | R> /** * Aggregates elements using the provided sink until it completes, or until * the delay signalled by the schedule has passed. * * This operator divides the stream into two asynchronous islands. Operators * upstream of this operator run on one fiber, while downstream operators run * on another. Elements will be aggregated by the sink until the downstream * fiber pulls the aggregated value, or until the schedule's delay has passed. * * Aggregated elements will be fed into the schedule to determine the delays * between pulls. * * @since 2.0.0 * @category utils */ ( self: Stream, sink: Sink.Sink, schedule: Schedule.Schedule, R3> ): Stream, E | E2, R | R2 | R3> } = internal.aggregateWithinEither /** * Maps the success values of this stream to the specified constant value. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.range(1, 5).pipe(Stream.as(null)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ null, null, null, null, null ] } * ``` * * @since 2.0.0 * @category mapping */ export const as: { /** * Maps the success values of this stream to the specified constant value. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.range(1, 5).pipe(Stream.as(null)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ null, null, null, null, null ] } * ``` * * @since 2.0.0 * @category mapping */ (value: B): (self: Stream) => Stream /** * Maps the success values of this stream to the specified constant value. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.range(1, 5).pipe(Stream.as(null)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ null, null, null, null, null ] } * ``` * * @since 2.0.0 * @category mapping */ (self: Stream, value: B): Stream } = internal.as const _async: ( register: (emit: Emit.Emit) => Effect.Effect | void, bufferSize?: number | "unbounded" | { readonly bufferSize?: number | undefined readonly strategy?: "dropping" | "sliding" | "suspend" | undefined } | undefined ) => Stream = internal._async export { /** * Creates a stream from an asynchronous callback that can be called multiple * times. The optionality of the error type `E` in `Emit` can be used to * signal the end of the stream by setting it to `None`. * * The registration function can optionally return an `Effect`, which will be * executed if the `Fiber` executing this Effect is interrupted. * * @example * ```ts * import type { StreamEmit } from "effect" * import { Chunk, Effect, Option, Stream } from "effect" * * const events = [1, 2, 3, 4] * * const stream = Stream.async( * (emit: StreamEmit.Emit) => { * events.forEach((n) => { * setTimeout(() => { * if (n === 3) { * emit(Effect.fail(Option.none())) // Terminate the stream * } else { * emit(Effect.succeed(Chunk.of(n))) // Add the current item to the stream * } * }, 100 * n) * }) * } * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 2 ] } * * ``` * @since 2.0.0 * @category constructors */ _async as async } /** * Creates a stream from an asynchronous callback that can be called multiple * times The registration of the callback itself returns an effect. The * optionality of the error type `E` can be used to signal the end of the * stream, by setting it to `None`. * * @since 2.0.0 * @category constructors */ export const asyncEffect: ( register: (emit: Emit.Emit) => Effect.Effect, bufferSize?: number | "unbounded" | { readonly bufferSize?: number | undefined readonly strategy?: "dropping" | "sliding" | "suspend" | undefined } | undefined ) => Stream = internal.asyncEffect /** * Creates a stream from an external push-based resource. * * You can use the `emit` helper to emit values to the stream. The `emit` helper * returns a boolean indicating whether the value was emitted or not. * * You can also use the `emit` helper to signal the end of the stream by * using apis such as `emit.end` or `emit.fail`. * * By default it uses an "unbounded" buffer size. * You can customize the buffer size and strategy by passing an object as the * second argument with the `bufferSize` and `strategy` fields. * * @example * ```ts * import { Effect, Stream } from "effect" * * Stream.asyncPush((emit) => * Effect.acquireRelease( * Effect.gen(function*() { * yield* Effect.log("subscribing") * return setInterval(() => emit.single("tick"), 1000) * }), * (handle) => * Effect.gen(function*() { * yield* Effect.log("unsubscribing") * clearInterval(handle) * }) * ), { bufferSize: 16, strategy: "dropping" }) * ``` * * @since 3.6.0 * @category constructors */ export const asyncPush: ( register: (emit: Emit.EmitOpsPush) => Effect.Effect, options?: { readonly bufferSize: "unbounded" } | { readonly bufferSize?: number | undefined readonly strategy?: "dropping" | "sliding" | undefined } | undefined ) => Stream> = internal.asyncPush /** * Creates a stream from an asynchronous callback that can be called multiple * times. The registration of the callback itself returns an a scoped * resource. The optionality of the error type `E` can be used to signal the * end of the stream, by setting it to `None`. * * @since 2.0.0 * @category constructors */ export const asyncScoped: ( register: (emit: Emit.Emit) => Effect.Effect, bufferSize?: number | "unbounded" | { readonly bufferSize?: number | undefined readonly strategy?: "dropping" | "sliding" | "suspend" | undefined } | undefined ) => Stream> = internal.asyncScoped /** * Returns a `Stream` that first collects `n` elements from the input `Stream`, * and then creates a new `Stream` using the specified function, and sends all * the following elements through that. * * @since 2.0.0 * @category sequencing */ export const branchAfter: { /** * Returns a `Stream` that first collects `n` elements from the input `Stream`, * and then creates a new `Stream` using the specified function, and sends all * the following elements through that. * * @since 2.0.0 * @category sequencing */ (n: number, f: (input: Chunk.Chunk) => Stream): (self: Stream) => Stream /** * Returns a `Stream` that first collects `n` elements from the input `Stream`, * and then creates a new `Stream` using the specified function, and sends all * the following elements through that. * * @since 2.0.0 * @category sequencing */ ( self: Stream, n: number, f: (input: Chunk.Chunk) => Stream ): Stream } = internal.branchAfter /** * Fan out the stream, producing a list of streams that have the same elements * as this stream. The driver stream will only ever advance the `maximumLag` * chunks before the slowest downstream stream. * * @example * ```ts * import { Console, Effect, Fiber, Schedule, Stream } from "effect" * * const numbers = Effect.scoped( * Stream.range(1, 20).pipe( * Stream.tap((n) => Console.log(`Emit ${n} element before broadcasting`)), * Stream.broadcast(2, 5), * Stream.flatMap(([first, second]) => * Effect.gen(function*() { * const fiber1 = yield* Stream.runFold(first, 0, (acc, e) => Math.max(acc, e)).pipe( * Effect.andThen((max) => Console.log(`Maximum: ${max}`)), * Effect.fork * ) * const fiber2 = yield* second.pipe( * Stream.schedule(Schedule.spaced("1 second")), * Stream.runForEach((n) => Console.log(`Logging to the Console: ${n}`)), * Effect.fork * ) * yield* Fiber.join(fiber1).pipe( * Effect.zip(Fiber.join(fiber2), { concurrent: true }) * ) * }) * ), * Stream.runCollect * ) * ) * * Effect.runPromise(numbers).then(console.log) * // Emit 1 element before broadcasting * // Emit 2 element before broadcasting * // Emit 3 element before broadcasting * // Emit 4 element before broadcasting * // Emit 5 element before broadcasting * // Emit 6 element before broadcasting * // Emit 7 element before broadcasting * // Emit 8 element before broadcasting * // Emit 9 element before broadcasting * // Emit 10 element before broadcasting * // Emit 11 element before broadcasting * // Logging to the Console: 1 * // Logging to the Console: 2 * // Logging to the Console: 3 * // Logging to the Console: 4 * // Logging to the Console: 5 * // Emit 12 element before broadcasting * // Emit 13 element before broadcasting * // Emit 14 element before broadcasting * // Emit 15 element before broadcasting * // Emit 16 element before broadcasting * // Logging to the Console: 6 * // Logging to the Console: 7 * // Logging to the Console: 8 * // Logging to the Console: 9 * // Logging to the Console: 10 * // Emit 17 element before broadcasting * // Emit 18 element before broadcasting * // Emit 19 element before broadcasting * // Emit 20 element before broadcasting * // Logging to the Console: 11 * // Logging to the Console: 12 * // Logging to the Console: 13 * // Logging to the Console: 14 * // Logging to the Console: 15 * // Maximum: 20 * // Logging to the Console: 16 * // Logging to the Console: 17 * // Logging to the Console: 18 * // Logging to the Console: 19 * // Logging to the Console: 20 * // { _id: 'Chunk', values: [ undefined ] } * ``` * * @since 2.0.0 * @category utils */ export const broadcast: { /** * Fan out the stream, producing a list of streams that have the same elements * as this stream. The driver stream will only ever advance the `maximumLag` * chunks before the slowest downstream stream. * * @example * ```ts * import { Console, Effect, Fiber, Schedule, Stream } from "effect" * * const numbers = Effect.scoped( * Stream.range(1, 20).pipe( * Stream.tap((n) => Console.log(`Emit ${n} element before broadcasting`)), * Stream.broadcast(2, 5), * Stream.flatMap(([first, second]) => * Effect.gen(function*() { * const fiber1 = yield* Stream.runFold(first, 0, (acc, e) => Math.max(acc, e)).pipe( * Effect.andThen((max) => Console.log(`Maximum: ${max}`)), * Effect.fork * ) * const fiber2 = yield* second.pipe( * Stream.schedule(Schedule.spaced("1 second")), * Stream.runForEach((n) => Console.log(`Logging to the Console: ${n}`)), * Effect.fork * ) * yield* Fiber.join(fiber1).pipe( * Effect.zip(Fiber.join(fiber2), { concurrent: true }) * ) * }) * ), * Stream.runCollect * ) * ) * * Effect.runPromise(numbers).then(console.log) * // Emit 1 element before broadcasting * // Emit 2 element before broadcasting * // Emit 3 element before broadcasting * // Emit 4 element before broadcasting * // Emit 5 element before broadcasting * // Emit 6 element before broadcasting * // Emit 7 element before broadcasting * // Emit 8 element before broadcasting * // Emit 9 element before broadcasting * // Emit 10 element before broadcasting * // Emit 11 element before broadcasting * // Logging to the Console: 1 * // Logging to the Console: 2 * // Logging to the Console: 3 * // Logging to the Console: 4 * // Logging to the Console: 5 * // Emit 12 element before broadcasting * // Emit 13 element before broadcasting * // Emit 14 element before broadcasting * // Emit 15 element before broadcasting * // Emit 16 element before broadcasting * // Logging to the Console: 6 * // Logging to the Console: 7 * // Logging to the Console: 8 * // Logging to the Console: 9 * // Logging to the Console: 10 * // Emit 17 element before broadcasting * // Emit 18 element before broadcasting * // Emit 19 element before broadcasting * // Emit 20 element before broadcasting * // Logging to the Console: 11 * // Logging to the Console: 12 * // Logging to the Console: 13 * // Logging to the Console: 14 * // Logging to the Console: 15 * // Maximum: 20 * // Logging to the Console: 16 * // Logging to the Console: 17 * // Logging to the Console: 18 * // Logging to the Console: 19 * // Logging to the Console: 20 * // { _id: 'Chunk', values: [ undefined ] } * ``` * * @since 2.0.0 * @category utils */ ( n: N, maximumLag: number | { readonly capacity: "unbounded"; readonly replay?: number | undefined } | { readonly capacity: number readonly strategy?: "sliding" | "dropping" | "suspend" | undefined readonly replay?: number | undefined } ): (self: Stream) => Effect.Effect>, never, Scope.Scope | R> /** * Fan out the stream, producing a list of streams that have the same elements * as this stream. The driver stream will only ever advance the `maximumLag` * chunks before the slowest downstream stream. * * @example * ```ts * import { Console, Effect, Fiber, Schedule, Stream } from "effect" * * const numbers = Effect.scoped( * Stream.range(1, 20).pipe( * Stream.tap((n) => Console.log(`Emit ${n} element before broadcasting`)), * Stream.broadcast(2, 5), * Stream.flatMap(([first, second]) => * Effect.gen(function*() { * const fiber1 = yield* Stream.runFold(first, 0, (acc, e) => Math.max(acc, e)).pipe( * Effect.andThen((max) => Console.log(`Maximum: ${max}`)), * Effect.fork * ) * const fiber2 = yield* second.pipe( * Stream.schedule(Schedule.spaced("1 second")), * Stream.runForEach((n) => Console.log(`Logging to the Console: ${n}`)), * Effect.fork * ) * yield* Fiber.join(fiber1).pipe( * Effect.zip(Fiber.join(fiber2), { concurrent: true }) * ) * }) * ), * Stream.runCollect * ) * ) * * Effect.runPromise(numbers).then(console.log) * // Emit 1 element before broadcasting * // Emit 2 element before broadcasting * // Emit 3 element before broadcasting * // Emit 4 element before broadcasting * // Emit 5 element before broadcasting * // Emit 6 element before broadcasting * // Emit 7 element before broadcasting * // Emit 8 element before broadcasting * // Emit 9 element before broadcasting * // Emit 10 element before broadcasting * // Emit 11 element before broadcasting * // Logging to the Console: 1 * // Logging to the Console: 2 * // Logging to the Console: 3 * // Logging to the Console: 4 * // Logging to the Console: 5 * // Emit 12 element before broadcasting * // Emit 13 element before broadcasting * // Emit 14 element before broadcasting * // Emit 15 element before broadcasting * // Emit 16 element before broadcasting * // Logging to the Console: 6 * // Logging to the Console: 7 * // Logging to the Console: 8 * // Logging to the Console: 9 * // Logging to the Console: 10 * // Emit 17 element before broadcasting * // Emit 18 element before broadcasting * // Emit 19 element before broadcasting * // Emit 20 element before broadcasting * // Logging to the Console: 11 * // Logging to the Console: 12 * // Logging to the Console: 13 * // Logging to the Console: 14 * // Logging to the Console: 15 * // Maximum: 20 * // Logging to the Console: 16 * // Logging to the Console: 17 * // Logging to the Console: 18 * // Logging to the Console: 19 * // Logging to the Console: 20 * // { _id: 'Chunk', values: [ undefined ] } * ``` * * @since 2.0.0 * @category utils */ ( self: Stream, n: N, maximumLag: number | { readonly capacity: "unbounded"; readonly replay?: number | undefined } | { readonly capacity: number readonly strategy?: "sliding" | "dropping" | "suspend" | undefined readonly replay?: number | undefined } ): Effect.Effect>, never, Scope.Scope | R> } = internal.broadcast /** * Returns a new Stream that multicasts the original Stream, subscribing to it as soon as the first consumer subscribes. * As long as there is at least one consumer, the upstream will continue running and emitting data. * When all consumers have exited, the upstream will be finalized. * * @since 3.8.0 * @category utils */ export const share: { /** * Returns a new Stream that multicasts the original Stream, subscribing to it as soon as the first consumer subscribes. * As long as there is at least one consumer, the upstream will continue running and emitting data. * When all consumers have exited, the upstream will be finalized. * * @since 3.8.0 * @category utils */ ( config: { readonly capacity: "unbounded" readonly replay?: number | undefined readonly idleTimeToLive?: Duration.DurationInput | undefined } | { readonly capacity: number readonly strategy?: "sliding" | "dropping" | "suspend" | undefined readonly replay?: number | undefined readonly idleTimeToLive?: Duration.DurationInput | undefined } ): (self: Stream) => Effect.Effect, never, R | Scope.Scope> /** * Returns a new Stream that multicasts the original Stream, subscribing to it as soon as the first consumer subscribes. * As long as there is at least one consumer, the upstream will continue running and emitting data. * When all consumers have exited, the upstream will be finalized. * * @since 3.8.0 * @category utils */ ( self: Stream, config: { readonly capacity: "unbounded" readonly replay?: number | undefined readonly idleTimeToLive?: Duration.DurationInput | undefined } | { readonly capacity: number readonly strategy?: "sliding" | "dropping" | "suspend" | undefined readonly replay?: number | undefined readonly idleTimeToLive?: Duration.DurationInput | undefined } ): Effect.Effect, never, R | Scope.Scope> } = internal.share /** * Fan out the stream, producing a dynamic number of streams that have the * same elements as this stream. The driver stream will only ever advance the * `maximumLag` chunks before the slowest downstream stream. * * @since 2.0.0 * @category utils */ export const broadcastDynamic: { /** * Fan out the stream, producing a dynamic number of streams that have the * same elements as this stream. The driver stream will only ever advance the * `maximumLag` chunks before the slowest downstream stream. * * @since 2.0.0 * @category utils */ ( maximumLag: number | { readonly capacity: "unbounded"; readonly replay?: number | undefined } | { readonly capacity: number readonly strategy?: "sliding" | "dropping" | "suspend" | undefined readonly replay?: number | undefined } ): (self: Stream) => Effect.Effect, never, Scope.Scope | R> /** * Fan out the stream, producing a dynamic number of streams that have the * same elements as this stream. The driver stream will only ever advance the * `maximumLag` chunks before the slowest downstream stream. * * @since 2.0.0 * @category utils */ ( self: Stream, maximumLag: number | { readonly capacity: "unbounded"; readonly replay?: number | undefined } | { readonly capacity: number readonly strategy?: "sliding" | "dropping" | "suspend" | undefined readonly replay?: number | undefined } ): Effect.Effect, never, Scope.Scope | R> } = internal.broadcastDynamic /** * Converts the stream to a scoped list of queues. Every value will be * replicated to every queue with the slowest queue being allowed to buffer * `maximumLag` chunks before the driver is back pressured. * * Queues can unsubscribe from upstream by shutting down. * * @since 2.0.0 * @category utils */ export const broadcastedQueues: { /** * Converts the stream to a scoped list of queues. Every value will be * replicated to every queue with the slowest queue being allowed to buffer * `maximumLag` chunks before the driver is back pressured. * * Queues can unsubscribe from upstream by shutting down. * * @since 2.0.0 * @category utils */ ( n: N, maximumLag: number | { readonly capacity: "unbounded"; readonly replay?: number | undefined } | { readonly capacity: number readonly strategy?: "sliding" | "dropping" | "suspend" | undefined readonly replay?: number | undefined } ): ( self: Stream ) => Effect.Effect>>, never, Scope.Scope | R> /** * Converts the stream to a scoped list of queues. Every value will be * replicated to every queue with the slowest queue being allowed to buffer * `maximumLag` chunks before the driver is back pressured. * * Queues can unsubscribe from upstream by shutting down. * * @since 2.0.0 * @category utils */ ( self: Stream, n: N, maximumLag: number | { readonly capacity: "unbounded"; readonly replay?: number | undefined } | { readonly capacity: number readonly strategy?: "sliding" | "dropping" | "suspend" | undefined readonly replay?: number | undefined } ): Effect.Effect>>, never, Scope.Scope | R> } = internal.broadcastedQueues /** * Converts the stream to a scoped dynamic amount of queues. Every chunk will * be replicated to every queue with the slowest queue being allowed to buffer * `maximumLag` chunks before the driver is back pressured. * * Queues can unsubscribe from upstream by shutting down. * * @since 2.0.0 * @category utils */ export const broadcastedQueuesDynamic: { /** * Converts the stream to a scoped dynamic amount of queues. Every chunk will * be replicated to every queue with the slowest queue being allowed to buffer * `maximumLag` chunks before the driver is back pressured. * * Queues can unsubscribe from upstream by shutting down. * * @since 2.0.0 * @category utils */ ( maximumLag: number | { readonly capacity: "unbounded"; readonly replay?: number | undefined } | { readonly capacity: number readonly strategy?: "sliding" | "dropping" | "suspend" | undefined readonly replay?: number | undefined } ): ( self: Stream ) => Effect.Effect>, never, Scope.Scope>, never, Scope.Scope | R> /** * Converts the stream to a scoped dynamic amount of queues. Every chunk will * be replicated to every queue with the slowest queue being allowed to buffer * `maximumLag` chunks before the driver is back pressured. * * Queues can unsubscribe from upstream by shutting down. * * @since 2.0.0 * @category utils */ ( self: Stream, maximumLag: number | { readonly capacity: "unbounded"; readonly replay?: number | undefined } | { readonly capacity: number readonly strategy?: "sliding" | "dropping" | "suspend" | undefined readonly replay?: number | undefined } ): Effect.Effect>, never, Scope.Scope>, never, Scope.Scope | R> } = internal.broadcastedQueuesDynamic /** * Allows a faster producer to progress independently of a slower consumer by * buffering up to `capacity` elements in a queue. * * Note: This combinator destroys the chunking structure. It's recommended to * use rechunk afterwards. Additionally, prefer capacities that are powers * of 2 for better performance. * * @example * ```ts * import { Console, Effect, Schedule, Stream } from "effect" * * const stream = Stream.range(1, 10).pipe( * Stream.tap((n) => Console.log(`before buffering: ${n}`)), * Stream.buffer({ capacity: 4 }), * Stream.tap((n) => Console.log(`after buffering: ${n}`)), * Stream.schedule(Schedule.spaced("5 seconds")) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // before buffering: 1 * // before buffering: 2 * // before buffering: 3 * // before buffering: 4 * // before buffering: 5 * // before buffering: 6 * // after buffering: 1 * // after buffering: 2 * // before buffering: 7 * // after buffering: 3 * // before buffering: 8 * // after buffering: 4 * // before buffering: 9 * // after buffering: 5 * // before buffering: 10 * // ... * ``` * * @since 2.0.0 * @category utils */ export const buffer: { /** * Allows a faster producer to progress independently of a slower consumer by * buffering up to `capacity` elements in a queue. * * Note: This combinator destroys the chunking structure. It's recommended to * use rechunk afterwards. Additionally, prefer capacities that are powers * of 2 for better performance. * * @example * ```ts * import { Console, Effect, Schedule, Stream } from "effect" * * const stream = Stream.range(1, 10).pipe( * Stream.tap((n) => Console.log(`before buffering: ${n}`)), * Stream.buffer({ capacity: 4 }), * Stream.tap((n) => Console.log(`after buffering: ${n}`)), * Stream.schedule(Schedule.spaced("5 seconds")) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // before buffering: 1 * // before buffering: 2 * // before buffering: 3 * // before buffering: 4 * // before buffering: 5 * // before buffering: 6 * // after buffering: 1 * // after buffering: 2 * // before buffering: 7 * // after buffering: 3 * // before buffering: 8 * // after buffering: 4 * // before buffering: 9 * // after buffering: 5 * // before buffering: 10 * // ... * ``` * * @since 2.0.0 * @category utils */ ( options: { readonly capacity: "unbounded" } | { readonly capacity: number readonly strategy?: "dropping" | "sliding" | "suspend" | undefined } ): (self: Stream) => Stream /** * Allows a faster producer to progress independently of a slower consumer by * buffering up to `capacity` elements in a queue. * * Note: This combinator destroys the chunking structure. It's recommended to * use rechunk afterwards. Additionally, prefer capacities that are powers * of 2 for better performance. * * @example * ```ts * import { Console, Effect, Schedule, Stream } from "effect" * * const stream = Stream.range(1, 10).pipe( * Stream.tap((n) => Console.log(`before buffering: ${n}`)), * Stream.buffer({ capacity: 4 }), * Stream.tap((n) => Console.log(`after buffering: ${n}`)), * Stream.schedule(Schedule.spaced("5 seconds")) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // before buffering: 1 * // before buffering: 2 * // before buffering: 3 * // before buffering: 4 * // before buffering: 5 * // before buffering: 6 * // after buffering: 1 * // after buffering: 2 * // before buffering: 7 * // after buffering: 3 * // before buffering: 8 * // after buffering: 4 * // before buffering: 9 * // after buffering: 5 * // before buffering: 10 * // ... * ``` * * @since 2.0.0 * @category utils */ ( self: Stream, options: { readonly capacity: "unbounded" } | { readonly capacity: number readonly strategy?: "dropping" | "sliding" | "suspend" | undefined } ): Stream } = internal.buffer /** * Allows a faster producer to progress independently of a slower consumer by * buffering up to `capacity` chunks in a queue. * * @note Prefer capacities that are powers of 2 for better performance. * @since 2.0.0 * @category utils */ export const bufferChunks: { /** * Allows a faster producer to progress independently of a slower consumer by * buffering up to `capacity` chunks in a queue. * * @note Prefer capacities that are powers of 2 for better performance. * @since 2.0.0 * @category utils */ ( options: { readonly capacity: number; readonly strategy?: "dropping" | "sliding" | "suspend" | undefined } ): (self: Stream) => Stream /** * Allows a faster producer to progress independently of a slower consumer by * buffering up to `capacity` chunks in a queue. * * @note Prefer capacities that are powers of 2 for better performance. * @since 2.0.0 * @category utils */ ( self: Stream, options: { readonly capacity: number; readonly strategy?: "dropping" | "sliding" | "suspend" | undefined } ): Stream } = internal.bufferChunks /** * Switches over to the stream produced by the provided function in case this * one fails with a typed error. * * @since 2.0.0 * @category error handling */ export const catchAll: { /** * Switches over to the stream produced by the provided function in case this * one fails with a typed error. * * @since 2.0.0 * @category error handling */ (f: (error: E) => Stream): (self: Stream) => Stream /** * Switches over to the stream produced by the provided function in case this * one fails with a typed error. * * @since 2.0.0 * @category error handling */ (self: Stream, f: (error: E) => Stream): Stream } = internal.catchAll /** * Switches over to the stream produced by the provided function in case this * one fails. Allows recovery from all causes of failure, including * interruption if the stream is uninterruptible. * * @since 2.0.0 * @category error handling */ export const catchAllCause: { /** * Switches over to the stream produced by the provided function in case this * one fails. Allows recovery from all causes of failure, including * interruption if the stream is uninterruptible. * * @since 2.0.0 * @category error handling */ (f: (cause: Cause.Cause) => Stream): (self: Stream) => Stream /** * Switches over to the stream produced by the provided function in case this * one fails. Allows recovery from all causes of failure, including * interruption if the stream is uninterruptible. * * @since 2.0.0 * @category error handling */ (self: Stream, f: (cause: Cause.Cause) => Stream): Stream } = internal.catchAllCause /** * Switches over to the stream produced by the provided function in case this * one fails with some typed error. * * @since 2.0.0 * @category error handling */ export const catchSome: { /** * Switches over to the stream produced by the provided function in case this * one fails with some typed error. * * @since 2.0.0 * @category error handling */ (pf: (error: E) => Option.Option>): (self: Stream) => Stream /** * Switches over to the stream produced by the provided function in case this * one fails with some typed error. * * @since 2.0.0 * @category error handling */ (self: Stream, pf: (error: E) => Option.Option>): Stream } = internal.catchSome /** * Switches over to the stream produced by the provided function in case this * one fails with an error matching the given `_tag`. * * @since 2.0.0 * @category error handling */ export const catchTag: { /** * Switches over to the stream produced by the provided function in case this * one fails with an error matching the given `_tag`. * * @since 2.0.0 * @category error handling */ (k: K, f: (e: Extract) => Stream): (self: Stream) => Stream, R1 | R> /** * Switches over to the stream produced by the provided function in case this * one fails with an error matching the given `_tag`. * * @since 2.0.0 * @category error handling */ ( self: Stream, k: K, f: (e: Extract) => Stream ): Stream, R | R1> } = internal.catchTag /** * Switches over to the stream produced by one of the provided functions, in * case this one fails with an error matching one of the given `_tag`'s. * * @since 2.0.0 * @category error handling */ export const catchTags: { /** * Switches over to the stream produced by one of the provided functions, in * case this one fails with an error matching one of the given `_tag`'s. * * @since 2.0.0 * @category error handling */ < E extends { _tag: string }, Cases extends { [K in E["_tag"]]+?: (error: Extract) => Stream } >(cases: Cases): ( self: Stream ) => Stream< | A | { [K in keyof Cases]: Cases[K] extends (...args: Array) => Stream.Variance ? A : never }[keyof Cases], | Exclude | { [K in keyof Cases]: Cases[K] extends (...args: Array) => Stream.Variance ? E : never }[keyof Cases], | R | { [K in keyof Cases]: Cases[K] extends (...args: Array) => Stream.Variance ? R : never }[keyof Cases] > /** * Switches over to the stream produced by one of the provided functions, in * case this one fails with an error matching one of the given `_tag`'s. * * @since 2.0.0 * @category error handling */ < A, E extends { _tag: string }, R, Cases extends { [K in E["_tag"]]+?: (error: Extract) => Stream } >(self: Stream, cases: Cases): Stream< | A | { [K in keyof Cases]: Cases[K] extends (...args: Array) => Stream.Variance ? A : never }[keyof Cases], | Exclude | { [K in keyof Cases]: Cases[K] extends (...args: Array) => Stream.Variance ? E : never }[keyof Cases], | R | { [K in keyof Cases]: Cases[K] extends (...args: Array) => Stream.Variance ? R : never }[keyof Cases] > } = internal.catchTags /** * Switches over to the stream produced by the provided function in case this * one fails with some errors. Allows recovery from all causes of failure, * including interruption if the stream is uninterruptible. * * @since 2.0.0 * @category error handling */ export const catchSomeCause: { /** * Switches over to the stream produced by the provided function in case this * one fails with some errors. Allows recovery from all causes of failure, * including interruption if the stream is uninterruptible. * * @since 2.0.0 * @category error handling */ (pf: (cause: Cause.Cause) => Option.Option>): (self: Stream) => Stream /** * Switches over to the stream produced by the provided function in case this * one fails with some errors. Allows recovery from all causes of failure, * including interruption if the stream is uninterruptible. * * @since 2.0.0 * @category error handling */ ( self: Stream, pf: (cause: Cause.Cause) => Option.Option> ): Stream } = internal.catchSomeCause /** * Returns a new stream that only emits elements that are not equal to the * previous element emitted, using natural equality to determine whether two * elements are equal. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.make(1, 1, 1, 2, 2, 3, 4).pipe(Stream.changes) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 2, 3, 4 ] } * ``` * * @since 2.0.0 * @category utils */ export const changes: (self: Stream) => Stream = internal.changes /** * Returns a new stream that only emits elements that are not equal to the * previous element emitted, using the specified function to determine whether * two elements are equal. * * @since 2.0.0 * @category utils */ export const changesWith: { /** * Returns a new stream that only emits elements that are not equal to the * previous element emitted, using the specified function to determine whether * two elements are equal. * * @since 2.0.0 * @category utils */ (f: (x: A, y: A) => boolean): (self: Stream) => Stream /** * Returns a new stream that only emits elements that are not equal to the * previous element emitted, using the specified function to determine whether * two elements are equal. * * @since 2.0.0 * @category utils */ (self: Stream, f: (x: A, y: A) => boolean): Stream } = internal.changesWith /** * Returns a new stream that only emits elements that are not equal to the * previous element emitted, using the specified effectual function to * determine whether two elements are equal. * * @since 2.0.0 * @category utils */ export const changesWithEffect: { /** * Returns a new stream that only emits elements that are not equal to the * previous element emitted, using the specified effectual function to * determine whether two elements are equal. * * @since 2.0.0 * @category utils */ (f: (x: A, y: A) => Effect.Effect): (self: Stream) => Stream /** * Returns a new stream that only emits elements that are not equal to the * previous element emitted, using the specified effectual function to * determine whether two elements are equal. * * @since 2.0.0 * @category utils */ (self: Stream, f: (x: A, y: A) => Effect.Effect): Stream } = internal.changesWithEffect /** * Exposes the underlying chunks of the stream as a stream of chunks of * elements. * * @since 2.0.0 * @category utils */ export const chunks: (self: Stream) => Stream, E, R> = internal.chunks /** * Performs the specified stream transformation with the chunk structure of * the stream exposed. * * @since 2.0.0 * @category utils */ export const chunksWith: { /** * Performs the specified stream transformation with the chunk structure of * the stream exposed. * * @since 2.0.0 * @category utils */ ( f: (stream: Stream, E, R>) => Stream, E2, R2> ): (self: Stream) => Stream /** * Performs the specified stream transformation with the chunk structure of * the stream exposed. * * @since 2.0.0 * @category utils */ ( self: Stream, f: (stream: Stream, E, R>) => Stream, E2, R2> ): Stream } = internal.chunksWith /** * Combines the elements from this stream and the specified stream by * repeatedly applying the function `f` to extract an element using both sides * and conceptually "offer" it to the destination stream. `f` can maintain * some internal state to control the combining process, with the initial * state being specified by `s`. * * Where possible, prefer `Stream.combineChunks` for a more efficient * implementation. * * @since 2.0.0 * @category utils */ export const combine: { /** * Combines the elements from this stream and the specified stream by * repeatedly applying the function `f` to extract an element using both sides * and conceptually "offer" it to the destination stream. `f` can maintain * some internal state to control the combining process, with the initial * state being specified by `s`. * * Where possible, prefer `Stream.combineChunks` for a more efficient * implementation. * * @since 2.0.0 * @category utils */ ( that: Stream, s: S, f: ( s: S, pullLeft: Effect.Effect, R3>, pullRight: Effect.Effect, R4> ) => Effect.Effect>, never, R5> ): (self: Stream) => Stream /** * Combines the elements from this stream and the specified stream by * repeatedly applying the function `f` to extract an element using both sides * and conceptually "offer" it to the destination stream. `f` can maintain * some internal state to control the combining process, with the initial * state being specified by `s`. * * Where possible, prefer `Stream.combineChunks` for a more efficient * implementation. * * @since 2.0.0 * @category utils */ ( self: Stream, that: Stream, s: S, f: ( s: S, pullLeft: Effect.Effect, R3>, pullRight: Effect.Effect, R4> ) => Effect.Effect>, never, R5> ): Stream } = internal.combine /** * Combines the chunks from this stream and the specified stream by repeatedly * applying the function `f` to extract a chunk using both sides and * conceptually "offer" it to the destination stream. `f` can maintain some * internal state to control the combining process, with the initial state * being specified by `s`. * * @since 2.0.0 * @category utils */ export const combineChunks: { /** * Combines the chunks from this stream and the specified stream by repeatedly * applying the function `f` to extract a chunk using both sides and * conceptually "offer" it to the destination stream. `f` can maintain some * internal state to control the combining process, with the initial state * being specified by `s`. * * @since 2.0.0 * @category utils */ ( that: Stream, s: S, f: ( s: S, pullLeft: Effect.Effect, Option.Option, R3>, pullRight: Effect.Effect, Option.Option, R4> ) => Effect.Effect, S], Option.Option>, never, R5> ): (self: Stream) => Stream /** * Combines the chunks from this stream and the specified stream by repeatedly * applying the function `f` to extract a chunk using both sides and * conceptually "offer" it to the destination stream. `f` can maintain some * internal state to control the combining process, with the initial state * being specified by `s`. * * @since 2.0.0 * @category utils */ ( self: Stream, that: Stream, s: S, f: ( s: S, pullLeft: Effect.Effect, Option.Option, R3>, pullRight: Effect.Effect, Option.Option, R4> ) => Effect.Effect, S], Option.Option>, never, R5> ): Stream } = internal.combineChunks /** * Concatenates the specified stream with this stream, resulting in a stream * that emits the elements from this stream and then the elements from the * specified stream. * * @example * ```ts * import { Effect, Stream } from "effect" * * const s1 = Stream.make(1, 2, 3) * const s2 = Stream.make(4, 5) * * const stream = Stream.concat(s1, s2) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 2, 3, 4, 5 ] } * ``` * * @since 2.0.0 * @category utils */ export const concat: { /** * Concatenates the specified stream with this stream, resulting in a stream * that emits the elements from this stream and then the elements from the * specified stream. * * @example * ```ts * import { Effect, Stream } from "effect" * * const s1 = Stream.make(1, 2, 3) * const s2 = Stream.make(4, 5) * * const stream = Stream.concat(s1, s2) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 2, 3, 4, 5 ] } * ``` * * @since 2.0.0 * @category utils */ (that: Stream): (self: Stream) => Stream /** * Concatenates the specified stream with this stream, resulting in a stream * that emits the elements from this stream and then the elements from the * specified stream. * * @example * ```ts * import { Effect, Stream } from "effect" * * const s1 = Stream.make(1, 2, 3) * const s2 = Stream.make(4, 5) * * const stream = Stream.concat(s1, s2) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 2, 3, 4, 5 ] } * ``` * * @since 2.0.0 * @category utils */ (self: Stream, that: Stream): Stream } = internal.concat /** * Concatenates all of the streams in the chunk to one stream. * * @example * ```ts * import { Chunk, Effect, Stream } from "effect" * * const s1 = Stream.make(1, 2, 3) * const s2 = Stream.make(4, 5) * const s3 = Stream.make(6, 7, 8) * * const stream = Stream.concatAll(Chunk.make(s1, s2, s3)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { * // _id: 'Chunk', * // values: [ * // 1, 2, 3, 4, * // 5, 6, 7, 8 * // ] * // } * ``` * * @since 2.0.0 * @category constructors */ export const concatAll: (streams: Chunk.Chunk>) => Stream = internal.concatAll /** * Composes this stream with the specified stream to create a cartesian * product of elements. The `right` stream would be run multiple times, for * every element in the `left` stream. * * See also `Stream.zip` for the more common point-wise variant. * * @example * ```ts * import { Effect, Stream } from "effect" * * const s1 = Stream.make(1, 2, 3) * const s2 = Stream.make("a", "b") * * const product = Stream.cross(s1, s2) * * Effect.runPromise(Stream.runCollect(product)).then(console.log) * // { * // _id: "Chunk", * // values: [ * // [ 1, "a" ], [ 1, "b" ], [ 2, "a" ], [ 2, "b" ], [ 3, "a" ], [ 3, "b" ] * // ] * // } * ``` * * @since 2.0.0 * @category utils */ export const cross: { /** * Composes this stream with the specified stream to create a cartesian * product of elements. The `right` stream would be run multiple times, for * every element in the `left` stream. * * See also `Stream.zip` for the more common point-wise variant. * * @example * ```ts * import { Effect, Stream } from "effect" * * const s1 = Stream.make(1, 2, 3) * const s2 = Stream.make("a", "b") * * const product = Stream.cross(s1, s2) * * Effect.runPromise(Stream.runCollect(product)).then(console.log) * // { * // _id: "Chunk", * // values: [ * // [ 1, "a" ], [ 1, "b" ], [ 2, "a" ], [ 2, "b" ], [ 3, "a" ], [ 3, "b" ] * // ] * // } * ``` * * @since 2.0.0 * @category utils */ (right: Stream): (left: Stream) => Stream<[AL, AR], EL | ER, RL | RR> /** * Composes this stream with the specified stream to create a cartesian * product of elements. The `right` stream would be run multiple times, for * every element in the `left` stream. * * See also `Stream.zip` for the more common point-wise variant. * * @example * ```ts * import { Effect, Stream } from "effect" * * const s1 = Stream.make(1, 2, 3) * const s2 = Stream.make("a", "b") * * const product = Stream.cross(s1, s2) * * Effect.runPromise(Stream.runCollect(product)).then(console.log) * // { * // _id: "Chunk", * // values: [ * // [ 1, "a" ], [ 1, "b" ], [ 2, "a" ], [ 2, "b" ], [ 3, "a" ], [ 3, "b" ] * // ] * // } * ``` * * @since 2.0.0 * @category utils */ (left: Stream, right: Stream): Stream<[AL, AR], EL | ER, RL | RR> } = internal.cross /** * Composes this stream with the specified stream to create a cartesian * product of elements, but keeps only elements from `left` stream. The `right` * stream would be run multiple times, for every element in the `left` stream. * * See also `Stream.zipLeft` for the more common point-wise variant. * * @since 2.0.0 * @category utils */ export const crossLeft: { /** * Composes this stream with the specified stream to create a cartesian * product of elements, but keeps only elements from `left` stream. The `right` * stream would be run multiple times, for every element in the `left` stream. * * See also `Stream.zipLeft` for the more common point-wise variant. * * @since 2.0.0 * @category utils */ (right: Stream): (left: Stream) => Stream /** * Composes this stream with the specified stream to create a cartesian * product of elements, but keeps only elements from `left` stream. The `right` * stream would be run multiple times, for every element in the `left` stream. * * See also `Stream.zipLeft` for the more common point-wise variant. * * @since 2.0.0 * @category utils */ (left: Stream, right: Stream): Stream } = internal.crossLeft /** * Composes this stream with the specified stream to create a cartesian * product of elements, but keeps only elements from the `right` stream. The * `left` stream would be run multiple times, for every element in the `right` * stream. * * See also `Stream.zipRight` for the more common point-wise variant. * * @since 2.0.0 * @category utils */ export const crossRight: { /** * Composes this stream with the specified stream to create a cartesian * product of elements, but keeps only elements from the `right` stream. The * `left` stream would be run multiple times, for every element in the `right` * stream. * * See also `Stream.zipRight` for the more common point-wise variant. * * @since 2.0.0 * @category utils */ (right: Stream): (left: Stream) => Stream /** * Composes this stream with the specified stream to create a cartesian * product of elements, but keeps only elements from the `right` stream. The * `left` stream would be run multiple times, for every element in the `right` * stream. * * See also `Stream.zipRight` for the more common point-wise variant. * * @since 2.0.0 * @category utils */ (left: Stream, right: Stream): Stream } = internal.crossRight /** * Composes this stream with the specified stream to create a cartesian * product of elements with a specified function. The `right` stream would be * run multiple times, for every element in the `left` stream. * * See also `Stream.zipWith` for the more common point-wise variant. * * @since 2.0.0 * @category utils */ export const crossWith: { /** * Composes this stream with the specified stream to create a cartesian * product of elements with a specified function. The `right` stream would be * run multiple times, for every element in the `left` stream. * * See also `Stream.zipWith` for the more common point-wise variant. * * @since 2.0.0 * @category utils */ (right: Stream, f: (left: AL, right: AR) => A): (left: Stream) => Stream /** * Composes this stream with the specified stream to create a cartesian * product of elements with a specified function. The `right` stream would be * run multiple times, for every element in the `left` stream. * * See also `Stream.zipWith` for the more common point-wise variant. * * @since 2.0.0 * @category utils */ ( left: Stream, right: Stream, f: (left: AL, right: AR) => A ): Stream } = internal.crossWith /** * Delays the emission of values by holding new values for a set duration. If * no new values arrive during that time the value is emitted, however if a * new value is received during the holding period the previous value is * discarded and the process is repeated with the new value. * * This operator is useful if you have a stream of "bursty" events which * eventually settle down and you only need the final event of the burst. For * example, a search engine may only want to initiate a search after a user * has paused typing so as to not prematurely recommend results. * * @example * ```ts * import { Effect, Stream } from "effect" * * let last = Date.now() * const log = (message: string) => * Effect.sync(() => { * const end = Date.now() * console.log(`${message} after ${end - last}ms`) * last = end * }) * * const stream = Stream.make(1, 2, 3).pipe( * Stream.concat( * Stream.fromEffect(Effect.sleep("200 millis").pipe(Effect.as(4))) // Emit 4 after 200 ms * ), * Stream.concat(Stream.make(5, 6)), // Continue with more rapid values * Stream.concat( * Stream.fromEffect(Effect.sleep("150 millis").pipe(Effect.as(7))) // Emit 7 after 150 ms * ), * Stream.concat(Stream.make(8)), * Stream.tap((n) => log(`Received ${n}`)), * Stream.debounce("100 millis"), // Only emit values after a pause of at least 100 milliseconds, * Stream.tap((n) => log(`> Emitted ${n}`)) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // Received 1 after 5ms * // Received 2 after 2ms * // Received 3 after 0ms * // > Emitted 3 after 104ms * // Received 4 after 99ms * // Received 5 after 1ms * // Received 6 after 0ms * // > Emitted 6 after 101ms * // Received 7 after 50ms * // Received 8 after 1ms * // > Emitted 8 after 101ms * // { _id: 'Chunk', values: [ 3, 6, 8 ] } * ``` * * @since 2.0.0 * @category utils */ export const debounce: { /** * Delays the emission of values by holding new values for a set duration. If * no new values arrive during that time the value is emitted, however if a * new value is received during the holding period the previous value is * discarded and the process is repeated with the new value. * * This operator is useful if you have a stream of "bursty" events which * eventually settle down and you only need the final event of the burst. For * example, a search engine may only want to initiate a search after a user * has paused typing so as to not prematurely recommend results. * * @example * ```ts * import { Effect, Stream } from "effect" * * let last = Date.now() * const log = (message: string) => * Effect.sync(() => { * const end = Date.now() * console.log(`${message} after ${end - last}ms`) * last = end * }) * * const stream = Stream.make(1, 2, 3).pipe( * Stream.concat( * Stream.fromEffect(Effect.sleep("200 millis").pipe(Effect.as(4))) // Emit 4 after 200 ms * ), * Stream.concat(Stream.make(5, 6)), // Continue with more rapid values * Stream.concat( * Stream.fromEffect(Effect.sleep("150 millis").pipe(Effect.as(7))) // Emit 7 after 150 ms * ), * Stream.concat(Stream.make(8)), * Stream.tap((n) => log(`Received ${n}`)), * Stream.debounce("100 millis"), // Only emit values after a pause of at least 100 milliseconds, * Stream.tap((n) => log(`> Emitted ${n}`)) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // Received 1 after 5ms * // Received 2 after 2ms * // Received 3 after 0ms * // > Emitted 3 after 104ms * // Received 4 after 99ms * // Received 5 after 1ms * // Received 6 after 0ms * // > Emitted 6 after 101ms * // Received 7 after 50ms * // Received 8 after 1ms * // > Emitted 8 after 101ms * // { _id: 'Chunk', values: [ 3, 6, 8 ] } * ``` * * @since 2.0.0 * @category utils */ (duration: Duration.DurationInput): (self: Stream) => Stream /** * Delays the emission of values by holding new values for a set duration. If * no new values arrive during that time the value is emitted, however if a * new value is received during the holding period the previous value is * discarded and the process is repeated with the new value. * * This operator is useful if you have a stream of "bursty" events which * eventually settle down and you only need the final event of the burst. For * example, a search engine may only want to initiate a search after a user * has paused typing so as to not prematurely recommend results. * * @example * ```ts * import { Effect, Stream } from "effect" * * let last = Date.now() * const log = (message: string) => * Effect.sync(() => { * const end = Date.now() * console.log(`${message} after ${end - last}ms`) * last = end * }) * * const stream = Stream.make(1, 2, 3).pipe( * Stream.concat( * Stream.fromEffect(Effect.sleep("200 millis").pipe(Effect.as(4))) // Emit 4 after 200 ms * ), * Stream.concat(Stream.make(5, 6)), // Continue with more rapid values * Stream.concat( * Stream.fromEffect(Effect.sleep("150 millis").pipe(Effect.as(7))) // Emit 7 after 150 ms * ), * Stream.concat(Stream.make(8)), * Stream.tap((n) => log(`Received ${n}`)), * Stream.debounce("100 millis"), // Only emit values after a pause of at least 100 milliseconds, * Stream.tap((n) => log(`> Emitted ${n}`)) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // Received 1 after 5ms * // Received 2 after 2ms * // Received 3 after 0ms * // > Emitted 3 after 104ms * // Received 4 after 99ms * // Received 5 after 1ms * // Received 6 after 0ms * // > Emitted 6 after 101ms * // Received 7 after 50ms * // Received 8 after 1ms * // > Emitted 8 after 101ms * // { _id: 'Chunk', values: [ 3, 6, 8 ] } * ``` * * @since 2.0.0 * @category utils */ (self: Stream, duration: Duration.DurationInput): Stream } = internal.debounce /** * The stream that dies with the specified defect. * * @since 2.0.0 * @category constructors */ export const die: (defect: unknown) => Stream = internal.die /** * The stream that dies with the specified lazily evaluated defect. * * @since 2.0.0 * @category constructors */ export const dieSync: (evaluate: LazyArg) => Stream = internal.dieSync /** * The stream that dies with an exception described by `message`. * * @since 2.0.0 * @category constructors */ export const dieMessage: (message: string) => Stream = internal.dieMessage /** * More powerful version of `Stream.broadcast`. Allows to provide a function * that determines what queues should receive which elements. The decide * function will receive the indices of the queues in the resulting list. * * @since 2.0.0 * @category utils */ export const distributedWith: { /** * More powerful version of `Stream.broadcast`. Allows to provide a function * that determines what queues should receive which elements. The decide * function will receive the indices of the queues in the resulting list. * * @since 2.0.0 * @category utils */ ( options: { readonly size: N readonly maximumLag: number readonly decide: (a: A) => Effect.Effect> } ): ( self: Stream ) => Effect.Effect>>>, never, Scope.Scope | R> /** * More powerful version of `Stream.broadcast`. Allows to provide a function * that determines what queues should receive which elements. The decide * function will receive the indices of the queues in the resulting list. * * @since 2.0.0 * @category utils */ ( self: Stream, options: { readonly size: N readonly maximumLag: number readonly decide: (a: A) => Effect.Effect> } ): Effect.Effect>>>, never, Scope.Scope | R> } = internal.distributedWith /** * More powerful version of `Stream.distributedWith`. This returns a function * that will produce new queues and corresponding indices. You can also * provide a function that will be executed after the final events are * enqueued in all queues. Shutdown of the queues is handled by the driver. * Downstream users can also shutdown queues manually. In this case the driver * will continue but no longer backpressure on them. * * @since 2.0.0 * @category utils */ export const distributedWithDynamic: { /** * More powerful version of `Stream.distributedWith`. This returns a function * that will produce new queues and corresponding indices. You can also * provide a function that will be executed after the final events are * enqueued in all queues. Shutdown of the queues is handled by the driver. * Downstream users can also shutdown queues manually. In this case the driver * will continue but no longer backpressure on them. * * @since 2.0.0 * @category utils */ ( options: { readonly maximumLag: number; readonly decide: (a: A) => Effect.Effect, never, never> } ): ( self: Stream ) => Effect.Effect< Effect.Effect<[number, Queue.Dequeue>>], never, never>, never, Scope.Scope | R > /** * More powerful version of `Stream.distributedWith`. This returns a function * that will produce new queues and corresponding indices. You can also * provide a function that will be executed after the final events are * enqueued in all queues. Shutdown of the queues is handled by the driver. * Downstream users can also shutdown queues manually. In this case the driver * will continue but no longer backpressure on them. * * @since 2.0.0 * @category utils */ ( self: Stream, options: { readonly maximumLag: number; readonly decide: (a: A) => Effect.Effect, never, never> } ): Effect.Effect< Effect.Effect<[number, Queue.Dequeue>>], never, never>, never, Scope.Scope | R > } = internal.distributedWithDynamic /** * Converts this stream to a stream that executes its effects but emits no * elements. Useful for sequencing effects using streams: * * @example * ```ts * import { Effect, Stream } from "effect" * * // We create a stream and immediately drain it. * const stream = Stream.range(1, 6).pipe(Stream.drain) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [] } * ``` * * @since 2.0.0 * @category utils */ export const drain: (self: Stream) => Stream = internal.drain /** * Drains the provided stream in the background for as long as this stream is * running. If this stream ends before `other`, `other` will be interrupted. * If `other` fails, this stream will fail with that error. * * @since 2.0.0 * @category utils */ export const drainFork: { /** * Drains the provided stream in the background for as long as this stream is * running. If this stream ends before `other`, `other` will be interrupted. * If `other` fails, this stream will fail with that error. * * @since 2.0.0 * @category utils */ (that: Stream): (self: Stream) => Stream /** * Drains the provided stream in the background for as long as this stream is * running. If this stream ends before `other`, `other` will be interrupted. * If `other` fails, this stream will fail with that error. * * @since 2.0.0 * @category utils */ (self: Stream, that: Stream): Stream } = internal.drainFork /** * Drops the specified number of elements from this stream. * * @since 2.0.0 * @category utils */ export const drop: { /** * Drops the specified number of elements from this stream. * * @since 2.0.0 * @category utils */ (n: number): (self: Stream) => Stream /** * Drops the specified number of elements from this stream. * * @since 2.0.0 * @category utils */ (self: Stream, n: number): Stream } = internal.drop /** * Drops the last specified number of elements from this stream. * * @note This combinator keeps `n` elements in memory. Be careful with big * numbers. * @since 2.0.0 * @category utils */ export const dropRight: { /** * Drops the last specified number of elements from this stream. * * @note This combinator keeps `n` elements in memory. Be careful with big * numbers. * @since 2.0.0 * @category utils */ (n: number): (self: Stream) => Stream /** * Drops the last specified number of elements from this stream. * * @note This combinator keeps `n` elements in memory. Be careful with big * numbers. * @since 2.0.0 * @category utils */ (self: Stream, n: number): Stream } = internal.dropRight /** * Drops all elements of the stream until the specified predicate evaluates to * `true`. * * @since 2.0.0 * @category utils */ export const dropUntil: { /** * Drops all elements of the stream until the specified predicate evaluates to * `true`. * * @since 2.0.0 * @category utils */ (predicate: Predicate>): (self: Stream) => Stream /** * Drops all elements of the stream until the specified predicate evaluates to * `true`. * * @since 2.0.0 * @category utils */ (self: Stream, predicate: Predicate): Stream } = internal.dropUntil /** * Drops all elements of the stream until the specified effectful predicate * evaluates to `true`. * * @since 2.0.0 * @category utils */ export const dropUntilEffect: { /** * Drops all elements of the stream until the specified effectful predicate * evaluates to `true`. * * @since 2.0.0 * @category utils */ (predicate: (a: NoInfer) => Effect.Effect): (self: Stream) => Stream /** * Drops all elements of the stream until the specified effectful predicate * evaluates to `true`. * * @since 2.0.0 * @category utils */ ( self: Stream, predicate: (a: NoInfer) => Effect.Effect ): Stream } = internal.dropUntilEffect /** * Drops all elements of the stream for as long as the specified predicate * evaluates to `true`. * * @since 2.0.0 * @category utils */ export const dropWhile: { /** * Drops all elements of the stream for as long as the specified predicate * evaluates to `true`. * * @since 2.0.0 * @category utils */ (predicate: Predicate>): (self: Stream) => Stream /** * Drops all elements of the stream for as long as the specified predicate * evaluates to `true`. * * @since 2.0.0 * @category utils */ (self: Stream, predicate: Predicate): Stream } = internal.dropWhile /** * Drops all elements of the stream for as long as the specified predicate * produces an effect that evalutates to `true` * * @since 2.0.0 * @category utils */ export const dropWhileEffect: { /** * Drops all elements of the stream for as long as the specified predicate * produces an effect that evalutates to `true` * * @since 2.0.0 * @category utils */ (predicate: (a: NoInfer) => Effect.Effect): (self: Stream) => Stream /** * Drops all elements of the stream for as long as the specified predicate * produces an effect that evalutates to `true` * * @since 2.0.0 * @category utils */ (self: Stream, predicate: (a: A) => Effect.Effect): Stream } = internal.dropWhileEffect /** * Returns a stream whose failures and successes have been lifted into an * `Either`. The resulting stream cannot fail, because the failures have been * exposed as part of the `Either` success case. * * @note The stream will end as soon as the first error occurs. * * @since 2.0.0 * @category utils */ export const either: (self: Stream) => Stream, never, R> = internal.either /** * The empty stream. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.empty * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [] } * ``` * * @since 2.0.0 * @category constructors */ export const empty: Stream = internal.empty /** * Executes the provided finalizer after this stream's finalizers run. * * @example * ```ts * import { Console, Effect, Stream } from "effect" * * const program = Stream.fromEffect(Console.log("Application Logic.")).pipe( * Stream.concat(Stream.finalizer(Console.log("Finalizing the stream"))), * Stream.ensuring( * Console.log("Doing some other works after stream's finalization") * ) * ) * * Effect.runPromise(Stream.runCollect(program)).then(console.log) * // Application Logic. * // Finalizing the stream * // Doing some other works after stream's finalization * // { _id: 'Chunk', values: [ undefined, undefined ] } * ``` * * @since 2.0.0 * @category utils */ export const ensuring: { /** * Executes the provided finalizer after this stream's finalizers run. * * @example * ```ts * import { Console, Effect, Stream } from "effect" * * const program = Stream.fromEffect(Console.log("Application Logic.")).pipe( * Stream.concat(Stream.finalizer(Console.log("Finalizing the stream"))), * Stream.ensuring( * Console.log("Doing some other works after stream's finalization") * ) * ) * * Effect.runPromise(Stream.runCollect(program)).then(console.log) * // Application Logic. * // Finalizing the stream * // Doing some other works after stream's finalization * // { _id: 'Chunk', values: [ undefined, undefined ] } * ``` * * @since 2.0.0 * @category utils */ (finalizer: Effect.Effect): (self: Stream) => Stream /** * Executes the provided finalizer after this stream's finalizers run. * * @example * ```ts * import { Console, Effect, Stream } from "effect" * * const program = Stream.fromEffect(Console.log("Application Logic.")).pipe( * Stream.concat(Stream.finalizer(Console.log("Finalizing the stream"))), * Stream.ensuring( * Console.log("Doing some other works after stream's finalization") * ) * ) * * Effect.runPromise(Stream.runCollect(program)).then(console.log) * // Application Logic. * // Finalizing the stream * // Doing some other works after stream's finalization * // { _id: 'Chunk', values: [ undefined, undefined ] } * ``` * * @since 2.0.0 * @category utils */ (self: Stream, finalizer: Effect.Effect): Stream } = internal.ensuring /** * Executes the provided finalizer after this stream's finalizers run. * * @since 2.0.0 * @category utils */ export const ensuringWith: { /** * Executes the provided finalizer after this stream's finalizers run. * * @since 2.0.0 * @category utils */ ( finalizer: (exit: Exit.Exit) => Effect.Effect ): (self: Stream) => Stream /** * Executes the provided finalizer after this stream's finalizers run. * * @since 2.0.0 * @category utils */ ( self: Stream, finalizer: (exit: Exit.Exit) => Effect.Effect ): Stream } = internal.ensuringWith /** * Accesses the whole context of the stream. * * @since 2.0.0 * @category context */ export const context: () => Stream, never, R> = internal.context /** * Accesses the context of the stream. * * @since 2.0.0 * @category context */ export const contextWith: (f: (env: Context.Context) => A) => Stream = internal.contextWith /** * Accesses the context of the stream in the context of an effect. * * @since 2.0.0 * @category context */ export const contextWithEffect: ( f: (env: Context.Context) => Effect.Effect ) => Stream = internal.contextWithEffect /** * Accesses the context of the stream in the context of a stream. * * @since 2.0.0 * @category context */ export const contextWithStream: ( f: (env: Context.Context) => Stream ) => Stream = internal.contextWithStream /** * Creates a stream that executes the specified effect but emits no elements. * * @since 2.0.0 * @category constructors */ export const execute: (effect: Effect.Effect) => Stream = internal.execute /** * Terminates with the specified error. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.fail("Uh oh!") * * Effect.runPromiseExit(Stream.runCollect(stream)).then(console.log) * // { * // _id: 'Exit', * // _tag: 'Failure', * // cause: { _id: 'Cause', _tag: 'Fail', failure: 'Uh oh!' } * // } * ``` * * @since 2.0.0 * @category constructors */ export const fail: (error: E) => Stream = internal.fail /** * Terminates with the specified lazily evaluated error. * * @since 2.0.0 * @category constructors */ export const failSync: (evaluate: LazyArg) => Stream = internal.failSync /** * The stream that always fails with the specified `Cause`. * * @since 2.0.0 * @category constructors */ export const failCause: (cause: Cause.Cause) => Stream = internal.failCause /** * The stream that always fails with the specified lazily evaluated `Cause`. * * @since 2.0.0 * @category constructors */ export const failCauseSync: (evaluate: LazyArg>) => Stream = internal.failCauseSync /** * Filters the elements emitted by this stream using the provided function. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.range(1, 11).pipe(Stream.filter((n) => n % 2 === 0)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 2, 4, 6, 8, 10 ] } * ``` * * @since 2.0.0 * @category filtering */ export const filter: { /** * Filters the elements emitted by this stream using the provided function. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.range(1, 11).pipe(Stream.filter((n) => n % 2 === 0)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 2, 4, 6, 8, 10 ] } * ``` * * @since 2.0.0 * @category filtering */ (refinement: Refinement, B>): (self: Stream) => Stream /** * Filters the elements emitted by this stream using the provided function. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.range(1, 11).pipe(Stream.filter((n) => n % 2 === 0)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 2, 4, 6, 8, 10 ] } * ``` * * @since 2.0.0 * @category filtering */ (predicate: Predicate): (self: Stream) => Stream /** * Filters the elements emitted by this stream using the provided function. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.range(1, 11).pipe(Stream.filter((n) => n % 2 === 0)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 2, 4, 6, 8, 10 ] } * ``` * * @since 2.0.0 * @category filtering */ (self: Stream, refinement: Refinement): Stream /** * Filters the elements emitted by this stream using the provided function. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.range(1, 11).pipe(Stream.filter((n) => n % 2 === 0)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 2, 4, 6, 8, 10 ] } * ``` * * @since 2.0.0 * @category filtering */ (self: Stream, predicate: Predicate): Stream } = internal.filter /** * Effectfully filters the elements emitted by this stream. * * @since 2.0.0 * @category filtering */ export const filterEffect: { /** * Effectfully filters the elements emitted by this stream. * * @since 2.0.0 * @category filtering */ (f: (a: NoInfer) => Effect.Effect): (self: Stream) => Stream /** * Effectfully filters the elements emitted by this stream. * * @since 2.0.0 * @category filtering */ (self: Stream, f: (a: A) => Effect.Effect): Stream } = internal.filterEffect /** * Performs a filter and map in a single step. * * @since 2.0.0 * @category utils */ export const filterMap: { /** * Performs a filter and map in a single step. * * @since 2.0.0 * @category utils */ (pf: (a: A) => Option.Option): (self: Stream) => Stream /** * Performs a filter and map in a single step. * * @since 2.0.0 * @category utils */ (self: Stream, pf: (a: A) => Option.Option): Stream } = internal.filterMap /** * Performs an effectful filter and map in a single step. * * @since 2.0.0 * @category utils */ export const filterMapEffect: { /** * Performs an effectful filter and map in a single step. * * @since 2.0.0 * @category utils */ (pf: (a: A) => Option.Option>): (self: Stream) => Stream /** * Performs an effectful filter and map in a single step. * * @since 2.0.0 * @category utils */ ( self: Stream, pf: (a: A) => Option.Option> ): Stream } = internal.filterMapEffect /** * Transforms all elements of the stream for as long as the specified partial * function is defined. * * @since 2.0.0 * @category utils */ export const filterMapWhile: { /** * Transforms all elements of the stream for as long as the specified partial * function is defined. * * @since 2.0.0 * @category utils */ (pf: (a: A) => Option.Option): (self: Stream) => Stream /** * Transforms all elements of the stream for as long as the specified partial * function is defined. * * @since 2.0.0 * @category utils */ (self: Stream, pf: (a: A) => Option.Option): Stream } = internal.filterMapWhile /** * Effectfully transforms all elements of the stream for as long as the * specified partial function is defined. * * @since 2.0.0 * @category utils */ export const filterMapWhileEffect: { /** * Effectfully transforms all elements of the stream for as long as the * specified partial function is defined. * * @since 2.0.0 * @category utils */ (pf: (a: A) => Option.Option>): (self: Stream) => Stream /** * Effectfully transforms all elements of the stream for as long as the * specified partial function is defined. * * @since 2.0.0 * @category utils */ ( self: Stream, pf: (a: A) => Option.Option> ): Stream } = internal.filterMapWhileEffect /** * Creates a one-element stream that never fails and executes the finalizer * when it ends. * * @example * ```ts * import { Console, Effect, Stream } from "effect" * * const application = Stream.fromEffect(Console.log("Application Logic.")) * * const deleteDir = (dir: string) => Console.log(`Deleting dir: ${dir}`) * * const program = application.pipe( * Stream.concat( * Stream.finalizer( * deleteDir("tmp").pipe( * Effect.andThen(Console.log("Temporary directory was deleted.")) * ) * ) * ) * ) * * Effect.runPromise(Stream.runCollect(program)).then(console.log) * // Application Logic. * // Deleting dir: tmp * // Temporary directory was deleted. * // { _id: 'Chunk', values: [ undefined, undefined ] } * ``` * * @since 2.0.0 * @category constructors */ export const finalizer: (finalizer: Effect.Effect) => Stream = internal.finalizer /** * Finds the first element emitted by this stream that satisfies the provided * predicate. * * @since 2.0.0 * @category elements */ export const find: { /** * Finds the first element emitted by this stream that satisfies the provided * predicate. * * @since 2.0.0 * @category elements */ (refinement: Refinement, B>): (self: Stream) => Stream /** * Finds the first element emitted by this stream that satisfies the provided * predicate. * * @since 2.0.0 * @category elements */ (predicate: Predicate>): (self: Stream) => Stream /** * Finds the first element emitted by this stream that satisfies the provided * predicate. * * @since 2.0.0 * @category elements */ (self: Stream, refinement: Refinement): Stream /** * Finds the first element emitted by this stream that satisfies the provided * predicate. * * @since 2.0.0 * @category elements */ (self: Stream, predicate: Predicate): Stream } = internal.find /** * Finds the first element emitted by this stream that satisfies the provided * effectful predicate. * * @since 2.0.0 * @category elements */ export const findEffect: { /** * Finds the first element emitted by this stream that satisfies the provided * effectful predicate. * * @since 2.0.0 * @category elements */ (predicate: (a: NoInfer) => Effect.Effect): (self: Stream) => Stream /** * Finds the first element emitted by this stream that satisfies the provided * effectful predicate. * * @since 2.0.0 * @category elements */ ( self: Stream, predicate: (a: NoInfer) => Effect.Effect ): Stream } = internal.findEffect /** * Returns a stream made of the concatenation in strict order of all the * streams produced by passing each element of this stream to `f0` * * @since 2.0.0 * @category sequencing */ export const flatMap: { /** * Returns a stream made of the concatenation in strict order of all the * streams produced by passing each element of this stream to `f0` * * @since 2.0.0 * @category sequencing */ ( f: (a: A) => Stream, options?: { readonly concurrency?: number | "unbounded" | undefined readonly bufferSize?: number | undefined readonly switch?: boolean | undefined } | undefined ): (self: Stream) => Stream /** * Returns a stream made of the concatenation in strict order of all the * streams produced by passing each element of this stream to `f0` * * @since 2.0.0 * @category sequencing */ ( self: Stream, f: (a: A) => Stream, options?: { readonly concurrency?: number | "unbounded" | undefined readonly bufferSize?: number | undefined readonly switch?: boolean | undefined } | undefined ): Stream } = internal.flatMap /** * Flattens this stream-of-streams into a stream made of the concatenation in * strict order of all the streams. * * @since 2.0.0 * @category sequencing */ export const flatten: { /** * Flattens this stream-of-streams into a stream made of the concatenation in * strict order of all the streams. * * @since 2.0.0 * @category sequencing */ ( options?: | { readonly concurrency?: number | "unbounded" | undefined; readonly bufferSize?: number | undefined } | undefined ): (self: Stream, E, R>) => Stream /** * Flattens this stream-of-streams into a stream made of the concatenation in * strict order of all the streams. * * @since 2.0.0 * @category sequencing */ ( self: Stream, E, R>, options?: | { readonly concurrency?: number | "unbounded" | undefined; readonly bufferSize?: number | undefined } | undefined ): Stream } = internal.flatten /** * Submerges the chunks carried by this stream into the stream's structure, * while still preserving them. * * @since 2.0.0 * @category sequencing */ export const flattenChunks: (self: Stream, E, R>) => Stream = internal.flattenChunks /** * Flattens `Effect` values into the stream's structure, preserving all * information about the effect. * * @since 2.0.0 * @category sequencing */ export const flattenEffect: { /** * Flattens `Effect` values into the stream's structure, preserving all * information about the effect. * * @since 2.0.0 * @category sequencing */ ( options?: | { readonly concurrency?: number | "unbounded" | undefined; readonly unordered?: boolean | undefined } | undefined ): (self: Stream, E, R>) => Stream /** * Flattens `Effect` values into the stream's structure, preserving all * information about the effect. * * @since 2.0.0 * @category sequencing */ ( self: Stream, E, R>, options?: | { readonly concurrency?: number | "unbounded" | undefined; readonly unordered?: boolean | undefined } | undefined ): Stream } = internal.flattenEffect /** * Unwraps `Exit` values that also signify end-of-stream by failing with `None`. * * @since 2.0.0 * @category sequencing */ export const flattenExitOption: ( self: Stream>, E, R> ) => Stream = internal.flattenExitOption /** * Submerges the iterables carried by this stream into the stream's structure, * while still preserving them. * * @since 2.0.0 * @category sequencing */ export const flattenIterables: (self: Stream, E, R>) => Stream = internal.flattenIterables /** * Unwraps `Exit` values and flatten chunks that also signify end-of-stream * by failing with `None`. * * @since 2.0.0 * @category sequencing */ export const flattenTake: (self: Stream, E, R>) => Stream = internal.flattenTake /** * Repeats this stream forever. * * @since 2.0.0 * @category utils */ export const forever: (self: Stream) => Stream = internal.forever /** * Creates a stream from an `AsyncIterable`. * * @example * ```ts * import { Effect, Stream } from "effect" * * const myAsyncIterable = async function*() { * yield 1 * yield 2 * } * * const stream = Stream.fromAsyncIterable( * myAsyncIterable(), * (e) => new Error(String(e)) // Error Handling * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 2 ] } * ``` * * @since 2.0.0 * @category constructors */ export const fromAsyncIterable: (iterable: AsyncIterable, onError: (e: unknown) => E) => Stream = internal.fromAsyncIterable /** * Creates a stream from a `Channel`. * * @since 2.0.0 * @category constructors */ export const fromChannel: ( channel: Channel.Channel, unknown, E, unknown, unknown, unknown, R> ) => Stream = internal.fromChannel /** * Creates a channel from a `Stream`. * * @since 2.0.0 * @category constructors */ export const toChannel: ( stream: Stream ) => Channel.Channel, unknown, E, unknown, unknown, unknown, R> = internal.toChannel /** * Creates a stream from a `Chunk` of values. * * @example * ```ts * import { Chunk, Effect, Stream } from "effect" * * // Creating a stream with values from a single Chunk * const stream = Stream.fromChunk(Chunk.make(1, 2, 3)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 2, 3 ] } * ``` * * @since 2.0.0 * @category constructors */ export const fromChunk: (chunk: Chunk.Chunk) => Stream = internal.fromChunk /** * Creates a stream from a subscription to a `PubSub`. * * **Options** * * - `shutdown`: If `true`, the `PubSub` will be shutdown after the stream is evaluated (defaults to `false`) * * @since 2.0.0 * @category constructors */ export const fromChunkPubSub: { /** * Creates a stream from a subscription to a `PubSub`. * * **Options** * * - `shutdown`: If `true`, the `PubSub` will be shutdown after the stream is evaluated (defaults to `false`) * * @since 2.0.0 * @category constructors */ ( pubsub: PubSub.PubSub>, options: { readonly scoped: true; readonly shutdown?: boolean | undefined } ): Effect.Effect, never, Scope.Scope> /** * Creates a stream from a subscription to a `PubSub`. * * **Options** * * - `shutdown`: If `true`, the `PubSub` will be shutdown after the stream is evaluated (defaults to `false`) * * @since 2.0.0 * @category constructors */ ( pubsub: PubSub.PubSub>, options?: { readonly scoped?: false | undefined; readonly shutdown?: boolean | undefined } | undefined ): Stream } = internal.fromChunkPubSub /** * Creates a stream from a `Queue` of values. * * **Options** * * - `shutdown`: If `true`, the queue will be shutdown after the stream is evaluated (defaults to `false`) * * @since 2.0.0 * @category constructors */ export const fromChunkQueue: ( queue: Queue.Dequeue>, options?: { readonly shutdown?: boolean | undefined } ) => Stream = internal.fromChunkQueue /** * Creates a stream from an arbitrary number of chunks. * * @example * ```ts * import { Chunk, Effect, Stream } from "effect" * * // Creating a stream with values from multiple Chunks * const stream = Stream.fromChunks(Chunk.make(1, 2, 3), Chunk.make(4, 5, 6)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 2, 3, 4, 5, 6 ] } * ``` * * @since 2.0.0 * @category constructors */ export const fromChunks: (...chunks: Array>) => Stream = internal.fromChunks /** * Either emits the success value of this effect or terminates the stream * with the failure value of this effect. * * @example * ```ts * import { Effect, Random, Stream } from "effect" * * const stream = Stream.fromEffect(Random.nextInt) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // Example Output: { _id: 'Chunk', values: [ 922694024 ] } * ``` * * @since 2.0.0 * @category constructors */ export const fromEffect: (effect: Effect.Effect) => Stream = internal.fromEffect /** * Creates a stream from an effect producing a value of type `A` or an empty * `Stream`. * * @since 2.0.0 * @category constructors */ export const fromEffectOption: (effect: Effect.Effect, R>) => Stream = internal.fromEffectOption /** * Creates a stream from a subscription to a `PubSub`. * * **Options** * * - `shutdown`: If `true`, the `PubSub` will be shutdown after the stream is evaluated (defaults to `false`) * * @since 2.0.0 * @category constructors */ export const fromPubSub: { /** * Creates a stream from a subscription to a `PubSub`. * * **Options** * * - `shutdown`: If `true`, the `PubSub` will be shutdown after the stream is evaluated (defaults to `false`) * * @since 2.0.0 * @category constructors */ ( pubsub: PubSub.PubSub, options: { readonly scoped: true readonly maxChunkSize?: number | undefined readonly shutdown?: boolean | undefined } ): Effect.Effect, never, Scope.Scope> /** * Creates a stream from a subscription to a `PubSub`. * * **Options** * * - `shutdown`: If `true`, the `PubSub` will be shutdown after the stream is evaluated (defaults to `false`) * * @since 2.0.0 * @category constructors */ ( pubsub: PubSub.PubSub, options?: { readonly scoped?: false | undefined readonly maxChunkSize?: number | undefined readonly shutdown?: boolean | undefined } | undefined ): Stream } = internal.fromPubSub /** * Creates a stream from a subscription to a `TPubSub`. * * @since 3.10.0 * @category constructors */ export const fromTPubSub: (pubsub: TPubSub) => Stream = internal.fromTPubSub /** * Creates a new `Stream` from an iterable collection of values. * * @example * ```ts * import { Effect, Stream } from "effect" * * const numbers = [1, 2, 3] * * const stream = Stream.fromIterable(numbers) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 2, 3 ] } * ``` * * @since 2.0.0 * @category constructors */ export const fromIterable: (iterable: Iterable) => Stream = internal.fromIterable /** * Creates a stream from an effect producing a value of type `Iterable`. * * @example * ```ts * import { Context, Effect, Stream } from "effect" * * class Database extends Context.Tag("Database")< * Database, * { readonly getUsers: Effect.Effect> } * >() {} * * const getUsers = Database.pipe(Effect.andThen((_) => _.getUsers)) * * const stream = Stream.fromIterableEffect(getUsers) * * Effect.runPromise( * Stream.runCollect(stream.pipe(Stream.provideService(Database, { getUsers: Effect.succeed(["user1", "user2"]) }))) * ).then(console.log) * // { _id: 'Chunk', values: [ 'user1', 'user2' ] } * ``` * * @since 2.0.0 * @category constructors */ export const fromIterableEffect: (effect: Effect.Effect, E, R>) => Stream = internal.fromIterableEffect /** * Creates a stream from an iterator * * @since 2.0.0 * @category constructors */ export const fromIteratorSucceed: (iterator: IterableIterator, maxChunkSize?: number) => Stream = internal.fromIteratorSucceed /** * Creates a stream from an effect that pulls elements from another stream. * * See `Stream.toPull` for reference. * * @since 2.0.0 * @category constructors */ export const fromPull: ( effect: Effect.Effect, Option.Option, R2>, never, Scope.Scope | R> ) => Stream> = internal.fromPull /** * Creates a stream from a queue of values * * **Options** * * - `maxChunkSize`: The maximum number of queued elements to put in one chunk in the stream * - `shutdown`: If `true`, the queue will be shutdown after the stream is evaluated (defaults to `false`) * * @since 2.0.0 * @category constructors */ export const fromQueue: ( queue: Queue.Dequeue, options?: { readonly maxChunkSize?: number | undefined readonly shutdown?: boolean | undefined } ) => Stream = internal.fromQueue /** * Creates a stream from a TQueue of values * * @since 3.10.0 * @category constructors */ export const fromTQueue: (queue: TDequeue) => Stream = internal.fromTQueue /** * Creates a stream from a `ReadableStream`. * * See https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream. * * @since 2.0.0 * @category constructors */ export const fromReadableStream: { /** * Creates a stream from a `ReadableStream`. * * See https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream. * * @since 2.0.0 * @category constructors */ ( options: { readonly evaluate: LazyArg> readonly onError: (error: unknown) => E readonly releaseLockOnEnd?: boolean | undefined } ): Stream /** * Creates a stream from a `ReadableStream`. * * See https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream. * * @since 2.0.0 * @category constructors */ (evaluate: LazyArg>, onError: (error: unknown) => E): Stream } = internal.fromReadableStream /** * Creates a stream from a `ReadableStreamBYOBReader`. * * See https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBReader. * * @since 2.0.0 * @category constructors */ export const fromReadableStreamByob: { /** * Creates a stream from a `ReadableStreamBYOBReader`. * * See https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBReader. * * @since 2.0.0 * @category constructors */ ( options: { readonly evaluate: LazyArg> readonly onError: (error: unknown) => E readonly bufferSize?: number | undefined readonly releaseLockOnEnd?: boolean | undefined } ): Stream /** * Creates a stream from a `ReadableStreamBYOBReader`. * * See https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBReader. * * @since 2.0.0 * @category constructors */ ( evaluate: LazyArg>, onError: (error: unknown) => E, /** Controls the size of the underlying `ArrayBuffer` (defaults to `4096`) */ allocSize?: number ): Stream } = internal.fromReadableStreamByob /** * Creates a stream from a `Schedule` that does not require any further * input. The stream will emit an element for each value output from the * schedule, continuing for as long as the schedule continues. * * @example * ```ts * import { Effect, Schedule, Stream } from "effect" * * // Emits values every 1 second for a total of 5 emissions * const schedule = Schedule.spaced("1 second").pipe( * Schedule.compose(Schedule.recurs(5)) * ) * * const stream = Stream.fromSchedule(schedule) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 0, 1, 2, 3, 4 ] } * ``` * * @since 2.0.0 * @category constructors */ export const fromSchedule: (schedule: Schedule.Schedule) => Stream = internal.fromSchedule /** * Creates a pipeline that groups on adjacent keys, calculated by the * specified function. * * @since 2.0.0 * @category grouping */ export const groupAdjacentBy: { /** * Creates a pipeline that groups on adjacent keys, calculated by the * specified function. * * @since 2.0.0 * @category grouping */ (f: (a: A) => K): (self: Stream) => Stream<[K, Chunk.NonEmptyChunk], E, R> /** * Creates a pipeline that groups on adjacent keys, calculated by the * specified function. * * @since 2.0.0 * @category grouping */ (self: Stream, f: (a: A) => K): Stream<[K, Chunk.NonEmptyChunk], E, R> } = internal.groupAdjacentBy /** * More powerful version of `Stream.groupByKey`. * * @example * ```ts * import { Chunk, Effect, GroupBy, Stream } from "effect" * * const groupByKeyResult = Stream.fromIterable([ * "Mary", * "James", * "Robert", * "Patricia", * "John", * "Jennifer", * "Rebecca", * "Peter" * ]).pipe( * Stream.groupBy((name) => Effect.succeed([name.substring(0, 1), name])) * ) * * const stream = GroupBy.evaluate(groupByKeyResult, (key, stream) => * Stream.fromEffect( * Stream.runCollect(stream).pipe( * Effect.andThen((chunk) => [key, Chunk.size(chunk)] as const) * ) * )) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { * // _id: 'Chunk', * // values: [ [ 'M', 1 ], [ 'J', 3 ], [ 'R', 2 ], [ 'P', 2 ] ] * // } * ``` * * @since 2.0.0 * @category grouping */ export const groupBy: { /** * More powerful version of `Stream.groupByKey`. * * @example * ```ts * import { Chunk, Effect, GroupBy, Stream } from "effect" * * const groupByKeyResult = Stream.fromIterable([ * "Mary", * "James", * "Robert", * "Patricia", * "John", * "Jennifer", * "Rebecca", * "Peter" * ]).pipe( * Stream.groupBy((name) => Effect.succeed([name.substring(0, 1), name])) * ) * * const stream = GroupBy.evaluate(groupByKeyResult, (key, stream) => * Stream.fromEffect( * Stream.runCollect(stream).pipe( * Effect.andThen((chunk) => [key, Chunk.size(chunk)] as const) * ) * )) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { * // _id: 'Chunk', * // values: [ [ 'M', 1 ], [ 'J', 3 ], [ 'R', 2 ], [ 'P', 2 ] ] * // } * ``` * * @since 2.0.0 * @category grouping */ ( f: (a: A) => Effect.Effect, options?: { readonly bufferSize?: number | undefined } | undefined ): (self: Stream) => GroupBy.GroupBy /** * More powerful version of `Stream.groupByKey`. * * @example * ```ts * import { Chunk, Effect, GroupBy, Stream } from "effect" * * const groupByKeyResult = Stream.fromIterable([ * "Mary", * "James", * "Robert", * "Patricia", * "John", * "Jennifer", * "Rebecca", * "Peter" * ]).pipe( * Stream.groupBy((name) => Effect.succeed([name.substring(0, 1), name])) * ) * * const stream = GroupBy.evaluate(groupByKeyResult, (key, stream) => * Stream.fromEffect( * Stream.runCollect(stream).pipe( * Effect.andThen((chunk) => [key, Chunk.size(chunk)] as const) * ) * )) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { * // _id: 'Chunk', * // values: [ [ 'M', 1 ], [ 'J', 3 ], [ 'R', 2 ], [ 'P', 2 ] ] * // } * ``` * * @since 2.0.0 * @category grouping */ ( self: Stream, f: (a: A) => Effect.Effect, options?: { readonly bufferSize?: number | undefined } | undefined ): GroupBy.GroupBy } = groupBy_.groupBy /** * Partition a stream using a function and process each stream individually. * This returns a data structure that can be used to further filter down which * groups shall be processed. * * After calling apply on the GroupBy object, the remaining groups will be * processed in parallel and the resulting streams merged in a * nondeterministic fashion. * * Up to `buffer` elements may be buffered in any group stream before the * producer is backpressured. Take care to consume from all streams in order * to prevent deadlocks. * * For example, to collect the first 2 words for every starting letter from a * stream of words: * * ```ts * import { pipe, GroupBy, Stream } from "effect" * * pipe( * Stream.fromIterable(["hello", "world", "hi", "holla"]), * Stream.groupByKey((word) => word[0]), * GroupBy.evaluate((key, stream) => * pipe( * stream, * Stream.take(2), * Stream.map((words) => [key, words] as const) * ) * ) * ) * ``` * * @since 2.0.0 * @category grouping */ export const groupByKey: { /** * Partition a stream using a function and process each stream individually. * This returns a data structure that can be used to further filter down which * groups shall be processed. * * After calling apply on the GroupBy object, the remaining groups will be * processed in parallel and the resulting streams merged in a * nondeterministic fashion. * * Up to `buffer` elements may be buffered in any group stream before the * producer is backpressured. Take care to consume from all streams in order * to prevent deadlocks. * * For example, to collect the first 2 words for every starting letter from a * stream of words: * * ```ts * import { pipe, GroupBy, Stream } from "effect" * * pipe( * Stream.fromIterable(["hello", "world", "hi", "holla"]), * Stream.groupByKey((word) => word[0]), * GroupBy.evaluate((key, stream) => * pipe( * stream, * Stream.take(2), * Stream.map((words) => [key, words] as const) * ) * ) * ) * ``` * * @since 2.0.0 * @category grouping */ ( f: (a: A) => K, options?: { readonly bufferSize?: number | undefined } ): (self: Stream) => GroupBy.GroupBy /** * Partition a stream using a function and process each stream individually. * This returns a data structure that can be used to further filter down which * groups shall be processed. * * After calling apply on the GroupBy object, the remaining groups will be * processed in parallel and the resulting streams merged in a * nondeterministic fashion. * * Up to `buffer` elements may be buffered in any group stream before the * producer is backpressured. Take care to consume from all streams in order * to prevent deadlocks. * * For example, to collect the first 2 words for every starting letter from a * stream of words: * * ```ts * import { pipe, GroupBy, Stream } from "effect" * * pipe( * Stream.fromIterable(["hello", "world", "hi", "holla"]), * Stream.groupByKey((word) => word[0]), * GroupBy.evaluate((key, stream) => * pipe( * stream, * Stream.take(2), * Stream.map((words) => [key, words] as const) * ) * ) * ) * ``` * * @since 2.0.0 * @category grouping */ ( self: Stream, f: (a: A) => K, options?: { readonly bufferSize?: number | undefined } ): GroupBy.GroupBy } = groupBy_.groupByKey /** * Partitions the stream with specified `chunkSize`. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.range(0, 8).pipe(Stream.grouped(3)) * * Effect.runPromise(Stream.runCollect(stream)).then((chunks) => console.log("%o", chunks)) * // { * // _id: 'Chunk', * // values: [ * // { _id: 'Chunk', values: [ 0, 1, 2, [length]: 3 ] }, * // { _id: 'Chunk', values: [ 3, 4, 5, [length]: 3 ] }, * // { _id: 'Chunk', values: [ 6, 7, 8, [length]: 3 ] }, * // [length]: 3 * // ] * // } * ``` * * @since 2.0.0 * @category grouping */ export const grouped: { /** * Partitions the stream with specified `chunkSize`. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.range(0, 8).pipe(Stream.grouped(3)) * * Effect.runPromise(Stream.runCollect(stream)).then((chunks) => console.log("%o", chunks)) * // { * // _id: 'Chunk', * // values: [ * // { _id: 'Chunk', values: [ 0, 1, 2, [length]: 3 ] }, * // { _id: 'Chunk', values: [ 3, 4, 5, [length]: 3 ] }, * // { _id: 'Chunk', values: [ 6, 7, 8, [length]: 3 ] }, * // [length]: 3 * // ] * // } * ``` * * @since 2.0.0 * @category grouping */ (chunkSize: number): (self: Stream) => Stream, E, R> /** * Partitions the stream with specified `chunkSize`. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.range(0, 8).pipe(Stream.grouped(3)) * * Effect.runPromise(Stream.runCollect(stream)).then((chunks) => console.log("%o", chunks)) * // { * // _id: 'Chunk', * // values: [ * // { _id: 'Chunk', values: [ 0, 1, 2, [length]: 3 ] }, * // { _id: 'Chunk', values: [ 3, 4, 5, [length]: 3 ] }, * // { _id: 'Chunk', values: [ 6, 7, 8, [length]: 3 ] }, * // [length]: 3 * // ] * // } * ``` * * @since 2.0.0 * @category grouping */ (self: Stream, chunkSize: number): Stream, E, R> } = internal.grouped /** * Partitions the stream with the specified `chunkSize` or until the specified * `duration` has passed, whichever is satisfied first. * * @example * ```ts * import { Chunk, Effect, Schedule, Stream } from "effect" * * const stream = Stream.range(0, 9).pipe( * Stream.repeat(Schedule.spaced("1 second")), * Stream.groupedWithin(18, "1.5 seconds"), * Stream.take(3) * ) * * Effect.runPromise(Stream.runCollect(stream)).then((chunks) => console.log(Chunk.toArray(chunks))) * // [ * // { * // _id: 'Chunk', * // values: [ * // 0, 1, 2, 3, 4, 5, 6, * // 7, 8, 9, 0, 1, 2, 3, * // 4, 5, 6, 7 * // ] * // }, * // { * // _id: 'Chunk', * // values: [ * // 8, 9, 0, 1, 2, * // 3, 4, 5, 6, 7, * // 8, 9 * // ] * // }, * // { * // _id: 'Chunk', * // values: [ * // 0, 1, 2, 3, 4, 5, 6, * // 7, 8, 9, 0, 1, 2, 3, * // 4, 5, 6, 7 * // ] * // } * // ] * ``` * * @since 2.0.0 * @category grouping */ export const groupedWithin: { /** * Partitions the stream with the specified `chunkSize` or until the specified * `duration` has passed, whichever is satisfied first. * * @example * ```ts * import { Chunk, Effect, Schedule, Stream } from "effect" * * const stream = Stream.range(0, 9).pipe( * Stream.repeat(Schedule.spaced("1 second")), * Stream.groupedWithin(18, "1.5 seconds"), * Stream.take(3) * ) * * Effect.runPromise(Stream.runCollect(stream)).then((chunks) => console.log(Chunk.toArray(chunks))) * // [ * // { * // _id: 'Chunk', * // values: [ * // 0, 1, 2, 3, 4, 5, 6, * // 7, 8, 9, 0, 1, 2, 3, * // 4, 5, 6, 7 * // ] * // }, * // { * // _id: 'Chunk', * // values: [ * // 8, 9, 0, 1, 2, * // 3, 4, 5, 6, 7, * // 8, 9 * // ] * // }, * // { * // _id: 'Chunk', * // values: [ * // 0, 1, 2, 3, 4, 5, 6, * // 7, 8, 9, 0, 1, 2, 3, * // 4, 5, 6, 7 * // ] * // } * // ] * ``` * * @since 2.0.0 * @category grouping */ (chunkSize: number, duration: Duration.DurationInput): (self: Stream) => Stream, E, R> /** * Partitions the stream with the specified `chunkSize` or until the specified * `duration` has passed, whichever is satisfied first. * * @example * ```ts * import { Chunk, Effect, Schedule, Stream } from "effect" * * const stream = Stream.range(0, 9).pipe( * Stream.repeat(Schedule.spaced("1 second")), * Stream.groupedWithin(18, "1.5 seconds"), * Stream.take(3) * ) * * Effect.runPromise(Stream.runCollect(stream)).then((chunks) => console.log(Chunk.toArray(chunks))) * // [ * // { * // _id: 'Chunk', * // values: [ * // 0, 1, 2, 3, 4, 5, 6, * // 7, 8, 9, 0, 1, 2, 3, * // 4, 5, 6, 7 * // ] * // }, * // { * // _id: 'Chunk', * // values: [ * // 8, 9, 0, 1, 2, * // 3, 4, 5, 6, 7, * // 8, 9 * // ] * // }, * // { * // _id: 'Chunk', * // values: [ * // 0, 1, 2, 3, 4, 5, 6, * // 7, 8, 9, 0, 1, 2, 3, * // 4, 5, 6, 7 * // ] * // } * // ] * ``` * * @since 2.0.0 * @category grouping */ (self: Stream, chunkSize: number, duration: Duration.DurationInput): Stream, E, R> } = internal.groupedWithin /** * Specialized version of haltWhen which halts the evaluation of this stream * after the given duration. * * An element in the process of being pulled will not be interrupted when the * given duration completes. See `interruptAfter` for this behavior. * * @since 2.0.0 * @category utils */ export const haltAfter: { /** * Specialized version of haltWhen which halts the evaluation of this stream * after the given duration. * * An element in the process of being pulled will not be interrupted when the * given duration completes. See `interruptAfter` for this behavior. * * @since 2.0.0 * @category utils */ (duration: Duration.DurationInput): (self: Stream) => Stream /** * Specialized version of haltWhen which halts the evaluation of this stream * after the given duration. * * An element in the process of being pulled will not be interrupted when the * given duration completes. See `interruptAfter` for this behavior. * * @since 2.0.0 * @category utils */ (self: Stream, duration: Duration.DurationInput): Stream } = internal.haltAfter /** * Halts the evaluation of this stream when the provided effect completes. The * given effect will be forked as part of the returned stream, and its success * will be discarded. * * An element in the process of being pulled will not be interrupted when the * effect completes. See `interruptWhen` for this behavior. * * If the effect completes with a failure, the stream will emit that failure. * * @since 2.0.0 * @category utils */ export const haltWhen: { /** * Halts the evaluation of this stream when the provided effect completes. The * given effect will be forked as part of the returned stream, and its success * will be discarded. * * An element in the process of being pulled will not be interrupted when the * effect completes. See `interruptWhen` for this behavior. * * If the effect completes with a failure, the stream will emit that failure. * * @since 2.0.0 * @category utils */ (effect: Effect.Effect): (self: Stream) => Stream /** * Halts the evaluation of this stream when the provided effect completes. The * given effect will be forked as part of the returned stream, and its success * will be discarded. * * An element in the process of being pulled will not be interrupted when the * effect completes. See `interruptWhen` for this behavior. * * If the effect completes with a failure, the stream will emit that failure. * * @since 2.0.0 * @category utils */ (self: Stream, effect: Effect.Effect): Stream } = internal.haltWhen /** * Halts the evaluation of this stream when the provided promise resolves. * * If the promise completes with a failure, the stream will emit that failure. * * @since 2.0.0 * @category utils */ export const haltWhenDeferred: { /** * Halts the evaluation of this stream when the provided promise resolves. * * If the promise completes with a failure, the stream will emit that failure. * * @since 2.0.0 * @category utils */ (deferred: Deferred.Deferred): (self: Stream) => Stream /** * Halts the evaluation of this stream when the provided promise resolves. * * If the promise completes with a failure, the stream will emit that failure. * * @since 2.0.0 * @category utils */ (self: Stream, deferred: Deferred.Deferred): Stream } = internal.haltWhenDeferred /** * The identity pipeline, which does not modify streams in any way. * * @since 2.0.0 * @category utils */ export const identity: () => Stream = internal.identityStream /** * Interleaves this stream and the specified stream deterministically by * alternating pulling values from this stream and the specified stream. When * one stream is exhausted all remaining values in the other stream will be * pulled. * * @example * ```ts * import { Effect, Stream } from "effect" * * const s1 = Stream.make(1, 2, 3) * const s2 = Stream.make(4, 5, 6) * * const stream = Stream.interleave(s1, s2) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 4, 2, 5, 3, 6 ] } * ``` * @since 2.0.0 * @category utils */ export const interleave: { /** * Interleaves this stream and the specified stream deterministically by * alternating pulling values from this stream and the specified stream. When * one stream is exhausted all remaining values in the other stream will be * pulled. * * @example * ```ts * import { Effect, Stream } from "effect" * * const s1 = Stream.make(1, 2, 3) * const s2 = Stream.make(4, 5, 6) * * const stream = Stream.interleave(s1, s2) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 4, 2, 5, 3, 6 ] } * ``` * @since 2.0.0 * @category utils */ (that: Stream): (self: Stream) => Stream /** * Interleaves this stream and the specified stream deterministically by * alternating pulling values from this stream and the specified stream. When * one stream is exhausted all remaining values in the other stream will be * pulled. * * @example * ```ts * import { Effect, Stream } from "effect" * * const s1 = Stream.make(1, 2, 3) * const s2 = Stream.make(4, 5, 6) * * const stream = Stream.interleave(s1, s2) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 4, 2, 5, 3, 6 ] } * ``` * @since 2.0.0 * @category utils */ (self: Stream, that: Stream): Stream } = internal.interleave /** * Combines this stream and the specified stream deterministically using the * stream of boolean values `pull` to control which stream to pull from next. * A value of `true` indicates to pull from this stream and a value of `false` * indicates to pull from the specified stream. Only consumes as many elements * as requested by the `pull` stream. If either this stream or the specified * stream are exhausted further requests for values from that stream will be * ignored. * * @example * ```ts * import { Effect, Stream } from "effect" * * const s1 = Stream.make(1, 3, 5, 7, 9) * const s2 = Stream.make(2, 4, 6, 8, 10) * * const booleanStream = Stream.make(true, false, false).pipe(Stream.forever) * * const stream = Stream.interleaveWith(s1, s2, booleanStream) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { * // _id: 'Chunk', * // values: [ * // 1, 2, 4, 3, 6, * // 8, 5, 10, 7, 9 * // ] * // } * ``` * * @since 2.0.0 * @category utils */ export const interleaveWith: { /** * Combines this stream and the specified stream deterministically using the * stream of boolean values `pull` to control which stream to pull from next. * A value of `true` indicates to pull from this stream and a value of `false` * indicates to pull from the specified stream. Only consumes as many elements * as requested by the `pull` stream. If either this stream or the specified * stream are exhausted further requests for values from that stream will be * ignored. * * @example * ```ts * import { Effect, Stream } from "effect" * * const s1 = Stream.make(1, 3, 5, 7, 9) * const s2 = Stream.make(2, 4, 6, 8, 10) * * const booleanStream = Stream.make(true, false, false).pipe(Stream.forever) * * const stream = Stream.interleaveWith(s1, s2, booleanStream) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { * // _id: 'Chunk', * // values: [ * // 1, 2, 4, 3, 6, * // 8, 5, 10, 7, 9 * // ] * // } * ``` * * @since 2.0.0 * @category utils */ (that: Stream, decider: Stream): (self: Stream) => Stream /** * Combines this stream and the specified stream deterministically using the * stream of boolean values `pull` to control which stream to pull from next. * A value of `true` indicates to pull from this stream and a value of `false` * indicates to pull from the specified stream. Only consumes as many elements * as requested by the `pull` stream. If either this stream or the specified * stream are exhausted further requests for values from that stream will be * ignored. * * @example * ```ts * import { Effect, Stream } from "effect" * * const s1 = Stream.make(1, 3, 5, 7, 9) * const s2 = Stream.make(2, 4, 6, 8, 10) * * const booleanStream = Stream.make(true, false, false).pipe(Stream.forever) * * const stream = Stream.interleaveWith(s1, s2, booleanStream) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { * // _id: 'Chunk', * // values: [ * // 1, 2, 4, 3, 6, * // 8, 5, 10, 7, 9 * // ] * // } * ``` * * @since 2.0.0 * @category utils */ ( self: Stream, that: Stream, decider: Stream ): Stream } = internal.interleaveWith /** * Intersperse stream with provided `element`. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3, 4, 5).pipe(Stream.intersperse(0)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { * // _id: 'Chunk', * // values: [ * // 1, 0, 2, 0, 3, * // 0, 4, 0, 5 * // ] * // } * ``` * * @since 2.0.0 * @category utils */ export const intersperse: { /** * Intersperse stream with provided `element`. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3, 4, 5).pipe(Stream.intersperse(0)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { * // _id: 'Chunk', * // values: [ * // 1, 0, 2, 0, 3, * // 0, 4, 0, 5 * // ] * // } * ``` * * @since 2.0.0 * @category utils */ (element: A2): (self: Stream) => Stream /** * Intersperse stream with provided `element`. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3, 4, 5).pipe(Stream.intersperse(0)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { * // _id: 'Chunk', * // values: [ * // 1, 0, 2, 0, 3, * // 0, 4, 0, 5 * // ] * // } * ``` * * @since 2.0.0 * @category utils */ (self: Stream, element: A2): Stream } = internal.intersperse /** * Intersperse the specified element, also adding a prefix and a suffix. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3, 4, 5).pipe( * Stream.intersperseAffixes({ * start: "[", * middle: "-", * end: "]" * }) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { * // _id: 'Chunk', * // values: [ * // '[', 1, '-', 2, '-', * // 3, '-', 4, '-', 5, * // ']' * // ] * // } * ``` * * @since 2.0.0 * @category utils */ export const intersperseAffixes: { /** * Intersperse the specified element, also adding a prefix and a suffix. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3, 4, 5).pipe( * Stream.intersperseAffixes({ * start: "[", * middle: "-", * end: "]" * }) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { * // _id: 'Chunk', * // values: [ * // '[', 1, '-', 2, '-', * // 3, '-', 4, '-', 5, * // ']' * // ] * // } * ``` * * @since 2.0.0 * @category utils */ (options: { readonly start: A2; readonly middle: A3; readonly end: A4 }): (self: Stream) => Stream /** * Intersperse the specified element, also adding a prefix and a suffix. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3, 4, 5).pipe( * Stream.intersperseAffixes({ * start: "[", * middle: "-", * end: "]" * }) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { * // _id: 'Chunk', * // values: [ * // '[', 1, '-', 2, '-', * // 3, '-', 4, '-', 5, * // ']' * // ] * // } * ``` * * @since 2.0.0 * @category utils */ ( self: Stream, options: { readonly start: A2; readonly middle: A3; readonly end: A4 } ): Stream } = internal.intersperseAffixes /** * Specialized version of `Stream.interruptWhen` which interrupts the * evaluation of this stream after the given `Duration`. * * @since 2.0.0 * @category utils */ export const interruptAfter: { /** * Specialized version of `Stream.interruptWhen` which interrupts the * evaluation of this stream after the given `Duration`. * * @since 2.0.0 * @category utils */ (duration: Duration.DurationInput): (self: Stream) => Stream /** * Specialized version of `Stream.interruptWhen` which interrupts the * evaluation of this stream after the given `Duration`. * * @since 2.0.0 * @category utils */ (self: Stream, duration: Duration.DurationInput): Stream } = internal.interruptAfter /** * Interrupts the evaluation of this stream when the provided effect * completes. The given effect will be forked as part of this stream, and its * success will be discarded. This combinator will also interrupt any * in-progress element being pulled from upstream. * * If the effect completes with a failure before the stream completes, the * returned stream will emit that failure. * * @since 2.0.0 * @category utils */ export const interruptWhen: { /** * Interrupts the evaluation of this stream when the provided effect * completes. The given effect will be forked as part of this stream, and its * success will be discarded. This combinator will also interrupt any * in-progress element being pulled from upstream. * * If the effect completes with a failure before the stream completes, the * returned stream will emit that failure. * * @since 2.0.0 * @category utils */ (effect: Effect.Effect): (self: Stream) => Stream /** * Interrupts the evaluation of this stream when the provided effect * completes. The given effect will be forked as part of this stream, and its * success will be discarded. This combinator will also interrupt any * in-progress element being pulled from upstream. * * If the effect completes with a failure before the stream completes, the * returned stream will emit that failure. * * @since 2.0.0 * @category utils */ (self: Stream, effect: Effect.Effect): Stream } = internal.interruptWhen /** * Interrupts the evaluation of this stream when the provided promise * resolves. This combinator will also interrupt any in-progress element being * pulled from upstream. * * If the promise completes with a failure, the stream will emit that failure. * * @since 2.0.0 * @category utils */ export const interruptWhenDeferred: { /** * Interrupts the evaluation of this stream when the provided promise * resolves. This combinator will also interrupt any in-progress element being * pulled from upstream. * * If the promise completes with a failure, the stream will emit that failure. * * @since 2.0.0 * @category utils */ (deferred: Deferred.Deferred): (self: Stream) => Stream /** * Interrupts the evaluation of this stream when the provided promise * resolves. This combinator will also interrupt any in-progress element being * pulled from upstream. * * If the promise completes with a failure, the stream will emit that failure. * * @since 2.0.0 * @category utils */ (self: Stream, deferred: Deferred.Deferred): Stream } = internal.interruptWhenDeferred /** * The infinite stream of iterative function application: a, f(a), f(f(a)), * f(f(f(a))), ... * * @example * ```ts * import { Effect, Stream } from "effect" * * // An infinite Stream of numbers starting from 1 and incrementing * const stream = Stream.iterate(1, (n) => n + 1) * * Effect.runPromise(Stream.runCollect(stream.pipe(Stream.take(10)))).then(console.log) * // { _id: 'Chunk', values: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] } * ``` * * @since 2.0.0 * @category constructors */ export const iterate: (value: A, next: (value: A) => A) => Stream = internal.iterate /** * Creates a stream from an sequence of values. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 2, 3 ] } * ``` * * @since 2.0.0 * @category constructors */ export const make: >(...as: As) => Stream = internal.make /** * Transforms the elements of this stream using the supplied function. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3).pipe(Stream.map((n) => n + 1)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 2, 3, 4 ] } * ``` * * @since 2.0.0 * @category mapping */ export const map: { /** * Transforms the elements of this stream using the supplied function. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3).pipe(Stream.map((n) => n + 1)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 2, 3, 4 ] } * ``` * * @since 2.0.0 * @category mapping */ (f: (a: A) => B): (self: Stream) => Stream /** * Transforms the elements of this stream using the supplied function. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3).pipe(Stream.map((n) => n + 1)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 2, 3, 4 ] } * ``` * * @since 2.0.0 * @category mapping */ (self: Stream, f: (a: A) => B): Stream } = internal.map /** * Statefully maps over the elements of this stream to produce new elements. * * @example * ```ts * import { Effect, Stream } from "effect" * * const runningTotal = (stream: Stream.Stream): Stream.Stream => * stream.pipe(Stream.mapAccum(0, (s, a) => [s + a, s + a])) * * // input: 0, 1, 2, 3, 4, 5, 6 * Effect.runPromise(Stream.runCollect(runningTotal(Stream.range(0, 6)))).then( * console.log * ) * // { _id: "Chunk", values: [ 0, 1, 3, 6, 10, 15, 21 ] } * ``` * * @since 2.0.0 * @category mapping */ export const mapAccum: { /** * Statefully maps over the elements of this stream to produce new elements. * * @example * ```ts * import { Effect, Stream } from "effect" * * const runningTotal = (stream: Stream.Stream): Stream.Stream => * stream.pipe(Stream.mapAccum(0, (s, a) => [s + a, s + a])) * * // input: 0, 1, 2, 3, 4, 5, 6 * Effect.runPromise(Stream.runCollect(runningTotal(Stream.range(0, 6)))).then( * console.log * ) * // { _id: "Chunk", values: [ 0, 1, 3, 6, 10, 15, 21 ] } * ``` * * @since 2.0.0 * @category mapping */ (s: S, f: (s: S, a: A) => readonly [S, A2]): (self: Stream) => Stream /** * Statefully maps over the elements of this stream to produce new elements. * * @example * ```ts * import { Effect, Stream } from "effect" * * const runningTotal = (stream: Stream.Stream): Stream.Stream => * stream.pipe(Stream.mapAccum(0, (s, a) => [s + a, s + a])) * * // input: 0, 1, 2, 3, 4, 5, 6 * Effect.runPromise(Stream.runCollect(runningTotal(Stream.range(0, 6)))).then( * console.log * ) * // { _id: "Chunk", values: [ 0, 1, 3, 6, 10, 15, 21 ] } * ``` * * @since 2.0.0 * @category mapping */ (self: Stream, s: S, f: (s: S, a: A) => readonly [S, A2]): Stream } = internal.mapAccum /** * Statefully and effectfully maps over the elements of this stream to produce * new elements. * * @since 2.0.0 * @category mapping */ export const mapAccumEffect: { /** * Statefully and effectfully maps over the elements of this stream to produce * new elements. * * @since 2.0.0 * @category mapping */ (s: S, f: (s: S, a: A) => Effect.Effect): (self: Stream) => Stream /** * Statefully and effectfully maps over the elements of this stream to produce * new elements. * * @since 2.0.0 * @category mapping */ ( self: Stream, s: S, f: (s: S, a: A) => Effect.Effect ): Stream } = internal.mapAccumEffect /** * Returns a stream whose failure and success channels have been mapped by the * specified `onFailure` and `onSuccess` functions. * * @since 2.0.0 * @category utils */ export const mapBoth: { /** * Returns a stream whose failure and success channels have been mapped by the * specified `onFailure` and `onSuccess` functions. * * @since 2.0.0 * @category utils */ ( options: { readonly onFailure: (e: E) => E2; readonly onSuccess: (a: A) => A2 } ): (self: Stream) => Stream /** * Returns a stream whose failure and success channels have been mapped by the * specified `onFailure` and `onSuccess` functions. * * @since 2.0.0 * @category utils */ ( self: Stream, options: { readonly onFailure: (e: E) => E2; readonly onSuccess: (a: A) => A2 } ): Stream } = internal.mapBoth /** * Transforms the chunks emitted by this stream. * * @since 2.0.0 * @category mapping */ export const mapChunks: { /** * Transforms the chunks emitted by this stream. * * @since 2.0.0 * @category mapping */ (f: (chunk: Chunk.Chunk) => Chunk.Chunk): (self: Stream) => Stream /** * Transforms the chunks emitted by this stream. * * @since 2.0.0 * @category mapping */ (self: Stream, f: (chunk: Chunk.Chunk) => Chunk.Chunk): Stream } = internal.mapChunks /** * Effectfully transforms the chunks emitted by this stream. * * @since 2.0.0 * @category mapping */ export const mapChunksEffect: { /** * Effectfully transforms the chunks emitted by this stream. * * @since 2.0.0 * @category mapping */ (f: (chunk: Chunk.Chunk) => Effect.Effect, E2, R2>): (self: Stream) => Stream /** * Effectfully transforms the chunks emitted by this stream. * * @since 2.0.0 * @category mapping */ ( self: Stream, f: (chunk: Chunk.Chunk) => Effect.Effect, E2, R2> ): Stream } = internal.mapChunksEffect /** * Maps each element to an iterable, and flattens the iterables into the * output of this stream. * * @example * ```ts * import { Effect, Stream } from "effect" * * const numbers = Stream.make("1-2-3", "4-5", "6").pipe( * Stream.mapConcat((s) => s.split("-")), * Stream.map((s) => parseInt(s)) * ) * * Effect.runPromise(Stream.runCollect(numbers)).then(console.log) * // { _id: 'Chunk', values: [ 1, 2, 3, 4, 5, 6 ] } * ``` * * @since 2.0.0 * @category mapping */ export const mapConcat: { /** * Maps each element to an iterable, and flattens the iterables into the * output of this stream. * * @example * ```ts * import { Effect, Stream } from "effect" * * const numbers = Stream.make("1-2-3", "4-5", "6").pipe( * Stream.mapConcat((s) => s.split("-")), * Stream.map((s) => parseInt(s)) * ) * * Effect.runPromise(Stream.runCollect(numbers)).then(console.log) * // { _id: 'Chunk', values: [ 1, 2, 3, 4, 5, 6 ] } * ``` * * @since 2.0.0 * @category mapping */ (f: (a: A) => Iterable): (self: Stream) => Stream /** * Maps each element to an iterable, and flattens the iterables into the * output of this stream. * * @example * ```ts * import { Effect, Stream } from "effect" * * const numbers = Stream.make("1-2-3", "4-5", "6").pipe( * Stream.mapConcat((s) => s.split("-")), * Stream.map((s) => parseInt(s)) * ) * * Effect.runPromise(Stream.runCollect(numbers)).then(console.log) * // { _id: 'Chunk', values: [ 1, 2, 3, 4, 5, 6 ] } * ``` * * @since 2.0.0 * @category mapping */ (self: Stream, f: (a: A) => Iterable): Stream } = internal.mapConcat /** * Maps each element to a chunk, and flattens the chunks into the output of * this stream. * * @since 2.0.0 * @category mapping */ export const mapConcatChunk: { /** * Maps each element to a chunk, and flattens the chunks into the output of * this stream. * * @since 2.0.0 * @category mapping */ (f: (a: A) => Chunk.Chunk): (self: Stream) => Stream /** * Maps each element to a chunk, and flattens the chunks into the output of * this stream. * * @since 2.0.0 * @category mapping */ (self: Stream, f: (a: A) => Chunk.Chunk): Stream } = internal.mapConcatChunk /** * Effectfully maps each element to a chunk, and flattens the chunks into the * output of this stream. * * @since 2.0.0 * @category mapping */ export const mapConcatChunkEffect: { /** * Effectfully maps each element to a chunk, and flattens the chunks into the * output of this stream. * * @since 2.0.0 * @category mapping */ (f: (a: A) => Effect.Effect, E2, R2>): (self: Stream) => Stream /** * Effectfully maps each element to a chunk, and flattens the chunks into the * output of this stream. * * @since 2.0.0 * @category mapping */ (self: Stream, f: (a: A) => Effect.Effect, E2, R2>): Stream } = internal.mapConcatChunkEffect /** * Effectfully maps each element to an iterable, and flattens the iterables * into the output of this stream. * * @since 2.0.0 * @category mapping */ export const mapConcatEffect: { /** * Effectfully maps each element to an iterable, and flattens the iterables * into the output of this stream. * * @since 2.0.0 * @category mapping */ (f: (a: A) => Effect.Effect, E2, R2>): (self: Stream) => Stream /** * Effectfully maps each element to an iterable, and flattens the iterables * into the output of this stream. * * @since 2.0.0 * @category mapping */ (self: Stream, f: (a: A) => Effect.Effect, E2, R2>): Stream } = internal.mapConcatEffect /** * Maps over elements of the stream with the specified effectful function. * * @example * ```ts * import { Effect, Random, Stream } from "effect" * * const stream = Stream.make(10, 20, 30).pipe( * Stream.mapEffect((n) => Random.nextIntBetween(0, n)) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // Example Output: { _id: 'Chunk', values: [ 7, 19, 8 ] } * ``` * * @since 2.0.0 * @category mapping */ export const mapEffect: { /** * Maps over elements of the stream with the specified effectful function. * * @example * ```ts * import { Effect, Random, Stream } from "effect" * * const stream = Stream.make(10, 20, 30).pipe( * Stream.mapEffect((n) => Random.nextIntBetween(0, n)) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // Example Output: { _id: 'Chunk', values: [ 7, 19, 8 ] } * ``` * * @since 2.0.0 * @category mapping */ ( f: (a: A) => Effect.Effect, options?: | { readonly concurrency?: number | "unbounded" | undefined; readonly unordered?: boolean | undefined } | undefined ): (self: Stream) => Stream /** * Maps over elements of the stream with the specified effectful function. * * @example * ```ts * import { Effect, Random, Stream } from "effect" * * const stream = Stream.make(10, 20, 30).pipe( * Stream.mapEffect((n) => Random.nextIntBetween(0, n)) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // Example Output: { _id: 'Chunk', values: [ 7, 19, 8 ] } * ``` * * @since 2.0.0 * @category mapping */ ( f: (a: A) => Effect.Effect, options: { readonly key: (a: A) => K; readonly bufferSize?: number | undefined } ): (self: Stream) => Stream /** * Maps over elements of the stream with the specified effectful function. * * @example * ```ts * import { Effect, Random, Stream } from "effect" * * const stream = Stream.make(10, 20, 30).pipe( * Stream.mapEffect((n) => Random.nextIntBetween(0, n)) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // Example Output: { _id: 'Chunk', values: [ 7, 19, 8 ] } * ``` * * @since 2.0.0 * @category mapping */ ( self: Stream, f: (a: A) => Effect.Effect, options?: | { readonly concurrency?: number | "unbounded" | undefined; readonly unordered?: boolean | undefined } | undefined ): Stream /** * Maps over elements of the stream with the specified effectful function. * * @example * ```ts * import { Effect, Random, Stream } from "effect" * * const stream = Stream.make(10, 20, 30).pipe( * Stream.mapEffect((n) => Random.nextIntBetween(0, n)) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // Example Output: { _id: 'Chunk', values: [ 7, 19, 8 ] } * ``` * * @since 2.0.0 * @category mapping */ ( self: Stream, f: (a: A) => Effect.Effect, options: { readonly key: (a: A) => K; readonly bufferSize?: number | undefined } ): Stream } = groupBy_.mapEffectOptions /** * Transforms the errors emitted by this stream using `f`. * * @since 2.0.0 * @category mapping */ export const mapError: { /** * Transforms the errors emitted by this stream using `f`. * * @since 2.0.0 * @category mapping */ (f: (error: E) => E2): (self: Stream) => Stream /** * Transforms the errors emitted by this stream using `f`. * * @since 2.0.0 * @category mapping */ (self: Stream, f: (error: E) => E2): Stream } = internal.mapError /** * Transforms the full causes of failures emitted by this stream. * * @since 2.0.0 * @category mapping */ export const mapErrorCause: { /** * Transforms the full causes of failures emitted by this stream. * * @since 2.0.0 * @category mapping */ (f: (cause: Cause.Cause) => Cause.Cause): (self: Stream) => Stream /** * Transforms the full causes of failures emitted by this stream. * * @since 2.0.0 * @category mapping */ (self: Stream, f: (cause: Cause.Cause) => Cause.Cause): Stream } = internal.mapErrorCause /** * Merges this stream and the specified stream together. * * New produced stream will terminate when both specified stream terminate if * no termination strategy is specified. * * @example * ```ts * import { Effect, Schedule, Stream } from "effect" * * const s1 = Stream.make(1, 2, 3).pipe( * Stream.schedule(Schedule.spaced("100 millis")) * ) * const s2 = Stream.make(4, 5, 6).pipe( * Stream.schedule(Schedule.spaced("200 millis")) * ) * * const stream = Stream.merge(s1, s2) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 4, 2, 3, 5, 6 ] } * ``` * * @since 2.0.0 * @category utils */ export const merge: { /** * Merges this stream and the specified stream together. * * New produced stream will terminate when both specified stream terminate if * no termination strategy is specified. * * @example * ```ts * import { Effect, Schedule, Stream } from "effect" * * const s1 = Stream.make(1, 2, 3).pipe( * Stream.schedule(Schedule.spaced("100 millis")) * ) * const s2 = Stream.make(4, 5, 6).pipe( * Stream.schedule(Schedule.spaced("200 millis")) * ) * * const stream = Stream.merge(s1, s2) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 4, 2, 3, 5, 6 ] } * ``` * * @since 2.0.0 * @category utils */ ( that: Stream, options?: { readonly haltStrategy?: HaltStrategy.HaltStrategyInput | undefined } | undefined ): (self: Stream) => Stream /** * Merges this stream and the specified stream together. * * New produced stream will terminate when both specified stream terminate if * no termination strategy is specified. * * @example * ```ts * import { Effect, Schedule, Stream } from "effect" * * const s1 = Stream.make(1, 2, 3).pipe( * Stream.schedule(Schedule.spaced("100 millis")) * ) * const s2 = Stream.make(4, 5, 6).pipe( * Stream.schedule(Schedule.spaced("200 millis")) * ) * * const stream = Stream.merge(s1, s2) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 4, 2, 3, 5, 6 ] } * ``` * * @since 2.0.0 * @category utils */ ( self: Stream, that: Stream, options?: { readonly haltStrategy?: HaltStrategy.HaltStrategyInput | undefined } | undefined ): Stream } = internal.merge /** * Merges a variable list of streams in a non-deterministic fashion. Up to `n` * streams may be consumed in parallel and up to `outputBuffer` chunks may be * buffered by this operator. * * @since 2.0.0 * @category utils */ export const mergeAll: { /** * Merges a variable list of streams in a non-deterministic fashion. Up to `n` * streams may be consumed in parallel and up to `outputBuffer` chunks may be * buffered by this operator. * * @since 2.0.0 * @category utils */ ( options: { readonly concurrency: number | "unbounded" readonly bufferSize?: number | undefined } ): (streams: Iterable>) => Stream /** * Merges a variable list of streams in a non-deterministic fashion. Up to `n` * streams may be consumed in parallel and up to `outputBuffer` chunks may be * buffered by this operator. * * @since 2.0.0 * @category utils */ ( streams: Iterable>, options: { readonly concurrency: number | "unbounded" readonly bufferSize?: number | undefined } ): Stream } = internal.mergeAll /** * Merges a struct of streams into a single stream of tagged values. * @category combinators * @since 3.8.5 * * @example * ```ts * import { Stream } from "effect" * // Stream.Stream<{ _tag: "a"; value: number; } | { _tag: "b"; value: string; }> * const res = Stream.mergeWithTag({ * a: Stream.make(0), * b: Stream.make("") * }, { concurrency: "unbounded" }) * ``` */ export const mergeWithTag: { /** * Merges a struct of streams into a single stream of tagged values. * @category combinators * @since 3.8.5 * * @example * ```ts * import { Stream } from "effect" * // Stream.Stream<{ _tag: "a"; value: number; } | { _tag: "b"; value: string; }> * const res = Stream.mergeWithTag({ * a: Stream.make(0), * b: Stream.make("") * }, { concurrency: "unbounded" }) * ``` */ }>( streams: S, options: { readonly concurrency: number | "unbounded" readonly bufferSize?: number | undefined } ): Stream< { [K in keyof S]: { _tag: K; value: Stream.Success } }[keyof S], Stream.Error, Stream.Context > /** * Merges a struct of streams into a single stream of tagged values. * @category combinators * @since 3.8.5 * * @example * ```ts * import { Stream } from "effect" * // Stream.Stream<{ _tag: "a"; value: number; } | { _tag: "b"; value: string; }> * const res = Stream.mergeWithTag({ * a: Stream.make(0), * b: Stream.make("") * }, { concurrency: "unbounded" }) * ``` */ ( options: { readonly concurrency: number | "unbounded" readonly bufferSize?: number | undefined } ): }>(streams: S) => Stream< { [K in keyof S]: { _tag: K; value: Stream.Success } }[keyof S], Stream.Error, Stream.Context > } = internal.mergeWithTag /** * Merges this stream and the specified stream together to a common element * type with the specified mapping functions. * * New produced stream will terminate when both specified stream terminate if * no termination strategy is specified. * * @example * ```ts * import { Effect, Schedule, Stream } from "effect" * * const s1 = Stream.make("1", "2", "3").pipe( * Stream.schedule(Schedule.spaced("100 millis")) * ) * const s2 = Stream.make(4.1, 5.3, 6.2).pipe( * Stream.schedule(Schedule.spaced("200 millis")) * ) * * const stream = Stream.mergeWith(s1, s2, { * onSelf: (s) => parseInt(s), * onOther: (n) => Math.floor(n) * }) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 4, 2, 3, 5, 6 ] } * ``` * * @since 2.0.0 * @category utils */ export const mergeWith: { /** * Merges this stream and the specified stream together to a common element * type with the specified mapping functions. * * New produced stream will terminate when both specified stream terminate if * no termination strategy is specified. * * @example * ```ts * import { Effect, Schedule, Stream } from "effect" * * const s1 = Stream.make("1", "2", "3").pipe( * Stream.schedule(Schedule.spaced("100 millis")) * ) * const s2 = Stream.make(4.1, 5.3, 6.2).pipe( * Stream.schedule(Schedule.spaced("200 millis")) * ) * * const stream = Stream.mergeWith(s1, s2, { * onSelf: (s) => parseInt(s), * onOther: (n) => Math.floor(n) * }) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 4, 2, 3, 5, 6 ] } * ``` * * @since 2.0.0 * @category utils */ ( other: Stream, options: { readonly onSelf: (a: A) => A3 readonly onOther: (a2: A2) => A4 readonly haltStrategy?: HaltStrategy.HaltStrategyInput | undefined } ): (self: Stream) => Stream /** * Merges this stream and the specified stream together to a common element * type with the specified mapping functions. * * New produced stream will terminate when both specified stream terminate if * no termination strategy is specified. * * @example * ```ts * import { Effect, Schedule, Stream } from "effect" * * const s1 = Stream.make("1", "2", "3").pipe( * Stream.schedule(Schedule.spaced("100 millis")) * ) * const s2 = Stream.make(4.1, 5.3, 6.2).pipe( * Stream.schedule(Schedule.spaced("200 millis")) * ) * * const stream = Stream.mergeWith(s1, s2, { * onSelf: (s) => parseInt(s), * onOther: (n) => Math.floor(n) * }) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 4, 2, 3, 5, 6 ] } * ``` * * @since 2.0.0 * @category utils */ ( self: Stream, other: Stream, options: { readonly onSelf: (a: A) => A3 readonly onOther: (a2: A2) => A4 readonly haltStrategy?: HaltStrategy.HaltStrategyInput | undefined } ): Stream } = internal.mergeWith /** * Merges this stream and the specified stream together to produce a stream of * eithers. * * @since 2.0.0 * @category utils */ export const mergeEither: { /** * Merges this stream and the specified stream together to produce a stream of * eithers. * * @since 2.0.0 * @category utils */ (that: Stream): (self: Stream) => Stream, E2 | E, R2 | R> /** * Merges this stream and the specified stream together to produce a stream of * eithers. * * @since 2.0.0 * @category utils */ (self: Stream, that: Stream): Stream, E | E2, R | R2> } = internal.mergeEither /** * Merges this stream and the specified stream together, discarding the values * from the right stream. * * @since 2.0.0 * @category utils */ export const mergeLeft: { /** * Merges this stream and the specified stream together, discarding the values * from the right stream. * * @since 2.0.0 * @category utils */ (right: Stream): (left: Stream) => Stream /** * Merges this stream and the specified stream together, discarding the values * from the right stream. * * @since 2.0.0 * @category utils */ (left: Stream, right: Stream): Stream } = internal.mergeLeft /** * Merges this stream and the specified stream together, discarding the values * from the left stream. * * @since 2.0.0 * @category utils */ export const mergeRight: { /** * Merges this stream and the specified stream together, discarding the values * from the left stream. * * @since 2.0.0 * @category utils */ (right: Stream): (left: Stream) => Stream /** * Merges this stream and the specified stream together, discarding the values * from the left stream. * * @since 2.0.0 * @category utils */ (left: Stream, right: Stream): Stream } = internal.mergeRight /** * Returns a combined string resulting from concatenating each of the values * from the stream. * * @since 2.0.0 * @category utils */ export const mkString: (self: Stream) => Effect.Effect = internal.mkString /** * The stream that never produces any value or fails with any error. * * @since 2.0.0 * @category constructors */ export const never: Stream = internal.never /** * Adds an effect to be executed at the end of the stream. * * @example * ```ts * import { Console, Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3).pipe( * Stream.map((n) => n * 2), * Stream.tap((n) => Console.log(`after mapping: ${n}`)), * Stream.onEnd(Console.log("Stream ended")) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // after mapping: 2 * // after mapping: 4 * // after mapping: 6 * // Stream ended * // { _id: 'Chunk', values: [ 2, 4, 6 ] } * ``` * * @since 3.6.0 * @category sequencing */ export const onEnd: { /** * Adds an effect to be executed at the end of the stream. * * @example * ```ts * import { Console, Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3).pipe( * Stream.map((n) => n * 2), * Stream.tap((n) => Console.log(`after mapping: ${n}`)), * Stream.onEnd(Console.log("Stream ended")) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // after mapping: 2 * // after mapping: 4 * // after mapping: 6 * // Stream ended * // { _id: 'Chunk', values: [ 2, 4, 6 ] } * ``` * * @since 3.6.0 * @category sequencing */ <_, E2, R2>(effect: Effect.Effect<_, E2, R2>): (self: Stream) => Stream /** * Adds an effect to be executed at the end of the stream. * * @example * ```ts * import { Console, Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3).pipe( * Stream.map((n) => n * 2), * Stream.tap((n) => Console.log(`after mapping: ${n}`)), * Stream.onEnd(Console.log("Stream ended")) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // after mapping: 2 * // after mapping: 4 * // after mapping: 6 * // Stream ended * // { _id: 'Chunk', values: [ 2, 4, 6 ] } * ``` * * @since 3.6.0 * @category sequencing */ (self: Stream, effect: Effect.Effect<_, E2, R2>): Stream } = internal.onEnd /** * Runs the specified effect if this stream fails, providing the error to the * effect if it exists. * * Note: Unlike `Effect.onError` there is no guarantee that the provided * effect will not be interrupted. * * @since 2.0.0 * @category utils */ export const onError: { /** * Runs the specified effect if this stream fails, providing the error to the * effect if it exists. * * Note: Unlike `Effect.onError` there is no guarantee that the provided * effect will not be interrupted. * * @since 2.0.0 * @category utils */ (cleanup: (cause: Cause.Cause) => Effect.Effect): (self: Stream) => Stream /** * Runs the specified effect if this stream fails, providing the error to the * effect if it exists. * * Note: Unlike `Effect.onError` there is no guarantee that the provided * effect will not be interrupted. * * @since 2.0.0 * @category utils */ ( self: Stream, cleanup: (cause: Cause.Cause) => Effect.Effect ): Stream } = internal.onError /** * Runs the specified effect if this stream ends. * * @since 2.0.0 * @category utils */ export const onDone: { /** * Runs the specified effect if this stream ends. * * @since 2.0.0 * @category utils */ (cleanup: () => Effect.Effect): (self: Stream) => Stream /** * Runs the specified effect if this stream ends. * * @since 2.0.0 * @category utils */ (self: Stream, cleanup: () => Effect.Effect): Stream } = internal.onDone /** * Adds an effect to be executed at the start of the stream. * * @example * ```ts * import { Console, Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3).pipe( * Stream.onStart(Console.log("Stream started")), * Stream.map((n) => n * 2), * Stream.tap((n) => Console.log(`after mapping: ${n}`)) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // Stream started * // after mapping: 2 * // after mapping: 4 * // after mapping: 6 * // { _id: 'Chunk', values: [ 2, 4, 6 ] } * ``` * * @since 3.6.0 * @category sequencing */ export const onStart: { /** * Adds an effect to be executed at the start of the stream. * * @example * ```ts * import { Console, Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3).pipe( * Stream.onStart(Console.log("Stream started")), * Stream.map((n) => n * 2), * Stream.tap((n) => Console.log(`after mapping: ${n}`)) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // Stream started * // after mapping: 2 * // after mapping: 4 * // after mapping: 6 * // { _id: 'Chunk', values: [ 2, 4, 6 ] } * ``` * * @since 3.6.0 * @category sequencing */ <_, E2, R2>(effect: Effect.Effect<_, E2, R2>): (self: Stream) => Stream /** * Adds an effect to be executed at the start of the stream. * * @example * ```ts * import { Console, Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3).pipe( * Stream.onStart(Console.log("Stream started")), * Stream.map((n) => n * 2), * Stream.tap((n) => Console.log(`after mapping: ${n}`)) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // Stream started * // after mapping: 2 * // after mapping: 4 * // after mapping: 6 * // { _id: 'Chunk', values: [ 2, 4, 6 ] } * ``` * * @since 3.6.0 * @category sequencing */ (self: Stream, effect: Effect.Effect<_, E2, R2>): Stream } = internal.onStart /** * Translates any failure into a stream termination, making the stream * infallible and all failures unchecked. * * @since 2.0.0 * @category error handling */ export const orDie: (self: Stream) => Stream = internal.orDie /** * Keeps none of the errors, and terminates the stream with them, using the * specified function to convert the `E` into a defect. * * @since 2.0.0 * @category error handling */ export const orDieWith: { /** * Keeps none of the errors, and terminates the stream with them, using the * specified function to convert the `E` into a defect. * * @since 2.0.0 * @category error handling */ (f: (e: E) => unknown): (self: Stream) => Stream /** * Keeps none of the errors, and terminates the stream with them, using the * specified function to convert the `E` into a defect. * * @since 2.0.0 * @category error handling */ (self: Stream, f: (e: E) => unknown): Stream } = internal.orDieWith /** * Switches to the provided stream in case this one fails with a typed error. * * See also `Stream.catchAll`. * * @since 2.0.0 * @category error handling */ export const orElse: { /** * Switches to the provided stream in case this one fails with a typed error. * * See also `Stream.catchAll`. * * @since 2.0.0 * @category error handling */ (that: LazyArg>): (self: Stream) => Stream /** * Switches to the provided stream in case this one fails with a typed error. * * See also `Stream.catchAll`. * * @since 2.0.0 * @category error handling */ (self: Stream, that: LazyArg>): Stream } = internal.orElse /** * Switches to the provided stream in case this one fails with a typed error. * * See also `Stream.catchAll`. * * @since 2.0.0 * @category error handling */ export const orElseEither: { /** * Switches to the provided stream in case this one fails with a typed error. * * See also `Stream.catchAll`. * * @since 2.0.0 * @category error handling */ (that: LazyArg>): (self: Stream) => Stream, E2, R2 | R> /** * Switches to the provided stream in case this one fails with a typed error. * * See also `Stream.catchAll`. * * @since 2.0.0 * @category error handling */ (self: Stream, that: LazyArg>): Stream, E2, R | R2> } = internal.orElseEither /** * Fails with given error in case this one fails with a typed error. * * See also `Stream.catchAll`. * * @since 2.0.0 * @category error handling */ export const orElseFail: { /** * Fails with given error in case this one fails with a typed error. * * See also `Stream.catchAll`. * * @since 2.0.0 * @category error handling */ (error: LazyArg): (self: Stream) => Stream /** * Fails with given error in case this one fails with a typed error. * * See also `Stream.catchAll`. * * @since 2.0.0 * @category error handling */ (self: Stream, error: LazyArg): Stream } = internal.orElseFail /** * Produces the specified element if this stream is empty. * * @since 2.0.0 * @category error handling */ export const orElseIfEmpty: { /** * Produces the specified element if this stream is empty. * * @since 2.0.0 * @category error handling */ (element: LazyArg): (self: Stream) => Stream /** * Produces the specified element if this stream is empty. * * @since 2.0.0 * @category error handling */ (self: Stream, element: LazyArg): Stream } = internal.orElseIfEmpty /** * Produces the specified chunk if this stream is empty. * * @since 2.0.0 * @category error handling */ export const orElseIfEmptyChunk: { /** * Produces the specified chunk if this stream is empty. * * @since 2.0.0 * @category error handling */ (chunk: LazyArg>): (self: Stream) => Stream /** * Produces the specified chunk if this stream is empty. * * @since 2.0.0 * @category error handling */ (self: Stream, chunk: LazyArg>): Stream } = internal.orElseIfEmptyChunk /** * Switches to the provided stream in case this one is empty. * * @since 2.0.0 * @category error handling */ export const orElseIfEmptyStream: { /** * Switches to the provided stream in case this one is empty. * * @since 2.0.0 * @category error handling */ (stream: LazyArg>): (self: Stream) => Stream /** * Switches to the provided stream in case this one is empty. * * @since 2.0.0 * @category error handling */ (self: Stream, stream: LazyArg>): Stream } = internal.orElseIfEmptyStream /** * Succeeds with the specified value if this one fails with a typed error. * * @since 2.0.0 * @category error handling */ export const orElseSucceed: { /** * Succeeds with the specified value if this one fails with a typed error. * * @since 2.0.0 * @category error handling */ (value: LazyArg): (self: Stream) => Stream /** * Succeeds with the specified value if this one fails with a typed error. * * @since 2.0.0 * @category error handling */ (self: Stream, value: LazyArg): Stream } = internal.orElseSucceed /** * Like `Stream.unfold`, but allows the emission of values to end one step further * than the unfolding of the state. This is useful for embedding paginated * APIs, hence the name. * * @example * ```ts * import { Effect, Option, Stream } from "effect" * * const stream = Stream.paginate(0, (n) => [ * n, * n < 3 ? Option.some(n + 1) : Option.none() * ]) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 0, 1, 2, 3 ] } * ``` * * @since 2.0.0 * @category constructors */ export const paginate: (s: S, f: (s: S) => readonly [A, Option.Option]) => Stream = internal.paginate /** * Like `Stream.unfoldChunk`, but allows the emission of values to end one step * further than the unfolding of the state. This is useful for embedding * paginated APIs, hence the name. * * @since 2.0.0 * @category constructors */ export const paginateChunk: ( s: S, f: (s: S) => readonly [Chunk.Chunk, Option.Option] ) => Stream = internal.paginateChunk /** * Like `Stream.unfoldChunkEffect`, but allows the emission of values to end one step * further than the unfolding of the state. This is useful for embedding * paginated APIs, hence the name. * * @since 2.0.0 * @category constructors */ export const paginateChunkEffect: ( s: S, f: (s: S) => Effect.Effect, Option.Option], E, R> ) => Stream = internal.paginateChunkEffect /** * Like `Stream.unfoldEffect` but allows the emission of values to end one step * further than the unfolding of the state. This is useful for embedding * paginated APIs, hence the name. * * @since 2.0.0 * @category constructors */ export const paginateEffect: ( s: S, f: (s: S) => Effect.Effect], E, R> ) => Stream = internal.paginateEffect /** * Splits a stream into two substreams based on a predicate. * * **Details** * * The `Stream.partition` function splits a stream into two parts: one for * elements that satisfy the predicate (evaluated to `true`) and another for * those that do not (evaluated to `false`). * * The faster stream may advance up to `bufferSize` elements ahead of the slower * one. * * **Example** (Partitioning a Stream into Even and Odd Numbers) * * ```ts * import { Effect, Stream } from "effect" * * const partition = Stream.range(1, 9).pipe( * Stream.partition((n) => n % 2 === 0, { bufferSize: 5 }) * ) * * const program = Effect.scoped( * Effect.gen(function*() { * const [odds, evens] = yield* partition * console.log(yield* Stream.runCollect(odds)) * console.log(yield* Stream.runCollect(evens)) * }) * ) * * Effect.runPromise(program) * // { _id: 'Chunk', values: [ 1, 3, 5, 7, 9 ] } * // { _id: 'Chunk', values: [ 2, 4, 6, 8 ] } * ``` * * @see {@link partitionEither} for partitioning a stream based on effectful * conditions. * * @since 2.0.0 * @category utils */ export const partition: { /** * Splits a stream into two substreams based on a predicate. * * **Details** * * The `Stream.partition` function splits a stream into two parts: one for * elements that satisfy the predicate (evaluated to `true`) and another for * those that do not (evaluated to `false`). * * The faster stream may advance up to `bufferSize` elements ahead of the slower * one. * * **Example** (Partitioning a Stream into Even and Odd Numbers) * * ```ts * import { Effect, Stream } from "effect" * * const partition = Stream.range(1, 9).pipe( * Stream.partition((n) => n % 2 === 0, { bufferSize: 5 }) * ) * * const program = Effect.scoped( * Effect.gen(function*() { * const [odds, evens] = yield* partition * console.log(yield* Stream.runCollect(odds)) * console.log(yield* Stream.runCollect(evens)) * }) * ) * * Effect.runPromise(program) * // { _id: 'Chunk', values: [ 1, 3, 5, 7, 9 ] } * // { _id: 'Chunk', values: [ 2, 4, 6, 8 ] } * ``` * * @see {@link partitionEither} for partitioning a stream based on effectful * conditions. * * @since 2.0.0 * @category utils */ ( refinement: Refinement, B>, options?: { bufferSize?: number | undefined } | undefined ): ( self: Stream ) => Effect.Effect<[excluded: Stream, E, never>, satisfying: Stream], E, R | Scope.Scope> /** * Splits a stream into two substreams based on a predicate. * * **Details** * * The `Stream.partition` function splits a stream into two parts: one for * elements that satisfy the predicate (evaluated to `true`) and another for * those that do not (evaluated to `false`). * * The faster stream may advance up to `bufferSize` elements ahead of the slower * one. * * **Example** (Partitioning a Stream into Even and Odd Numbers) * * ```ts * import { Effect, Stream } from "effect" * * const partition = Stream.range(1, 9).pipe( * Stream.partition((n) => n % 2 === 0, { bufferSize: 5 }) * ) * * const program = Effect.scoped( * Effect.gen(function*() { * const [odds, evens] = yield* partition * console.log(yield* Stream.runCollect(odds)) * console.log(yield* Stream.runCollect(evens)) * }) * ) * * Effect.runPromise(program) * // { _id: 'Chunk', values: [ 1, 3, 5, 7, 9 ] } * // { _id: 'Chunk', values: [ 2, 4, 6, 8 ] } * ``` * * @see {@link partitionEither} for partitioning a stream based on effectful * conditions. * * @since 2.0.0 * @category utils */ ( predicate: Predicate, options?: { bufferSize?: number | undefined } | undefined ): ( self: Stream ) => Effect.Effect<[excluded: Stream, satisfying: Stream], E, Scope.Scope | R> /** * Splits a stream into two substreams based on a predicate. * * **Details** * * The `Stream.partition` function splits a stream into two parts: one for * elements that satisfy the predicate (evaluated to `true`) and another for * those that do not (evaluated to `false`). * * The faster stream may advance up to `bufferSize` elements ahead of the slower * one. * * **Example** (Partitioning a Stream into Even and Odd Numbers) * * ```ts * import { Effect, Stream } from "effect" * * const partition = Stream.range(1, 9).pipe( * Stream.partition((n) => n % 2 === 0, { bufferSize: 5 }) * ) * * const program = Effect.scoped( * Effect.gen(function*() { * const [odds, evens] = yield* partition * console.log(yield* Stream.runCollect(odds)) * console.log(yield* Stream.runCollect(evens)) * }) * ) * * Effect.runPromise(program) * // { _id: 'Chunk', values: [ 1, 3, 5, 7, 9 ] } * // { _id: 'Chunk', values: [ 2, 4, 6, 8 ] } * ``` * * @see {@link partitionEither} for partitioning a stream based on effectful * conditions. * * @since 2.0.0 * @category utils */ ( self: Stream, refinement: Refinement, options?: { bufferSize?: number | undefined } | undefined ): Effect.Effect<[excluded: Stream, E, never>, satisfying: Stream], E, R | Scope.Scope> /** * Splits a stream into two substreams based on a predicate. * * **Details** * * The `Stream.partition` function splits a stream into two parts: one for * elements that satisfy the predicate (evaluated to `true`) and another for * those that do not (evaluated to `false`). * * The faster stream may advance up to `bufferSize` elements ahead of the slower * one. * * **Example** (Partitioning a Stream into Even and Odd Numbers) * * ```ts * import { Effect, Stream } from "effect" * * const partition = Stream.range(1, 9).pipe( * Stream.partition((n) => n % 2 === 0, { bufferSize: 5 }) * ) * * const program = Effect.scoped( * Effect.gen(function*() { * const [odds, evens] = yield* partition * console.log(yield* Stream.runCollect(odds)) * console.log(yield* Stream.runCollect(evens)) * }) * ) * * Effect.runPromise(program) * // { _id: 'Chunk', values: [ 1, 3, 5, 7, 9 ] } * // { _id: 'Chunk', values: [ 2, 4, 6, 8 ] } * ``` * * @see {@link partitionEither} for partitioning a stream based on effectful * conditions. * * @since 2.0.0 * @category utils */ ( self: Stream, predicate: Predicate, options?: { bufferSize?: number | undefined } | undefined ): Effect.Effect<[excluded: Stream, satisfying: Stream], E, R | Scope.Scope> } = internal.partition /** * Splits a stream into two substreams based on an effectful condition. * * **Details** * * The `Stream.partitionEither` function is used to divide a stream into two * parts: one for elements that satisfy a condition producing `Either.left` * values, and another for those that produce `Either.right` values. This * function applies an effectful predicate to each element in the stream to * determine which substream it belongs to. * * The faster stream may advance up to `bufferSize` elements ahead of the slower * one. * * **Example** (Partitioning a Stream with an Effectful Predicate) * * ```ts * import { Effect, Either, Stream } from "effect" * * const partition = Stream.range(1, 9).pipe( * Stream.partitionEither( * (n) => Effect.succeed(n % 2 === 0 ? Either.right(n) : Either.left(n)), * { bufferSize: 5 } * ) * ) * * const program = Effect.scoped( * Effect.gen(function*() { * const [evens, odds] = yield* partition * console.log(yield* Stream.runCollect(evens)) * console.log(yield* Stream.runCollect(odds)) * }) * ) * * Effect.runPromise(program) * // { _id: 'Chunk', values: [ 1, 3, 5, 7, 9 ] } * // { _id: 'Chunk', values: [ 2, 4, 6, 8 ] } * ``` * * @see {@link partition} for partitioning a stream based on simple conditions. * * @since 2.0.0 * @category utils */ export const partitionEither: { /** * Splits a stream into two substreams based on an effectful condition. * * **Details** * * The `Stream.partitionEither` function is used to divide a stream into two * parts: one for elements that satisfy a condition producing `Either.left` * values, and another for those that produce `Either.right` values. This * function applies an effectful predicate to each element in the stream to * determine which substream it belongs to. * * The faster stream may advance up to `bufferSize` elements ahead of the slower * one. * * **Example** (Partitioning a Stream with an Effectful Predicate) * * ```ts * import { Effect, Either, Stream } from "effect" * * const partition = Stream.range(1, 9).pipe( * Stream.partitionEither( * (n) => Effect.succeed(n % 2 === 0 ? Either.right(n) : Either.left(n)), * { bufferSize: 5 } * ) * ) * * const program = Effect.scoped( * Effect.gen(function*() { * const [evens, odds] = yield* partition * console.log(yield* Stream.runCollect(evens)) * console.log(yield* Stream.runCollect(odds)) * }) * ) * * Effect.runPromise(program) * // { _id: 'Chunk', values: [ 1, 3, 5, 7, 9 ] } * // { _id: 'Chunk', values: [ 2, 4, 6, 8 ] } * ``` * * @see {@link partition} for partitioning a stream based on simple conditions. * * @since 2.0.0 * @category utils */ ( predicate: (a: NoInfer) => Effect.Effect, E2, R2>, options?: { readonly bufferSize?: number | undefined } | undefined ): ( self: Stream ) => Effect.Effect<[left: Stream, right: Stream], E2 | E, Scope.Scope | R2 | R> /** * Splits a stream into two substreams based on an effectful condition. * * **Details** * * The `Stream.partitionEither` function is used to divide a stream into two * parts: one for elements that satisfy a condition producing `Either.left` * values, and another for those that produce `Either.right` values. This * function applies an effectful predicate to each element in the stream to * determine which substream it belongs to. * * The faster stream may advance up to `bufferSize` elements ahead of the slower * one. * * **Example** (Partitioning a Stream with an Effectful Predicate) * * ```ts * import { Effect, Either, Stream } from "effect" * * const partition = Stream.range(1, 9).pipe( * Stream.partitionEither( * (n) => Effect.succeed(n % 2 === 0 ? Either.right(n) : Either.left(n)), * { bufferSize: 5 } * ) * ) * * const program = Effect.scoped( * Effect.gen(function*() { * const [evens, odds] = yield* partition * console.log(yield* Stream.runCollect(evens)) * console.log(yield* Stream.runCollect(odds)) * }) * ) * * Effect.runPromise(program) * // { _id: 'Chunk', values: [ 1, 3, 5, 7, 9 ] } * // { _id: 'Chunk', values: [ 2, 4, 6, 8 ] } * ``` * * @see {@link partition} for partitioning a stream based on simple conditions. * * @since 2.0.0 * @category utils */ ( self: Stream, predicate: (a: A) => Effect.Effect, E2, R2>, options?: { readonly bufferSize?: number | undefined } | undefined ): Effect.Effect<[left: Stream, right: Stream], E | E2, Scope.Scope | R | R2> } = internal.partitionEither /** * Peels off enough material from the stream to construct a `Z` using the * provided `Sink` and then returns both the `Z` and the rest of the * `Stream` in a scope. Like all scoped values, the provided stream is * valid only within the scope. * * @since 2.0.0 * @category utils */ export const peel: { /** * Peels off enough material from the stream to construct a `Z` using the * provided `Sink` and then returns both the `Z` and the rest of the * `Stream` in a scope. Like all scoped values, the provided stream is * valid only within the scope. * * @since 2.0.0 * @category utils */ (sink: Sink.Sink): (self: Stream) => Effect.Effect<[A2, Stream], E2 | E, Scope.Scope | R2 | R> /** * Peels off enough material from the stream to construct a `Z` using the * provided `Sink` and then returns both the `Z` and the rest of the * `Stream` in a scope. Like all scoped values, the provided stream is * valid only within the scope. * * @since 2.0.0 * @category utils */ (self: Stream, sink: Sink.Sink): Effect.Effect<[A2, Stream], E | E2, Scope.Scope | R | R2> } = internal.peel /** * Pipes all of the values from this stream through the provided sink. * * See also `Stream.transduce`. * * @since 2.0.0 * @category utils */ export const pipeThrough: { /** * Pipes all of the values from this stream through the provided sink. * * See also `Stream.transduce`. * * @since 2.0.0 * @category utils */ (sink: Sink.Sink): (self: Stream) => Stream /** * Pipes all of the values from this stream through the provided sink. * * See also `Stream.transduce`. * * @since 2.0.0 * @category utils */ (self: Stream, sink: Sink.Sink): Stream } = internal.pipeThrough /** * Pipes all the values from this stream through the provided channel. * * @since 2.0.0 * @category utils */ export const pipeThroughChannel: { /** * Pipes all the values from this stream through the provided channel. * * @since 2.0.0 * @category utils */ ( channel: Channel.Channel, Chunk.Chunk, E2, E, unknown, unknown, R2> ): (self: Stream) => Stream /** * Pipes all the values from this stream through the provided channel. * * @since 2.0.0 * @category utils */ ( self: Stream, channel: Channel.Channel, Chunk.Chunk, E2, E, unknown, unknown, R2> ): Stream } = internal.pipeThroughChannel /** * Pipes all values from this stream through the provided channel, passing * through any error emitted by this stream unchanged. * * @since 2.0.0 * @category utils */ export const pipeThroughChannelOrFail: { /** * Pipes all values from this stream through the provided channel, passing * through any error emitted by this stream unchanged. * * @since 2.0.0 * @category utils */ ( chan: Channel.Channel, Chunk.Chunk, E2, E, unknown, unknown, R2> ): (self: Stream) => Stream /** * Pipes all values from this stream through the provided channel, passing * through any error emitted by this stream unchanged. * * @since 2.0.0 * @category utils */ ( self: Stream, chan: Channel.Channel, Chunk.Chunk, E2, E, unknown, unknown, R2> ): Stream } = internal.pipeThroughChannelOrFail /** * Emits the provided chunk before emitting any other value. * * @since 2.0.0 * @category utils */ export const prepend: { /** * Emits the provided chunk before emitting any other value. * * @since 2.0.0 * @category utils */ (values: Chunk.Chunk): (self: Stream) => Stream /** * Emits the provided chunk before emitting any other value. * * @since 2.0.0 * @category utils */ (self: Stream, values: Chunk.Chunk): Stream } = internal.prepend /** * Provides the stream with its required context, which eliminates its * dependency on `R`. * * @since 2.0.0 * @category context */ export const provideContext: { /** * Provides the stream with its required context, which eliminates its * dependency on `R`. * * @since 2.0.0 * @category context */ (context: Context.Context): (self: Stream) => Stream /** * Provides the stream with its required context, which eliminates its * dependency on `R`. * * @since 2.0.0 * @category context */ (self: Stream, context: Context.Context): Stream } = internal.provideContext /** * Provides the stream with some of its required context, which eliminates its * dependency on `R`. * * @since 3.16.9 * @category context */ export const provideSomeContext: { /** * Provides the stream with some of its required context, which eliminates its * dependency on `R`. * * @since 3.16.9 * @category context */ (context: Context.Context): (self: Stream) => Stream> /** * Provides the stream with some of its required context, which eliminates its * dependency on `R`. * * @since 3.16.9 * @category context */ (self: Stream, context: Context.Context): Stream> } = internal.provideSomeContext /** * Provides a `Layer` to the stream, which translates it to another level. * * @since 2.0.0 * @category context */ export const provideLayer: { /** * Provides a `Layer` to the stream, which translates it to another level. * * @since 2.0.0 * @category context */ (layer: Layer.Layer): (self: Stream) => Stream /** * Provides a `Layer` to the stream, which translates it to another level. * * @since 2.0.0 * @category context */ (self: Stream, layer: Layer.Layer): Stream } = internal.provideLayer /** * Provides the stream with the single service it requires. If the stream * requires more than one service use `Stream.provideContext` instead. * * @since 2.0.0 * @category context */ export const provideService: { /** * Provides the stream with the single service it requires. If the stream * requires more than one service use `Stream.provideContext` instead. * * @since 2.0.0 * @category context */ (tag: Context.Tag, resource: NoInfer): (self: Stream) => Stream> /** * Provides the stream with the single service it requires. If the stream * requires more than one service use `Stream.provideContext` instead. * * @since 2.0.0 * @category context */ (self: Stream, tag: Context.Tag, resource: NoInfer): Stream> } = internal.provideService /** * Provides the stream with the single service it requires. If the stream * requires more than one service use `Stream.provideContext` instead. * * @since 2.0.0 * @category context */ export const provideServiceEffect: { /** * Provides the stream with the single service it requires. If the stream * requires more than one service use `Stream.provideContext` instead. * * @since 2.0.0 * @category context */ (tag: Context.Tag, effect: Effect.Effect, E2, R2>): (self: Stream) => Stream> /** * Provides the stream with the single service it requires. If the stream * requires more than one service use `Stream.provideContext` instead. * * @since 2.0.0 * @category context */ ( self: Stream, tag: Context.Tag, effect: Effect.Effect, E2, R2> ): Stream> } = internal.provideServiceEffect /** * Provides the stream with the single service it requires. If the stream * requires more than one service use `Stream.provideContext` instead. * * @since 2.0.0 * @category context */ export const provideServiceStream: { /** * Provides the stream with the single service it requires. If the stream * requires more than one service use `Stream.provideContext` instead. * * @since 2.0.0 * @category context */ (tag: Context.Tag, stream: Stream, E2, R2>): (self: Stream) => Stream> /** * Provides the stream with the single service it requires. If the stream * requires more than one service use `Stream.provideContext` instead. * * @since 2.0.0 * @category context */ ( self: Stream, tag: Context.Tag, stream: Stream, E2, R2> ): Stream> } = internal.provideServiceStream /** * Transforms the context being provided to the stream with the specified * function. * * @since 2.0.0 * @category context */ export const mapInputContext: { /** * Transforms the context being provided to the stream with the specified * function. * * @since 2.0.0 * @category context */ (f: (env: Context.Context) => Context.Context): (self: Stream) => Stream /** * Transforms the context being provided to the stream with the specified * function. * * @since 2.0.0 * @category context */ (self: Stream, f: (env: Context.Context) => Context.Context): Stream } = internal.mapInputContext /** * Splits the context into two parts, providing one part using the * specified layer and leaving the remainder `R0`. * * @since 2.0.0 * @category context */ export const provideSomeLayer: { /** * Splits the context into two parts, providing one part using the * specified layer and leaving the remainder `R0`. * * @since 2.0.0 * @category context */ (layer: Layer.Layer): (self: Stream) => Stream> /** * Splits the context into two parts, providing one part using the * specified layer and leaving the remainder `R0`. * * @since 2.0.0 * @category context */ (self: Stream, layer: Layer.Layer): Stream> } = internal.provideSomeLayer /** * Returns a stream that mirrors the first upstream to emit an item. * As soon as one of the upstream emits a first value, the other is interrupted. * The resulting stream will forward all items from the "winning" source stream. * Any upstream failures will cause the returned stream to fail. * * @example * ```ts * import { Stream, Schedule, Console, Effect } from "effect" * * const stream = Stream.fromSchedule(Schedule.spaced('2 millis')).pipe( * Stream.race(Stream.fromSchedule(Schedule.spaced('1 millis'))), * Stream.take(6), * Stream.tap(Console.log) * ) * * Effect.runPromise(Stream.runDrain(stream)) * // Output each millisecond from the first stream, the rest streams are interrupted * // 0 * // 1 * // 2 * // 3 * // 4 * // 5 * ``` * @since 3.7.0 * @category racing */ export const race: { /** * Returns a stream that mirrors the first upstream to emit an item. * As soon as one of the upstream emits a first value, the other is interrupted. * The resulting stream will forward all items from the "winning" source stream. * Any upstream failures will cause the returned stream to fail. * * @example * ```ts * import { Stream, Schedule, Console, Effect } from "effect" * * const stream = Stream.fromSchedule(Schedule.spaced('2 millis')).pipe( * Stream.race(Stream.fromSchedule(Schedule.spaced('1 millis'))), * Stream.take(6), * Stream.tap(Console.log) * ) * * Effect.runPromise(Stream.runDrain(stream)) * // Output each millisecond from the first stream, the rest streams are interrupted * // 0 * // 1 * // 2 * // 3 * // 4 * // 5 * ``` * @since 3.7.0 * @category racing */ (right: Stream): (left: Stream) => Stream /** * Returns a stream that mirrors the first upstream to emit an item. * As soon as one of the upstream emits a first value, the other is interrupted. * The resulting stream will forward all items from the "winning" source stream. * Any upstream failures will cause the returned stream to fail. * * @example * ```ts * import { Stream, Schedule, Console, Effect } from "effect" * * const stream = Stream.fromSchedule(Schedule.spaced('2 millis')).pipe( * Stream.race(Stream.fromSchedule(Schedule.spaced('1 millis'))), * Stream.take(6), * Stream.tap(Console.log) * ) * * Effect.runPromise(Stream.runDrain(stream)) * // Output each millisecond from the first stream, the rest streams are interrupted * // 0 * // 1 * // 2 * // 3 * // 4 * // 5 * ``` * @since 3.7.0 * @category racing */ (left: Stream, right: Stream): Stream } = internal.race /** * Returns a stream that mirrors the first upstream to emit an item. * As soon as one of the upstream emits a first value, all the others are interrupted. * The resulting stream will forward all items from the "winning" source stream. * Any upstream failures will cause the returned stream to fail. * * @example * ```ts * import { Stream, Schedule, Console, Effect } from "effect" * * const stream = Stream.raceAll( * Stream.fromSchedule(Schedule.spaced('1 millis')), * Stream.fromSchedule(Schedule.spaced('2 millis')), * Stream.fromSchedule(Schedule.spaced('4 millis')), * ).pipe(Stream.take(6), Stream.tap(Console.log)) * * Effect.runPromise(Stream.runDrain(stream)) * // Output each millisecond from the first stream, the rest streams are interrupted * // 0 * // 1 * // 2 * // 3 * // 4 * // 5 * ``` * @since 3.5.0 * @category racing */ export const raceAll: >>( ...streams: S ) => Stream< Stream.Success, Stream.Error, Stream.Context > = internal.raceAll /** * Constructs a stream from a range of integers, including both endpoints. * * @example * ```ts * import { Effect, Stream } from "effect" * * // A Stream with a range of numbers from 1 to 5 * const stream = Stream.range(1, 5) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 1, 2, 3, 4, 5 ] } * ``` * * @since 2.0.0 * @category constructors */ export const range: (min: number, max: number, chunkSize?: number) => Stream = internal.range /** * Re-chunks the elements of the stream into chunks of `n` elements each. The * last chunk might contain less than `n` elements. * * @since 2.0.0 * @category utils */ export const rechunk: { /** * Re-chunks the elements of the stream into chunks of `n` elements each. The * last chunk might contain less than `n` elements. * * @since 2.0.0 * @category utils */ (n: number): (self: Stream) => Stream /** * Re-chunks the elements of the stream into chunks of `n` elements each. The * last chunk might contain less than `n` elements. * * @since 2.0.0 * @category utils */ (self: Stream, n: number): Stream } = internal.rechunk /** * Keeps some of the errors, and terminates the fiber with the rest * * @since 2.0.0 * @category error handling */ export const refineOrDie: { /** * Keeps some of the errors, and terminates the fiber with the rest * * @since 2.0.0 * @category error handling */ (pf: (error: E) => Option.Option): (self: Stream) => Stream /** * Keeps some of the errors, and terminates the fiber with the rest * * @since 2.0.0 * @category error handling */ (self: Stream, pf: (error: E) => Option.Option): Stream } = internal.refineOrDie /** * Keeps some of the errors, and terminates the fiber with the rest, using the * specified function to convert the `E` into a defect. * * @since 2.0.0 * @category error handling */ export const refineOrDieWith: { /** * Keeps some of the errors, and terminates the fiber with the rest, using the * specified function to convert the `E` into a defect. * * @since 2.0.0 * @category error handling */ (pf: (error: E) => Option.Option, f: (error: E) => unknown): (self: Stream) => Stream /** * Keeps some of the errors, and terminates the fiber with the rest, using the * specified function to convert the `E` into a defect. * * @since 2.0.0 * @category error handling */ ( self: Stream, pf: (error: E) => Option.Option, f: (error: E) => unknown ): Stream } = internal.refineOrDieWith /** * Repeats the entire stream using the specified schedule. The stream will * execute normally, and then repeat again according to the provided schedule. * * @example * ```ts * import { Effect, Schedule, Stream } from "effect" * * const stream = Stream.repeat(Stream.succeed(1), Schedule.forever) * * Effect.runPromise(Stream.runCollect(stream.pipe(Stream.take(5)))).then(console.log) * // { _id: 'Chunk', values: [ 1, 1, 1, 1, 1 ] } * ``` * * @since 2.0.0 * @category utils */ export const repeat: { /** * Repeats the entire stream using the specified schedule. The stream will * execute normally, and then repeat again according to the provided schedule. * * @example * ```ts * import { Effect, Schedule, Stream } from "effect" * * const stream = Stream.repeat(Stream.succeed(1), Schedule.forever) * * Effect.runPromise(Stream.runCollect(stream.pipe(Stream.take(5)))).then(console.log) * // { _id: 'Chunk', values: [ 1, 1, 1, 1, 1 ] } * ``` * * @since 2.0.0 * @category utils */ (schedule: Schedule.Schedule): (self: Stream) => Stream /** * Repeats the entire stream using the specified schedule. The stream will * execute normally, and then repeat again according to the provided schedule. * * @example * ```ts * import { Effect, Schedule, Stream } from "effect" * * const stream = Stream.repeat(Stream.succeed(1), Schedule.forever) * * Effect.runPromise(Stream.runCollect(stream.pipe(Stream.take(5)))).then(console.log) * // { _id: 'Chunk', values: [ 1, 1, 1, 1, 1 ] } * ``` * * @since 2.0.0 * @category utils */ (self: Stream, schedule: Schedule.Schedule): Stream } = internal.repeat /** * Creates a stream from an effect producing a value of type `A` which repeats * forever. * * @example * ```ts * import { Effect, Random, Stream } from "effect" * * const stream = Stream.repeatEffect(Random.nextInt) * * Effect.runPromise(Stream.runCollect(stream.pipe(Stream.take(5)))).then(console.log) * // Example Output: { _id: 'Chunk', values: [ 3891571149, 4239494205, 2352981603, 2339111046, 1488052210 ] } * ``` * * @since 2.0.0 * @category constructors */ export const repeatEffect: (effect: Effect.Effect) => Stream = internal.repeatEffect /** * Creates a stream from an effect producing chunks of `A` values which * repeats forever. * * @since 2.0.0 * @category constructors */ export const repeatEffectChunk: (effect: Effect.Effect, E, R>) => Stream = internal.repeatEffectChunk /** * Creates a stream from an effect producing chunks of `A` values until it * fails with `None`. * * @since 2.0.0 * @category constructors */ export const repeatEffectChunkOption: ( effect: Effect.Effect, Option.Option, R> ) => Stream = internal.repeatEffectChunkOption /** * Creates a stream from an effect producing values of type `A` until it fails * with `None`. * * @example * ```ts * // In this example, we're draining an Iterator to create a stream from it * import { Stream, Effect, Option } from "effect" * * const drainIterator = (it: Iterator): Stream.Stream => * Stream.repeatEffectOption( * Effect.sync(() => it.next()).pipe( * Effect.andThen((res) => { * if (res.done) { * return Effect.fail(Option.none()) * } * return Effect.succeed(res.value) * }) * ) * ) * ``` * * @since 2.0.0 * @category constructors */ export const repeatEffectOption: (effect: Effect.Effect, R>) => Stream = internal.repeatEffectOption /** * Creates a stream from an effect producing a value of type `A`, which is * repeated using the specified schedule. * * @since 2.0.0 * @category constructors */ export const repeatEffectWithSchedule: ( effect: Effect.Effect, schedule: Schedule.Schedule ) => Stream = internal.repeatEffectWithSchedule /** * Repeats the entire stream using the specified schedule. The stream will * execute normally, and then repeat again according to the provided schedule. * The schedule output will be emitted at the end of each repetition. * * @since 2.0.0 * @category utils */ export const repeatEither: { /** * Repeats the entire stream using the specified schedule. The stream will * execute normally, and then repeat again according to the provided schedule. * The schedule output will be emitted at the end of each repetition. * * @since 2.0.0 * @category utils */ (schedule: Schedule.Schedule): (self: Stream) => Stream, E, R2 | R> /** * Repeats the entire stream using the specified schedule. The stream will * execute normally, and then repeat again according to the provided schedule. * The schedule output will be emitted at the end of each repetition. * * @since 2.0.0 * @category utils */ (self: Stream, schedule: Schedule.Schedule): Stream, E, R | R2> } = internal.repeatEither /** * Repeats each element of the stream using the provided schedule. Repetitions * are done in addition to the first execution, which means using * `Schedule.recurs(1)` actually results in the original effect, plus an * additional recurrence, for a total of two repetitions of each value in the * stream. * * @since 2.0.0 * @category utils */ export const repeatElements: { /** * Repeats each element of the stream using the provided schedule. Repetitions * are done in addition to the first execution, which means using * `Schedule.recurs(1)` actually results in the original effect, plus an * additional recurrence, for a total of two repetitions of each value in the * stream. * * @since 2.0.0 * @category utils */ (schedule: Schedule.Schedule): (self: Stream) => Stream /** * Repeats each element of the stream using the provided schedule. Repetitions * are done in addition to the first execution, which means using * `Schedule.recurs(1)` actually results in the original effect, plus an * additional recurrence, for a total of two repetitions of each value in the * stream. * * @since 2.0.0 * @category utils */ (self: Stream, schedule: Schedule.Schedule): Stream } = internal.repeatElements /** * Repeats each element of the stream using the provided schedule. When the * schedule is finished, then the output of the schedule will be emitted into * the stream. Repetitions are done in addition to the first execution, which * means using `Schedule.recurs(1)` actually results in the original effect, * plus an additional recurrence, for a total of two repetitions of each value * in the stream. * * This function accepts two conversion functions, which allow the output of * this stream and the output of the provided schedule to be unified into a * single type. For example, `Either` or similar data type. * * @since 2.0.0 * @category utils */ export const repeatElementsWith: { /** * Repeats each element of the stream using the provided schedule. When the * schedule is finished, then the output of the schedule will be emitted into * the stream. Repetitions are done in addition to the first execution, which * means using `Schedule.recurs(1)` actually results in the original effect, * plus an additional recurrence, for a total of two repetitions of each value * in the stream. * * This function accepts two conversion functions, which allow the output of * this stream and the output of the provided schedule to be unified into a * single type. For example, `Either` or similar data type. * * @since 2.0.0 * @category utils */ ( schedule: Schedule.Schedule, options: { readonly onElement: (a: A) => C; readonly onSchedule: (b: B) => C } ): (self: Stream) => Stream /** * Repeats each element of the stream using the provided schedule. When the * schedule is finished, then the output of the schedule will be emitted into * the stream. Repetitions are done in addition to the first execution, which * means using `Schedule.recurs(1)` actually results in the original effect, * plus an additional recurrence, for a total of two repetitions of each value * in the stream. * * This function accepts two conversion functions, which allow the output of * this stream and the output of the provided schedule to be unified into a * single type. For example, `Either` or similar data type. * * @since 2.0.0 * @category utils */ ( self: Stream, schedule: Schedule.Schedule, options: { readonly onElement: (a: A) => C; readonly onSchedule: (b: B) => C } ): Stream } = internal.repeatElementsWith /** * Repeats the provided value infinitely. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.repeatValue(0) * * Effect.runPromise(Stream.runCollect(stream.pipe(Stream.take(5)))).then(console.log) * // { _id: 'Chunk', values: [ 0, 0, 0, 0, 0 ] } * ``` * * @since 2.0.0 * @category constructors */ export const repeatValue: (value: A) => Stream = internal.repeatValue /** * Repeats the entire stream using the specified schedule. The stream will * execute normally, and then repeat again according to the provided schedule. * The schedule output will be emitted at the end of each repetition and can * be unified with the stream elements using the provided functions. * * @since 2.0.0 * @category utils */ export const repeatWith: { /** * Repeats the entire stream using the specified schedule. The stream will * execute normally, and then repeat again according to the provided schedule. * The schedule output will be emitted at the end of each repetition and can * be unified with the stream elements using the provided functions. * * @since 2.0.0 * @category utils */ ( schedule: Schedule.Schedule, options: { readonly onElement: (a: A) => C; readonly onSchedule: (b: B) => C } ): (self: Stream) => Stream /** * Repeats the entire stream using the specified schedule. The stream will * execute normally, and then repeat again according to the provided schedule. * The schedule output will be emitted at the end of each repetition and can * be unified with the stream elements using the provided functions. * * @since 2.0.0 * @category utils */ ( self: Stream, schedule: Schedule.Schedule, options: { readonly onElement: (a: A) => C; readonly onSchedule: (b: B) => C } ): Stream } = internal.repeatWith /** * When the stream fails, retry it according to the given schedule * * This retries the entire stream, so will re-execute all of the stream's * acquire operations. * * The schedule is reset as soon as the first element passes through the * stream again. * * @since 2.0.0 * @category utils */ export const retry: { /** * When the stream fails, retry it according to the given schedule * * This retries the entire stream, so will re-execute all of the stream's * acquire operations. * * The schedule is reset as soon as the first element passes through the * stream again. * * @since 2.0.0 * @category utils */ (policy: Schedule.Schedule, R2>): (self: Stream) => Stream /** * When the stream fails, retry it according to the given schedule * * This retries the entire stream, so will re-execute all of the stream's * acquire operations. * * The schedule is reset as soon as the first element passes through the * stream again. * * @since 2.0.0 * @category utils */ (self: Stream, policy: Schedule.Schedule, R2>): Stream } = internal.retry /** * Apply an `ExecutionPlan` to the stream, which allows you to fallback to * different resources in case of failure. * * If you have a stream that could fail with partial results, you can use * the `preventFallbackOnPartialStream` option to prevent contamination of * the final stream with partial results. * * @since 3.16.0 * @category Error handling * @experimental */ export const withExecutionPlan: { /** * Apply an `ExecutionPlan` to the stream, which allows you to fallback to * different resources in case of failure. * * If you have a stream that could fail with partial results, you can use * the `preventFallbackOnPartialStream` option to prevent contamination of * the final stream with partial results. * * @since 3.16.0 * @category Error handling * @experimental */ ( policy: ExecutionPlan<{ provides: Provides; input: Input; error: PolicyE; requirements: R2 }>, options?: { readonly preventFallbackOnPartialStream?: boolean | undefined } ): (self: Stream) => Stream> /** * Apply an `ExecutionPlan` to the stream, which allows you to fallback to * different resources in case of failure. * * If you have a stream that could fail with partial results, you can use * the `preventFallbackOnPartialStream` option to prevent contamination of * the final stream with partial results. * * @since 3.16.0 * @category Error handling * @experimental */ ( self: Stream, policy: ExecutionPlan<{ provides: Provides; input: Input; error: PolicyE; requirements: R2 }>, options?: { readonly preventFallbackOnPartialStream?: boolean | undefined } ): Stream> } = internal.withExecutionPlan /** * Runs the sink on the stream to produce either the sink's result or an error. * * @since 2.0.0 * @category destructors */ export const run: { /** * Runs the sink on the stream to produce either the sink's result or an error. * * @since 2.0.0 * @category destructors */ (sink: Sink.Sink): (self: Stream) => Effect.Effect> /** * Runs the sink on the stream to produce either the sink's result or an error. * * @since 2.0.0 * @category destructors */ (self: Stream, sink: Sink.Sink): Effect.Effect> } = internal.run /** * Runs the stream and collects all of its elements to a chunk. * * @since 2.0.0 * @category destructors */ export const runCollect: (self: Stream) => Effect.Effect, E, R> = internal.runCollect /** * Runs the stream and emits the number of elements processed * * @since 2.0.0 * @category destructors */ export const runCount: (self: Stream) => Effect.Effect = internal.runCount /** * Runs the stream only for its effects. The emitted elements are discarded. * * @since 2.0.0 * @category destructors */ export const runDrain: (self: Stream) => Effect.Effect = internal.runDrain /** * Executes a pure fold over the stream of values - reduces all elements in * the stream to a value of type `S`. * * @since 2.0.0 * @category destructors */ export const runFold: { /** * Executes a pure fold over the stream of values - reduces all elements in * the stream to a value of type `S`. * * @since 2.0.0 * @category destructors */ (s: S, f: (s: S, a: A) => S): (self: Stream) => Effect.Effect /** * Executes a pure fold over the stream of values - reduces all elements in * the stream to a value of type `S`. * * @since 2.0.0 * @category destructors */ (self: Stream, s: S, f: (s: S, a: A) => S): Effect.Effect } = internal.runFold /** * Executes an effectful fold over the stream of values. * * @since 2.0.0 * @category destructors */ export const runFoldEffect: { /** * Executes an effectful fold over the stream of values. * * @since 2.0.0 * @category destructors */ (s: S, f: (s: S, a: A) => Effect.Effect): (self: Stream) => Effect.Effect> /** * Executes an effectful fold over the stream of values. * * @since 2.0.0 * @category destructors */ (self: Stream, s: S, f: (s: S, a: A) => Effect.Effect): Effect.Effect> } = internal.runFoldEffect /** * Executes a pure fold over the stream of values. Returns a scoped value that * represents the scope of the stream. * * @since 2.0.0 * @category destructors */ export const runFoldScoped: { /** * Executes a pure fold over the stream of values. Returns a scoped value that * represents the scope of the stream. * * @since 2.0.0 * @category destructors */ (s: S, f: (s: S, a: A) => S): (self: Stream) => Effect.Effect /** * Executes a pure fold over the stream of values. Returns a scoped value that * represents the scope of the stream. * * @since 2.0.0 * @category destructors */ (self: Stream, s: S, f: (s: S, a: A) => S): Effect.Effect } = internal.runFoldScoped /** * Executes an effectful fold over the stream of values. Returns a scoped * value that represents the scope of the stream. * * @since 2.0.0 * @category destructors */ export const runFoldScopedEffect: { /** * Executes an effectful fold over the stream of values. Returns a scoped * value that represents the scope of the stream. * * @since 2.0.0 * @category destructors */ (s: S, f: (s: S, a: A) => Effect.Effect): (self: Stream) => Effect.Effect /** * Executes an effectful fold over the stream of values. Returns a scoped * value that represents the scope of the stream. * * @since 2.0.0 * @category destructors */ (self: Stream, s: S, f: (s: S, a: A) => Effect.Effect): Effect.Effect } = internal.runFoldScopedEffect /** * Reduces the elements in the stream to a value of type `S`. Stops the fold * early when the condition is not fulfilled. Example: * * @since 2.0.0 * @category destructors */ export const runFoldWhile: { /** * Reduces the elements in the stream to a value of type `S`. Stops the fold * early when the condition is not fulfilled. Example: * * @since 2.0.0 * @category destructors */ (s: S, cont: Predicate, f: (s: S, a: A) => S): (self: Stream) => Effect.Effect /** * Reduces the elements in the stream to a value of type `S`. Stops the fold * early when the condition is not fulfilled. Example: * * @since 2.0.0 * @category destructors */ (self: Stream, s: S, cont: Predicate, f: (s: S, a: A) => S): Effect.Effect } = internal.runFoldWhile /** * Executes an effectful fold over the stream of values. Stops the fold early * when the condition is not fulfilled. * * @since 2.0.0 * @category destructors */ export const runFoldWhileEffect: { /** * Executes an effectful fold over the stream of values. Stops the fold early * when the condition is not fulfilled. * * @since 2.0.0 * @category destructors */ (s: S, cont: Predicate, f: (s: S, a: A) => Effect.Effect): (self: Stream) => Effect.Effect> /** * Executes an effectful fold over the stream of values. Stops the fold early * when the condition is not fulfilled. * * @since 2.0.0 * @category destructors */ ( self: Stream, s: S, cont: Predicate, f: (s: S, a: A) => Effect.Effect ): Effect.Effect> } = internal.runFoldWhileEffect /** * Executes a pure fold over the stream of values. Returns a scoped value that * represents the scope of the stream. Stops the fold early when the condition * is not fulfilled. * * @since 2.0.0 * @category destructors */ export const runFoldWhileScoped: { /** * Executes a pure fold over the stream of values. Returns a scoped value that * represents the scope of the stream. Stops the fold early when the condition * is not fulfilled. * * @since 2.0.0 * @category destructors */ (s: S, cont: Predicate, f: (s: S, a: A) => S): (self: Stream) => Effect.Effect /** * Executes a pure fold over the stream of values. Returns a scoped value that * represents the scope of the stream. Stops the fold early when the condition * is not fulfilled. * * @since 2.0.0 * @category destructors */ (self: Stream, s: S, cont: Predicate, f: (s: S, a: A) => S): Effect.Effect } = internal.runFoldWhileScoped /** * Executes an effectful fold over the stream of values. Returns a scoped * value that represents the scope of the stream. Stops the fold early when * the condition is not fulfilled. * * @since 2.0.0 * @category destructors */ export const runFoldWhileScopedEffect: { /** * Executes an effectful fold over the stream of values. Returns a scoped * value that represents the scope of the stream. Stops the fold early when * the condition is not fulfilled. * * @since 2.0.0 * @category destructors */ (s: S, cont: Predicate, f: (s: S, a: A) => Effect.Effect): (self: Stream) => Effect.Effect /** * Executes an effectful fold over the stream of values. Returns a scoped * value that represents the scope of the stream. Stops the fold early when * the condition is not fulfilled. * * @since 2.0.0 * @category destructors */ ( self: Stream, s: S, cont: Predicate, f: (s: S, a: A) => Effect.Effect ): Effect.Effect } = internal.runFoldWhileScopedEffect /** * Consumes all elements of the stream, passing them to the specified * callback. * * @since 2.0.0 * @category destructors */ export const runForEach: { /** * Consumes all elements of the stream, passing them to the specified * callback. * * @since 2.0.0 * @category destructors */ (f: (a: A) => Effect.Effect): (self: Stream) => Effect.Effect /** * Consumes all elements of the stream, passing them to the specified * callback. * * @since 2.0.0 * @category destructors */ (self: Stream, f: (a: A) => Effect.Effect): Effect.Effect } = internal.runForEach /** * Consumes all elements of the stream, passing them to the specified * callback. * * @since 2.0.0 * @category destructors */ export const runForEachChunk: { /** * Consumes all elements of the stream, passing them to the specified * callback. * * @since 2.0.0 * @category destructors */ (f: (a: Chunk.Chunk) => Effect.Effect): (self: Stream) => Effect.Effect /** * Consumes all elements of the stream, passing them to the specified * callback. * * @since 2.0.0 * @category destructors */ (self: Stream, f: (a: Chunk.Chunk) => Effect.Effect): Effect.Effect } = internal.runForEachChunk /** * Like `Stream.runForEachChunk`, but returns a scoped effect so the * finalization order can be controlled. * * @since 2.0.0 * @category destructors */ export const runForEachChunkScoped: { /** * Like `Stream.runForEachChunk`, but returns a scoped effect so the * finalization order can be controlled. * * @since 2.0.0 * @category destructors */ (f: (a: Chunk.Chunk) => Effect.Effect): (self: Stream) => Effect.Effect /** * Like `Stream.runForEachChunk`, but returns a scoped effect so the * finalization order can be controlled. * * @since 2.0.0 * @category destructors */ (self: Stream, f: (a: Chunk.Chunk) => Effect.Effect): Effect.Effect } = internal.runForEachChunkScoped /** * Like `Stream.forEach`, but returns a scoped effect so the finalization * order can be controlled. * * @since 2.0.0 * @category destructors */ export const runForEachScoped: { /** * Like `Stream.forEach`, but returns a scoped effect so the finalization * order can be controlled. * * @since 2.0.0 * @category destructors */ (f: (a: A) => Effect.Effect): (self: Stream) => Effect.Effect /** * Like `Stream.forEach`, but returns a scoped effect so the finalization * order can be controlled. * * @since 2.0.0 * @category destructors */ (self: Stream, f: (a: A) => Effect.Effect): Effect.Effect } = internal.runForEachScoped /** * Consumes elements of the stream, passing them to the specified callback, * and terminating consumption when the callback returns `false`. * * @since 2.0.0 * @category destructors */ export const runForEachWhile: { /** * Consumes elements of the stream, passing them to the specified callback, * and terminating consumption when the callback returns `false`. * * @since 2.0.0 * @category destructors */ (f: (a: A) => Effect.Effect): (self: Stream) => Effect.Effect /** * Consumes elements of the stream, passing them to the specified callback, * and terminating consumption when the callback returns `false`. * * @since 2.0.0 * @category destructors */ (self: Stream, f: (a: A) => Effect.Effect): Effect.Effect } = internal.runForEachWhile /** * Like `Stream.runForEachWhile`, but returns a scoped effect so the * finalization order can be controlled. * * @since 2.0.0 * @category destructors */ export const runForEachWhileScoped: { /** * Like `Stream.runForEachWhile`, but returns a scoped effect so the * finalization order can be controlled. * * @since 2.0.0 * @category destructors */ (f: (a: A) => Effect.Effect): (self: Stream) => Effect.Effect /** * Like `Stream.runForEachWhile`, but returns a scoped effect so the * finalization order can be controlled. * * @since 2.0.0 * @category destructors */ (self: Stream, f: (a: A) => Effect.Effect): Effect.Effect } = internal.runForEachWhileScoped /** * Runs the stream to completion and yields the first value emitted by it, * discarding the rest of the elements. * * @since 2.0.0 * @category destructors */ export const runHead: (self: Stream) => Effect.Effect, E, R> = internal.runHead /** * Publishes elements of this stream to a `PubSub`. Stream failure and ending will * also be signalled. * * @since 2.0.0 * @category destructors */ export const runIntoPubSub: { /** * Publishes elements of this stream to a `PubSub`. Stream failure and ending will * also be signalled. * * @since 2.0.0 * @category destructors */ (pubsub: PubSub.PubSub>): (self: Stream) => Effect.Effect /** * Publishes elements of this stream to a `PubSub`. Stream failure and ending will * also be signalled. * * @since 2.0.0 * @category destructors */ (self: Stream, pubsub: PubSub.PubSub>): Effect.Effect } = internal.runIntoPubSub /** * Like `Stream.runIntoPubSub`, but provides the result as a scoped effect to * allow for scope composition. * * @since 2.0.0 * @category destructors */ export const runIntoPubSubScoped: { /** * Like `Stream.runIntoPubSub`, but provides the result as a scoped effect to * allow for scope composition. * * @since 2.0.0 * @category destructors */ (pubsub: PubSub.PubSub>): (self: Stream) => Effect.Effect /** * Like `Stream.runIntoPubSub`, but provides the result as a scoped effect to * allow for scope composition. * * @since 2.0.0 * @category destructors */ (self: Stream, pubsub: PubSub.PubSub>): Effect.Effect } = internal.runIntoPubSubScoped /** * Enqueues elements of this stream into a queue. Stream failure and ending * will also be signalled. * * @since 2.0.0 * @category destructors */ export const runIntoQueue: { /** * Enqueues elements of this stream into a queue. Stream failure and ending * will also be signalled. * * @since 2.0.0 * @category destructors */ (queue: Queue.Enqueue>): (self: Stream) => Effect.Effect /** * Enqueues elements of this stream into a queue. Stream failure and ending * will also be signalled. * * @since 2.0.0 * @category destructors */ (self: Stream, queue: Queue.Enqueue>): Effect.Effect } = internal.runIntoQueue /** * Like `Stream.runIntoQueue`, but provides the result as a scoped [[ZIO]] * to allow for scope composition. * * @since 2.0.0 * @category destructors */ export const runIntoQueueElementsScoped: { /** * Like `Stream.runIntoQueue`, but provides the result as a scoped [[ZIO]] * to allow for scope composition. * * @since 2.0.0 * @category destructors */ (queue: Queue.Enqueue>>): (self: Stream) => Effect.Effect /** * Like `Stream.runIntoQueue`, but provides the result as a scoped [[ZIO]] * to allow for scope composition. * * @since 2.0.0 * @category destructors */ ( self: Stream, queue: Queue.Enqueue>> ): Effect.Effect } = internal.runIntoQueueElementsScoped /** * Like `Stream.runIntoQueue`, but provides the result as a scoped effect * to allow for scope composition. * * @since 2.0.0 * @category destructors */ export const runIntoQueueScoped: { /** * Like `Stream.runIntoQueue`, but provides the result as a scoped effect * to allow for scope composition. * * @since 2.0.0 * @category destructors */ (queue: Queue.Enqueue>): (self: Stream) => Effect.Effect /** * Like `Stream.runIntoQueue`, but provides the result as a scoped effect * to allow for scope composition. * * @since 2.0.0 * @category destructors */ (self: Stream, queue: Queue.Enqueue>): Effect.Effect } = internal.runIntoQueueScoped /** * Runs the stream to completion and yields the last value emitted by it, * discarding the rest of the elements. * * @since 2.0.0 * @category destructors */ export const runLast: (self: Stream) => Effect.Effect, E, R> = internal.runLast /** * @since 2.0.0 * @category destructors */ export const runScoped: { /** * @since 2.0.0 * @category destructors */ (sink: Sink.Sink): (self: Stream) => Effect.Effect /** * @since 2.0.0 * @category destructors */ (self: Stream, sink: Sink.Sink): Effect.Effect } = internal.runScoped /** * Runs the stream to a sink which sums elements, provided they are Numeric. * * @since 2.0.0 * @category destructors */ export const runSum: (self: Stream) => Effect.Effect = internal.runSum /** * Statefully maps over the elements of this stream to produce all * intermediate results of type `S` given an initial S. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.range(1, 6).pipe(Stream.scan(0, (a, b) => a + b)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 0, 1, 3, 6, 10, 15, 21 ] } * ``` * * @since 2.0.0 * @category utils */ export const scan: { /** * Statefully maps over the elements of this stream to produce all * intermediate results of type `S` given an initial S. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.range(1, 6).pipe(Stream.scan(0, (a, b) => a + b)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 0, 1, 3, 6, 10, 15, 21 ] } * ``` * * @since 2.0.0 * @category utils */ (s: S, f: (s: S, a: A) => S): (self: Stream) => Stream /** * Statefully maps over the elements of this stream to produce all * intermediate results of type `S` given an initial S. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.range(1, 6).pipe(Stream.scan(0, (a, b) => a + b)) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 0, 1, 3, 6, 10, 15, 21 ] } * ``` * * @since 2.0.0 * @category utils */ (self: Stream, s: S, f: (s: S, a: A) => S): Stream } = internal.scan /** * Statefully and effectfully maps over the elements of this stream to produce * all intermediate results of type `S` given an initial S. * * @since 2.0.0 * @category utils */ export const scanEffect: { /** * Statefully and effectfully maps over the elements of this stream to produce * all intermediate results of type `S` given an initial S. * * @since 2.0.0 * @category utils */ (s: S, f: (s: S, a: A) => Effect.Effect): (self: Stream) => Stream /** * Statefully and effectfully maps over the elements of this stream to produce * all intermediate results of type `S` given an initial S. * * @since 2.0.0 * @category utils */ (self: Stream, s: S, f: (s: S, a: A) => Effect.Effect): Stream } = internal.scanEffect /** * Statefully maps over the elements of this stream to produce all * intermediate results. * * See also `Stream.scan`. * * @since 2.0.0 * @category utils */ export const scanReduce: { /** * Statefully maps over the elements of this stream to produce all * intermediate results. * * See also `Stream.scan`. * * @since 2.0.0 * @category utils */ (f: (a2: A2 | A, a: A) => A2): (self: Stream) => Stream /** * Statefully maps over the elements of this stream to produce all * intermediate results. * * See also `Stream.scan`. * * @since 2.0.0 * @category utils */ (self: Stream, f: (a2: A | A2, a: A) => A2): Stream } = internal.scanReduce /** * Statefully and effectfully maps over the elements of this stream to produce * all intermediate results. * * See also `Stream.scanEffect`. * * @since 2.0.0 * @category utils */ export const scanReduceEffect: { /** * Statefully and effectfully maps over the elements of this stream to produce * all intermediate results. * * See also `Stream.scanEffect`. * * @since 2.0.0 * @category utils */ (f: (a2: A2 | A, a: A) => Effect.Effect): (self: Stream) => Stream /** * Statefully and effectfully maps over the elements of this stream to produce * all intermediate results. * * See also `Stream.scanEffect`. * * @since 2.0.0 * @category utils */ ( self: Stream, f: (a2: A | A2, a: A) => Effect.Effect ): Stream } = internal.scanReduceEffect /** * Schedules the output of the stream using the provided `schedule`. * * @since 2.0.0 * @category utils */ export const schedule: { /** * Schedules the output of the stream using the provided `schedule`. * * @since 2.0.0 * @category utils */ (schedule: Schedule.Schedule): (self: Stream) => Stream /** * Schedules the output of the stream using the provided `schedule`. * * @since 2.0.0 * @category utils */ (self: Stream, schedule: Schedule.Schedule): Stream } = internal.schedule /** * Schedules the output of the stream using the provided `schedule` and emits * its output at the end (if `schedule` is finite). Uses the provided function * to align the stream and schedule outputs on the same type. * * @since 2.0.0 * @category utils */ export const scheduleWith: { /** * Schedules the output of the stream using the provided `schedule` and emits * its output at the end (if `schedule` is finite). Uses the provided function * to align the stream and schedule outputs on the same type. * * @since 2.0.0 * @category utils */ ( schedule: Schedule.Schedule, options: { readonly onElement: (a: A) => C; readonly onSchedule: (b: B) => C } ): (self: Stream) => Stream /** * Schedules the output of the stream using the provided `schedule` and emits * its output at the end (if `schedule` is finite). Uses the provided function * to align the stream and schedule outputs on the same type. * * @since 2.0.0 * @category utils */ ( self: Stream, schedule: Schedule.Schedule, options: { readonly onElement: (a: A) => C; readonly onSchedule: (b: B) => C } ): Stream } = internal.scheduleWith /** * Creates a single-valued stream from a scoped resource. * * @example * ```ts * import { Console, Effect, Stream } from "effect" * * // Creating a single-valued stream from a scoped resource * const stream = Stream.scoped( * Effect.acquireRelease( * Console.log("acquire"), * () => Console.log("release") * ) * ).pipe( * Stream.flatMap(() => Console.log("use")) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // acquire * // use * // release * // { _id: 'Chunk', values: [ undefined ] } * ``` * * @since 2.0.0 * @category constructors */ export const scoped: (effect: Effect.Effect) => Stream> = internal.scoped /** * Use a function that receives a scope and returns an effect to emit an output * element. The output element will be the result of the returned effect, if * successful. * * @since 3.11.0 * @category constructors */ export const scopedWith: (f: (scope: Scope.Scope) => Effect.Effect) => Stream = internal.scopedWith /** * Emits a sliding window of `n` elements. * * ```ts * import { pipe, Stream } from "effect" * * pipe( * Stream.make(1, 2, 3, 4), * Stream.sliding(2), * Stream.runCollect * ) * // => Chunk(Chunk(1, 2), Chunk(2, 3), Chunk(3, 4)) * ``` * * @since 2.0.0 * @category utils */ export const sliding: { /** * Emits a sliding window of `n` elements. * * ```ts * import { pipe, Stream } from "effect" * * pipe( * Stream.make(1, 2, 3, 4), * Stream.sliding(2), * Stream.runCollect * ) * // => Chunk(Chunk(1, 2), Chunk(2, 3), Chunk(3, 4)) * ``` * * @since 2.0.0 * @category utils */ (chunkSize: number): (self: Stream) => Stream, E, R> /** * Emits a sliding window of `n` elements. * * ```ts * import { pipe, Stream } from "effect" * * pipe( * Stream.make(1, 2, 3, 4), * Stream.sliding(2), * Stream.runCollect * ) * // => Chunk(Chunk(1, 2), Chunk(2, 3), Chunk(3, 4)) * ``` * * @since 2.0.0 * @category utils */ (self: Stream, chunkSize: number): Stream, E, R> } = internal.sliding /** * Like `sliding`, but with a configurable `stepSize` parameter. * * @since 2.0.0 * @category utils */ export const slidingSize: { /** * Like `sliding`, but with a configurable `stepSize` parameter. * * @since 2.0.0 * @category utils */ (chunkSize: number, stepSize: number): (self: Stream) => Stream, E, R> /** * Like `sliding`, but with a configurable `stepSize` parameter. * * @since 2.0.0 * @category utils */ (self: Stream, chunkSize: number, stepSize: number): Stream, E, R> } = internal.slidingSize /** * Converts an option on values into an option on errors. * * @since 2.0.0 * @category utils */ export const some: (self: Stream, E, R>) => Stream, R> = internal.some /** * Extracts the optional value, or returns the given 'default'. * * @since 2.0.0 * @category utils */ export const someOrElse: { /** * Extracts the optional value, or returns the given 'default'. * * @since 2.0.0 * @category utils */ (fallback: LazyArg): (self: Stream, E, R>) => Stream /** * Extracts the optional value, or returns the given 'default'. * * @since 2.0.0 * @category utils */ (self: Stream, E, R>, fallback: LazyArg): Stream } = internal.someOrElse /** * Extracts the optional value, or fails with the given error 'e'. * * @since 2.0.0 * @category utils */ export const someOrFail: { /** * Extracts the optional value, or fails with the given error 'e'. * * @since 2.0.0 * @category utils */ (error: LazyArg): (self: Stream, E, R>) => Stream /** * Extracts the optional value, or fails with the given error 'e'. * * @since 2.0.0 * @category utils */ (self: Stream, E, R>, error: LazyArg): Stream } = internal.someOrFail /** * Splits elements based on a predicate or refinement. * * ```ts * import { pipe, Stream } from "effect" * * pipe( * Stream.range(1, 10), * Stream.split((n) => n % 4 === 0), * Stream.runCollect * ) * // => Chunk(Chunk(1, 2, 3), Chunk(5, 6, 7), Chunk(9)) * ``` * * @since 2.0.0 * @category utils */ export const split: { /** * Splits elements based on a predicate or refinement. * * ```ts * import { pipe, Stream } from "effect" * * pipe( * Stream.range(1, 10), * Stream.split((n) => n % 4 === 0), * Stream.runCollect * ) * // => Chunk(Chunk(1, 2, 3), Chunk(5, 6, 7), Chunk(9)) * ``` * * @since 2.0.0 * @category utils */ (refinement: Refinement, B>): (self: Stream) => Stream>, E, R> /** * Splits elements based on a predicate or refinement. * * ```ts * import { pipe, Stream } from "effect" * * pipe( * Stream.range(1, 10), * Stream.split((n) => n % 4 === 0), * Stream.runCollect * ) * // => Chunk(Chunk(1, 2, 3), Chunk(5, 6, 7), Chunk(9)) * ``` * * @since 2.0.0 * @category utils */ (predicate: Predicate>): (self: Stream) => Stream, E, R> /** * Splits elements based on a predicate or refinement. * * ```ts * import { pipe, Stream } from "effect" * * pipe( * Stream.range(1, 10), * Stream.split((n) => n % 4 === 0), * Stream.runCollect * ) * // => Chunk(Chunk(1, 2, 3), Chunk(5, 6, 7), Chunk(9)) * ``` * * @since 2.0.0 * @category utils */ (self: Stream, refinement: Refinement): Stream>, E, R> /** * Splits elements based on a predicate or refinement. * * ```ts * import { pipe, Stream } from "effect" * * pipe( * Stream.range(1, 10), * Stream.split((n) => n % 4 === 0), * Stream.runCollect * ) * // => Chunk(Chunk(1, 2, 3), Chunk(5, 6, 7), Chunk(9)) * ``` * * @since 2.0.0 * @category utils */ (self: Stream, predicate: Predicate): Stream, E, R> } = internal.split /** * Splits elements on a delimiter and transforms the splits into desired output. * * @since 2.0.0 * @category utils */ export const splitOnChunk: { /** * Splits elements on a delimiter and transforms the splits into desired output. * * @since 2.0.0 * @category utils */ (delimiter: Chunk.Chunk): (self: Stream) => Stream, E, R> /** * Splits elements on a delimiter and transforms the splits into desired output. * * @since 2.0.0 * @category utils */ (self: Stream, delimiter: Chunk.Chunk): Stream, E, R> } = internal.splitOnChunk /** * Splits strings on newlines. Handles both Windows newlines (`\r\n`) and UNIX * newlines (`\n`). * * @since 2.0.0 * @category combinators */ export const splitLines: (self: Stream) => Stream = internal.splitLines /** * Creates a single-valued pure stream. * * @example * ```ts * import { Effect, Stream } from "effect" * * // A Stream with a single number * const stream = Stream.succeed(3) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 3 ] } * ``` * * @since 2.0.0 * @category constructors */ export const succeed: (value: A) => Stream = internal.succeed /** * Creates a single-valued pure stream. * * @since 2.0.0 * @category constructors */ export const sync: (evaluate: LazyArg) => Stream = internal.sync /** * Returns a lazily constructed stream. * * @since 2.0.0 * @category constructors */ export const suspend: (stream: LazyArg>) => Stream = internal.suspend /** * Takes the specified number of elements from this stream. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.take(Stream.iterate(0, (n) => n + 1), 5) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 0, 1, 2, 3, 4 ] } * ``` * * @since 2.0.0 * @category utils */ export const take: { /** * Takes the specified number of elements from this stream. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.take(Stream.iterate(0, (n) => n + 1), 5) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 0, 1, 2, 3, 4 ] } * ``` * * @since 2.0.0 * @category utils */ (n: number): (self: Stream) => Stream /** * Takes the specified number of elements from this stream. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.take(Stream.iterate(0, (n) => n + 1), 5) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 0, 1, 2, 3, 4 ] } * ``` * * @since 2.0.0 * @category utils */ (self: Stream, n: number): Stream } = internal.take /** * Takes the last specified number of elements from this stream. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.takeRight(Stream.make(1, 2, 3, 4, 5, 6), 3) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 4, 5, 6 ] } * ``` * * @since 2.0.0 * @category utils */ export const takeRight: { /** * Takes the last specified number of elements from this stream. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.takeRight(Stream.make(1, 2, 3, 4, 5, 6), 3) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 4, 5, 6 ] } * ``` * * @since 2.0.0 * @category utils */ (n: number): (self: Stream) => Stream /** * Takes the last specified number of elements from this stream. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.takeRight(Stream.make(1, 2, 3, 4, 5, 6), 3) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 4, 5, 6 ] } * ``` * * @since 2.0.0 * @category utils */ (self: Stream, n: number): Stream } = internal.takeRight /** * Takes all elements of the stream until the specified predicate evaluates to * `true`. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.takeUntil(Stream.iterate(0, (n) => n + 1), (n) => n === 4) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 0, 1, 2, 3, 4 ] } * ``` * * @since 2.0.0 * @category utils */ export const takeUntil: { /** * Takes all elements of the stream until the specified predicate evaluates to * `true`. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.takeUntil(Stream.iterate(0, (n) => n + 1), (n) => n === 4) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 0, 1, 2, 3, 4 ] } * ``` * * @since 2.0.0 * @category utils */ (predicate: Predicate>): (self: Stream) => Stream /** * Takes all elements of the stream until the specified predicate evaluates to * `true`. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.takeUntil(Stream.iterate(0, (n) => n + 1), (n) => n === 4) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 0, 1, 2, 3, 4 ] } * ``` * * @since 2.0.0 * @category utils */ (self: Stream, predicate: Predicate): Stream } = internal.takeUntil /** * Takes all elements of the stream until the specified effectual predicate * evaluates to `true`. * * @since 2.0.0 * @category utils */ export const takeUntilEffect: { /** * Takes all elements of the stream until the specified effectual predicate * evaluates to `true`. * * @since 2.0.0 * @category utils */ (predicate: (a: NoInfer) => Effect.Effect): (self: Stream) => Stream /** * Takes all elements of the stream until the specified effectual predicate * evaluates to `true`. * * @since 2.0.0 * @category utils */ (self: Stream, predicate: (a: A) => Effect.Effect): Stream } = internal.takeUntilEffect /** * Takes all elements of the stream for as long as the specified predicate * evaluates to `true`. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.takeWhile(Stream.iterate(0, (n) => n + 1), (n) => n < 5) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 0, 1, 2, 3, 4 ] } * ``` * * @since 2.0.0 * @category utils */ export const takeWhile: { /** * Takes all elements of the stream for as long as the specified predicate * evaluates to `true`. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.takeWhile(Stream.iterate(0, (n) => n + 1), (n) => n < 5) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 0, 1, 2, 3, 4 ] } * ``` * * @since 2.0.0 * @category utils */ (refinement: Refinement, B>): (self: Stream) => Stream /** * Takes all elements of the stream for as long as the specified predicate * evaluates to `true`. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.takeWhile(Stream.iterate(0, (n) => n + 1), (n) => n < 5) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 0, 1, 2, 3, 4 ] } * ``` * * @since 2.0.0 * @category utils */ (predicate: Predicate>): (self: Stream) => Stream /** * Takes all elements of the stream for as long as the specified predicate * evaluates to `true`. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.takeWhile(Stream.iterate(0, (n) => n + 1), (n) => n < 5) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 0, 1, 2, 3, 4 ] } * ``` * * @since 2.0.0 * @category utils */ (self: Stream, refinement: Refinement): Stream /** * Takes all elements of the stream for as long as the specified predicate * evaluates to `true`. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.takeWhile(Stream.iterate(0, (n) => n + 1), (n) => n < 5) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ 0, 1, 2, 3, 4 ] } * ``` * * @since 2.0.0 * @category utils */ (self: Stream, predicate: Predicate): Stream } = internal.takeWhile /** * Adds an effect to consumption of every element of the stream. * * @example * ```ts * import { Console, Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3).pipe( * Stream.tap((n) => Console.log(`before mapping: ${n}`)), * Stream.map((n) => n * 2), * Stream.tap((n) => Console.log(`after mapping: ${n}`)) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // before mapping: 1 * // after mapping: 2 * // before mapping: 2 * // after mapping: 4 * // before mapping: 3 * // after mapping: 6 * // { _id: 'Chunk', values: [ 2, 4, 6 ] } * ``` * * @since 2.0.0 * @category sequencing */ export const tap: { /** * Adds an effect to consumption of every element of the stream. * * @example * ```ts * import { Console, Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3).pipe( * Stream.tap((n) => Console.log(`before mapping: ${n}`)), * Stream.map((n) => n * 2), * Stream.tap((n) => Console.log(`after mapping: ${n}`)) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // before mapping: 1 * // after mapping: 2 * // before mapping: 2 * // after mapping: 4 * // before mapping: 3 * // after mapping: 6 * // { _id: 'Chunk', values: [ 2, 4, 6 ] } * ``` * * @since 2.0.0 * @category sequencing */ (f: (a: NoInfer) => Effect.Effect): (self: Stream) => Stream /** * Adds an effect to consumption of every element of the stream. * * @example * ```ts * import { Console, Effect, Stream } from "effect" * * const stream = Stream.make(1, 2, 3).pipe( * Stream.tap((n) => Console.log(`before mapping: ${n}`)), * Stream.map((n) => n * 2), * Stream.tap((n) => Console.log(`after mapping: ${n}`)) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // before mapping: 1 * // after mapping: 2 * // before mapping: 2 * // after mapping: 4 * // before mapping: 3 * // after mapping: 6 * // { _id: 'Chunk', values: [ 2, 4, 6 ] } * ``` * * @since 2.0.0 * @category sequencing */ (self: Stream, f: (a: NoInfer) => Effect.Effect): Stream } = internal.tap /** * Returns a stream that effectfully "peeks" at the failure or success of * the stream. * * @since 2.0.0 * @category sequencing */ export const tapBoth: { /** * Returns a stream that effectfully "peeks" at the failure or success of * the stream. * * @since 2.0.0 * @category sequencing */ ( options: { readonly onFailure: (e: NoInfer) => Effect.Effect readonly onSuccess: (a: NoInfer) => Effect.Effect } ): (self: Stream) => Stream /** * Returns a stream that effectfully "peeks" at the failure or success of * the stream. * * @since 2.0.0 * @category sequencing */ ( self: Stream, options: { readonly onFailure: (e: NoInfer) => Effect.Effect readonly onSuccess: (a: NoInfer) => Effect.Effect } ): Stream } = internal.tapBoth /** * Returns a stream that effectfully "peeks" at the failure of the stream. * * @since 2.0.0 * @category sequencing */ export const tapError: { /** * Returns a stream that effectfully "peeks" at the failure of the stream. * * @since 2.0.0 * @category sequencing */ (f: (error: NoInfer) => Effect.Effect): (self: Stream) => Stream /** * Returns a stream that effectfully "peeks" at the failure of the stream. * * @since 2.0.0 * @category sequencing */ (self: Stream, f: (error: E) => Effect.Effect): Stream } = internal.tapError /** * Returns a stream that effectfully "peeks" at the cause of failure of the * stream. * * @since 2.0.0 * @category utils */ export const tapErrorCause: { /** * Returns a stream that effectfully "peeks" at the cause of failure of the * stream. * * @since 2.0.0 * @category utils */ (f: (cause: Cause.Cause>) => Effect.Effect): (self: Stream) => Stream /** * Returns a stream that effectfully "peeks" at the cause of failure of the * stream. * * @since 2.0.0 * @category utils */ ( self: Stream, f: (cause: Cause.Cause) => Effect.Effect ): Stream } = internal.tapErrorCause /** * Sends all elements emitted by this stream to the specified sink in addition * to emitting them. * * @since 2.0.0 * @category sequencing */ export const tapSink: { /** * Sends all elements emitted by this stream to the specified sink in addition * to emitting them. * * @since 2.0.0 * @category sequencing */ (sink: Sink.Sink): (self: Stream) => Stream /** * Sends all elements emitted by this stream to the specified sink in addition * to emitting them. * * @since 2.0.0 * @category sequencing */ (self: Stream, sink: Sink.Sink): Stream } = internal.tapSink /** * Delays the chunks of this stream according to the given bandwidth * parameters using the token bucket algorithm. Allows for burst in the * processing of elements by allowing the token bucket to accumulate tokens up * to a `units + burst` threshold. The weight of each chunk is determined by * the `cost` function. * * If using the "enforce" strategy, chunks that do not meet the bandwidth * constraints are dropped. If using the "shape" strategy, chunks are delayed * until they can be emitted without exceeding the bandwidth constraints. * * Defaults to the "shape" strategy. * * @example * ```ts * import { Chunk, Effect, Schedule, Stream } from "effect" * * let last = Date.now() * const log = (message: string) => * Effect.sync(() => { * const end = Date.now() * console.log(`${message} after ${end - last}ms`) * last = end * }) * * const stream = Stream.fromSchedule(Schedule.spaced("50 millis")).pipe( * Stream.take(6), * Stream.tap((n) => log(`Received ${n}`)), * Stream.throttle({ * cost: Chunk.size, * duration: "100 millis", * units: 1 * }), * Stream.tap((n) => log(`> Emitted ${n}`)) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // Received 0 after 56ms * // > Emitted 0 after 0ms * // Received 1 after 52ms * // > Emitted 1 after 48ms * // Received 2 after 52ms * // > Emitted 2 after 49ms * // Received 3 after 52ms * // > Emitted 3 after 48ms * // Received 4 after 52ms * // > Emitted 4 after 47ms * // Received 5 after 52ms * // > Emitted 5 after 49ms * // { _id: 'Chunk', values: [ 0, 1, 2, 3, 4, 5 ] } * ``` * * @since 2.0.0 * @category utils */ export const throttle: { /** * Delays the chunks of this stream according to the given bandwidth * parameters using the token bucket algorithm. Allows for burst in the * processing of elements by allowing the token bucket to accumulate tokens up * to a `units + burst` threshold. The weight of each chunk is determined by * the `cost` function. * * If using the "enforce" strategy, chunks that do not meet the bandwidth * constraints are dropped. If using the "shape" strategy, chunks are delayed * until they can be emitted without exceeding the bandwidth constraints. * * Defaults to the "shape" strategy. * * @example * ```ts * import { Chunk, Effect, Schedule, Stream } from "effect" * * let last = Date.now() * const log = (message: string) => * Effect.sync(() => { * const end = Date.now() * console.log(`${message} after ${end - last}ms`) * last = end * }) * * const stream = Stream.fromSchedule(Schedule.spaced("50 millis")).pipe( * Stream.take(6), * Stream.tap((n) => log(`Received ${n}`)), * Stream.throttle({ * cost: Chunk.size, * duration: "100 millis", * units: 1 * }), * Stream.tap((n) => log(`> Emitted ${n}`)) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // Received 0 after 56ms * // > Emitted 0 after 0ms * // Received 1 after 52ms * // > Emitted 1 after 48ms * // Received 2 after 52ms * // > Emitted 2 after 49ms * // Received 3 after 52ms * // > Emitted 3 after 48ms * // Received 4 after 52ms * // > Emitted 4 after 47ms * // Received 5 after 52ms * // > Emitted 5 after 49ms * // { _id: 'Chunk', values: [ 0, 1, 2, 3, 4, 5 ] } * ``` * * @since 2.0.0 * @category utils */ ( options: { readonly cost: (chunk: Chunk.Chunk) => number readonly units: number readonly duration: Duration.DurationInput readonly burst?: number | undefined readonly strategy?: "enforce" | "shape" | undefined } ): (self: Stream) => Stream /** * Delays the chunks of this stream according to the given bandwidth * parameters using the token bucket algorithm. Allows for burst in the * processing of elements by allowing the token bucket to accumulate tokens up * to a `units + burst` threshold. The weight of each chunk is determined by * the `cost` function. * * If using the "enforce" strategy, chunks that do not meet the bandwidth * constraints are dropped. If using the "shape" strategy, chunks are delayed * until they can be emitted without exceeding the bandwidth constraints. * * Defaults to the "shape" strategy. * * @example * ```ts * import { Chunk, Effect, Schedule, Stream } from "effect" * * let last = Date.now() * const log = (message: string) => * Effect.sync(() => { * const end = Date.now() * console.log(`${message} after ${end - last}ms`) * last = end * }) * * const stream = Stream.fromSchedule(Schedule.spaced("50 millis")).pipe( * Stream.take(6), * Stream.tap((n) => log(`Received ${n}`)), * Stream.throttle({ * cost: Chunk.size, * duration: "100 millis", * units: 1 * }), * Stream.tap((n) => log(`> Emitted ${n}`)) * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // Received 0 after 56ms * // > Emitted 0 after 0ms * // Received 1 after 52ms * // > Emitted 1 after 48ms * // Received 2 after 52ms * // > Emitted 2 after 49ms * // Received 3 after 52ms * // > Emitted 3 after 48ms * // Received 4 after 52ms * // > Emitted 4 after 47ms * // Received 5 after 52ms * // > Emitted 5 after 49ms * // { _id: 'Chunk', values: [ 0, 1, 2, 3, 4, 5 ] } * ``` * * @since 2.0.0 * @category utils */ ( self: Stream, options: { readonly cost: (chunk: Chunk.Chunk) => number readonly units: number readonly duration: Duration.DurationInput readonly burst?: number | undefined readonly strategy?: "enforce" | "shape" | undefined } ): Stream } = internal.throttle /** * Delays the chunks of this stream according to the given bandwidth * parameters using the token bucket algorithm. Allows for burst in the * processing of elements by allowing the token bucket to accumulate tokens up * to a `units + burst` threshold. The weight of each chunk is determined by * the effectful `costFn` function. * * If using the "enforce" strategy, chunks that do not meet the bandwidth * constraints are dropped. If using the "shape" strategy, chunks are delayed * until they can be emitted without exceeding the bandwidth constraints. * * Defaults to the "shape" strategy. * * @since 2.0.0 * @category utils */ export const throttleEffect: { /** * Delays the chunks of this stream according to the given bandwidth * parameters using the token bucket algorithm. Allows for burst in the * processing of elements by allowing the token bucket to accumulate tokens up * to a `units + burst` threshold. The weight of each chunk is determined by * the effectful `costFn` function. * * If using the "enforce" strategy, chunks that do not meet the bandwidth * constraints are dropped. If using the "shape" strategy, chunks are delayed * until they can be emitted without exceeding the bandwidth constraints. * * Defaults to the "shape" strategy. * * @since 2.0.0 * @category utils */ ( options: { readonly cost: (chunk: Chunk.Chunk) => Effect.Effect readonly units: number readonly duration: Duration.DurationInput readonly burst?: number | undefined readonly strategy?: "enforce" | "shape" | undefined } ): (self: Stream) => Stream /** * Delays the chunks of this stream according to the given bandwidth * parameters using the token bucket algorithm. Allows for burst in the * processing of elements by allowing the token bucket to accumulate tokens up * to a `units + burst` threshold. The weight of each chunk is determined by * the effectful `costFn` function. * * If using the "enforce" strategy, chunks that do not meet the bandwidth * constraints are dropped. If using the "shape" strategy, chunks are delayed * until they can be emitted without exceeding the bandwidth constraints. * * Defaults to the "shape" strategy. * * @since 2.0.0 * @category utils */ ( self: Stream, options: { readonly cost: (chunk: Chunk.Chunk) => Effect.Effect readonly units: number readonly duration: Duration.DurationInput readonly burst?: number | undefined readonly strategy?: "enforce" | "shape" | undefined } ): Stream } = internal.throttleEffect /** * A stream that emits void values spaced by the specified duration. * * @example * ```ts * import { Effect, Stream } from "effect" * * let last = Date.now() * const log = (message: string) => * Effect.sync(() => { * const end = Date.now() * console.log(`${message} after ${end - last}ms`) * last = end * }) * * const stream = Stream.tick("1 seconds").pipe(Stream.tap(() => log("tick"))) * * Effect.runPromise(Stream.runCollect(stream.pipe(Stream.take(5)))).then(console.log) * // tick after 4ms * // tick after 1003ms * // tick after 1001ms * // tick after 1002ms * // tick after 1002ms * // { _id: 'Chunk', values: [ undefined, undefined, undefined, undefined, undefined ] } * ``` * * @since 2.0.0 * @category constructors */ export const tick: (interval: Duration.DurationInput) => Stream = internal.tick /** * Ends the stream if it does not produce a value after the specified duration. * * @since 2.0.0 * @category utils */ export const timeout: { /** * Ends the stream if it does not produce a value after the specified duration. * * @since 2.0.0 * @category utils */ (duration: Duration.DurationInput): (self: Stream) => Stream /** * Ends the stream if it does not produce a value after the specified duration. * * @since 2.0.0 * @category utils */ (self: Stream, duration: Duration.DurationInput): Stream } = internal.timeout /** * Fails the stream with given error if it does not produce a value after d * duration. * * @since 2.0.0 * @category utils */ export const timeoutFail: { /** * Fails the stream with given error if it does not produce a value after d * duration. * * @since 2.0.0 * @category utils */ (error: LazyArg, duration: Duration.DurationInput): (self: Stream) => Stream /** * Fails the stream with given error if it does not produce a value after d * duration. * * @since 2.0.0 * @category utils */ ( self: Stream, error: LazyArg, duration: Duration.DurationInput ): Stream } = internal.timeoutFail /** * Fails the stream with given cause if it does not produce a value after d * duration. * * @since 2.0.0 * @category utils */ export const timeoutFailCause: { /** * Fails the stream with given cause if it does not produce a value after d * duration. * * @since 2.0.0 * @category utils */ (cause: LazyArg>, duration: Duration.DurationInput): (self: Stream) => Stream /** * Fails the stream with given cause if it does not produce a value after d * duration. * * @since 2.0.0 * @category utils */ ( self: Stream, cause: LazyArg>, duration: Duration.DurationInput ): Stream } = internal.timeoutFailCause /** * Switches the stream if it does not produce a value after the specified * duration. * * @since 2.0.0 * @category utils */ export const timeoutTo: { /** * Switches the stream if it does not produce a value after the specified * duration. * * @since 2.0.0 * @category utils */ (duration: Duration.DurationInput, that: Stream): (self: Stream) => Stream /** * Switches the stream if it does not produce a value after the specified * duration. * * @since 2.0.0 * @category utils */ ( self: Stream, duration: Duration.DurationInput, that: Stream ): Stream } = internal.timeoutTo /** * Converts the stream to a scoped `PubSub` of chunks. After the scope is closed, * the `PubSub` will never again produce values and should be discarded. * * @since 2.0.0 * @category destructors */ export const toPubSub: { /** * Converts the stream to a scoped `PubSub` of chunks. After the scope is closed, * the `PubSub` will never again produce values and should be discarded. * * @since 2.0.0 * @category destructors */ ( capacity: number | { readonly capacity: "unbounded"; readonly replay?: number | undefined } | { readonly capacity: number readonly strategy?: "sliding" | "dropping" | "suspend" | undefined readonly replay?: number | undefined } ): (self: Stream) => Effect.Effect>, never, Scope.Scope | R> /** * Converts the stream to a scoped `PubSub` of chunks. After the scope is closed, * the `PubSub` will never again produce values and should be discarded. * * @since 2.0.0 * @category destructors */ ( self: Stream, capacity: number | { readonly capacity: "unbounded"; readonly replay?: number | undefined } | { readonly capacity: number readonly strategy?: "sliding" | "dropping" | "suspend" | undefined readonly replay?: number | undefined } ): Effect.Effect>, never, Scope.Scope | R> } = internal.toPubSub /** * Returns in a scope a ZIO effect that can be used to repeatedly pull chunks * from the stream. The pull effect fails with None when the stream is * finished, or with Some error if it fails, otherwise it returns a chunk of * the stream's output. * * @example * ```ts * import { Effect, Stream } from "effect" * * // Simulate a chunked stream * const stream = Stream.fromIterable([1, 2, 3, 4, 5]).pipe(Stream.rechunk(2)) * * const program = Effect.gen(function*() { * // Create an effect to get data chunks from the stream * const getChunk = yield* Stream.toPull(stream) * * // Continuously fetch and process chunks * while (true) { * const chunk = yield* getChunk * console.log(chunk) * } * }) * * Effect.runPromise(Effect.scoped(program)).then(console.log, console.error) * // { _id: 'Chunk', values: [ 1, 2 ] } * // { _id: 'Chunk', values: [ 3, 4 ] } * // { _id: 'Chunk', values: [ 5 ] } * // (FiberFailure) Error: { * // "_id": "Option", * // "_tag": "None" * // } * ``` * * @since 2.0.0 * @category destructors */ export const toPull: ( self: Stream ) => Effect.Effect, Option.Option, R>, never, Scope.Scope | R> = internal.toPull /** * Converts the stream to a scoped queue of chunks. After the scope is closed, * the queue will never again produce values and should be discarded. * * Defaults to the "suspend" back pressure strategy with a capacity of 2. * * @since 2.0.0 * @category destructors */ export const toQueue: { /** * Converts the stream to a scoped queue of chunks. After the scope is closed, * the queue will never again produce values and should be discarded. * * Defaults to the "suspend" back pressure strategy with a capacity of 2. * * @since 2.0.0 * @category destructors */ ( options?: | { readonly strategy?: "dropping" | "sliding" | "suspend" | undefined; readonly capacity?: number | undefined } | { readonly strategy: "unbounded" } | undefined ): (self: Stream) => Effect.Effect>, never, Scope.Scope | R> /** * Converts the stream to a scoped queue of chunks. After the scope is closed, * the queue will never again produce values and should be discarded. * * Defaults to the "suspend" back pressure strategy with a capacity of 2. * * @since 2.0.0 * @category destructors */ ( self: Stream, options?: | { readonly strategy?: "dropping" | "sliding" | "suspend" | undefined; readonly capacity?: number | undefined } | { readonly strategy: "unbounded" } | undefined ): Effect.Effect>, never, Scope.Scope | R> } = internal.toQueue /** * Converts the stream to a scoped queue of elements. After the scope is * closed, the queue will never again produce values and should be discarded. * * Defaults to a capacity of 2. * * @since 2.0.0 * @category destructors */ export const toQueueOfElements: { /** * Converts the stream to a scoped queue of elements. After the scope is * closed, the queue will never again produce values and should be discarded. * * Defaults to a capacity of 2. * * @since 2.0.0 * @category destructors */ (options?: { readonly capacity?: number | undefined } | undefined): ( self: Stream ) => Effect.Effect>>, never, Scope.Scope | R> /** * Converts the stream to a scoped queue of elements. After the scope is * closed, the queue will never again produce values and should be discarded. * * Defaults to a capacity of 2. * * @since 2.0.0 * @category destructors */ ( self: Stream, options?: { readonly capacity?: number | undefined } | undefined ): Effect.Effect>>, never, Scope.Scope | R> } = internal.toQueueOfElements /** * Converts the stream to a `ReadableStream`. * * See https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream. * * @since 2.0.0 * @category destructors */ export const toReadableStream: { /** * Converts the stream to a `ReadableStream`. * * See https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream. * * @since 2.0.0 * @category destructors */ (options?: { readonly strategy?: QueuingStrategy | undefined }): ( self: Stream ) => ReadableStream /** * Converts the stream to a `ReadableStream`. * * See https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream. * * @since 2.0.0 * @category destructors */ ( self: Stream, options?: { readonly strategy?: QueuingStrategy | undefined } ): ReadableStream } = internal.toReadableStream /** * Converts the stream to a `Effect`. * * See https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream. * * @since 2.0.0 * @category destructors */ export const toReadableStreamEffect: { /** * Converts the stream to a `Effect`. * * See https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream. * * @since 2.0.0 * @category destructors */ (options?: { readonly strategy?: QueuingStrategy | undefined }): ( self: Stream ) => Effect.Effect, never, R> /** * Converts the stream to a `Effect`. * * See https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream. * * @since 2.0.0 * @category destructors */ ( self: Stream, options?: { readonly strategy?: QueuingStrategy | undefined } ): Effect.Effect, never, R> } = internal.toReadableStreamEffect /** * Converts the stream to a `ReadableStream` using the provided runtime. * * See https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream. * * @since 2.0.0 * @category destructors */ export const toReadableStreamRuntime: { /** * Converts the stream to a `ReadableStream` using the provided runtime. * * See https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream. * * @since 2.0.0 * @category destructors */ ( runtime: Runtime, options?: { readonly strategy?: QueuingStrategy | undefined } ): (self: Stream) => ReadableStream /** * Converts the stream to a `ReadableStream` using the provided runtime. * * See https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream. * * @since 2.0.0 * @category destructors */ ( self: Stream, runtime: Runtime, options?: { readonly strategy?: QueuingStrategy | undefined } ): ReadableStream } = internal.toReadableStreamRuntime /** * Converts the stream to a `AsyncIterable` using the provided runtime. * * @since 3.15.0 * @category destructors */ export const toAsyncIterableRuntime: { /** * Converts the stream to a `AsyncIterable` using the provided runtime. * * @since 3.15.0 * @category destructors */ (runtime: Runtime): (self: Stream) => AsyncIterable /** * Converts the stream to a `AsyncIterable` using the provided runtime. * * @since 3.15.0 * @category destructors */ (self: Stream, runtime: Runtime): AsyncIterable } = internal.toAsyncIterableRuntime /** * Converts the stream to a `AsyncIterable` capturing the required dependencies. * * @since 3.15.0 * @category destructors */ export const toAsyncIterableEffect: (self: Stream) => Effect.Effect, never, R> = internal.toAsyncIterableEffect /** * Converts the stream to a `AsyncIterable`. * * @since 3.15.0 * @category destructors */ export const toAsyncIterable: (self: Stream) => AsyncIterable = internal.toAsyncIterable /** * Applies the transducer to the stream and emits its outputs. * * @since 2.0.0 * @category utils */ export const transduce: { /** * Applies the transducer to the stream and emits its outputs. * * @since 2.0.0 * @category utils */ (sink: Sink.Sink): (self: Stream) => Stream /** * Applies the transducer to the stream and emits its outputs. * * @since 2.0.0 * @category utils */ (self: Stream, sink: Sink.Sink): Stream } = internal.transduce /** * Creates a stream by peeling off the "layers" of a value of type `S`. * * @example * ```ts * import { Effect, Option, Stream } from "effect" * * const stream = Stream.unfold(1, (n) => Option.some([n, n + 1])) * * Effect.runPromise(Stream.runCollect(stream.pipe(Stream.take(5)))).then(console.log) * // { _id: 'Chunk', values: [ 1, 2, 3, 4, 5 ] } * ``` * * @since 2.0.0 * @category constructors */ export const unfold: (s: S, f: (s: S) => Option.Option) => Stream = internal.unfold /** * Creates a stream by peeling off the "layers" of a value of type `S`. * * @since 2.0.0 * @category constructors */ export const unfoldChunk: ( s: S, f: (s: S) => Option.Option, S]> ) => Stream = internal.unfoldChunk /** * Creates a stream by effectfully peeling off the "layers" of a value of type * `S`. * * @since 2.0.0 * @category constructors */ export const unfoldChunkEffect: ( s: S, f: (s: S) => Effect.Effect, S]>, E, R> ) => Stream = internal.unfoldChunkEffect /** * Creates a stream by effectfully peeling off the "layers" of a value of type * `S`. * * @example * ```ts * import { Effect, Option, Random, Stream } from "effect" * * const stream = Stream.unfoldEffect(1, (n) => * Random.nextBoolean.pipe( * Effect.map((b) => (b ? Option.some([n, -n]) : Option.some([n, n]))) * )) * * Effect.runPromise(Stream.runCollect(stream.pipe(Stream.take(5)))).then(console.log) * // { _id: 'Chunk', values: [ 1, -1, -1, -1, -1 ] } * ``` * * @since 2.0.0 * @category constructors */ export const unfoldEffect: ( s: S, f: (s: S) => Effect.Effect, E, R> ) => Stream = internal.unfoldEffect const void_: Stream = internal.void export { /** * A stream that contains a single `void` value. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.void * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ undefined ] } * * ``` * @since 2.0.0 * @category constructors */ void_ as void } /** * Creates a stream produced from an `Effect`. * * @since 2.0.0 * @category constructors */ export const unwrap: (effect: Effect.Effect, E, R>) => Stream = internal.unwrap /** * Creates a stream produced from a scoped `Effect`. * * @since 2.0.0 * @category constructors */ export const unwrapScoped: ( effect: Effect.Effect, E, R> ) => Stream> = internal.unwrapScoped /** * Creates a stream produced from a function which receives a `Scope` and * returns an `Effect`. The resulting stream will emit a single element, which * will be the result of the returned effect, if successful. * * @since 3.11.0 * @category constructors */ export const unwrapScopedWith: ( f: (scope: Scope.Scope) => Effect.Effect, E, R> ) => Stream = internal.unwrapScopedWith /** * Updates the specified service within the context of the `Stream`. * * @since 2.0.0 * @category context */ export const updateService: { /** * Updates the specified service within the context of the `Stream`. * * @since 2.0.0 * @category context */ (tag: Context.Tag, f: (service: NoInfer) => NoInfer): (self: Stream) => Stream /** * Updates the specified service within the context of the `Stream`. * * @since 2.0.0 * @category context */ ( self: Stream, tag: Context.Tag, f: (service: NoInfer) => NoInfer ): Stream } = internal.updateService /** * Returns the specified stream if the given condition is satisfied, otherwise * returns an empty stream. * * @since 2.0.0 * @category utils */ export const when: { /** * Returns the specified stream if the given condition is satisfied, otherwise * returns an empty stream. * * @since 2.0.0 * @category utils */ (test: LazyArg): (self: Stream) => Stream /** * Returns the specified stream if the given condition is satisfied, otherwise * returns an empty stream. * * @since 2.0.0 * @category utils */ (self: Stream, test: LazyArg): Stream } = internal.when /** * Returns the resulting stream when the given `PartialFunction` is defined * for the given value, otherwise returns an empty stream. * * @since 2.0.0 * @category constructors */ export const whenCase: ( evaluate: LazyArg, pf: (a: A) => Option.Option> ) => Stream = internal.whenCase /** * Returns the stream when the given partial function is defined for the given * effectful value, otherwise returns an empty stream. * * @since 2.0.0 * @category utils */ export const whenCaseEffect: { /** * Returns the stream when the given partial function is defined for the given * effectful value, otherwise returns an empty stream. * * @since 2.0.0 * @category utils */ (pf: (a: A) => Option.Option>): (self: Effect.Effect) => Stream /** * Returns the stream when the given partial function is defined for the given * effectful value, otherwise returns an empty stream. * * @since 2.0.0 * @category utils */ ( self: Effect.Effect, pf: (a: A) => Option.Option> ): Stream } = internal.whenCaseEffect /** * Returns the stream if the given effectful condition is satisfied, otherwise * returns an empty stream. * * @since 2.0.0 * @category utils */ export const whenEffect: { /** * Returns the stream if the given effectful condition is satisfied, otherwise * returns an empty stream. * * @since 2.0.0 * @category utils */ (effect: Effect.Effect): (self: Stream) => Stream /** * Returns the stream if the given effectful condition is satisfied, otherwise * returns an empty stream. * * @since 2.0.0 * @category utils */ (self: Stream, effect: Effect.Effect): Stream } = internal.whenEffect /** * Wraps the stream with a new span for tracing. * * @since 2.0.0 * @category tracing */ export const withSpan: { /** * Wraps the stream with a new span for tracing. * * @since 2.0.0 * @category tracing */ (name: string, options?: Tracer.SpanOptions | undefined): (self: Stream) => Stream> /** * Wraps the stream with a new span for tracing. * * @since 2.0.0 * @category tracing */ ( self: Stream, name: string, options?: Tracer.SpanOptions | undefined ): Stream> } = internal.withSpan /** * Zips this stream with another point-wise and emits tuples of elements from * both streams. * * The new stream will end when one of the sides ends. * * @example * ```ts * import { Effect, Stream } from "effect" * * // We create two streams and zip them together. * const stream = Stream.zip( * Stream.make(1, 2, 3, 4, 5, 6), * Stream.make("a", "b", "c") * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ [ 1, 'a' ], [ 2, 'b' ], [ 3, 'c' ] ] } * ``` * * @since 2.0.0 * @category zipping */ export const zip: { /** * Zips this stream with another point-wise and emits tuples of elements from * both streams. * * The new stream will end when one of the sides ends. * * @example * ```ts * import { Effect, Stream } from "effect" * * // We create two streams and zip them together. * const stream = Stream.zip( * Stream.make(1, 2, 3, 4, 5, 6), * Stream.make("a", "b", "c") * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ [ 1, 'a' ], [ 2, 'b' ], [ 3, 'c' ] ] } * ``` * * @since 2.0.0 * @category zipping */ (that: Stream): (self: Stream) => Stream<[A, A2], E2 | E, R2 | R> /** * Zips this stream with another point-wise and emits tuples of elements from * both streams. * * The new stream will end when one of the sides ends. * * @example * ```ts * import { Effect, Stream } from "effect" * * // We create two streams and zip them together. * const stream = Stream.zip( * Stream.make(1, 2, 3, 4, 5, 6), * Stream.make("a", "b", "c") * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ [ 1, 'a' ], [ 2, 'b' ], [ 3, 'c' ] ] } * ``` * * @since 2.0.0 * @category zipping */ (self: Stream, that: Stream): Stream<[A, A2], E | E2, R | R2> } = internal.zip /** * Zips this stream with another point-wise and emits tuples of elements from * both streams. * * The new stream will end when one of the sides ends. * * @since 2.0.0 * @category zipping */ export const zipFlatten: { /** * Zips this stream with another point-wise and emits tuples of elements from * both streams. * * The new stream will end when one of the sides ends. * * @since 2.0.0 * @category zipping */ (that: Stream): , E, R>(self: Stream) => Stream<[...A, A2], E2 | E, R2 | R> /** * Zips this stream with another point-wise and emits tuples of elements from * both streams. * * The new stream will end when one of the sides ends. * * @since 2.0.0 * @category zipping */ , E, R, A2, E2, R2>(self: Stream, that: Stream): Stream<[...A, A2], E | E2, R | R2> } = internal.zipFlatten /** * Zips this stream with another point-wise, creating a new stream of pairs of * elements from both sides. * * The defaults `defaultLeft` and `defaultRight` will be used if the streams * have different lengths and one of the streams has ended before the other. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.zipAll(Stream.make(1, 2, 3, 4, 5, 6), { * other: Stream.make("a", "b", "c"), * defaultSelf: 0, * defaultOther: "x" * }) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: "Chunk", values: [ [ 1, "a" ], [ 2, "b" ], [ 3, "c" ], [ 4, "x" ], [ 5, "x" ], [ 6, "x" ] ] } * ``` * * @since 2.0.0 * @category zipping */ export const zipAll: { /** * Zips this stream with another point-wise, creating a new stream of pairs of * elements from both sides. * * The defaults `defaultLeft` and `defaultRight` will be used if the streams * have different lengths and one of the streams has ended before the other. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.zipAll(Stream.make(1, 2, 3, 4, 5, 6), { * other: Stream.make("a", "b", "c"), * defaultSelf: 0, * defaultOther: "x" * }) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: "Chunk", values: [ [ 1, "a" ], [ 2, "b" ], [ 3, "c" ], [ 4, "x" ], [ 5, "x" ], [ 6, "x" ] ] } * ``` * * @since 2.0.0 * @category zipping */ ( options: { readonly other: Stream; readonly defaultSelf: A; readonly defaultOther: A2 } ): (self: Stream) => Stream<[A, A2], E2 | E, R2 | R> /** * Zips this stream with another point-wise, creating a new stream of pairs of * elements from both sides. * * The defaults `defaultLeft` and `defaultRight` will be used if the streams * have different lengths and one of the streams has ended before the other. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.zipAll(Stream.make(1, 2, 3, 4, 5, 6), { * other: Stream.make("a", "b", "c"), * defaultSelf: 0, * defaultOther: "x" * }) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: "Chunk", values: [ [ 1, "a" ], [ 2, "b" ], [ 3, "c" ], [ 4, "x" ], [ 5, "x" ], [ 6, "x" ] ] } * ``` * * @since 2.0.0 * @category zipping */ ( self: Stream, options: { readonly other: Stream; readonly defaultSelf: A; readonly defaultOther: A2 } ): Stream<[A, A2], E | E2, R | R2> } = internal.zipAll /** * Zips this stream with another point-wise, and keeps only elements from this * stream. * * The provided default value will be used if the other stream ends before * this one. * * @since 2.0.0 * @category zipping */ export const zipAllLeft: { /** * Zips this stream with another point-wise, and keeps only elements from this * stream. * * The provided default value will be used if the other stream ends before * this one. * * @since 2.0.0 * @category zipping */ (that: Stream, defaultLeft: A): (self: Stream) => Stream /** * Zips this stream with another point-wise, and keeps only elements from this * stream. * * The provided default value will be used if the other stream ends before * this one. * * @since 2.0.0 * @category zipping */ (self: Stream, that: Stream, defaultLeft: A): Stream } = internal.zipAllLeft /** * Zips this stream with another point-wise, and keeps only elements from the * other stream. * * The provided default value will be used if this stream ends before the * other one. * * @since 2.0.0 * @category zipping */ export const zipAllRight: { /** * Zips this stream with another point-wise, and keeps only elements from the * other stream. * * The provided default value will be used if this stream ends before the * other one. * * @since 2.0.0 * @category zipping */ (that: Stream, defaultRight: A2): (self: Stream) => Stream /** * Zips this stream with another point-wise, and keeps only elements from the * other stream. * * The provided default value will be used if this stream ends before the * other one. * * @since 2.0.0 * @category zipping */ (self: Stream, that: Stream, defaultRight: A2): Stream } = internal.zipAllRight /** * Zips this stream that is sorted by distinct keys and the specified stream * that is sorted by distinct keys to produce a new stream that is sorted by * distinct keys. Combines values associated with each key into a tuple, * using the specified values `defaultLeft` and `defaultRight` to fill in * missing values. * * This allows zipping potentially unbounded streams of data by key in * constant space but the caller is responsible for ensuring that the * streams are sorted by distinct keys. * * @since 2.0.0 * @category zipping */ export const zipAllSortedByKey: { /** * Zips this stream that is sorted by distinct keys and the specified stream * that is sorted by distinct keys to produce a new stream that is sorted by * distinct keys. Combines values associated with each key into a tuple, * using the specified values `defaultLeft` and `defaultRight` to fill in * missing values. * * This allows zipping potentially unbounded streams of data by key in * constant space but the caller is responsible for ensuring that the * streams are sorted by distinct keys. * * @since 2.0.0 * @category zipping */ ( options: { readonly other: Stream readonly defaultSelf: A readonly defaultOther: A2 readonly order: Order.Order } ): (self: Stream) => Stream<[K, [A, A2]], E2 | E, R2 | R> /** * Zips this stream that is sorted by distinct keys and the specified stream * that is sorted by distinct keys to produce a new stream that is sorted by * distinct keys. Combines values associated with each key into a tuple, * using the specified values `defaultLeft` and `defaultRight` to fill in * missing values. * * This allows zipping potentially unbounded streams of data by key in * constant space but the caller is responsible for ensuring that the * streams are sorted by distinct keys. * * @since 2.0.0 * @category zipping */ ( self: Stream, options: { readonly other: Stream readonly defaultSelf: A readonly defaultOther: A2 readonly order: Order.Order } ): Stream<[K, [A, A2]], E | E2, R | R2> } = internal.zipAllSortedByKey /** * Zips this stream that is sorted by distinct keys and the specified stream * that is sorted by distinct keys to produce a new stream that is sorted by * distinct keys. Keeps only values from this stream, using the specified * value `default` to fill in missing values. * * This allows zipping potentially unbounded streams of data by key in * constant space but the caller is responsible for ensuring that the * streams are sorted by distinct keys. * * @since 2.0.0 * @category zipping */ export const zipAllSortedByKeyLeft: { /** * Zips this stream that is sorted by distinct keys and the specified stream * that is sorted by distinct keys to produce a new stream that is sorted by * distinct keys. Keeps only values from this stream, using the specified * value `default` to fill in missing values. * * This allows zipping potentially unbounded streams of data by key in * constant space but the caller is responsible for ensuring that the * streams are sorted by distinct keys. * * @since 2.0.0 * @category zipping */ ( options: { readonly other: Stream readonly defaultSelf: A readonly order: Order.Order } ): (self: Stream) => Stream<[K, A], E2 | E, R2 | R> /** * Zips this stream that is sorted by distinct keys and the specified stream * that is sorted by distinct keys to produce a new stream that is sorted by * distinct keys. Keeps only values from this stream, using the specified * value `default` to fill in missing values. * * This allows zipping potentially unbounded streams of data by key in * constant space but the caller is responsible for ensuring that the * streams are sorted by distinct keys. * * @since 2.0.0 * @category zipping */ ( self: Stream, options: { readonly other: Stream readonly defaultSelf: A readonly order: Order.Order } ): Stream<[K, A], E | E2, R | R2> } = internal.zipAllSortedByKeyLeft /** * Zips this stream that is sorted by distinct keys and the specified stream * that is sorted by distinct keys to produce a new stream that is sorted by * distinct keys. Keeps only values from that stream, using the specified * value `default` to fill in missing values. * * This allows zipping potentially unbounded streams of data by key in * constant space but the caller is responsible for ensuring that the * streams are sorted by distinct keys. * * @since 2.0.0 * @category zipping */ export const zipAllSortedByKeyRight: { /** * Zips this stream that is sorted by distinct keys and the specified stream * that is sorted by distinct keys to produce a new stream that is sorted by * distinct keys. Keeps only values from that stream, using the specified * value `default` to fill in missing values. * * This allows zipping potentially unbounded streams of data by key in * constant space but the caller is responsible for ensuring that the * streams are sorted by distinct keys. * * @since 2.0.0 * @category zipping */ ( options: { readonly other: Stream readonly defaultOther: A2 readonly order: Order.Order } ): (self: Stream) => Stream<[K, A2], E2 | E, R2 | R> /** * Zips this stream that is sorted by distinct keys and the specified stream * that is sorted by distinct keys to produce a new stream that is sorted by * distinct keys. Keeps only values from that stream, using the specified * value `default` to fill in missing values. * * This allows zipping potentially unbounded streams of data by key in * constant space but the caller is responsible for ensuring that the * streams are sorted by distinct keys. * * @since 2.0.0 * @category zipping */ ( self: Stream, options: { readonly other: Stream readonly defaultOther: A2 readonly order: Order.Order } ): Stream<[K, A2], E | E2, R | R2> } = internal.zipAllSortedByKeyRight /** * Zips this stream that is sorted by distinct keys and the specified stream * that is sorted by distinct keys to produce a new stream that is sorted by * distinct keys. Uses the functions `left`, `right`, and `both` to handle * the cases where a key and value exist in this stream, that stream, or * both streams. * * This allows zipping potentially unbounded streams of data by key in * constant space but the caller is responsible for ensuring that the * streams are sorted by distinct keys. * * @since 2.0.0 * @category zipping */ export const zipAllSortedByKeyWith: { /** * Zips this stream that is sorted by distinct keys and the specified stream * that is sorted by distinct keys to produce a new stream that is sorted by * distinct keys. Uses the functions `left`, `right`, and `both` to handle * the cases where a key and value exist in this stream, that stream, or * both streams. * * This allows zipping potentially unbounded streams of data by key in * constant space but the caller is responsible for ensuring that the * streams are sorted by distinct keys. * * @since 2.0.0 * @category zipping */ ( options: { readonly other: Stream readonly onSelf: (a: A) => A3 readonly onOther: (a2: A2) => A3 readonly onBoth: (a: A, a2: A2) => A3 readonly order: Order.Order } ): (self: Stream) => Stream<[K, A3], E2 | E, R2 | R> /** * Zips this stream that is sorted by distinct keys and the specified stream * that is sorted by distinct keys to produce a new stream that is sorted by * distinct keys. Uses the functions `left`, `right`, and `both` to handle * the cases where a key and value exist in this stream, that stream, or * both streams. * * This allows zipping potentially unbounded streams of data by key in * constant space but the caller is responsible for ensuring that the * streams are sorted by distinct keys. * * @since 2.0.0 * @category zipping */ ( self: Stream, options: { readonly other: Stream readonly onSelf: (a: A) => A3 readonly onOther: (a2: A2) => A3 readonly onBoth: (a: A, a2: A2) => A3 readonly order: Order.Order } ): Stream<[K, A3], E | E2, R | R2> } = internal.zipAllSortedByKeyWith /** * Zips this stream with another point-wise. The provided functions will be * used to create elements for the composed stream. * * The functions `left` and `right` will be used if the streams have different * lengths and one of the streams has ended before the other. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.zipAllWith(Stream.make(1, 2, 3, 4, 5, 6), { * other: Stream.make("a", "b", "c"), * onSelf: (n) => [n, "x"], * onOther: (s) => [0, s], * onBoth: (n, s) => [n - s.length, s] * }) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: "Chunk", values: [ [ 0, "a" ], [ 1, "b" ], [ 2, "c" ], [ 4, "x" ], [ 5, "x" ], [ 6, "x" ] ] } * ``` * * @since 2.0.0 * @category zipping */ export const zipAllWith: { /** * Zips this stream with another point-wise. The provided functions will be * used to create elements for the composed stream. * * The functions `left` and `right` will be used if the streams have different * lengths and one of the streams has ended before the other. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.zipAllWith(Stream.make(1, 2, 3, 4, 5, 6), { * other: Stream.make("a", "b", "c"), * onSelf: (n) => [n, "x"], * onOther: (s) => [0, s], * onBoth: (n, s) => [n - s.length, s] * }) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: "Chunk", values: [ [ 0, "a" ], [ 1, "b" ], [ 2, "c" ], [ 4, "x" ], [ 5, "x" ], [ 6, "x" ] ] } * ``` * * @since 2.0.0 * @category zipping */ ( options: { readonly other: Stream readonly onSelf: (a: A) => A3 readonly onOther: (a2: A2) => A3 readonly onBoth: (a: A, a2: A2) => A3 } ): (self: Stream) => Stream /** * Zips this stream with another point-wise. The provided functions will be * used to create elements for the composed stream. * * The functions `left` and `right` will be used if the streams have different * lengths and one of the streams has ended before the other. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.zipAllWith(Stream.make(1, 2, 3, 4, 5, 6), { * other: Stream.make("a", "b", "c"), * onSelf: (n) => [n, "x"], * onOther: (s) => [0, s], * onBoth: (n, s) => [n - s.length, s] * }) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: "Chunk", values: [ [ 0, "a" ], [ 1, "b" ], [ 2, "c" ], [ 4, "x" ], [ 5, "x" ], [ 6, "x" ] ] } * ``` * * @since 2.0.0 * @category zipping */ ( self: Stream, options: { readonly other: Stream readonly onSelf: (a: A) => A3 readonly onOther: (a2: A2) => A3 readonly onBoth: (a: A, a2: A2) => A3 } ): Stream } = internal.zipAllWith /** * Zips the two streams so that when a value is emitted by either of the two * streams, it is combined with the latest value from the other stream to * produce a result. * * Note: tracking the latest value is done on a per-chunk basis. That means * that emitted elements that are not the last value in chunks will never be * used for zipping. * * @example * ```ts * import { Effect, Schedule, Stream } from "effect" * * const s1 = Stream.make(1, 2, 3).pipe( * Stream.schedule(Schedule.spaced("1 second")) * ) * * const s2 = Stream.make("a", "b", "c", "d").pipe( * Stream.schedule(Schedule.spaced("500 millis")) * ) * * const stream = Stream.zipLatest(s1, s2) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: "Chunk", values: [ [ 1, "a" ], [ 1, "b" ], [ 2, "b" ], [ 2, "c" ], [ 2, "d" ], [ 3, "d" ] ] } * ``` * * @since 2.0.0 * @category zipping */ export const zipLatest: { /** * Zips the two streams so that when a value is emitted by either of the two * streams, it is combined with the latest value from the other stream to * produce a result. * * Note: tracking the latest value is done on a per-chunk basis. That means * that emitted elements that are not the last value in chunks will never be * used for zipping. * * @example * ```ts * import { Effect, Schedule, Stream } from "effect" * * const s1 = Stream.make(1, 2, 3).pipe( * Stream.schedule(Schedule.spaced("1 second")) * ) * * const s2 = Stream.make("a", "b", "c", "d").pipe( * Stream.schedule(Schedule.spaced("500 millis")) * ) * * const stream = Stream.zipLatest(s1, s2) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: "Chunk", values: [ [ 1, "a" ], [ 1, "b" ], [ 2, "b" ], [ 2, "c" ], [ 2, "d" ], [ 3, "d" ] ] } * ``` * * @since 2.0.0 * @category zipping */ (right: Stream): (left: Stream) => Stream<[AL, AR], EL | ER, RL | RR> /** * Zips the two streams so that when a value is emitted by either of the two * streams, it is combined with the latest value from the other stream to * produce a result. * * Note: tracking the latest value is done on a per-chunk basis. That means * that emitted elements that are not the last value in chunks will never be * used for zipping. * * @example * ```ts * import { Effect, Schedule, Stream } from "effect" * * const s1 = Stream.make(1, 2, 3).pipe( * Stream.schedule(Schedule.spaced("1 second")) * ) * * const s2 = Stream.make("a", "b", "c", "d").pipe( * Stream.schedule(Schedule.spaced("500 millis")) * ) * * const stream = Stream.zipLatest(s1, s2) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: "Chunk", values: [ [ 1, "a" ], [ 1, "b" ], [ 2, "b" ], [ 2, "c" ], [ 2, "d" ], [ 3, "d" ] ] } * ``` * * @since 2.0.0 * @category zipping */ (left: Stream, right: Stream): Stream<[AL, AR], EL | ER, RL | RR> } = internal.zipLatest /** * Zips multiple streams so that when a value is emitted by any of the streams, * it is combined with the latest values from the other streams to produce a result. * * Note: tracking the latest value is done on a per-chunk basis. That means * that emitted elements that are not the last value in chunks will never be * used for zipping. * * @example * ```ts * import { Stream, Schedule, Console, Effect } from "effect" * * const stream = Stream.zipLatestAll( * Stream.fromSchedule(Schedule.spaced('1 millis')), * Stream.fromSchedule(Schedule.spaced('2 millis')), * Stream.fromSchedule(Schedule.spaced('4 millis')), * ).pipe(Stream.take(6), Stream.tap(Console.log)) * * Effect.runPromise(Stream.runDrain(stream)) * // Output: * // [ 0, 0, 0 ] * // [ 1, 0, 0 ] * // [ 1, 1, 0 ] * // [ 2, 1, 0 ] * // [ 3, 1, 0 ] * // [ 3, 1, 1 ] * // ..... * ``` * * @since 3.3.0 * @category zipping */ export const zipLatestAll: >>( ...streams: T ) => Stream< [T[number]] extends [never] ? never : { [K in keyof T]: T[K] extends Stream ? A : never }, [T[number]] extends [never] ? never : T[number] extends Stream ? _E : never, [T[number]] extends [never] ? never : T[number] extends Stream ? _R : never > = internal.zipLatestAll /** * Zips the two streams so that when a value is emitted by either of the two * streams, it is combined with the latest value from the other stream to * produce a result. * * Note: tracking the latest value is done on a per-chunk basis. That means * that emitted elements that are not the last value in chunks will never be * used for zipping. * * @since 2.0.0 * @category zipping */ export const zipLatestWith: { /** * Zips the two streams so that when a value is emitted by either of the two * streams, it is combined with the latest value from the other stream to * produce a result. * * Note: tracking the latest value is done on a per-chunk basis. That means * that emitted elements that are not the last value in chunks will never be * used for zipping. * * @since 2.0.0 * @category zipping */ (right: Stream, f: (left: AL, right: AR) => A): (left: Stream) => Stream /** * Zips the two streams so that when a value is emitted by either of the two * streams, it is combined with the latest value from the other stream to * produce a result. * * Note: tracking the latest value is done on a per-chunk basis. That means * that emitted elements that are not the last value in chunks will never be * used for zipping. * * @since 2.0.0 * @category zipping */ ( left: Stream, right: Stream, f: (left: AL, right: AR) => A ): Stream } = internal.zipLatestWith /** * Zips this stream with another point-wise, but keeps only the outputs of * `left` stream. * * The new stream will end when one of the sides ends. * * @since 2.0.0 * @category zipping */ export const zipLeft: { /** * Zips this stream with another point-wise, but keeps only the outputs of * `left` stream. * * The new stream will end when one of the sides ends. * * @since 2.0.0 * @category zipping */ (right: Stream): (left: Stream) => Stream /** * Zips this stream with another point-wise, but keeps only the outputs of * `left` stream. * * The new stream will end when one of the sides ends. * * @since 2.0.0 * @category zipping */ (left: Stream, right: Stream): Stream } = internal.zipLeft /** * Zips this stream with another point-wise, but keeps only the outputs of the * `right` stream. * * The new stream will end when one of the sides ends. * * @since 2.0.0 * @category zipping */ export const zipRight: { /** * Zips this stream with another point-wise, but keeps only the outputs of the * `right` stream. * * The new stream will end when one of the sides ends. * * @since 2.0.0 * @category zipping */ (right: Stream): (left: Stream) => Stream /** * Zips this stream with another point-wise, but keeps only the outputs of the * `right` stream. * * The new stream will end when one of the sides ends. * * @since 2.0.0 * @category zipping */ (left: Stream, right: Stream): Stream } = internal.zipRight /** * Zips this stream with another point-wise and applies the function to the * paired elements. * * The new stream will end when one of the sides ends. * * @example * ```ts * import { Effect, Stream } from "effect" * * // We create two streams and zip them with custom logic. * const stream = Stream.zipWith( * Stream.make(1, 2, 3, 4, 5, 6), * Stream.make("a", "b", "c"), * (n, s) => [n - s.length, s] * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ [ 0, 'a' ], [ 1, 'b' ], [ 2, 'c' ] ] } * ``` * * @since 2.0.0 * @category zipping */ export const zipWith: { /** * Zips this stream with another point-wise and applies the function to the * paired elements. * * The new stream will end when one of the sides ends. * * @example * ```ts * import { Effect, Stream } from "effect" * * // We create two streams and zip them with custom logic. * const stream = Stream.zipWith( * Stream.make(1, 2, 3, 4, 5, 6), * Stream.make("a", "b", "c"), * (n, s) => [n - s.length, s] * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ [ 0, 'a' ], [ 1, 'b' ], [ 2, 'c' ] ] } * ``` * * @since 2.0.0 * @category zipping */ (right: Stream, f: (left: AL, right: AR) => A): (left: Stream) => Stream /** * Zips this stream with another point-wise and applies the function to the * paired elements. * * The new stream will end when one of the sides ends. * * @example * ```ts * import { Effect, Stream } from "effect" * * // We create two streams and zip them with custom logic. * const stream = Stream.zipWith( * Stream.make(1, 2, 3, 4, 5, 6), * Stream.make("a", "b", "c"), * (n, s) => [n - s.length, s] * ) * * Effect.runPromise(Stream.runCollect(stream)).then(console.log) * // { _id: 'Chunk', values: [ [ 0, 'a' ], [ 1, 'b' ], [ 2, 'c' ] ] } * ``` * * @since 2.0.0 * @category zipping */ ( left: Stream, right: Stream, f: (left: AL, right: AR) => A ): Stream } = internal.zipWith /** * Zips this stream with another point-wise and applies the function to the * paired elements. * * The new stream will end when one of the sides ends. * * @since 2.0.0 * @category zipping */ export const zipWithChunks: { /** * Zips this stream with another point-wise and applies the function to the * paired elements. * * The new stream will end when one of the sides ends. * * @since 2.0.0 * @category zipping */ ( that: Stream, f: ( left: Chunk.Chunk, right: Chunk.Chunk ) => readonly [Chunk.Chunk, Either.Either, Chunk.Chunk>] ): (self: Stream) => Stream /** * Zips this stream with another point-wise and applies the function to the * paired elements. * * The new stream will end when one of the sides ends. * * @since 2.0.0 * @category zipping */ ( self: Stream, that: Stream, f: ( left: Chunk.Chunk, right: Chunk.Chunk ) => readonly [Chunk.Chunk, Either.Either, Chunk.Chunk>] ): Stream } = internal.zipWithChunks /** * Zips each element with the next element if present. * * @example * ```ts * import { Chunk, Effect, Stream } from "effect" * * const stream = Stream.zipWithNext(Stream.make(1, 2, 3, 4)) * * Effect.runPromise(Stream.runCollect(stream)).then((chunk) => console.log(Chunk.toArray(chunk))) * // [ * // [ 1, { _id: 'Option', _tag: 'Some', value: 2 } ], * // [ 2, { _id: 'Option', _tag: 'Some', value: 3 } ], * // [ 3, { _id: 'Option', _tag: 'Some', value: 4 } ], * // [ 4, { _id: 'Option', _tag: 'None' } ] * // ] * ``` * * @since 2.0.0 * @category zipping */ export const zipWithNext: (self: Stream) => Stream<[A, Option.Option], E, R> = internal.zipWithNext /** * Zips each element with the previous element. Initially accompanied by * `None`. * * @example * ```ts * import { Chunk, Effect, Stream } from "effect" * * const stream = Stream.zipWithPrevious(Stream.make(1, 2, 3, 4)) * * Effect.runPromise(Stream.runCollect(stream)).then((chunk) => console.log(Chunk.toArray(chunk))) * // [ * // [ { _id: 'Option', _tag: 'None' }, 1 ], * // [ { _id: 'Option', _tag: 'Some', value: 1 }, 2 ], * // [ { _id: 'Option', _tag: 'Some', value: 2 }, 3 ], * // [ { _id: 'Option', _tag: 'Some', value: 3 }, 4 ] * // ] * ``` * * @since 2.0.0 * @category zipping */ export const zipWithPrevious: (self: Stream) => Stream<[Option.Option, A], E, R> = internal.zipWithPrevious /** * Zips each element with both the previous and next element. * * @example * ```ts * import { Chunk, Effect, Stream } from "effect" * * const stream = Stream.zipWithPreviousAndNext(Stream.make(1, 2, 3, 4)) * * Effect.runPromise(Stream.runCollect(stream)).then((chunk) => console.log(Chunk.toArray(chunk))) * // [ * // [ * // { _id: 'Option', _tag: 'None' }, * // 1, * // { _id: 'Option', _tag: 'Some', value: 2 } * // ], * // [ * // { _id: 'Option', _tag: 'Some', value: 1 }, * // 2, * // { _id: 'Option', _tag: 'Some', value: 3 } * // ], * // [ * // { _id: 'Option', _tag: 'Some', value: 2 }, * // 3, * // { _id: 'Option', _tag: 'Some', value: 4 } * // ], * // [ * // { _id: 'Option', _tag: 'Some', value: 3 }, * // 4, * // { _id: 'Option', _tag: 'None' } * // ] * // ] * ``` * * @since 2.0.0 * @category zipping */ export const zipWithPreviousAndNext: ( self: Stream ) => Stream<[Option.Option, A, Option.Option], E, R> = internal.zipWithPreviousAndNext /** * Zips this stream together with the index of elements. * * @example * ```ts * import { Effect, Stream } from "effect" * * const stream = Stream.make("Mary", "James", "Robert", "Patricia") * * const indexedStream = Stream.zipWithIndex(stream) * * Effect.runPromise(Stream.runCollect(indexedStream)).then(console.log) * // { * // _id: 'Chunk', * // values: [ [ 'Mary', 0 ], [ 'James', 1 ], [ 'Robert', 2 ], [ 'Patricia', 3 ] ] * // } * ``` * * @since 2.0.0 * @category zipping */ export const zipWithIndex: (self: Stream) => Stream<[A, number], E, R> = internal.zipWithIndex // ------------------------------------------------------------------------------------- // do notation // ------------------------------------------------------------------------------------- /** * The "do simulation" in Effect allows you to write code in a more declarative style, similar to the "do notation" in other programming languages. It provides a way to define variables and perform operations on them using functions like `bind` and `let`. * * Here's how the do simulation works: * * 1. Start the do simulation using the `Do` value * 2. Within the do simulation scope, you can use the `bind` function to define variables and bind them to `Stream` values * 3. You can accumulate multiple `bind` statements to define multiple variables within the scope * 4. Inside the do simulation scope, you can also use the `let` function to define variables and bind them to simple values * * @example * ```ts * import * as assert from "node:assert" * import { Chunk, Effect, pipe, Stream } from "effect" * * const result = pipe( * Stream.Do, * Stream.bind("x", () => Stream.succeed(2)), * Stream.bind("y", () => Stream.succeed(3)), * Stream.let("sum", ({ x, y }) => x + y) * ) * assert.deepStrictEqual(Effect.runSync(Stream.runCollect(result)), Chunk.of({ x: 2, y: 3, sum: 5 })) * ``` * * @see {@link bindTo} * @see {@link bind} * @see {@link bindEffect} * @see {@link let_ let} * * @category do notation * @since 2.0.0 */ export const Do: Stream<{}> = internal.Do /** * The "do simulation" in Effect allows you to write code in a more declarative style, similar to the "do notation" in other programming languages. It provides a way to define variables and perform operations on them using functions like `bind` and `let`. * * Here's how the do simulation works: * * 1. Start the do simulation using the `Do` value * 2. Within the do simulation scope, you can use the `bind` function to define variables and bind them to `Stream` values * 3. You can accumulate multiple `bind` statements to define multiple variables within the scope * 4. Inside the do simulation scope, you can also use the `let` function to define variables and bind them to simple values * * @example * ```ts * import * as assert from "node:assert" * import { Chunk, Effect, pipe, Stream } from "effect" * * const result = pipe( * Stream.Do, * Stream.bind("x", () => Stream.succeed(2)), * Stream.bind("y", () => Stream.succeed(3)), * Stream.let("sum", ({ x, y }) => x + y) * ) * assert.deepStrictEqual(Effect.runSync(Stream.runCollect(result)), Chunk.of({ x: 2, y: 3, sum: 5 })) * ``` * * @see {@link Do} * @see {@link bindTo} * @see {@link bindEffect} * @see {@link let_ let} * * @category do notation * @since 2.0.0 */ export const bind: { /** * The "do simulation" in Effect allows you to write code in a more declarative style, similar to the "do notation" in other programming languages. It provides a way to define variables and perform operations on them using functions like `bind` and `let`. * * Here's how the do simulation works: * * 1. Start the do simulation using the `Do` value * 2. Within the do simulation scope, you can use the `bind` function to define variables and bind them to `Stream` values * 3. You can accumulate multiple `bind` statements to define multiple variables within the scope * 4. Inside the do simulation scope, you can also use the `let` function to define variables and bind them to simple values * * @example * ```ts * import * as assert from "node:assert" * import { Chunk, Effect, pipe, Stream } from "effect" * * const result = pipe( * Stream.Do, * Stream.bind("x", () => Stream.succeed(2)), * Stream.bind("y", () => Stream.succeed(3)), * Stream.let("sum", ({ x, y }) => x + y) * ) * assert.deepStrictEqual(Effect.runSync(Stream.runCollect(result)), Chunk.of({ x: 2, y: 3, sum: 5 })) * ``` * * @see {@link Do} * @see {@link bindTo} * @see {@link bindEffect} * @see {@link let_ let} * * @category do notation * @since 2.0.0 */ ( tag: Exclude, f: (_: NoInfer) => Stream, options?: | { readonly concurrency?: number | "unbounded" | undefined; readonly bufferSize?: number | undefined } | undefined ): (self: Stream) => Stream<{ [K in N | keyof A]: K extends keyof A ? A[K] : B }, E2 | E, R2 | R> /** * The "do simulation" in Effect allows you to write code in a more declarative style, similar to the "do notation" in other programming languages. It provides a way to define variables and perform operations on them using functions like `bind` and `let`. * * Here's how the do simulation works: * * 1. Start the do simulation using the `Do` value * 2. Within the do simulation scope, you can use the `bind` function to define variables and bind them to `Stream` values * 3. You can accumulate multiple `bind` statements to define multiple variables within the scope * 4. Inside the do simulation scope, you can also use the `let` function to define variables and bind them to simple values * * @example * ```ts * import * as assert from "node:assert" * import { Chunk, Effect, pipe, Stream } from "effect" * * const result = pipe( * Stream.Do, * Stream.bind("x", () => Stream.succeed(2)), * Stream.bind("y", () => Stream.succeed(3)), * Stream.let("sum", ({ x, y }) => x + y) * ) * assert.deepStrictEqual(Effect.runSync(Stream.runCollect(result)), Chunk.of({ x: 2, y: 3, sum: 5 })) * ``` * * @see {@link Do} * @see {@link bindTo} * @see {@link bindEffect} * @see {@link let_ let} * * @category do notation * @since 2.0.0 */ ( self: Stream, tag: Exclude, f: (_: NoInfer) => Stream, options?: | { readonly concurrency?: number | "unbounded" | undefined; readonly bufferSize?: number | undefined } | undefined ): Stream<{ [K in N | keyof A]: K extends keyof A ? A[K] : B }, E | E2, R | R2> } = internal.bind /** * Binds an effectful value in a `do` scope * * @see {@link Do} * @see {@link bindTo} * @see {@link bind} * @see {@link let_ let} * * @since 2.0.0 * @category do notation */ export const bindEffect: { /** * Binds an effectful value in a `do` scope * * @see {@link Do} * @see {@link bindTo} * @see {@link bind} * @see {@link let_ let} * * @since 2.0.0 * @category do notation */ ( tag: Exclude, f: (_: NoInfer) => Effect.Effect, options?: { readonly concurrency?: number | "unbounded" | undefined; readonly bufferSize?: number | undefined } ): (self: Stream) => Stream<{ [K in keyof A | N]: K extends keyof A ? A[K] : B }, E | E2, R | R2> /** * Binds an effectful value in a `do` scope * * @see {@link Do} * @see {@link bindTo} * @see {@link bind} * @see {@link let_ let} * * @since 2.0.0 * @category do notation */ ( self: Stream, tag: Exclude, f: (_: NoInfer) => Effect.Effect, options?: { readonly concurrency?: number | "unbounded" | undefined; readonly unordered?: boolean | undefined } ): Stream<{ [K in keyof A | N]: K extends keyof A ? A[K] : B }, E | E2, R | R2> } = groupBy_.bindEffect /** * The "do simulation" in Effect allows you to write code in a more declarative style, similar to the "do notation" in other programming languages. It provides a way to define variables and perform operations on them using functions like `bind` and `let`. * * Here's how the do simulation works: * * 1. Start the do simulation using the `Do` value * 2. Within the do simulation scope, you can use the `bind` function to define variables and bind them to `Stream` values * 3. You can accumulate multiple `bind` statements to define multiple variables within the scope * 4. Inside the do simulation scope, you can also use the `let` function to define variables and bind them to simple values * * @example * ```ts * import * as assert from "node:assert" * import { Chunk, Effect, pipe, Stream } from "effect" * * const result = pipe( * Stream.Do, * Stream.bind("x", () => Stream.succeed(2)), * Stream.bind("y", () => Stream.succeed(3)), * Stream.let("sum", ({ x, y }) => x + y) * ) * assert.deepStrictEqual(Effect.runSync(Stream.runCollect(result)), Chunk.of({ x: 2, y: 3, sum: 5 })) * ``` * * @see {@link Do} * @see {@link bind} * @see {@link bindEffect} * @see {@link let_ let} * * @category do notation * @since 2.0.0 */ export const bindTo: { /** * The "do simulation" in Effect allows you to write code in a more declarative style, similar to the "do notation" in other programming languages. It provides a way to define variables and perform operations on them using functions like `bind` and `let`. * * Here's how the do simulation works: * * 1. Start the do simulation using the `Do` value * 2. Within the do simulation scope, you can use the `bind` function to define variables and bind them to `Stream` values * 3. You can accumulate multiple `bind` statements to define multiple variables within the scope * 4. Inside the do simulation scope, you can also use the `let` function to define variables and bind them to simple values * * @example * ```ts * import * as assert from "node:assert" * import { Chunk, Effect, pipe, Stream } from "effect" * * const result = pipe( * Stream.Do, * Stream.bind("x", () => Stream.succeed(2)), * Stream.bind("y", () => Stream.succeed(3)), * Stream.let("sum", ({ x, y }) => x + y) * ) * assert.deepStrictEqual(Effect.runSync(Stream.runCollect(result)), Chunk.of({ x: 2, y: 3, sum: 5 })) * ``` * * @see {@link Do} * @see {@link bind} * @see {@link bindEffect} * @see {@link let_ let} * * @category do notation * @since 2.0.0 */ (name: N): (self: Stream) => Stream<{ [K in N]: A }, E, R> /** * The "do simulation" in Effect allows you to write code in a more declarative style, similar to the "do notation" in other programming languages. It provides a way to define variables and perform operations on them using functions like `bind` and `let`. * * Here's how the do simulation works: * * 1. Start the do simulation using the `Do` value * 2. Within the do simulation scope, you can use the `bind` function to define variables and bind them to `Stream` values * 3. You can accumulate multiple `bind` statements to define multiple variables within the scope * 4. Inside the do simulation scope, you can also use the `let` function to define variables and bind them to simple values * * @example * ```ts * import * as assert from "node:assert" * import { Chunk, Effect, pipe, Stream } from "effect" * * const result = pipe( * Stream.Do, * Stream.bind("x", () => Stream.succeed(2)), * Stream.bind("y", () => Stream.succeed(3)), * Stream.let("sum", ({ x, y }) => x + y) * ) * assert.deepStrictEqual(Effect.runSync(Stream.runCollect(result)), Chunk.of({ x: 2, y: 3, sum: 5 })) * ``` * * @see {@link Do} * @see {@link bind} * @see {@link bindEffect} * @see {@link let_ let} * * @category do notation * @since 2.0.0 */ (self: Stream, name: N): Stream<{ [K in N]: A }, E, R> } = internal.bindTo const let_: { ( name: Exclude, f: (a: NoInfer) => B ): (self: Stream) => Stream<{ [K in N | keyof A]: K extends keyof A ? A[K] : B }, E, R> ( self: Stream, name: Exclude, f: (a: NoInfer) => B ): Stream<{ [K in N | keyof A]: K extends keyof A ? A[K] : B }, E, R> } = internal.let_ export { /** * The "do simulation" in Effect allows you to write code in a more declarative style, similar to the "do notation" in other programming languages. It provides a way to define variables and perform operations on them using functions like `bind` and `let`. * * Here's how the do simulation works: * * 1. Start the do simulation using the `Do` value * 2. Within the do simulation scope, you can use the `bind` function to define variables and bind them to `Stream` values * 3. You can accumulate multiple `bind` statements to define multiple variables within the scope * 4. Inside the do simulation scope, you can also use the `let` function to define variables and bind them to simple values * * @example * ```ts * import * as assert from "node:assert" * import { Chunk, Effect, pipe, Stream } from "effect" * * const result = pipe( * Stream.Do, * Stream.bind("x", () => Stream.succeed(2)), * Stream.bind("y", () => Stream.succeed(3)), * Stream.let("sum", ({ x, y }) => x + y) * ) * assert.deepStrictEqual(Effect.runSync(Stream.runCollect(result)), Chunk.of({ x: 2, y: 3, sum: 5 })) * ``` * * @see {@link Do} * @see {@link bindTo} * @see {@link bind} * @see {@link bindEffect} * * @category do notation * @since 2.0.0 */ let_ as let } // ------------------------------------------------------------------------------------- // encoding // ------------------------------------------------------------------------------------- /** * Decode Uint8Array chunks into a stream of strings using the specified encoding. * * @since 2.0.0 * @category encoding */ export const decodeText: { // ------------------------------------------------------------------------------------- // encoding // ------------------------------------------------------------------------------------- /** * Decode Uint8Array chunks into a stream of strings using the specified encoding. * * @since 2.0.0 * @category encoding */ (encoding?: string | undefined): (self: Stream) => Stream // ------------------------------------------------------------------------------------- // encoding // ------------------------------------------------------------------------------------- /** * Decode Uint8Array chunks into a stream of strings using the specified encoding. * * @since 2.0.0 * @category encoding */ (self: Stream, encoding?: string | undefined): Stream } = internal.decodeText /** * Encode a stream of strings into a stream of Uint8Array chunks using the specified encoding. * * @since 2.0.0 * @category encoding */ export const encodeText: (self: Stream) => Stream = internal.encodeText /** * @since 3.4.0 * @category models */ export interface EventListener { addEventListener( event: string, f: (event: A) => void, options?: { readonly capture?: boolean readonly passive?: boolean readonly once?: boolean readonly signal?: AbortSignal } | boolean ): void removeEventListener( event: string, f: (event: A) => void, options?: { readonly capture?: boolean } | boolean ): void } /** * Creates a `Stream` using addEventListener. * @since 3.1.0 */ export const fromEventListener: ( target: EventListener, type: string, options?: boolean | { readonly capture?: boolean readonly passive?: boolean readonly once?: boolean readonly bufferSize?: number | "unbounded" | undefined } | undefined ) => Stream = internal.fromEventListener