<A, E>(self: Enqueue<A, E | Done>): Effect<boolean>Signals queue completion.
When to use
Use to stop accepting new offers while allowing already queued messages to be consumed.
Details
Returns false if the queue is already done.
Example (Ending queues)
import { Cause, Effect, Queue } from "effect"
const program = Effect.gen(function*() {
const queue = yield* Queue.bounded<number, Cause.Done>(10)
// Add some messages
yield* Queue.offer(queue, 1)
yield* Queue.offer(queue, 2)
// Signal completion - no more messages will be accepted
const ended = yield* Queue.end(queue)
console.log(ended) // true
// Trying to offer more messages will return false
const offerResult = yield* Queue.offer(queue, 3)
console.log(offerResult) // false
// But we can still take existing messages
const message = yield* Queue.take(queue)
console.log(message) // 1
})export const const end: <A, E>(
self: Enqueue<A, E | Done>
) => Effect<boolean>
Signals queue completion.
When to use
Use to stop accepting new offers while allowing already queued messages to be
consumed.
Details
Returns false if the queue is already done.
Example (Ending queues)
import { Cause, Effect, Queue } from "effect"
const program = Effect.gen(function*() {
const queue = yield* Queue.bounded<number, Cause.Done>(10)
// Add some messages
yield* Queue.offer(queue, 1)
yield* Queue.offer(queue, 2)
// Signal completion - no more messages will be accepted
const ended = yield* Queue.end(queue)
console.log(ended) // true
// Trying to offer more messages will return false
const offerResult = yield* Queue.offer(queue, 3)
console.log(offerResult) // false
// But we can still take existing messages
const message = yield* Queue.take(queue)
console.log(message) // 1
})
end = <function (type parameter) A in <A, E>(self: Enqueue<A, E | Done>): Effect<boolean>A, function (type parameter) E in <A, E>(self: Enqueue<A, E | Done>): Effect<boolean>E>(self: Enqueue<A, E | Done>(parameter) self: {
strategy: "suspend" | "dropping" | "sliding";
dispatcher: SchedulerDispatcher;
capacity: number;
messages: MutableList.MutableList<any>;
state: Queue.State<any, any>;
scheduleRunning: boolean;
toString: () => string;
toJSON: () => unknown;
}
self: interface Enqueue<in A, in E = never>An Enqueue is a queue that can be offered to.
Details
This interface represents the write-only part of a Queue, allowing you to offer
elements to the queue but not take elements from it.
Example (Offering through enqueue handles)
import { Effect, Queue } from "effect"
// Function that only needs write access to a queue
const producer = (enqueue: Queue.Enqueue<string>) =>
Effect.gen(function*() {
yield* Queue.offer(enqueue, "hello")
yield* Queue.offerAll(enqueue, ["world", "!"])
})
const program = Effect.gen(function*() {
const queue = yield* Queue.bounded<string>(10)
yield* producer(queue)
})
Companion namespace containing type-level metadata for the Enqueue
write-only queue interface.
Enqueue<function (type parameter) A in <A, E>(self: Enqueue<A, E | Done>): Effect<boolean>A, function (type parameter) E in <A, E>(self: Enqueue<A, E | Done>): Effect<boolean>E | interface Done<A = void>A graceful completion signal for queues and streams.
When to use
Use to model normal producer completion through a stream or queue error
channel.
Details
Done indicates that a producer has finished normally — no more elements
will arrive. It is distinct from an error or interruption; it represents
successful completion. The optional value field can carry a final
leftover payload.
Example (Signaling queue completion)
import { Cause, Effect, Queue } from "effect"
const program = Effect.gen(function*() {
const queue = yield* Queue.bounded<number, Cause.Done>(10)
yield* Queue.offer(queue, 1)
yield* Queue.end(queue)
const result = yield* Effect.flip(Queue.take(queue))
console.log(Cause.isDone(result)) // true
})
Companion namespace for the Done interface.
Creates a Done signal with an optional value.
When to use
Use when you need to construct a low-level pull completion signal directly.
Done>): 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<boolean> => const failCause: {
<E>(cause: Cause<E>): <A>(
self: Enqueue<A, E>
) => Effect<boolean>
<A, E>(
self: Enqueue<A, E>,
cause: Cause<E>
): Effect<boolean>
}
failCause(self: Enqueue<A, E | Done>(parameter) self: {
strategy: "suspend" | "dropping" | "sliding";
dispatcher: SchedulerDispatcher;
capacity: number;
messages: MutableList.MutableList<any>;
state: Queue.State<any, any>;
scheduleRunning: boolean;
toString: () => string;
toJSON: () => unknown;
}
self, import corecore.const causeFail: <E>(
error: E
) => Cause.Cause<E>
causeFail(import corecore.const Done: <A = void>(
value?: A
) => Cause.Done<A>
Done()))