<In>(): make.Constructor<In>Creates a pipe-style constructor for sinks over input type In.
Details
The returned function exposes the sink input as a Stream<In>, applies the
provided pipeline, and uses the final effect's success value as the sink
result.
export const const make: <In>() => make.Constructor<In>Creates a pipe-style constructor for sinks over input type In.
Details
The returned function exposes the sink input as a Stream<In>, applies the
provided pipeline, and uses the final effect's success value as the sink
result.
Companion namespace containing overload types for the pipe-style sink
constructor returned by Sink.make.
make = <function (type parameter) In in <In>(): make.Constructor<In>In>(): make.interface make.Constructor<In>Overloaded function type returned by Sink.make.
Details
The first pipeline function receives the sink input as a Stream<In>. The
final pipeline step must return an Effect, whose success value becomes
the sink result.
Constructor<function (type parameter) In in <In>(): make.Constructor<In>In> => (...fns: [](parameter) fns: {
length: 0;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
pop: () => undefined;
push: (...items: Array<never>) => number;
concat: { (...items: Array<ConcatArray<never>>): Array<never>; (...items: Array<ConcatArray<never>>): Array<never> };
join: (separator?: string) => string;
reverse: () => Array<never>;
shift: () => undefined;
slice: (start?: number, end?: number) => Array<never>;
sort: (compareFn?: ((a: never, b: never) => number) | undefined) => [];
splice: { (start: number, deleteCount?: number): Array<never>; (start: number, deleteCount: number, ...items: Array<never>): Array<never> };
unshift: (...items: Array<never>) => number;
indexOf: (searchElement: never, fromIndex?: number) => number;
lastIndexOf: (searchElement: never, fromIndex?: number) => number;
every: { (predicate: (value: never, index: number, array: Array<never>) => value is S, thisArg?: any): this is S[]; (predicate: (value: never, index: number, array: Array<never>) => unknown, thisArg?: any): boolean };
some: (predicate: (value: never, index: number, array: Array<never>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: never, index: number, array: Array<never>) => void, thisArg?: any) => void;
map: (callbackfn: (value: never, index: number, array: Array<never>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: never, index: number, array: Array<never>) => value is S, thisArg?: any): Array<S>; (predicate: (value: never, index: number, array: Array<never>) => unknown, thisArg?: any): Array<never> };
reduce: { (callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: Array<never>) => never): never; (callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: Array<never>) => never, initialVa…;
reduceRight: { (callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: Array<never>) => never): never; (callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: Array<never>) => never, initialVa…;
find: { (predicate: (value: never, index: number, obj: Array<never>) => value is S, thisArg?: any): S | undefined; (predicate: (value: never, index: number, obj: Array<never>) => unknown, thisArg?: any): undefined };
findIndex: (predicate: (value: never, index: number, obj: Array<never>) => unknown, thisArg?: any) => number;
fill: (value: never, start?: number, end?: number) => [];
copyWithin: (target: number, start: number, end?: number) => [];
entries: () => ArrayIterator<[number, never]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<never>;
includes: (searchElement: never, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: never, index: number, array: Array<never>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => undefined;
findLast: { (predicate: (value: never, index: number, array: Array<never>) => value is S, thisArg?: any): S | undefined; (predicate: (value: never, index: number, array: Array<never>) => unknown, thisArg?: any): undefined };
findLastIndex: (predicate: (value: never, index: number, array: Array<never>) => unknown, thisArg?: any) => number;
toReversed: () => Array<never>;
toSorted: (compareFn?: ((a: never, b: never) => number) | undefined) => Array<never>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<never>): Array<never>; (start: number, deleteCount?: number): Array<never> };
with: (index: number, value: never) => Array<never>;
}
fns: []) =>
const fromTransform: <
In,
A,
E,
R,
L = never
>(
transform: (
upstream: Pull.Pull<
NonEmptyReadonlyArray<In>,
never,
void
>,
scope: Scope.Scope
) => Effect.Effect<End<A, L>, E, R>
) => Sink<A, In, L, E, R>
Creates a Sink from a low-level transform function.
Details
The transform receives the upstream pull of non-empty input arrays and the
active scope, and returns an effect that completes with the sink's End
value.
fromTransform((upstream: Pull.Pull<
readonly [unknown, ...unknown[]],
never,
void,
never
>
(parameter) upstream: {
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
upstream, scope: Scope.Scope(parameter) scope: {
strategy: "sequential" | "parallel";
state: State.Open | State.Closed | State.Empty;
}
scope) =>
pipe<Stream<unknown, never, never>, Effect.Effect<any, never, never>, Effect.Effect<never, Cause.Done<End<any, never>>, never>, Effect.Effect<never, Cause.Done<End<any, never>>, never>>(a: Stream<unknown, never, never>, ab: (a: Stream<unknown, never, never>) => Effect.Effect<any, never, never>, bc: (b: Effect.Effect<any, never, never>) => Effect.Effect<never, Cause.Done<End<any, never>>, never>, cd: (c: Effect.Effect<never, Cause.Done<End<any, never>>, never>) => Effect.Effect<...>): Effect.Effect<...> (+19 overloads)Pipes the value of an expression through a left-to-right sequence of
functions.
When to use
Use when you need to compose data-last functions into readable
transformation pipelines instead of method-style chains.
Details
Takes an initial value, passes it to the first function, then passes each
result to the next function in order. The final function result is returned.
Gotchas
Each function passed after the initial value must accept a single argument,
because pipe calls each step with only the previous result.
Example (Piping values through functions)
In this example, 1 is passed to the first function, and each result becomes
the input for the next function.
import { pipe } from "effect"
const result = pipe(
1,
(n) => n + 1,
(n) => n * 2,
(n) => `result: ${n}`
)
console.log(result) // "result: 4"
Example (Chaining methods before conversion)
const numbers = [1, 2, 3, 4]
const double = (n: number) => n * 2
const greaterThanFour = (n: number) => n > 4
const result = numbers.map(double).filter(greaterThanFour)
console.log(result) // [6, 8]
Example (Rewriting method chains with pipe)
The same transformation can be written with data-last functions.
import { Array, pipe } from "effect"
const numbers = [1, 2, 3, 4]
const double = (n: number) => n * 2
const greaterThanFour = (n: number) => n > 4
const result = pipe(
numbers,
Array.map(double),
Array.filter(greaterThanFour)
)
console.log(result) // [6, 8]
Example (Chaining arithmetic operations)
import { pipe } from "effect"
// Define simple arithmetic operations
const increment = (x: number) => x + 1
const double = (x: number) => x * 2
const subtractTen = (x: number) => x - 10
// Sequentially apply these operations using `pipe`
const result = pipe(5, increment, double, subtractTen)
console.log(result)
// Output: 2
Example (Building a simple transformation pipeline)
import { pipe } from "effect"
// Simple transformation pipeline
const result = pipe(
5,
(x) => x * 2, // 10
(x) => x + 1, // 11
(x) => x.toString() // "11"
)
console.log(result) // "11"
pipe(
import internalStreaminternalStream.const fromChannel: <
A extends Arr.NonEmptyReadonlyArray<any>,
E,
R
>(
channel: Channel.Channel<
A,
E,
void,
unknown,
unknown,
unknown,
R
>
) => Stream<
A extends Arr.NonEmptyReadonlyArray<infer A>
? A
: never,
E,
R
>
fromChannel(import ChannelChannel.const fromPull: <
OutElem,
OutErr,
OutDone,
EX,
EnvX,
Env
>(
effect: Effect.Effect<
Pull.Pull<OutElem, OutErr, OutDone, EnvX>,
EX,
Env
>
) => Channel<
OutElem,
Pull.ExcludeDone<OutErr> | EX,
OutDone,
unknown,
unknown,
unknown,
Env | EnvX
>
Creates a Channel from an Effect that produces a Pull.
Example (Creating channels from pulls)
import { Channel, Effect } from "effect"
const channel = Channel.fromPull(
Effect.succeed(Effect.succeed(42))
)
fromPull(import EffectEffect.const succeed: <A>(value: A) => Effect<A>Creates an Effect that always succeeds with a given value.
When to use
Use when an effect should complete successfully with a specific value without any errors
or external dependencies.
Example (Creating a successful effect)
import { Effect } from "effect"
// Creating an effect that represents a successful scenario
//
// ┌─── Effect<number, never, never>
// ▼
const success = Effect.succeed(42)
succeed(upstream: Pull.Pull<
readonly [unknown, ...unknown[]],
never,
void,
never
>
(parameter) upstream: {
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
upstream))),
...fns: [](parameter) fns: {
length: 0;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
pop: () => undefined;
push: (...items: Array<never>) => number;
concat: { (...items: Array<ConcatArray<never>>): Array<never>; (...items: Array<ConcatArray<never>>): Array<never> };
join: (separator?: string) => string;
reverse: () => Array<never>;
shift: () => undefined;
slice: (start?: number, end?: number) => Array<never>;
sort: (compareFn?: ((a: never, b: never) => number) | undefined) => [];
splice: { (start: number, deleteCount?: number): Array<never>; (start: number, deleteCount: number, ...items: Array<never>): Array<never> };
unshift: (...items: Array<never>) => number;
indexOf: (searchElement: never, fromIndex?: number) => number;
lastIndexOf: (searchElement: never, fromIndex?: number) => number;
every: { (predicate: (value: never, index: number, array: Array<never>) => value is S, thisArg?: any): this is S[]; (predicate: (value: never, index: number, array: Array<never>) => unknown, thisArg?: any): boolean };
some: (predicate: (value: never, index: number, array: Array<never>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: never, index: number, array: Array<never>) => void, thisArg?: any) => void;
map: (callbackfn: (value: never, index: number, array: Array<never>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: never, index: number, array: Array<never>) => value is S, thisArg?: any): Array<S>; (predicate: (value: never, index: number, array: Array<never>) => unknown, thisArg?: any): Array<never> };
reduce: { (callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: Array<never>) => never): never; (callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: Array<never>) => never, initialVa…;
reduceRight: { (callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: Array<never>) => never): never; (callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: Array<never>) => never, initialVa…;
find: { (predicate: (value: never, index: number, obj: Array<never>) => value is S, thisArg?: any): S | undefined; (predicate: (value: never, index: number, obj: Array<never>) => unknown, thisArg?: any): undefined };
findIndex: (predicate: (value: never, index: number, obj: Array<never>) => unknown, thisArg?: any) => number;
fill: (value: never, start?: number, end?: number) => [];
copyWithin: (target: number, start: number, end?: number) => [];
entries: () => ArrayIterator<[number, never]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<never>;
includes: (searchElement: never, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: never, index: number, array: Array<never>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => undefined;
findLast: { (predicate: (value: never, index: number, array: Array<never>) => value is S, thisArg?: any): S | undefined; (predicate: (value: never, index: number, array: Array<never>) => unknown, thisArg?: any): undefined };
findLastIndex: (predicate: (value: never, index: number, array: Array<never>) => unknown, thisArg?: any) => number;
toReversed: () => Array<never>;
toSorted: (compareFn?: ((a: never, b: never) => number) | undefined) => Array<never>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<never>): Array<never>; (start: number, deleteCount?: number): Array<never> };
with: (index: number, value: never) => Array<never>;
}
fns as any as [() => import EffectEffect.interface Effect<out A, out E = never, out R = never>The Effect interface defines a value that lazily describes a workflow or
job. The workflow requires some context R, and may fail with an error of
type E, or succeed with a value of type A.
When to use
Use when you need to represent a lazy, composable workflow that can require
services, fail with a typed error, or succeed with a typed value.
Details
Effect values model resourceful interaction with the outside world,
including synchronous, asynchronous, concurrent, and parallel interaction.
They use a fiber-based concurrency model, with built-in support for
scheduling, fine-grained interruption, structured concurrency, and high
scalability.
To run an Effect value, you need a Runtime, which is a type that is
capable of executing Effect values.
Effect<any>],
import EffectEffect.const flatMap: {
<A, B, E1, R1>(
f: (a: A) => Effect<B, E1, R1>
): <E, R>(
self: Effect<A, E, R>
) => Effect<B, E1 | E, R1 | R>
<A, E, R, B, E1, R1>(
self: Effect<A, E, R>,
f: (a: A) => Effect<B, E1, R1>
): Effect<B, E | E1, R | R1>
}
flatMap((a: anya) => import CauseCause.const done: <A = void>(
value?: A
) => Effect.Effect<never, Done<A>>
Creates an Effect that fails with a Done error. Shorthand for
Effect.fail(Cause.Done(value)).
When to use
Use when you model stream or queue completion through the error channel.
Example (Failing with Done)
import { Cause, Effect } from "effect"
const program = Cause.done("finished")
Effect.runPromiseExit(program).then((exit) => {
console.log(exit._tag) // "Failure"
})
done<type End<A, L = never> = readonly [
value: A,
leftover?: readonly [L, ...L[]] | undefined
]
Tuple returned when a Sink finishes.
Details
The first element is the sink result. The optional second element contains a
non-empty array of leftover input that was pulled but not consumed.
End<any>>([a: anya])),
import ScopeScope.const provide: {
(value: Scope): <A, E, R>(
self: Effect<A, E, R>
) => Effect<A, E, Exclude<R, Scope>>
<A, E, R>(
self: Effect<A, E, R>,
value: Scope
): Effect<A, E, Exclude<R, Scope>>
}
provide(scope: Scope.Scope(parameter) scope: {
strategy: "sequential" | "parallel";
state: State.Open | State.Closed | State.Empty;
}
scope)
)
)
/**
* Companion namespace containing overload types for the pipe-style sink
* constructor returned by `Sink.make`.
*
* @since 4.0.0
*/
export declare namespace make {
/**
* Overloaded function type returned by `Sink.make`.
*
* **Details**
*
* The first pipeline function receives the sink input as a `Stream<In>`. The
* final pipeline step must return an `Effect`, whose success value becomes
* the sink result.
*
* @category models
* @since 4.0.0
*/
export interface interface make.Constructor<In>Overloaded function type returned by Sink.make.
Details
The first pipeline function receives the sink input as a Stream<In>. The
final pipeline step must return an Effect, whose success value becomes
the sink result.
Constructor<function (type parameter) In in Constructor<In>In> {
<function (type parameter) E in <E, R, B = never>(ab: (_: Stream<In>) => Effect.Effect<B, E, R>): Sink<B, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never>(ab: (_: Stream<In>) => Effect.Effect<B, E, R>): Sink<B, In, never, E, Exclude<R, Scope.Scope>>R, function (type parameter) B in <E, R, B = never>(ab: (_: Stream<In>) => Effect.Effect<B, E, R>): Sink<B, In, never, E, Exclude<R, Scope.Scope>>B = never>(ab: (
_: Stream<In>
) => Effect.Effect<B, E, R>
ab: (_: Stream<In>(parameter) _: {
channel: Channel.Channel<Arr.NonEmptyReadonlyArray<A>, E, void, unknown, unknown, unknown, R>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
_: interface Stream<out A, out E = never, out R = never>A Stream<A, E, R> describes a program that can emit many A values, fail
with E, and require R.
Details
Streams are pull-based with backpressure and emit chunks to amortize effect
evaluation. They support monadic composition and error handling similar to
Effect, adapted for multiple values.
Example (Creating and consuming streams)
import { Console, Effect, Stream } from "effect"
const program = Effect.gen(function*() {
yield* Stream.make(1, 2, 3).pipe(
Stream.map((n) => n * 2),
Stream.runForEach((n) => Console.log(n))
)
})
Effect.runPromise(program)
// Output:
// 2
// 4
// 6
Stream<function (type parameter) In in Constructor<In>In>) => import EffectEffect.interface Effect<out A, out E = never, out R = never>The Effect interface defines a value that lazily describes a workflow or
job. The workflow requires some context R, and may fail with an error of
type E, or succeed with a value of type A.
When to use
Use when you need to represent a lazy, composable workflow that can require
services, fail with a typed error, or succeed with a typed value.
Details
Effect values model resourceful interaction with the outside world,
including synchronous, asynchronous, concurrent, and parallel interaction.
They use a fiber-based concurrency model, with built-in support for
scheduling, fine-grained interruption, structured concurrency, and high
scalability.
To run an Effect value, you need a Runtime, which is a type that is
capable of executing Effect values.
Effect<function (type parameter) B in <E, R, B = never>(ab: (_: Stream<In>) => Effect.Effect<B, E, R>): Sink<B, In, never, E, Exclude<R, Scope.Scope>>B, function (type parameter) E in <E, R, B = never>(ab: (_: Stream<In>) => Effect.Effect<B, E, R>): Sink<B, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never>(ab: (_: Stream<In>) => Effect.Effect<B, E, R>): Sink<B, In, never, E, Exclude<R, Scope.Scope>>R>): interface Sink<out A, in In = unknown, out L = never, out E = never, out R = never>A Sink<A, In, L, E, R> is used to consume elements produced by a Stream.
You can think of a sink as a function that will consume a variable amount of
In elements (could be 0, 1, or many), might fail with an error of type E,
and will eventually yield a value of type A together with a remainder of
type L (i.e. any leftovers).
Example (Running a sink with a stream)
import { Effect, Sink, Stream } from "effect"
// Create a simple sink that always succeeds with a value
const sink: Sink.Sink<number> = Sink.succeed(42)
// Use the sink to consume a stream
const stream = Stream.make(1, 2, 3)
const program = Stream.run(stream, sink)
Effect.runPromise(program).then(console.log)
// Output: 42
Namespace containing types and interfaces for Sink variance and type relationships.
Sink<function (type parameter) B in <E, R, B = never>(ab: (_: Stream<In>) => Effect.Effect<B, E, R>): Sink<B, In, never, E, Exclude<R, Scope.Scope>>B, function (type parameter) In in Constructor<In>In, never, function (type parameter) E in <E, R, B = never>(ab: (_: Stream<In>) => Effect.Effect<B, E, R>): Sink<B, In, never, E, Exclude<R, Scope.Scope>>E, type Exclude<T, U> = T extends U
? never
: T
Exclude from T those types that are assignable to U
Exclude<function (type parameter) R in <E, R, B = never>(ab: (_: Stream<In>) => Effect.Effect<B, E, R>): Sink<B, In, never, E, Exclude<R, Scope.Scope>>R, import ScopeScope.Scope>>
<function (type parameter) E in <E, R, B = never, C = never>(ab: (_: Stream<In>) => B, bc: (_: B) => Effect.Effect<C, E, R>): Sink<C, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never, C = never>(ab: (_: Stream<In>) => B, bc: (_: B) => Effect.Effect<C, E, R>): Sink<C, In, never, E, Exclude<R, Scope.Scope>>R, function (type parameter) B in <E, R, B = never, C = never>(ab: (_: Stream<In>) => B, bc: (_: B) => Effect.Effect<C, E, R>): Sink<C, In, never, E, Exclude<R, Scope.Scope>>B = never, function (type parameter) C in <E, R, B = never, C = never>(ab: (_: Stream<In>) => B, bc: (_: B) => Effect.Effect<C, E, R>): Sink<C, In, never, E, Exclude<R, Scope.Scope>>C = never>(
ab: (_: Stream<In>) => Bab: (_: Stream<In>(parameter) _: {
channel: Channel.Channel<Arr.NonEmptyReadonlyArray<A>, E, void, unknown, unknown, unknown, R>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
_: interface Stream<out A, out E = never, out R = never>A Stream<A, E, R> describes a program that can emit many A values, fail
with E, and require R.
Details
Streams are pull-based with backpressure and emit chunks to amortize effect
evaluation. They support monadic composition and error handling similar to
Effect, adapted for multiple values.
Example (Creating and consuming streams)
import { Console, Effect, Stream } from "effect"
const program = Effect.gen(function*() {
yield* Stream.make(1, 2, 3).pipe(
Stream.map((n) => n * 2),
Stream.runForEach((n) => Console.log(n))
)
})
Effect.runPromise(program)
// Output:
// 2
// 4
// 6
Stream<function (type parameter) In in Constructor<In>In>) => function (type parameter) B in <E, R, B = never, C = never>(ab: (_: Stream<In>) => B, bc: (_: B) => Effect.Effect<C, E, R>): Sink<C, In, never, E, Exclude<R, Scope.Scope>>B,
bc: (_: B) => Effect.Effect<C, E, R>bc: (_: B = never_: function (type parameter) B in <E, R, B = never, C = never>(ab: (_: Stream<In>) => B, bc: (_: B) => Effect.Effect<C, E, R>): Sink<C, In, never, E, Exclude<R, Scope.Scope>>B) => import EffectEffect.interface Effect<out A, out E = never, out R = never>The Effect interface defines a value that lazily describes a workflow or
job. The workflow requires some context R, and may fail with an error of
type E, or succeed with a value of type A.
When to use
Use when you need to represent a lazy, composable workflow that can require
services, fail with a typed error, or succeed with a typed value.
Details
Effect values model resourceful interaction with the outside world,
including synchronous, asynchronous, concurrent, and parallel interaction.
They use a fiber-based concurrency model, with built-in support for
scheduling, fine-grained interruption, structured concurrency, and high
scalability.
To run an Effect value, you need a Runtime, which is a type that is
capable of executing Effect values.
Effect<function (type parameter) C in <E, R, B = never, C = never>(ab: (_: Stream<In>) => B, bc: (_: B) => Effect.Effect<C, E, R>): Sink<C, In, never, E, Exclude<R, Scope.Scope>>C, function (type parameter) E in <E, R, B = never, C = never>(ab: (_: Stream<In>) => B, bc: (_: B) => Effect.Effect<C, E, R>): Sink<C, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never, C = never>(ab: (_: Stream<In>) => B, bc: (_: B) => Effect.Effect<C, E, R>): Sink<C, In, never, E, Exclude<R, Scope.Scope>>R>
): interface Sink<out A, in In = unknown, out L = never, out E = never, out R = never>A Sink<A, In, L, E, R> is used to consume elements produced by a Stream.
You can think of a sink as a function that will consume a variable amount of
In elements (could be 0, 1, or many), might fail with an error of type E,
and will eventually yield a value of type A together with a remainder of
type L (i.e. any leftovers).
Example (Running a sink with a stream)
import { Effect, Sink, Stream } from "effect"
// Create a simple sink that always succeeds with a value
const sink: Sink.Sink<number> = Sink.succeed(42)
// Use the sink to consume a stream
const stream = Stream.make(1, 2, 3)
const program = Stream.run(stream, sink)
Effect.runPromise(program).then(console.log)
// Output: 42
Namespace containing types and interfaces for Sink variance and type relationships.
Sink<function (type parameter) C in <E, R, B = never, C = never>(ab: (_: Stream<In>) => B, bc: (_: B) => Effect.Effect<C, E, R>): Sink<C, In, never, E, Exclude<R, Scope.Scope>>C, function (type parameter) In in Constructor<In>In, never, function (type parameter) E in <E, R, B = never, C = never>(ab: (_: Stream<In>) => B, bc: (_: B) => Effect.Effect<C, E, R>): Sink<C, In, never, E, Exclude<R, Scope.Scope>>E, type Exclude<T, U> = T extends U
? never
: T
Exclude from T those types that are assignable to U
Exclude<function (type parameter) R in <E, R, B = never, C = never>(ab: (_: Stream<In>) => B, bc: (_: B) => Effect.Effect<C, E, R>): Sink<C, In, never, E, Exclude<R, Scope.Scope>>R, import ScopeScope.Scope>>
<function (type parameter) E in <E, R, B = never, C = never, D = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => Effect.Effect<D, E, R>): Sink<D, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never, C = never, D = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => Effect.Effect<D, E, R>): Sink<D, In, never, E, Exclude<R, Scope.Scope>>R, function (type parameter) B in <E, R, B = never, C = never, D = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => Effect.Effect<D, E, R>): Sink<D, In, never, E, Exclude<R, Scope.Scope>>B = never, function (type parameter) C in <E, R, B = never, C = never, D = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => Effect.Effect<D, E, R>): Sink<D, In, never, E, Exclude<R, Scope.Scope>>C = never, function (type parameter) D in <E, R, B = never, C = never, D = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => Effect.Effect<D, E, R>): Sink<D, In, never, E, Exclude<R, Scope.Scope>>D = never>(
ab: (_: Stream<In>) => Bab: (_: Stream<In>(parameter) _: {
channel: Channel.Channel<Arr.NonEmptyReadonlyArray<A>, E, void, unknown, unknown, unknown, R>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
_: interface Stream<out A, out E = never, out R = never>A Stream<A, E, R> describes a program that can emit many A values, fail
with E, and require R.
Details
Streams are pull-based with backpressure and emit chunks to amortize effect
evaluation. They support monadic composition and error handling similar to
Effect, adapted for multiple values.
Example (Creating and consuming streams)
import { Console, Effect, Stream } from "effect"
const program = Effect.gen(function*() {
yield* Stream.make(1, 2, 3).pipe(
Stream.map((n) => n * 2),
Stream.runForEach((n) => Console.log(n))
)
})
Effect.runPromise(program)
// Output:
// 2
// 4
// 6
Stream<function (type parameter) In in Constructor<In>In>) => function (type parameter) B in <E, R, B = never, C = never, D = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => Effect.Effect<D, E, R>): Sink<D, In, never, E, Exclude<R, Scope.Scope>>B,
bc: (_: B) => Cbc: (_: B = never_: function (type parameter) B in <E, R, B = never, C = never, D = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => Effect.Effect<D, E, R>): Sink<D, In, never, E, Exclude<R, Scope.Scope>>B) => function (type parameter) C in <E, R, B = never, C = never, D = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => Effect.Effect<D, E, R>): Sink<D, In, never, E, Exclude<R, Scope.Scope>>C,
cd: (_: C) => Effect.Effect<D, E, R>cd: (_: C = never_: function (type parameter) C in <E, R, B = never, C = never, D = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => Effect.Effect<D, E, R>): Sink<D, In, never, E, Exclude<R, Scope.Scope>>C) => import EffectEffect.interface Effect<out A, out E = never, out R = never>The Effect interface defines a value that lazily describes a workflow or
job. The workflow requires some context R, and may fail with an error of
type E, or succeed with a value of type A.
When to use
Use when you need to represent a lazy, composable workflow that can require
services, fail with a typed error, or succeed with a typed value.
Details
Effect values model resourceful interaction with the outside world,
including synchronous, asynchronous, concurrent, and parallel interaction.
They use a fiber-based concurrency model, with built-in support for
scheduling, fine-grained interruption, structured concurrency, and high
scalability.
To run an Effect value, you need a Runtime, which is a type that is
capable of executing Effect values.
Effect<function (type parameter) D in <E, R, B = never, C = never, D = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => Effect.Effect<D, E, R>): Sink<D, In, never, E, Exclude<R, Scope.Scope>>D, function (type parameter) E in <E, R, B = never, C = never, D = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => Effect.Effect<D, E, R>): Sink<D, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never, C = never, D = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => Effect.Effect<D, E, R>): Sink<D, In, never, E, Exclude<R, Scope.Scope>>R>
): interface Sink<out A, in In = unknown, out L = never, out E = never, out R = never>A Sink<A, In, L, E, R> is used to consume elements produced by a Stream.
You can think of a sink as a function that will consume a variable amount of
In elements (could be 0, 1, or many), might fail with an error of type E,
and will eventually yield a value of type A together with a remainder of
type L (i.e. any leftovers).
Example (Running a sink with a stream)
import { Effect, Sink, Stream } from "effect"
// Create a simple sink that always succeeds with a value
const sink: Sink.Sink<number> = Sink.succeed(42)
// Use the sink to consume a stream
const stream = Stream.make(1, 2, 3)
const program = Stream.run(stream, sink)
Effect.runPromise(program).then(console.log)
// Output: 42
Namespace containing types and interfaces for Sink variance and type relationships.
Sink<function (type parameter) D in <E, R, B = never, C = never, D = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => Effect.Effect<D, E, R>): Sink<D, In, never, E, Exclude<R, Scope.Scope>>D, function (type parameter) In in Constructor<In>In, never, function (type parameter) E in <E, R, B = never, C = never, D = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => Effect.Effect<D, E, R>): Sink<D, In, never, E, Exclude<R, Scope.Scope>>E, type Exclude<T, U> = T extends U
? never
: T
Exclude from T those types that are assignable to U
Exclude<function (type parameter) R in <E, R, B = never, C = never, D = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => Effect.Effect<D, E, R>): Sink<D, In, never, E, Exclude<R, Scope.Scope>>R, import ScopeScope.Scope>>
<function (type parameter) E in <E, R, B = never, C = never, D = never, F = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => Effect.Effect<F, E, R>): Sink<F, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never, C = never, D = never, F = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => Effect.Effect<F, E, R>): Sink<F, In, never, E, Exclude<R, Scope.Scope>>R, function (type parameter) B in <E, R, B = never, C = never, D = never, F = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => Effect.Effect<F, E, R>): Sink<F, In, never, E, Exclude<R, Scope.Scope>>B = never, function (type parameter) C in <E, R, B = never, C = never, D = never, F = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => Effect.Effect<F, E, R>): Sink<F, In, never, E, Exclude<R, Scope.Scope>>C = never, function (type parameter) D in <E, R, B = never, C = never, D = never, F = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => Effect.Effect<F, E, R>): Sink<F, In, never, E, Exclude<R, Scope.Scope>>D = never, function (type parameter) F in <E, R, B = never, C = never, D = never, F = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => Effect.Effect<F, E, R>): Sink<F, In, never, E, Exclude<R, Scope.Scope>>F = never>(
ab: (_: Stream<In>) => Bab: (_: Stream<In>(parameter) _: {
channel: Channel.Channel<Arr.NonEmptyReadonlyArray<A>, E, void, unknown, unknown, unknown, R>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
_: interface Stream<out A, out E = never, out R = never>A Stream<A, E, R> describes a program that can emit many A values, fail
with E, and require R.
Details
Streams are pull-based with backpressure and emit chunks to amortize effect
evaluation. They support monadic composition and error handling similar to
Effect, adapted for multiple values.
Example (Creating and consuming streams)
import { Console, Effect, Stream } from "effect"
const program = Effect.gen(function*() {
yield* Stream.make(1, 2, 3).pipe(
Stream.map((n) => n * 2),
Stream.runForEach((n) => Console.log(n))
)
})
Effect.runPromise(program)
// Output:
// 2
// 4
// 6
Stream<function (type parameter) In in Constructor<In>In>) => function (type parameter) B in <E, R, B = never, C = never, D = never, F = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => Effect.Effect<F, E, R>): Sink<F, In, never, E, Exclude<R, Scope.Scope>>B,
bc: (_: B) => Cbc: (_: B = never_: function (type parameter) B in <E, R, B = never, C = never, D = never, F = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => Effect.Effect<F, E, R>): Sink<F, In, never, E, Exclude<R, Scope.Scope>>B) => function (type parameter) C in <E, R, B = never, C = never, D = never, F = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => Effect.Effect<F, E, R>): Sink<F, In, never, E, Exclude<R, Scope.Scope>>C,
cd: (_: C) => Dcd: (_: C = never_: function (type parameter) C in <E, R, B = never, C = never, D = never, F = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => Effect.Effect<F, E, R>): Sink<F, In, never, E, Exclude<R, Scope.Scope>>C) => function (type parameter) D in <E, R, B = never, C = never, D = never, F = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => Effect.Effect<F, E, R>): Sink<F, In, never, E, Exclude<R, Scope.Scope>>D,
df: (_: D) => Effect.Effect<F, E, R>df: (_: D = never_: function (type parameter) D in <E, R, B = never, C = never, D = never, F = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => Effect.Effect<F, E, R>): Sink<F, In, never, E, Exclude<R, Scope.Scope>>D) => import EffectEffect.interface Effect<out A, out E = never, out R = never>The Effect interface defines a value that lazily describes a workflow or
job. The workflow requires some context R, and may fail with an error of
type E, or succeed with a value of type A.
When to use
Use when you need to represent a lazy, composable workflow that can require
services, fail with a typed error, or succeed with a typed value.
Details
Effect values model resourceful interaction with the outside world,
including synchronous, asynchronous, concurrent, and parallel interaction.
They use a fiber-based concurrency model, with built-in support for
scheduling, fine-grained interruption, structured concurrency, and high
scalability.
To run an Effect value, you need a Runtime, which is a type that is
capable of executing Effect values.
Effect<function (type parameter) F in <E, R, B = never, C = never, D = never, F = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => Effect.Effect<F, E, R>): Sink<F, In, never, E, Exclude<R, Scope.Scope>>F, function (type parameter) E in <E, R, B = never, C = never, D = never, F = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => Effect.Effect<F, E, R>): Sink<F, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never, C = never, D = never, F = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => Effect.Effect<F, E, R>): Sink<F, In, never, E, Exclude<R, Scope.Scope>>R>
): interface Sink<out A, in In = unknown, out L = never, out E = never, out R = never>A Sink<A, In, L, E, R> is used to consume elements produced by a Stream.
You can think of a sink as a function that will consume a variable amount of
In elements (could be 0, 1, or many), might fail with an error of type E,
and will eventually yield a value of type A together with a remainder of
type L (i.e. any leftovers).
Example (Running a sink with a stream)
import { Effect, Sink, Stream } from "effect"
// Create a simple sink that always succeeds with a value
const sink: Sink.Sink<number> = Sink.succeed(42)
// Use the sink to consume a stream
const stream = Stream.make(1, 2, 3)
const program = Stream.run(stream, sink)
Effect.runPromise(program).then(console.log)
// Output: 42
Namespace containing types and interfaces for Sink variance and type relationships.
Sink<function (type parameter) F in <E, R, B = never, C = never, D = never, F = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => Effect.Effect<F, E, R>): Sink<F, In, never, E, Exclude<R, Scope.Scope>>F, function (type parameter) In in Constructor<In>In, never, function (type parameter) E in <E, R, B = never, C = never, D = never, F = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => Effect.Effect<F, E, R>): Sink<F, In, never, E, Exclude<R, Scope.Scope>>E, type Exclude<T, U> = T extends U
? never
: T
Exclude from T those types that are assignable to U
Exclude<function (type parameter) R in <E, R, B = never, C = never, D = never, F = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => Effect.Effect<F, E, R>): Sink<F, In, never, E, Exclude<R, Scope.Scope>>R, import ScopeScope.Scope>>
<function (type parameter) E in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>R, function (type parameter) B in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>B = never, function (type parameter) C in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>C = never, function (type parameter) D in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>D = never, function (type parameter) F in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>F = never, function (type parameter) G in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>G = never>(
ab: (_: Stream<In>) => Bab: (_: Stream<In>(parameter) _: {
channel: Channel.Channel<Arr.NonEmptyReadonlyArray<A>, E, void, unknown, unknown, unknown, R>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
_: interface Stream<out A, out E = never, out R = never>A Stream<A, E, R> describes a program that can emit many A values, fail
with E, and require R.
Details
Streams are pull-based with backpressure and emit chunks to amortize effect
evaluation. They support monadic composition and error handling similar to
Effect, adapted for multiple values.
Example (Creating and consuming streams)
import { Console, Effect, Stream } from "effect"
const program = Effect.gen(function*() {
yield* Stream.make(1, 2, 3).pipe(
Stream.map((n) => n * 2),
Stream.runForEach((n) => Console.log(n))
)
})
Effect.runPromise(program)
// Output:
// 2
// 4
// 6
Stream<function (type parameter) In in Constructor<In>In>) => function (type parameter) B in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>B,
bc: (_: B) => Cbc: (_: B = never_: function (type parameter) B in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>B) => function (type parameter) C in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>C,
cd: (_: C) => Dcd: (_: C = never_: function (type parameter) C in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>C) => function (type parameter) D in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>D,
df: (_: D) => Fdf: (_: D = never_: function (type parameter) D in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>D) => function (type parameter) F in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>F,
fg: (_: F) => Effect.Effect<G, E, R>fg: (_: F = never_: function (type parameter) F in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>F) => import EffectEffect.interface Effect<out A, out E = never, out R = never>The Effect interface defines a value that lazily describes a workflow or
job. The workflow requires some context R, and may fail with an error of
type E, or succeed with a value of type A.
When to use
Use when you need to represent a lazy, composable workflow that can require
services, fail with a typed error, or succeed with a typed value.
Details
Effect values model resourceful interaction with the outside world,
including synchronous, asynchronous, concurrent, and parallel interaction.
They use a fiber-based concurrency model, with built-in support for
scheduling, fine-grained interruption, structured concurrency, and high
scalability.
To run an Effect value, you need a Runtime, which is a type that is
capable of executing Effect values.
Effect<function (type parameter) G in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>G, function (type parameter) E in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>R>
): interface Sink<out A, in In = unknown, out L = never, out E = never, out R = never>A Sink<A, In, L, E, R> is used to consume elements produced by a Stream.
You can think of a sink as a function that will consume a variable amount of
In elements (could be 0, 1, or many), might fail with an error of type E,
and will eventually yield a value of type A together with a remainder of
type L (i.e. any leftovers).
Example (Running a sink with a stream)
import { Effect, Sink, Stream } from "effect"
// Create a simple sink that always succeeds with a value
const sink: Sink.Sink<number> = Sink.succeed(42)
// Use the sink to consume a stream
const stream = Stream.make(1, 2, 3)
const program = Stream.run(stream, sink)
Effect.runPromise(program).then(console.log)
// Output: 42
Namespace containing types and interfaces for Sink variance and type relationships.
Sink<function (type parameter) G in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>G, function (type parameter) In in Constructor<In>In, never, function (type parameter) E in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>E, type Exclude<T, U> = T extends U
? never
: T
Exclude from T those types that are assignable to U
Exclude<function (type parameter) R in <E, R, B = never, C = never, D = never, F = never, G = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => Effect.Effect<G, E, R>): Sink<G, In, never, E, Exclude<R, Scope.Scope>>R, import ScopeScope.Scope>>
<function (type parameter) E in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>R, function (type parameter) B in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>B = never, function (type parameter) C in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>C = never, function (type parameter) D in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>D = never, function (type parameter) F in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>F = never, function (type parameter) G in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>G = never, function (type parameter) H in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>H = never>(
ab: (_: Stream<In>) => Bab: (_: Stream<In>(parameter) _: {
channel: Channel.Channel<Arr.NonEmptyReadonlyArray<A>, E, void, unknown, unknown, unknown, R>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
_: interface Stream<out A, out E = never, out R = never>A Stream<A, E, R> describes a program that can emit many A values, fail
with E, and require R.
Details
Streams are pull-based with backpressure and emit chunks to amortize effect
evaluation. They support monadic composition and error handling similar to
Effect, adapted for multiple values.
Example (Creating and consuming streams)
import { Console, Effect, Stream } from "effect"
const program = Effect.gen(function*() {
yield* Stream.make(1, 2, 3).pipe(
Stream.map((n) => n * 2),
Stream.runForEach((n) => Console.log(n))
)
})
Effect.runPromise(program)
// Output:
// 2
// 4
// 6
Stream<function (type parameter) In in Constructor<In>In>) => function (type parameter) B in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>B,
bc: (_: B) => Cbc: (_: B = never_: function (type parameter) B in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>B) => function (type parameter) C in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>C,
cd: (_: C) => Dcd: (_: C = never_: function (type parameter) C in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>C) => function (type parameter) D in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>D,
df: (_: D) => Fdf: (_: D = never_: function (type parameter) D in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>D) => function (type parameter) F in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>F,
fg: (_: F) => Gfg: (_: F = never_: function (type parameter) F in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>F) => function (type parameter) G in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>G,
gh: (_: G) => Effect.Effect<H, E, R>gh: (_: G = never_: function (type parameter) G in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>G) => import EffectEffect.interface Effect<out A, out E = never, out R = never>The Effect interface defines a value that lazily describes a workflow or
job. The workflow requires some context R, and may fail with an error of
type E, or succeed with a value of type A.
When to use
Use when you need to represent a lazy, composable workflow that can require
services, fail with a typed error, or succeed with a typed value.
Details
Effect values model resourceful interaction with the outside world,
including synchronous, asynchronous, concurrent, and parallel interaction.
They use a fiber-based concurrency model, with built-in support for
scheduling, fine-grained interruption, structured concurrency, and high
scalability.
To run an Effect value, you need a Runtime, which is a type that is
capable of executing Effect values.
Effect<function (type parameter) H in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>H, function (type parameter) E in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>R>
): interface Sink<out A, in In = unknown, out L = never, out E = never, out R = never>A Sink<A, In, L, E, R> is used to consume elements produced by a Stream.
You can think of a sink as a function that will consume a variable amount of
In elements (could be 0, 1, or many), might fail with an error of type E,
and will eventually yield a value of type A together with a remainder of
type L (i.e. any leftovers).
Example (Running a sink with a stream)
import { Effect, Sink, Stream } from "effect"
// Create a simple sink that always succeeds with a value
const sink: Sink.Sink<number> = Sink.succeed(42)
// Use the sink to consume a stream
const stream = Stream.make(1, 2, 3)
const program = Stream.run(stream, sink)
Effect.runPromise(program).then(console.log)
// Output: 42
Namespace containing types and interfaces for Sink variance and type relationships.
Sink<function (type parameter) H in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>H, function (type parameter) In in Constructor<In>In, never, function (type parameter) E in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>E, type Exclude<T, U> = T extends U
? never
: T
Exclude from T those types that are assignable to U
Exclude<function (type parameter) R in <E, R, B = never, C = never, D = never, F = never, G = never, H = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => Effect.Effect<H, E, R>): Sink<H, In, never, E, Exclude<R, Scope.Scope>>R, import ScopeScope.Scope>>
<function (type parameter) E in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>R, function (type parameter) B in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>B = never, function (type parameter) C in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>C = never, function (type parameter) D in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>D = never, function (type parameter) F in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>F = never, function (type parameter) G in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>G = never, function (type parameter) H in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>H = never, function (type parameter) I in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>I = never>(
ab: (_: Stream<In>) => Bab: (_: Stream<In>(parameter) _: {
channel: Channel.Channel<Arr.NonEmptyReadonlyArray<A>, E, void, unknown, unknown, unknown, R>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
_: interface Stream<out A, out E = never, out R = never>A Stream<A, E, R> describes a program that can emit many A values, fail
with E, and require R.
Details
Streams are pull-based with backpressure and emit chunks to amortize effect
evaluation. They support monadic composition and error handling similar to
Effect, adapted for multiple values.
Example (Creating and consuming streams)
import { Console, Effect, Stream } from "effect"
const program = Effect.gen(function*() {
yield* Stream.make(1, 2, 3).pipe(
Stream.map((n) => n * 2),
Stream.runForEach((n) => Console.log(n))
)
})
Effect.runPromise(program)
// Output:
// 2
// 4
// 6
Stream<function (type parameter) In in Constructor<In>In>) => function (type parameter) B in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>B,
bc: (_: B) => Cbc: (_: B = never_: function (type parameter) B in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>B) => function (type parameter) C in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>C,
cd: (_: C) => Dcd: (_: C = never_: function (type parameter) C in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>C) => function (type parameter) D in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>D,
df: (_: D) => Fdf: (_: D = never_: function (type parameter) D in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>D) => function (type parameter) F in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>F,
fg: (_: F) => Gfg: (_: F = never_: function (type parameter) F in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>F) => function (type parameter) G in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>G,
gh: (_: G) => Hgh: (_: G = never_: function (type parameter) G in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>G) => function (type parameter) H in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>H,
hi: (_: H) => Effect.Effect<I, E, R>hi: (_: H = never_: function (type parameter) H in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>H) => import EffectEffect.interface Effect<out A, out E = never, out R = never>The Effect interface defines a value that lazily describes a workflow or
job. The workflow requires some context R, and may fail with an error of
type E, or succeed with a value of type A.
When to use
Use when you need to represent a lazy, composable workflow that can require
services, fail with a typed error, or succeed with a typed value.
Details
Effect values model resourceful interaction with the outside world,
including synchronous, asynchronous, concurrent, and parallel interaction.
They use a fiber-based concurrency model, with built-in support for
scheduling, fine-grained interruption, structured concurrency, and high
scalability.
To run an Effect value, you need a Runtime, which is a type that is
capable of executing Effect values.
Effect<function (type parameter) I in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>I, function (type parameter) E in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>R>
): interface Sink<out A, in In = unknown, out L = never, out E = never, out R = never>A Sink<A, In, L, E, R> is used to consume elements produced by a Stream.
You can think of a sink as a function that will consume a variable amount of
In elements (could be 0, 1, or many), might fail with an error of type E,
and will eventually yield a value of type A together with a remainder of
type L (i.e. any leftovers).
Example (Running a sink with a stream)
import { Effect, Sink, Stream } from "effect"
// Create a simple sink that always succeeds with a value
const sink: Sink.Sink<number> = Sink.succeed(42)
// Use the sink to consume a stream
const stream = Stream.make(1, 2, 3)
const program = Stream.run(stream, sink)
Effect.runPromise(program).then(console.log)
// Output: 42
Namespace containing types and interfaces for Sink variance and type relationships.
Sink<function (type parameter) I in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>I, function (type parameter) In in Constructor<In>In, never, function (type parameter) E in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>E, type Exclude<T, U> = T extends U
? never
: T
Exclude from T those types that are assignable to U
Exclude<function (type parameter) R in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => Effect.Effect<I, E, R>): Sink<I, In, never, E, Exclude<R, Scope.Scope>>R, import ScopeScope.Scope>>
<function (type parameter) E in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>R, function (type parameter) B in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>B = never, function (type parameter) C in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>C = never, function (type parameter) D in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>D = never, function (type parameter) F in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>F = never, function (type parameter) G in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>G = never, function (type parameter) H in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>H = never, function (type parameter) I in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>I = never, function (type parameter) J in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>J = never>(
ab: (_: Stream<In>) => Bab: (_: Stream<In>(parameter) _: {
channel: Channel.Channel<Arr.NonEmptyReadonlyArray<A>, E, void, unknown, unknown, unknown, R>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
_: interface Stream<out A, out E = never, out R = never>A Stream<A, E, R> describes a program that can emit many A values, fail
with E, and require R.
Details
Streams are pull-based with backpressure and emit chunks to amortize effect
evaluation. They support monadic composition and error handling similar to
Effect, adapted for multiple values.
Example (Creating and consuming streams)
import { Console, Effect, Stream } from "effect"
const program = Effect.gen(function*() {
yield* Stream.make(1, 2, 3).pipe(
Stream.map((n) => n * 2),
Stream.runForEach((n) => Console.log(n))
)
})
Effect.runPromise(program)
// Output:
// 2
// 4
// 6
Stream<function (type parameter) In in Constructor<In>In>) => function (type parameter) B in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>B,
bc: (_: B) => Cbc: (_: B = never_: function (type parameter) B in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>B) => function (type parameter) C in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>C,
cd: (_: C) => Dcd: (_: C = never_: function (type parameter) C in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>C) => function (type parameter) D in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>D,
df: (_: D) => Fdf: (_: D = never_: function (type parameter) D in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>D) => function (type parameter) F in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>F,
fg: (_: F) => Gfg: (_: F = never_: function (type parameter) F in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>F) => function (type parameter) G in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>G,
gh: (_: G) => Hgh: (_: G = never_: function (type parameter) G in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>G) => function (type parameter) H in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>H,
hi: (_: H) => Ihi: (_: H = never_: function (type parameter) H in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>H) => function (type parameter) I in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>I,
ij: (_: I) => Effect.Effect<J, E, R>ij: (_: I = never_: function (type parameter) I in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>I) => import EffectEffect.interface Effect<out A, out E = never, out R = never>The Effect interface defines a value that lazily describes a workflow or
job. The workflow requires some context R, and may fail with an error of
type E, or succeed with a value of type A.
When to use
Use when you need to represent a lazy, composable workflow that can require
services, fail with a typed error, or succeed with a typed value.
Details
Effect values model resourceful interaction with the outside world,
including synchronous, asynchronous, concurrent, and parallel interaction.
They use a fiber-based concurrency model, with built-in support for
scheduling, fine-grained interruption, structured concurrency, and high
scalability.
To run an Effect value, you need a Runtime, which is a type that is
capable of executing Effect values.
Effect<function (type parameter) J in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>J, function (type parameter) E in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>R>
): interface Sink<out A, in In = unknown, out L = never, out E = never, out R = never>A Sink<A, In, L, E, R> is used to consume elements produced by a Stream.
You can think of a sink as a function that will consume a variable amount of
In elements (could be 0, 1, or many), might fail with an error of type E,
and will eventually yield a value of type A together with a remainder of
type L (i.e. any leftovers).
Example (Running a sink with a stream)
import { Effect, Sink, Stream } from "effect"
// Create a simple sink that always succeeds with a value
const sink: Sink.Sink<number> = Sink.succeed(42)
// Use the sink to consume a stream
const stream = Stream.make(1, 2, 3)
const program = Stream.run(stream, sink)
Effect.runPromise(program).then(console.log)
// Output: 42
Namespace containing types and interfaces for Sink variance and type relationships.
Sink<function (type parameter) J in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>J, function (type parameter) In in Constructor<In>In, never, function (type parameter) E in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>E, type Exclude<T, U> = T extends U
? never
: T
Exclude from T those types that are assignable to U
Exclude<function (type parameter) R in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => Effect.Effect<J, E, R>): Sink<J, In, never, E, Exclude<R, Scope.Scope>>R, import ScopeScope.Scope>>
<function (type parameter) E in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>R, function (type parameter) B in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>B = never, function (type parameter) C in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>C = never, function (type parameter) D in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>D = never, function (type parameter) F in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>F = never, function (type parameter) G in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>G = never, function (type parameter) H in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>H = never, function (type parameter) I in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>I = never, function (type parameter) J in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>J = never, function (type parameter) K in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>K = never>(
ab: (_: Stream<In>) => Bab: (_: Stream<In>(parameter) _: {
channel: Channel.Channel<Arr.NonEmptyReadonlyArray<A>, E, void, unknown, unknown, unknown, R>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
_: interface Stream<out A, out E = never, out R = never>A Stream<A, E, R> describes a program that can emit many A values, fail
with E, and require R.
Details
Streams are pull-based with backpressure and emit chunks to amortize effect
evaluation. They support monadic composition and error handling similar to
Effect, adapted for multiple values.
Example (Creating and consuming streams)
import { Console, Effect, Stream } from "effect"
const program = Effect.gen(function*() {
yield* Stream.make(1, 2, 3).pipe(
Stream.map((n) => n * 2),
Stream.runForEach((n) => Console.log(n))
)
})
Effect.runPromise(program)
// Output:
// 2
// 4
// 6
Stream<function (type parameter) In in Constructor<In>In>) => function (type parameter) B in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>B,
bc: (_: B) => Cbc: (_: B = never_: function (type parameter) B in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>B) => function (type parameter) C in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>C,
cd: (_: C) => Dcd: (_: C = never_: function (type parameter) C in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>C) => function (type parameter) D in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>D,
df: (_: D) => Fdf: (_: D = never_: function (type parameter) D in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>D) => function (type parameter) F in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>F,
fg: (_: F) => Gfg: (_: F = never_: function (type parameter) F in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>F) => function (type parameter) G in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>G,
gh: (_: G) => Hgh: (_: G = never_: function (type parameter) G in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>G) => function (type parameter) H in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>H,
hi: (_: H) => Ihi: (_: H = never_: function (type parameter) H in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>H) => function (type parameter) I in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>I,
ij: (_: I) => Jij: (_: I = never_: function (type parameter) I in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>I) => function (type parameter) J in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>J,
jk: (_: J) => Effect.Effect<K, E, R>jk: (_: J = never_: function (type parameter) J in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>J) => import EffectEffect.interface Effect<out A, out E = never, out R = never>The Effect interface defines a value that lazily describes a workflow or
job. The workflow requires some context R, and may fail with an error of
type E, or succeed with a value of type A.
When to use
Use when you need to represent a lazy, composable workflow that can require
services, fail with a typed error, or succeed with a typed value.
Details
Effect values model resourceful interaction with the outside world,
including synchronous, asynchronous, concurrent, and parallel interaction.
They use a fiber-based concurrency model, with built-in support for
scheduling, fine-grained interruption, structured concurrency, and high
scalability.
To run an Effect value, you need a Runtime, which is a type that is
capable of executing Effect values.
Effect<function (type parameter) K in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>K, function (type parameter) E in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>R>
): interface Sink<out A, in In = unknown, out L = never, out E = never, out R = never>A Sink<A, In, L, E, R> is used to consume elements produced by a Stream.
You can think of a sink as a function that will consume a variable amount of
In elements (could be 0, 1, or many), might fail with an error of type E,
and will eventually yield a value of type A together with a remainder of
type L (i.e. any leftovers).
Example (Running a sink with a stream)
import { Effect, Sink, Stream } from "effect"
// Create a simple sink that always succeeds with a value
const sink: Sink.Sink<number> = Sink.succeed(42)
// Use the sink to consume a stream
const stream = Stream.make(1, 2, 3)
const program = Stream.run(stream, sink)
Effect.runPromise(program).then(console.log)
// Output: 42
Namespace containing types and interfaces for Sink variance and type relationships.
Sink<function (type parameter) K in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>K, function (type parameter) In in Constructor<In>In, never, function (type parameter) E in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>E, type Exclude<T, U> = T extends U
? never
: T
Exclude from T those types that are assignable to U
Exclude<function (type parameter) R in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => Effect.Effect<K, E, R>): Sink<K, In, never, E, Exclude<R, Scope.Scope>>R, import ScopeScope.Scope>>
<
function (type parameter) E in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>E,
function (type parameter) R in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>R,
function (type parameter) B in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>B = never,
function (type parameter) C in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>C = never,
function (type parameter) D in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>D = never,
function (type parameter) F in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>F = never,
function (type parameter) G in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>G = never,
function (type parameter) H in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>H = never,
function (type parameter) I in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>I = never,
function (type parameter) J in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>J = never,
function (type parameter) K in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>K = never,
function (type parameter) L in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>L = never
>(
ab: (_: Stream<In>) => Bab: (_: Stream<In>(parameter) _: {
channel: Channel.Channel<Arr.NonEmptyReadonlyArray<A>, E, void, unknown, unknown, unknown, R>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
_: interface Stream<out A, out E = never, out R = never>A Stream<A, E, R> describes a program that can emit many A values, fail
with E, and require R.
Details
Streams are pull-based with backpressure and emit chunks to amortize effect
evaluation. They support monadic composition and error handling similar to
Effect, adapted for multiple values.
Example (Creating and consuming streams)
import { Console, Effect, Stream } from "effect"
const program = Effect.gen(function*() {
yield* Stream.make(1, 2, 3).pipe(
Stream.map((n) => n * 2),
Stream.runForEach((n) => Console.log(n))
)
})
Effect.runPromise(program)
// Output:
// 2
// 4
// 6
Stream<function (type parameter) In in Constructor<In>In>) => function (type parameter) B in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>B,
bc: (_: B) => Cbc: (_: B = never_: function (type parameter) B in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>B) => function (type parameter) C in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>C,
cd: (_: C) => Dcd: (_: C = never_: function (type parameter) C in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>C) => function (type parameter) D in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>D,
df: (_: D) => Fdf: (_: D = never_: function (type parameter) D in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>D) => function (type parameter) F in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>F,
fg: (_: F) => Gfg: (_: F = never_: function (type parameter) F in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>F) => function (type parameter) G in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>G,
gh: (_: G) => Hgh: (_: G = never_: function (type parameter) G in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>G) => function (type parameter) H in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>H,
hi: (_: H) => Ihi: (_: H = never_: function (type parameter) H in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>H) => function (type parameter) I in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>I,
ij: (_: I) => Jij: (_: I = never_: function (type parameter) I in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>I) => function (type parameter) J in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>J,
jk: (_: J) => Kjk: (_: J = never_: function (type parameter) J in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>J) => function (type parameter) K in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>K,
kl: (_: K) => Effect.Effect<L, E, R>kl: (_: K = never_: function (type parameter) K in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>K) => import EffectEffect.interface Effect<out A, out E = never, out R = never>The Effect interface defines a value that lazily describes a workflow or
job. The workflow requires some context R, and may fail with an error of
type E, or succeed with a value of type A.
When to use
Use when you need to represent a lazy, composable workflow that can require
services, fail with a typed error, or succeed with a typed value.
Details
Effect values model resourceful interaction with the outside world,
including synchronous, asynchronous, concurrent, and parallel interaction.
They use a fiber-based concurrency model, with built-in support for
scheduling, fine-grained interruption, structured concurrency, and high
scalability.
To run an Effect value, you need a Runtime, which is a type that is
capable of executing Effect values.
Effect<function (type parameter) L in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>L, function (type parameter) E in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>E, function (type parameter) R in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>R>
): interface Sink<out A, in In = unknown, out L = never, out E = never, out R = never>A Sink<A, In, L, E, R> is used to consume elements produced by a Stream.
You can think of a sink as a function that will consume a variable amount of
In elements (could be 0, 1, or many), might fail with an error of type E,
and will eventually yield a value of type A together with a remainder of
type L (i.e. any leftovers).
Example (Running a sink with a stream)
import { Effect, Sink, Stream } from "effect"
// Create a simple sink that always succeeds with a value
const sink: Sink.Sink<number> = Sink.succeed(42)
// Use the sink to consume a stream
const stream = Stream.make(1, 2, 3)
const program = Stream.run(stream, sink)
Effect.runPromise(program).then(console.log)
// Output: 42
Namespace containing types and interfaces for Sink variance and type relationships.
Sink<function (type parameter) L in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>L, function (type parameter) In in Constructor<In>In, never, function (type parameter) E in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>E, type Exclude<T, U> = T extends U
? never
: T
Exclude from T those types that are assignable to U
Exclude<function (type parameter) R in <E, R, B = never, C = never, D = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(ab: (_: Stream<In>) => B, bc: (_: B) => C, cd: (_: C) => D, df: (_: D) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => Effect.Effect<L, E, R>): Sink<L, In, never, E, Exclude<R, Scope.Scope>>R, import ScopeScope.Scope>>
}
}