UNPKG

@dialog-db/query

Version:

Datalog query engine inspired by Datomic

50 lines 2 kB
import type { Result } from '../api.js'; import { SUSPEND, RESUME } from './constant.js'; export { SUSPEND, RESUME, Result }; export type Suspend = typeof SUSPEND; export interface Throw<Error extends globalThis.Error = globalThis.Error> { join?: never; throw: Error | AbortError; } export interface Join { join(group: Wake): void; } export type Command = Suspend | Throw<Error> | Join; export interface Task<Ok, Error extends globalThis.Error = never, Command extends Suspend | Join | Throw<Error> = Suspend | Join | Throw<Error>> { [Symbol.iterator](): Execution<Ok, Command>; } export interface Execution<Ok extends unknown, Command extends Suspend | Join | Throw<Error>> { throw(error: InferError<Command>): Step<Ok, Command>; return(ok: Ok): Step<Ok, Command>; next(): Step<Ok, Command>; [Symbol.iterator](): Execution<Ok, Command>; } /** * Wake handler which can be used to wake the suspended task. */ export interface Wake { wake(): void; } export type Step<Ok extends unknown, Command extends Suspend | Join | Throw<Error>> = IteratorResult<Command, Ok>; export type InferError<Command> = Command extends Throw<infer Error> ? Error : never; /** * Future is a type safe promise as it captures both success and error types and * provides functionality to move from try/catch operating mode into `Result` * based one. */ export interface Future<Ok extends unknown, Error extends globalThis.Error> extends Promise<Ok> { /** * Returns a promise for the `Result` that captures both success or error * cases. */ result(): Invocation<Result<Ok, Error>>; } export interface AbortError extends Error { name: 'AbortError'; reason: unknown; } export interface Invocation<Ok extends unknown, Fail extends globalThis.Error = never> extends Future<Ok, Fail | AbortError>, Task<Ok, Fail> { abort(reason: unknown): void; [Symbol.iterator](): Execution<Ok, Suspend | Join | Throw<Fail>>; } //# sourceMappingURL=task.d.ts.map