actor
Version:
Actor based concurrency primitives for managing effects
211 lines • 7.93 kB
TypeScript
/**
* Gets a handle to the task that invoked it. Useful when task needs to
* suspend execution until some outside event occurs, in which case handle
* can be used resume execution (see `suspend` code example for more details)
*
* @template T, M, X
* @returns {Task.Task<Task.Controller<T, X, M>, never>}
*/
export function current<T, M, X>(): Task.Task<Task.Controller<T, X, M>, never, never>;
/**
* Suspends execution for the given duration in milliseconds, after which
* execution is resumed (unless it was aborted in the meantime).
*
* @example
* ```js
* function * demo() {
* console.log("I'm going to take small nap")
* yield * sleep(200)
* console.log("I am back to work")
* }
* ```
*
* @param {number} [duration]
* @returns {Task.Task<void, never>}
*/
export function sleep(duration?: number | undefined): Task.Task<void, never>;
/**
* Takes several effects and combines them into a one.
*
* @template T
* @param {Task.Effect<T>[]} effects
* @returns {Task.Effect<T>}
*/
export function batch<T>(effects: Task.Effect<T>[]): Task.Effect<T>;
/**
* Kind of like promise.then which is handy when you want to extract result
* from the given task from the outside.
*
* @template T, U, X, M
* @param {Task.Task<T, X, M>} task
* @param {(value:T) => U} resolve
* @param {(error:X) => U} reject
* @returns {Task.Task<U, never, M>}
*/
export function then<T, U, X, M>(task: Task.Task<T, X, M>, resolve: (value: T) => U, reject: (error: X) => U): Task.Task<U, never, M>;
/**
* Executes given task concurrently with a current task (task that spawned it).
* Spawned task is detached from the task that spawned it and it can outlive it
* and / or fail without affecting a task that spawned it. If you need to wait
* on concurrent task completion consider using `fork` instead which can be
* later `joined`. If you just want a to block on task execution you can just
* `yield* work()` directly instead.
*
* @param {Task.Task<void, never, never>} task
* @returns {Task.Task<void, never>}
*/
export function spawn(task: Task.Task<void, never, never>): Task.Task<void, never>;
/**
* Groups multiple forks togather and joins joins them with current task.
*
* @template T, X, M
* @param {Task.Fork<T, X, M>[]} forks
* @returns {Task.Task<void, X, M>}
*/
export function group<T, X, M>(forks: Task.Fork<T, X, M>[]): Task.Task<void, X, M>;
/**
* @template T, X, M
* @param {Task.Fork<T, X, M>} fork
* @returns {Task.Task<T, X, M>}
*/
export function join<T, X, M>(fork: Task.Fork<T, X, M>): Task.Task<T, X, M>;
export * from "./task.js";
export function effect<T>(task: Task.Task<T, never, never>): Task.Effect<T>;
export function suspend(): Task.Task<void, never>;
export function wait<T, X = unknown>(input: Task.Await<T>): Task.Task<T, Error, never>;
export function send<T>(message: T): Task.Effect<T>;
export function listen<Tag extends string, T>(source: { [K in Tag]: Task.Effect<T>; }): Task.Effect<Task.Tagged<Tag, T>>;
export function effects<Tag extends string, T>(tasks: Task.Task<T, never, never>[]): Task.Effect<T>;
export function tag<Tag extends string, T, M, X>(effect: Task.Task<T, X, M>, tag: Tag): Task.Task<T, X, Task.Tagged<Tag, M>>;
/**
* Returns empty `Effect`, that is produces no messages. Kind of like `[]` or
* `""` but for effects.
*
* @type {() => Task.Effect<never>}
*/
export const none: () => Task.Effect<never>;
export function all<T, X>(tasks: Iterable<Task.Task<T, X, never>>): Task.Task<T[], X, never>;
export function isMessage<M>(value: Task.Instruction<M>): value is M;
export function isInstruction<M>(value: Task.Instruction<M>): value is Task.Control;
export function main(task: Task.Task<void, never>): void;
export function resume<T, X, M>(task: Task.Controller<T, X, M>): void;
export function fork<T, X, M>(task: Task.Task<T, X, M>, options?: Task.ForkOptions | undefined): Task.Fork<T, X, M>;
export function exit<T, M, X>(handle: Task.Controller<T, M, X>, value: T): Task.Task<void, never>;
export function terminate<M, X>(handle: Task.Controller<void, X, M>): Task.Task<void, never, never> & Task.Controller<void, never, never>;
export function abort<T, M, X>(handle: Task.Controller<T, X, M>, error?: X | undefined): Task.Task<void, never, never> & Task.Controller<void, never, never>;
export function loop<M>(init: Task.Effect<M>, next: (message: M) => Task.Effect<M>): Task.Task<void, never, never>;
export type Tagged<Tag extends string, T> = {
type: Tag;
} & { [K in Tag]: T; };
export type Control = typeof SUSPEND | typeof CURRENT;
import * as Task from "./task.js";
/**
* @template T, X, M
* @implements {Task.Fork<T, X, M>}
* @implements {Task.Controller<T, X, M>}
* @implements {Task.Task<Task.Fork<T, X, M>, never>}
* @implements {Task.Future<T, X>}
* @extends {Future<T, X>}
*/
declare class Fork<T, X, M> extends Future<T, X> implements Task.Fork<T, X, M>, Task.Controller<T, X, M>, Task.Task<Task.Fork<T, X, M>, never>, Task.Future<T, X> {
/**
* @param {Task.Task<T, X, M>} task
* @param {Task.ForkOptions} [options]
* @param {Task.StateHandler<T, X>} [handler]
* @param {Task.TaskState<T, M>} [state]
*/
constructor(task: Task.Task<T, X, M>, options?: Task.ForkOptions | undefined, handler?: Task.StateHandler<T, X> | undefined, state?: Task.TaskState<T, M> | undefined);
id: number;
name: string;
/** @type {Task.Task<T, X, M>} */
task: Task.Task<T, X, M>;
state: Task.TaskState<T, M>;
status: Task.Status;
/** @type {Task.Controller<T, X, M>} */
controller: Task.Controller<T, X, M>;
resume(): Generator<never, void, unknown>;
/**
* @returns {Task.Task<T, X, M>}
*/
join(): Task.Task<T, X, M>;
/**
* @param {X} error
*/
abort(error: X): Task.Task<void, never, never> & Task.Controller<void, never, never>;
/**
* @param {T} value
*/
exit(value: T): Task.Task<void, never, never>;
/**
* @private
* @param {any} error
* @returns {never}
*/
private panic;
/**
* @private
* @param {Task.TaskState<T, M>} state
*/
private step;
/**
* @param {unknown} value
*/
next(value: unknown): Task.TaskState<T, M>;
/**
* @param {T} value
*/
return(value: T): Task.TaskState<T, M>;
/**
* @param {X} error
*/
throw(error: X): Task.TaskState<T, M>;
get [Symbol.toStringTag](): string;
/**
* @returns {Task.Controller<Task.Fork<T, X, M>, never, never>}
*/
[Symbol.iterator](): Task.Controller<Task.Fork<T, X, M>, never, never>;
}
declare const SUSPEND: unique symbol;
declare const CURRENT: unique symbol;
/**
* @template T, X
* @implements {Task.Future<T, X>}
*/
declare class Future<T, X> implements Task.Future<T, X> {
/**
* @param {Task.StateHandler<T, X>} handler
*/
constructor(handler: Task.StateHandler<T, X>);
handler: Task.StateHandler<T, X>;
/**
* @abstract
* @type {Task.Result<T, X>|void}
*/
result: Task.Result<T, X> | void;
/**
* @type {Promise<T>}
*/
get promise(): Promise<T>;
/**
* @template U, [E=never]
* @param {((value:T) => U | PromiseLike<U>)|undefined|null} [onresolve]
* @param {((error:X) => E|PromiseLike<E>)|undefined|null} [onreject]
* @returns {Promise<U|E>}
*/
then<U, E = never>(onresolve?: ((value: T) => U | PromiseLike<U>) | null | undefined, onreject?: ((error: X) => E | PromiseLike<E>) | null | undefined): Promise<U | E>;
/**
* @template [U=never]
* @param {(error:X) => U} onreject
*/
catch<U_1 = never>(onreject: (error: X) => U_1): Task.Future<T | U_1, never>;
/**
* @param {() => void} onfinally
* @returns {Task.Future<T, X>}
*/
finally(onfinally: () => void): Task.Future<T, X>;
/**
* @abstract
*/
activate(): Future<T, X>;
}
//# sourceMappingURL=lib.d.ts.map