/**
* @since 3.8.0
* @experimental
*/
import type { Cause, NoSuchElementException } from "./Cause.js";
import type { Channel } from "./Channel.js";
import type { Chunk } from "./Chunk.js";
import type { Effect } from "./Effect.js";
import type { Exit } from "./Exit.js";
import type { Inspectable } from "./Inspectable.js";
import type { Option } from "./Option.js";
import type { Scope } from "./Scope.js";
import type { Stream } from "./Stream.js";
/**
* @since 3.8.0
* @experimental
* @category type ids
*/
export declare const TypeId: unique symbol;
/**
* @since 3.8.0
* @experimental
* @category type ids
*/
export type TypeId = typeof TypeId;
/**
* @since 3.8.0
* @experimental
* @category type ids
*/
export declare const ReadonlyTypeId: unique symbol;
/**
* @since 3.8.0
* @experimental
* @category type ids
*/
export type ReadonlyTypeId = typeof ReadonlyTypeId;
/**
* @since 3.8.0
* @experimental
* @category guards
*/
export declare const isMailbox: (u: unknown) => u is Mailbox;
/**
* @since 3.8.0
* @experimental
* @category guards
*/
export declare const isReadonlyMailbox: (u: unknown) => u is ReadonlyMailbox;
/**
* A `Mailbox` is a queue that can be signaled to be done or failed.
*
* @since 3.8.0
* @experimental
* @category models
*/
export interface Mailbox extends ReadonlyMailbox {
readonly [TypeId]: TypeId;
/**
* Add a message to the mailbox. Returns `false` if the mailbox is done.
*/
readonly offer: (message: A) => Effect;
/**
* Add a message to the mailbox. Returns `false` if the mailbox is done.
*/
readonly unsafeOffer: (message: A) => boolean;
/**
* Add multiple messages to the mailbox. Returns the remaining messages that
* were not added.
*/
readonly offerAll: (messages: Iterable) => Effect>;
/**
* Add multiple messages to the mailbox. Returns the remaining messages that
* were not added.
*/
readonly unsafeOfferAll: (messages: Iterable) => Chunk;
/**
* Fail the mailbox with an error. If the mailbox is already done, `false` is
* returned.
*/
readonly fail: (error: E) => Effect;
/**
* Fail the mailbox with a cause. If the mailbox is already done, `false` is
* returned.
*/
readonly failCause: (cause: Cause) => Effect;
/**
* Signal that the mailbox is complete. If the mailbox is already done, `false` is
* returned.
*/
readonly end: Effect;
/**
* Signal that the mailbox is done. If the mailbox is already done, `false` is
* returned.
*/
readonly done: (exit: Exit) => Effect;
/**
* Signal that the mailbox is done. If the mailbox is already done, `false` is
* returned.
*/
readonly unsafeDone: (exit: Exit) => boolean;
/**
* Shutdown the mailbox, canceling any pending operations.
* If the mailbox is already done, `false` is returned.
*/
readonly shutdown: Effect;
}
/**
* A `ReadonlyMailbox` represents a mailbox that can only be read from.
*
* @since 3.8.0
* @experimental
* @category models
*/
export interface ReadonlyMailbox extends Effect, done: boolean], E>, Inspectable {
readonly [ReadonlyTypeId]: ReadonlyTypeId;
/**
* Take all messages from the mailbox, returning an empty Chunk if the mailbox
* is empty or done.
*/
readonly clear: Effect, E>;
/**
* Take all messages from the mailbox, or wait for messages to be available.
*
* If the mailbox is done, the `done` flag will be `true`. If the mailbox
* fails, the Effect will fail with the error.
*/
readonly takeAll: Effect, done: boolean], E>;
/**
* Take a specified number of messages from the mailbox. It will only take
* up to the capacity of the mailbox.
*
* If the mailbox is done, the `done` flag will be `true`. If the mailbox
* fails, the Effect will fail with the error.
*/
readonly takeN: (n: number) => Effect, done: boolean], E>;
/**
* Take a single message from the mailbox, or wait for a message to be
* available.
*
* If the mailbox is done, it will fail with `NoSuchElementException`. If the
* mailbox fails, the Effect will fail with the error.
*/
readonly take: Effect;
/** Wait for the mailbox to be done. */
readonly await: Effect;
/**
* Check the size of the mailbox.
*
* If the mailbox is complete, it will return `None`.
*/
readonly size: Effect