@typed/fp
Version:
Data Structures and Resources for fp-ts
296 lines • 7.92 kB
TypeScript
/**
*
* `Resume` is a possibly synchronous or asynchronous effect type. Conceptually you can think of
* `Resume` as a union between the `IO` and `Task` monads w/ cancelation. The `Disposable` interface is
* borrowed from `@most/core`'s internal types and makes it easy to interoperate. Using `Disposable`
* makes it easy to reuse the `@most/scheduler` package for providing scheduling consistent with any
* other most-based workflows you have.
*
* The beauty of `Resume` is that it can do work as fast as possible without delay. Sync when possible
* but async when needed allows you to unify your sync/async workflows using a single monad w/ easy
* interop with your existing IO/Task allowing for cancelation when required.
* @since 0.9.2
*/
import { Disposable } from '@most/types';
import { Alt1 } from 'fp-ts/Alt';
import { Applicative1 } from 'fp-ts/Applicative';
import { Apply1 } from 'fp-ts/Apply';
import * as Ch from 'fp-ts/Chain';
import { ChainRec1 } from 'fp-ts/ChainRec';
import * as E from 'fp-ts/Either';
import { FromIO1 } from 'fp-ts/FromIO';
import { FromTask1 } from 'fp-ts/FromTask';
import { Functor1 } from 'fp-ts/Functor';
import { IO } from 'fp-ts/IO';
import { Monad1 } from 'fp-ts/Monad';
import { Pointed1 } from 'fp-ts/Pointed';
import { Task } from 'fp-ts/Task';
import { Arity1 } from './function';
import { MonadRec1 } from './MonadRec';
/**
* @since 0.9.2
* @category Model
*/
export declare type Resume<A> = Sync<A> | Async<A>;
/**
* @since 0.9.2
* @category Type-level
*/
export declare type ValueOf<A> = [A] extends [Resume<infer R>] ? R : never;
/**
* @since 0.9.2
* @category Model
*/
export interface Async<A> {
readonly _tag: 'async';
readonly resume: AsyncResume<A>;
}
/**
* @since 0.9.2
* @category Model
*/
export declare type AsyncResume<A> = (resume: (value: A) => Disposable) => Disposable;
/**
* @since 0.9.2
* @category Constructor
*/
export declare const async: <A>(resume: AsyncResume<A>) => Async<A>;
/**
* @since 0.9.2
* @category Constructor
*/
export declare const fromTask: <A>(task: Task<A>) => Async<A>;
/**
* @since 0.9.2
* @category Model
*/
export interface Sync<A> {
readonly _tag: 'sync';
readonly resume: IO<A>;
}
/**
* @since 0.9.2
* @category Constructor
*/
export declare const sync: <A>(resume: IO<A>) => Sync<A>;
/**
* @since 0.9.2
* @category Refinement
*/
export declare const isSync: <A>(resume: Resume<A>) => resume is Sync<A>;
/**
* @since 0.9.2
* @category Refinement
*/
export declare const isAsync: <A>(resume: Resume<A>) => resume is Async<A>;
/**
* @since 0.9.2
* @category Combinator
*/
export declare const ap: <A>(fa: Resume<A>) => <B>(fab: Resume<Arity1<A, B>>) => Resume<B>;
/**
* @since 0.9.2
* @category Deconstructor
*/
export declare const run: <A>(f: Arity1<A, Disposable>) => (resume: Resume<A>) => Disposable;
/**
* @since 0.9.2
* @category Deconstructor
*/
export declare const start: <A>(f: Arity1<A, any>) => (resume: Resume<A>) => Disposable;
/**
* @since 0.9.2
* @category Deconstructor
*/
export declare const exec: (resume: Resume<any>) => Disposable;
/**
* @since 0.9.2
* @category Model
*/
export declare type DisposableTask<A> = () => DisposablePromise<A>;
/**
* @since 0.9.2
* @category Model
*/
export declare type DisposablePromise<A> = Promise<A> & Disposable;
/**
* @since 0.9.2
* @category Deconstructor
*/
export declare const toTask: <A>(resume: Resume<A>) => DisposableTask<A>;
/**
* @since 0.9.2
* @category Combinator
*/
export declare const chain: <A, B>(f: Arity1<A, Resume<B>>) => (resume: Resume<A>) => Resume<B>;
/**
* @since 0.9.2
* @category Constructor
*/
export declare const of: <A>(a: A) => Sync<A>;
/**
* @since 0.9.2
* @category Combinator
*/
export declare const chainRec: <A, B>(f: Arity1<A, Resume<E.Either<A, B>>>) => (value: A) => Resume<B>;
/**
* @since 0.9.2
* @category Combinator
*/
export declare const race: <A>(ra: Resume<A>) => <B>(rb: Resume<B>) => Resume<A | B>;
/**
* @since 0.9.2
* @category URI
*/
export declare const URI = "@typed/fp/Resume";
/**
* @since 0.9.2
* @category URI
*/
export declare type URI = typeof URI;
declare module 'fp-ts/HKT' {
interface URItoKind<A> {
[URI]: Resume<A>;
}
}
/**
* @since 0.9.2
* @category Instance
*/
export declare const Pointed: Pointed1<URI>;
/**
* @since 0.9.2
* @category Instance
*/
export declare const Functor: Functor1<URI>;
/**
* @since 0.9.2
* @category Combinator
*/
export declare const map: <A, B>(f: (a: A) => B) => (fa: Resume<A>) => Resume<B>;
/**
* @since 0.9.2
* @category Instance
*/
export declare const Apply: Apply1<URI>;
/**
* @since 0.9.2
* @category Instance
*/
export declare const Applicative: Applicative1<URI>;
/**
* @since 0.9.2
* @category Instance
*/
export declare const Chain: Ch.Chain1<URI>;
/**
* @since 0.9.2
* @category Combinator
*/
export declare const chainFirst: <A, B>(f: (a: A) => Resume<B>) => (first: Resume<A>) => Resume<A>;
/**
* @since 0.9.2
* @category Instance
*/
export declare const Monad: Monad1<URI>;
/**
* @since 0.9.2
* @category Instance
*/
export declare const ChainRec: ChainRec1<URI>;
/**
* @since 0.9.2
* @category Instance
*/
export declare const MonadRec: MonadRec1<URI>;
/**
* @since 0.9.2
* @category Instance
*/
export declare const Alt: Alt1<URI>;
/**
* @since 0.9.2
* @category Instance
*/
export declare const FromIO: FromIO1<URI>;
/**
* @since 0.9.2
* @category Constructor
*/
export declare const fromIO: import("fp-ts/NaturalTransformation").NaturalTransformation11<"IO", "@typed/fp/Resume">;
/**
* @since 0.9.2
* @category Instance
*/
export declare const FromTask: FromTask1<URI>;
/**
* @since 0.9.2
* @category Constructor
*/
export declare const Do: Resume<{}>;
/**
* @since 0.9.2
* @category Combinator
*/
export declare const bindTo: <N extends string>(name: N) => <A>(fa: Resume<A>) => Resume<{ [K in N]: A; }>;
/**
* @since 0.9.2
* @category Combinator
*/
export declare const bind: <N extends string, A, B>(name: Exclude<N, keyof A>, f: (a: A) => Resume<B>) => (ma: Resume<A>) => Resume<{ readonly [K in N | keyof A]: K extends keyof A ? A[K] : B; }>;
/**
* @since 0.9.2
* @category Combinator
*/
export declare const tupled: <A>(fa: Resume<A>) => Resume<readonly [A]>;
/**
* @since 0.9.2
* @category Combinator
*/
export declare const traverseReadonlyArray: <A, B>(f: (a: A) => Resume<B>) => (ta: readonly A[]) => Resume<readonly B[]>;
/**
* @since 0.9.2
* @category Combinator
*/
export declare const traverseReadonlyArrayWithIndex: <A, B>(f: (i: number, a: A) => Resume<B>) => (ta: readonly A[]) => Resume<readonly B[]>;
/**
* @since 0.9.2
* @category Combinator
*/
export declare const zip: <A>(ta: readonly Resume<A>[]) => Resume<readonly A[]>;
/**
* @since 0.9.2
* @category Combinator
*/
export declare const chainFirstTaskK: <A, B>(f: (a: A) => Task<B>) => (first: Resume<A>) => Resume<A>;
/**
* @since 0.9.2
* @category Combinator
*/
export declare const chainTaskK: <A, B>(f: (a: A) => Task<B>) => (first: Resume<A>) => Resume<B>;
/**
* @since 0.9.2
* @category Constructor
*/
export declare const fromTaskK: <A extends readonly unknown[], B>(f: (...a: A) => Task<B>) => (...a: A) => Resume<B>;
/**
* @since 0.9.2
* @category Combinator
*/
export declare const chainFirstIOK: <A, B>(f: (a: A) => IO<B>) => (first: Resume<A>) => Resume<A>;
/**
* @since 0.9.2
* @category Combinator
*/
export declare const chainIOK: <A, B>(f: (a: A) => IO<B>) => (first: Resume<A>) => Resume<B>;
/**
* @since 0.9.2
* @category Constructor
*/
export declare const fromIOK: <A extends readonly unknown[], B>(f: (...a: A) => IO<B>) => (...a: A) => Resume<B>;
/**
* @since 0.9.2
* @category Typeclass Constructor
*/
export declare const getMonoid: <A>(M: import("fp-ts/Monoid").Monoid<A>) => import("fp-ts/Monoid").Monoid<Resume<A>>;
//# sourceMappingURL=Resume.d.ts.map