resultar 3.6.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -0
- package/README.md +141 -15
- package/dist/index.d.ts +297 -123
- package/dist/index.js +898 -279
- package/package.json +5 -4
package/dist/index.d.ts
CHANGED
|
@@ -15,6 +15,11 @@ declare abstract class Pipeable {
|
|
|
15
15
|
pipe<A>(ab: PipeFn<this, A>): A;
|
|
16
16
|
pipe<A, B>(ab: PipeFn<this, A>, bc: PipeFn<A, B>): B;
|
|
17
17
|
pipe<A, B, C>(ab: PipeFn<this, A>, bc: PipeFn<A, B>, cd: PipeFn<B, C>): C;
|
|
18
|
+
pipe<A, B, C, D>(ab: PipeFn<this, A>, bc: PipeFn<A, B>, cd: PipeFn<B, C>, de: PipeFn<C, D>): D;
|
|
19
|
+
pipe<A, B, C, D, E>(ab: PipeFn<this, A>, bc: PipeFn<A, B>, cd: PipeFn<B, C>, de: PipeFn<C, D>, ef: PipeFn<D, E>): E;
|
|
20
|
+
pipe<A, B, C, D, E, F>(ab: PipeFn<this, A>, bc: PipeFn<A, B>, cd: PipeFn<B, C>, de: PipeFn<C, D>, ef: PipeFn<D, E>, fg: PipeFn<E, F>): F;
|
|
21
|
+
pipe<A, B, C, D, E, F, G>(ab: PipeFn<this, A>, bc: PipeFn<A, B>, cd: PipeFn<B, C>, de: PipeFn<C, D>, ef: PipeFn<D, E>, fg: PipeFn<E, F>, gh: PipeFn<F, G>): G;
|
|
22
|
+
pipe<A, B, C, D, E, F, G, H>(ab: PipeFn<this, A>, bc: PipeFn<A, B>, cd: PipeFn<B, C>, de: PipeFn<C, D>, ef: PipeFn<D, E>, fg: PipeFn<E, F>, gh: PipeFn<F, G>, hi: PipeFn<G, H>): H;
|
|
18
23
|
}
|
|
19
24
|
//#endregion
|
|
20
25
|
//#region src/utils.d.ts
|
|
@@ -711,6 +716,293 @@ declare class AbortError extends Error {
|
|
|
711
716
|
*/
|
|
712
717
|
declare const isAbortError: (value: unknown) => value is AbortError;
|
|
713
718
|
//#endregion
|
|
719
|
+
//#region src/result-task.d.ts
|
|
720
|
+
/** A failure cause produced by a `ResultTask` execution. */
|
|
721
|
+
type Cause<E> = {
|
|
722
|
+
readonly _tag: "Fail";
|
|
723
|
+
readonly error: E;
|
|
724
|
+
} | {
|
|
725
|
+
readonly _tag: "Die";
|
|
726
|
+
readonly defect: unknown;
|
|
727
|
+
} | {
|
|
728
|
+
readonly _tag: "Interrupt";
|
|
729
|
+
readonly reason: unknown;
|
|
730
|
+
} | {
|
|
731
|
+
readonly _tag: "Sequential";
|
|
732
|
+
readonly left: Cause<E>;
|
|
733
|
+
readonly right: Cause<E>;
|
|
734
|
+
};
|
|
735
|
+
/** Rejection used when a simplified boundary cannot represent multiple failures. */
|
|
736
|
+
declare class ResultTaskCauseError extends Error {
|
|
737
|
+
override readonly cause: Cause<unknown>;
|
|
738
|
+
constructor(cause: Cause<unknown>);
|
|
739
|
+
}
|
|
740
|
+
/** Type identifier symbol for nominal `ResultTask` branding and variance checks. */
|
|
741
|
+
declare const ResultTaskTypeId: unique symbol;
|
|
742
|
+
/** Type identifier symbol for nominal `ServiceTag` branding. */
|
|
743
|
+
declare const ServiceTagTypeId: unique symbol;
|
|
744
|
+
/** Type identifier symbol for nominal `ResultTask` yieldable objects. */
|
|
745
|
+
declare const ResultTaskYieldTypeId: unique symbol;
|
|
746
|
+
/** Error thrown as a Die cause when a requested service is not provided in the environment. */
|
|
747
|
+
declare class MissingServiceError extends Error {
|
|
748
|
+
readonly serviceIdentifier: string;
|
|
749
|
+
constructor(serviceIdentifier: string);
|
|
750
|
+
}
|
|
751
|
+
declare const scopeTypeId: unique symbol;
|
|
752
|
+
/** Tracks deferred release failures until the owning scope is closed. */
|
|
753
|
+
interface ResultTaskScope<out E> {
|
|
754
|
+
readonly [scopeTypeId]: E;
|
|
755
|
+
}
|
|
756
|
+
type ScopeError<R> = R extends ResultTaskScope<infer E> ? E : never;
|
|
757
|
+
type WithoutScope<R> = Exclude<R, ResultTaskScope<unknown>>;
|
|
758
|
+
/** Resource acquisition and release share one execution and service environment. */
|
|
759
|
+
interface ResultTaskAcquireReleaseOptions<A, E, R, ReleaseError, ReleaseR> {
|
|
760
|
+
readonly acquire: ResultTask<A, E, R>;
|
|
761
|
+
readonly release: (resource: A, exit: Exit<unknown, unknown>) => ResultTask<void, ReleaseError, ReleaseR>;
|
|
762
|
+
}
|
|
763
|
+
/** The complete outcome of a `ResultTask` execution. */
|
|
764
|
+
type Exit<A, E> = {
|
|
765
|
+
readonly _tag: "Success";
|
|
766
|
+
readonly value: A;
|
|
767
|
+
} | {
|
|
768
|
+
readonly _tag: "Failure";
|
|
769
|
+
readonly cause: Cause<E>;
|
|
770
|
+
};
|
|
771
|
+
/** Handlers for matching both success and failure cases of a ResultTask. */
|
|
772
|
+
type ResultTaskMatchOptions<A, E, B, C = B> = {
|
|
773
|
+
readonly onSuccess: (value: A) => B;
|
|
774
|
+
readonly onFailure: (error: E) => C;
|
|
775
|
+
} | {
|
|
776
|
+
readonly ok: (value: A) => B;
|
|
777
|
+
readonly err: (error: E) => C;
|
|
778
|
+
};
|
|
779
|
+
/** A service that can be requested from a `ResultTask.gen` workflow. */
|
|
780
|
+
interface ServiceTag<Identifier extends string, Service> {
|
|
781
|
+
readonly [ServiceTagTypeId]: typeof ServiceTagTypeId;
|
|
782
|
+
readonly _tag: "ServiceTag";
|
|
783
|
+
readonly identifier: Identifier;
|
|
784
|
+
readonly key: symbol;
|
|
785
|
+
readonly [Symbol.iterator]: () => Generator<ResultTaskServiceYield<ServiceTag<Identifier, Service>>, Service, Service>;
|
|
786
|
+
}
|
|
787
|
+
/** Resolves a service requested by a `ResultTask.gen` workflow. */
|
|
788
|
+
type ResultTaskServiceResolver<R, E = never, ResolverR = never> = { readonly [Tag in Extract<R, AnyServiceTag> as Tag["identifier"]]: () => ResultTask<ServiceForTag<Tag>, E, ResolverR>; };
|
|
789
|
+
type ResolverTasks<Resolvers> = Resolvers[keyof Resolvers] extends (() => infer Task) ? Task : never;
|
|
790
|
+
type ResolverError<Resolvers> = [ResolverTasks<Resolvers>] extends [never] ? never : ResolverTasks<Resolvers> extends ResultTask<unknown, infer E, unknown> ? E : never;
|
|
791
|
+
type ResolverRequirements<Resolvers> = [ResolverTasks<Resolvers>] extends [never] ? never : ResolverTasks<Resolvers> extends ResultTask<unknown, unknown, infer R> ? R : never;
|
|
792
|
+
type EliminateProvidedServices<R, Services> = R extends AnyServiceTag ? R["identifier"] extends keyof Services ? Services[R["identifier"]] extends ServiceForTag<R> ? never : R : R : R;
|
|
793
|
+
type EliminateResolvedServices<R, Resolvers> = R extends AnyServiceTag ? R["identifier"] extends keyof Resolvers ? Resolvers[R["identifier"]] extends (() => ResultTask<infer S, unknown, unknown>) ? S extends ServiceForTag<R> ? never : R : R : R : R;
|
|
794
|
+
type IncompatibleProvidedServices<R, Services> = R extends AnyServiceTag ? R["identifier"] extends keyof Services ? Services[R["identifier"]] extends ServiceForTag<R> ? never : R["identifier"] : never : never;
|
|
795
|
+
type IncompatibleResolvedServices<R, Resolvers> = R extends AnyServiceTag ? R["identifier"] extends keyof Resolvers ? Resolvers[R["identifier"]] extends (() => ResultTask<infer S, unknown, unknown>) ? S extends ServiceForTag<R> ? never : R["identifier"] : R["identifier"] : never : never;
|
|
796
|
+
/** Owns resources across executions. Close it after its consumers have finished. */
|
|
797
|
+
interface ResultTaskScopeOwner {
|
|
798
|
+
readonly use: <A, E, R>(task: ResultTask<A, E, R>) => ResultTask<A, E, R>;
|
|
799
|
+
readonly close: (exit?: Exit<unknown, unknown>) => ResultTask<void, unknown>;
|
|
800
|
+
}
|
|
801
|
+
/** Options for running a `ResultTask` with an optional signal and its required services. */
|
|
802
|
+
type ResultTaskRunOptions<R = never> = {
|
|
803
|
+
readonly signal?: AbortSignal;
|
|
804
|
+
} & ([WithoutScope<R>] extends [never] ? {
|
|
805
|
+
readonly services?: never;
|
|
806
|
+
} : {
|
|
807
|
+
readonly services: ResultTaskServices<R>;
|
|
808
|
+
});
|
|
809
|
+
/** The object-shaped service environment required by a task. */
|
|
810
|
+
type ResultTaskServices<R> = { readonly [Tag in Extract<R, AnyServiceTag> as Tag["identifier"]]: ServiceForTag<Tag>; };
|
|
811
|
+
/** Options for creating a synchronous task with an explicit error boundary. */
|
|
812
|
+
interface ResultTaskTryOptions<A, E> {
|
|
813
|
+
readonly try: () => A;
|
|
814
|
+
readonly catch: (cause: unknown) => E;
|
|
815
|
+
}
|
|
816
|
+
/** Options for creating a lazy promise-producing task with an explicit error boundary. */
|
|
817
|
+
interface ResultTaskTryPromiseOptions<A, E> {
|
|
818
|
+
readonly try: (signal: AbortSignal) => PromiseLike<A>;
|
|
819
|
+
readonly catch: (cause: unknown) => E;
|
|
820
|
+
}
|
|
821
|
+
type AnyServiceTag = Pick<ServiceTag<string, unknown>, "_tag" | "identifier" | "key">;
|
|
822
|
+
type ServiceForTag<Tag> = Tag extends ServiceTag<string, infer Service> ? Service : never;
|
|
823
|
+
type WithoutServices<R> = Exclude<R, AnyServiceTag>;
|
|
824
|
+
interface ResultTaskYield<A, E, R> {
|
|
825
|
+
readonly [ResultTaskYieldTypeId]: typeof ResultTaskYieldTypeId;
|
|
826
|
+
readonly _tag: "ResultTask";
|
|
827
|
+
readonly task: ResultTask<A, E, R>;
|
|
828
|
+
}
|
|
829
|
+
interface ResultTaskServiceYield<Tag extends AnyServiceTag> {
|
|
830
|
+
readonly [ResultTaskYieldTypeId]: typeof ResultTaskYieldTypeId;
|
|
831
|
+
readonly _tag: "Service";
|
|
832
|
+
readonly tag: Tag;
|
|
833
|
+
}
|
|
834
|
+
type GeneratorError<Yield> = Yield extends {
|
|
835
|
+
readonly _tag: "ResultTask";
|
|
836
|
+
readonly task: infer Task;
|
|
837
|
+
} ? Task extends ResultTask<infer _A, infer E, infer _R> ? E : never : Yield extends {
|
|
838
|
+
readonly error: infer E;
|
|
839
|
+
readonly isErr: unknown;
|
|
840
|
+
} ? E : never;
|
|
841
|
+
type GeneratorRequirements<Yield> = Yield extends {
|
|
842
|
+
readonly _tag: "ResultTask";
|
|
843
|
+
readonly task: infer Task;
|
|
844
|
+
} ? Task extends ResultTask<infer _A, infer _E, infer R> ? R : never : Yield extends {
|
|
845
|
+
readonly _tag: "Service";
|
|
846
|
+
readonly tag: infer Tag;
|
|
847
|
+
} ? Tag : never;
|
|
848
|
+
type ResultTaskRunArguments<R> = [WithoutScope<R>] extends [never] ? [options?: ResultTaskRunOptions<R>] : [options: ResultTaskRunOptions<R>];
|
|
849
|
+
/** Returns true if a value is a nominal `ServiceTag`. */
|
|
850
|
+
declare const isServiceTag: (value: unknown) => value is ServiceTag<string, unknown>;
|
|
851
|
+
/** Returns true if a value is a `ResultTask` instance. */
|
|
852
|
+
declare const isResultTask: (value: unknown) => value is ResultTask<unknown, unknown, unknown>;
|
|
853
|
+
/** Creates a service tag that can be requested with `yield*` inside `ResultTask.gen`. */
|
|
854
|
+
declare const serviceTag: <Service, const Identifier extends string = string>(identifier: Identifier) => ServiceTag<Identifier, Service>;
|
|
855
|
+
interface ContinuationStep {
|
|
856
|
+
readonly current: ResultTask<unknown, unknown, unknown> | undefined;
|
|
857
|
+
readonly currentExit: Exit<unknown, unknown> | undefined;
|
|
858
|
+
}
|
|
859
|
+
/**
|
|
860
|
+
* A lazy, composable workflow that can succeed with `A` or fail with `E`.
|
|
861
|
+
*
|
|
862
|
+
* Constructing a `ResultTask` never runs its work. Use `runResult`, `runExit`, or `runPromise` at an
|
|
863
|
+
* explicit application boundary to execute it.
|
|
864
|
+
*/
|
|
865
|
+
interface ResultTask<out A, out E = never, out R = never> {
|
|
866
|
+
readonly [ResultTaskTypeId]: {
|
|
867
|
+
readonly success: (_: never) => A;
|
|
868
|
+
readonly error: (_: never) => E;
|
|
869
|
+
readonly requirements: (_: never) => R;
|
|
870
|
+
};
|
|
871
|
+
}
|
|
872
|
+
declare class ResultTask<out A, out E = never, out R = never> extends Pipeable {
|
|
873
|
+
private readonly typeWitness;
|
|
874
|
+
private readonly instruction;
|
|
875
|
+
private readonly execute;
|
|
876
|
+
private constructor();
|
|
877
|
+
/** @internal */
|
|
878
|
+
static toTapContinuationStep(res: unknown, onSuccess: () => ResultTask<unknown, unknown, unknown>, passThroughExit: Exit<unknown, unknown>): ContinuationStep;
|
|
879
|
+
private static runTaskLoop;
|
|
880
|
+
/** Creates a task that succeeds with `value` when it is executed. */
|
|
881
|
+
static succeed<A>(value: A): ResultTask<A, never>;
|
|
882
|
+
static succeed<A, E>(value: A): ResultTask<A, E>;
|
|
883
|
+
/** Creates a task that fails with `error` when it is executed. */
|
|
884
|
+
static fail<const E>(error: E): ResultTask<never, E>;
|
|
885
|
+
/** Lifts an already computed Result into a lazy task. */
|
|
886
|
+
static fromResult<A, E>(result: Result<A, E>): ResultTask<A, E>;
|
|
887
|
+
/** Creates a task for synchronous work. Thrown values are defects, not typed failures. */
|
|
888
|
+
static sync<A>(evaluate: () => A): ResultTask<A>;
|
|
889
|
+
/** Creates a task that maps synchronous throws into the typed error channel. */
|
|
890
|
+
static try<A, E>(options: ResultTaskTryOptions<A, E>): ResultTask<A, E>;
|
|
891
|
+
/** Creates a lazy task that preserves synchronous throws and promise rejections as unknown. */
|
|
892
|
+
static tryPromise<A>(run: (signal: AbortSignal) => PromiseLike<A>): ResultTask<A, unknown>;
|
|
893
|
+
/** Creates a lazy task that maps synchronous throws and promise rejections into `E`. */
|
|
894
|
+
static tryPromise<A, E>(options: ResultTaskTryPromiseOptions<A, E>): ResultTask<A, E>;
|
|
895
|
+
/**
|
|
896
|
+
* Acquires lazily and registers release in the current scope. Release failures remain in the
|
|
897
|
+
* scope requirement until `scoped` or a run boundary closes it; catchAll cannot erase them early.
|
|
898
|
+
*/
|
|
899
|
+
static acquireRelease<A, E, R, ReleaseError = never, ReleaseR = never>(options: ResultTaskAcquireReleaseOptions<A, E, R, ReleaseError, ReleaseR>): ResultTask<A, E, R | WithoutScope<ReleaseR> | ResultTaskScope<ReleaseError | ScopeError<ReleaseR>>>;
|
|
900
|
+
/** Closes a child scope before continuing, adding its deferred release errors to E. */
|
|
901
|
+
static scoped<A, E, R>(task: ResultTask<A, E, R>): ResultTask<A, E | ScopeError<R>, WithoutScope<R>>;
|
|
902
|
+
/** Creates a service tag that can be requested with `yield*` inside `ResultTask.gen`. */
|
|
903
|
+
static service<Service, const Identifier extends string>(identifier: Identifier): ServiceTag<Identifier, Service>;
|
|
904
|
+
/** Builds a task from a generator and short-circuits on the first failed task. */
|
|
905
|
+
static gen<Yield, Return, Next>(body: () => Generator<Yield, Return, Next>): ResultTask<Return, GeneratorError<Yield>, GeneratorRequirements<Yield>>;
|
|
906
|
+
/** Maps the success value without executing the task. */
|
|
907
|
+
map<B>(f: (value: A) => B): ResultTask<B, E, R>;
|
|
908
|
+
/** Chains another task from the success value without executing either task immediately. */
|
|
909
|
+
flatMap<B, E2, R2>(f: (value: A) => ResultTask<B, E2, R2>): ResultTask<B, E | E2, R | R2>;
|
|
910
|
+
/** Alias for `flatMap`, matching the existing Resultar vocabulary. */
|
|
911
|
+
andThen<B, E2, R2>(f: (value: A) => ResultTask<B, E2, R2>): ResultTask<B, E | E2, R | R2>;
|
|
912
|
+
/**
|
|
913
|
+
* Recovers a single typed failure. Composite causes become a Die(ResultTaskCauseError) so the
|
|
914
|
+
* removed E cannot escape through runExit; the original tree remains available on error.cause.
|
|
915
|
+
*/
|
|
916
|
+
catchAll<B, E2, R2>(f: (error: E) => ResultTask<B, E2, R2>): ResultTask<A | B, E2, R | R2>;
|
|
917
|
+
/** Maps the error value without executing the task. */
|
|
918
|
+
mapError<E2>(f: (error: E) => E2): ResultTask<A, E2, R>;
|
|
919
|
+
/**
|
|
920
|
+
* Executes a side effect on the success value without modifying it.
|
|
921
|
+
* If the callback returns a `ResultTask`, its requirements and errors are merged.
|
|
922
|
+
*/
|
|
923
|
+
tap<E2 = never, R2 = never>(f: (value: A) => ResultTask<unknown, E2, R2> | Promise<unknown> | void): ResultTask<A, E | E2, R | R2>;
|
|
924
|
+
/**
|
|
925
|
+
* Executes a side effect on the error value without modifying it.
|
|
926
|
+
* If the callback returns a `ResultTask`, its requirements and errors are merged.
|
|
927
|
+
*/
|
|
928
|
+
tapError<E2 = never, R2 = never>(f: (error: E) => ResultTask<unknown, E2, R2> | Promise<unknown> | void): ResultTask<A, E | E2, R | R2>;
|
|
929
|
+
/** Replaces the success value with a constant. */
|
|
930
|
+
as<B>(value: B): ResultTask<B, E, R>;
|
|
931
|
+
/**
|
|
932
|
+
* Transforms both success and failure cases into a single value type.
|
|
933
|
+
*/
|
|
934
|
+
match<B, C = B>(handlers: ResultTaskMatchOptions<A, E, B, C>): ResultTask<B | C, never, R>;
|
|
935
|
+
/** Converts this ResultTask into an eagerly started ResultAsync using the standard runtime. */
|
|
936
|
+
toResultAsync(this: ResultTask<A, E, never>): ResultAsync<A, E>;
|
|
937
|
+
/** Provides one required service and removes it from the task's requirements. */
|
|
938
|
+
provideService<Tag extends Extract<R, AnyServiceTag>>(tag: Tag, ...args: [service: ServiceForTag<Tag>]): ResultTask<A, E, Exclude<R, Tag>>;
|
|
939
|
+
/** Provides all requirements using an object keyed by service identifier. */
|
|
940
|
+
provideServices(services: ResultTaskServices<R>): ResultTask<A, E, Extract<R, ResultTaskScope<unknown>>>;
|
|
941
|
+
/** Provides a lazy resolver for service tags that are not already in the environment. */
|
|
942
|
+
provideServiceResolver<Resolvers extends ResultTaskServiceResolver<NoInfer<R>, unknown, unknown>>(resolvers: Resolvers): ResultTask<A, E | ResolverError<Resolvers>, WithoutServices<R> | ResolverRequirements<Resolvers>>;
|
|
943
|
+
/** Enables `yield* task` inside `ResultTask.gen` workflows. */
|
|
944
|
+
[Symbol.iterator](): Generator<ResultTaskYield<A, E, R>, A, Exit<A, E>>;
|
|
945
|
+
/** Provides one required service and removes it from the task's requirements. */
|
|
946
|
+
static provideService<A, E, R, Tag extends Extract<R, AnyServiceTag>>(task: ResultTask<A, E, R>, tag: Tag, service: ServiceForTag<Tag>): ResultTask<A, E, Exclude<R, Tag>>;
|
|
947
|
+
static provideService<Tag extends AnyServiceTag>(tag: Tag, service: ServiceForTag<Tag>): <A, E, R>(task: ResultTask<A, E, R>) => ResultTask<A, E, Exclude<R, Tag>>;
|
|
948
|
+
/** Provides a lazy resolver for service tags that are not already in the environment. */
|
|
949
|
+
static provideServiceResolver<A, E, R, Resolvers extends ResultTaskServiceResolver<NoInfer<R>, unknown, unknown>>(task: ResultTask<A, E, R>, resolvers: Resolvers): ResultTask<A, E | ResolverError<Resolvers>, WithoutServices<R> | ResolverRequirements<Resolvers>>;
|
|
950
|
+
static provideServiceResolver<const Resolvers extends Readonly<Record<string, () => ResultTask<unknown, unknown, unknown>>>>(resolvers: Resolvers): <A, E, R>(task: [IncompatibleResolvedServices<R, Resolvers>] extends [never] ? ResultTask<A, E, R> : never) => ResultTask<A, E | ResolverError<Resolvers>, EliminateResolvedServices<R, Resolvers> | ResolverRequirements<Resolvers>>;
|
|
951
|
+
/** Shares one in-flight execution and successful value. Failed executions can be retried. */
|
|
952
|
+
static memoize<A, E, R>(task: ResultTask<A, E, R>): ResultTask<A, E, R>;
|
|
953
|
+
/** Creates an explicit resource owner for adapters that manage long-lived scopes. */
|
|
954
|
+
static makeScope(): ResultTaskScopeOwner;
|
|
955
|
+
/** Provides all requirements using an object keyed by service identifier. */
|
|
956
|
+
static provideServices<A, E, R>(task: ResultTask<A, E, R>, services: ResultTaskServices<R>): ResultTask<A, E, Extract<R, ResultTaskScope<unknown>>>;
|
|
957
|
+
static provideServices<const Services extends Readonly<Record<string, unknown>>>(services: Services): <A, E, R>(task: [IncompatibleProvidedServices<R, Services>] extends [never] ? ResultTask<A, E, R> : never) => ResultTask<A, E, EliminateProvidedServices<R, Services>>;
|
|
958
|
+
/** Maps the success value using the canonical functional form or curried for `pipe`. */
|
|
959
|
+
static map<A, E, R, B>(task: ResultTask<A, E, R>, f: (value: A) => B): ResultTask<B, E, R>;
|
|
960
|
+
static map<A, B>(f: (value: A) => B): <E, R>(task: ResultTask<A, E, R>) => ResultTask<B, E, R>;
|
|
961
|
+
/** Maps the error value using the canonical functional form or curried for `pipe`. */
|
|
962
|
+
static mapError<A, E, R, E2>(task: ResultTask<A, E, R>, f: (error: E) => E2): ResultTask<A, E2, R>;
|
|
963
|
+
static mapError<E, E2>(f: (error: E) => E2): <A, R>(task: ResultTask<A, E, R>) => ResultTask<A, E2, R>;
|
|
964
|
+
/** Chains a task using the canonical functional form or curried for `pipe`. */
|
|
965
|
+
static flatMap<A, E, R, B, E2, R2>(task: ResultTask<A, E, R>, f: (value: A) => ResultTask<B, E2, R2>): ResultTask<B, E | E2, R | R2>;
|
|
966
|
+
static flatMap<A, B, E2, R2>(f: (value: A) => ResultTask<B, E2, R2>): <E, R>(task: ResultTask<A, E, R>) => ResultTask<B, E | E2, R | R2>;
|
|
967
|
+
/** Alias for `flatMap`, matching the existing Resultar vocabulary. */
|
|
968
|
+
static andThen<A, E, R, B, E2, R2>(task: ResultTask<A, E, R>, f: (value: A) => ResultTask<B, E2, R2>): ResultTask<B, E | E2, R | R2>;
|
|
969
|
+
static andThen<A, B, E2, R2>(f: (value: A) => ResultTask<B, E2, R2>): <E, R>(task: ResultTask<A, E, R>) => ResultTask<B, E | E2, R | R2>;
|
|
970
|
+
/** Recovers from a typed failure using the canonical functional form or curried for `pipe`. */
|
|
971
|
+
static catchAll<A, E, R, B, E2, R2>(task: ResultTask<A, E, R>, f: (error: E) => ResultTask<B, E2, R2>): ResultTask<A | B, E2, R | R2>;
|
|
972
|
+
static catchAll<E, B, E2, R2>(f: (error: E) => ResultTask<B, E2, R2>): <A, R>(task: ResultTask<A, E, R>) => ResultTask<A | B, E2, R | R2>;
|
|
973
|
+
/** Executes a side effect on the success value using the canonical functional form or curried for `pipe`. */
|
|
974
|
+
static tap<A, E, R, E2 = never, R2 = never>(task: ResultTask<A, E, R>, f: (value: A) => ResultTask<unknown, E2, R2> | Promise<unknown> | void): ResultTask<A, E | E2, R | R2>;
|
|
975
|
+
static tap<A, E2 = never, R2 = never>(f: (value: A) => ResultTask<unknown, E2, R2> | Promise<unknown> | void): <E, R>(task: ResultTask<A, E, R>) => ResultTask<A, E | E2, R | R2>;
|
|
976
|
+
/** Executes a side effect on the error value using the canonical functional form or curried for `pipe`. */
|
|
977
|
+
static tapError<A, E, R, E2 = never, R2 = never>(task: ResultTask<A, E, R>, f: (error: E) => ResultTask<unknown, E2, R2> | Promise<unknown> | void): ResultTask<A, E | E2, R | R2>;
|
|
978
|
+
static tapError<E, E2 = never, R2 = never>(f: (error: E) => ResultTask<unknown, E2, R2> | Promise<unknown> | void): <A, R>(task: ResultTask<A, E, R>) => ResultTask<A, E | E2, R | R2>;
|
|
979
|
+
/** Replaces the success value with a constant using the canonical functional form or curried for `pipe`. */
|
|
980
|
+
static as<A, E, R, B>(task: ResultTask<A, E, R>, value: B): ResultTask<B, E, R>;
|
|
981
|
+
static as<B>(value: B): <A, E, R>(task: ResultTask<A, E, R>) => ResultTask<B, E, R>;
|
|
982
|
+
/** Matches both success and error cases using the canonical functional form or curried for `pipe`. */
|
|
983
|
+
static match<A, E, R, B, C = B>(task: ResultTask<A, E, R>, handlers: ResultTaskMatchOptions<A, E, B, C>): ResultTask<B | C, never, R>;
|
|
984
|
+
static match<A, E, B, C = B>(handlers: ResultTaskMatchOptions<A, E, B, C>): <R>(task: ResultTask<A, E, R>) => ResultTask<B | C, never, R>;
|
|
985
|
+
/**
|
|
986
|
+
* Eagerly executes a ResultTask using the standard runtime and returns a ResultAsync.
|
|
987
|
+
*/
|
|
988
|
+
static toResultAsync<A, E>(task: ResultTask<A, E, never>): ResultAsync<A, E>;
|
|
989
|
+
/**
|
|
990
|
+
* Captures an existing ResultAsync or creates a lazy task from a ResultAsync factory.
|
|
991
|
+
*/
|
|
992
|
+
static fromResultAsync<A, E>(asyncResultOrFactory: ResultAsync<A, E> | ((signal: AbortSignal) => ResultAsync<A, E>)): ResultTask<A, E>;
|
|
993
|
+
private static runExitInternal;
|
|
994
|
+
private static runResultInternal;
|
|
995
|
+
/** Runs a task and preserves success, typed failure, and runtime defects in an `Exit`. */
|
|
996
|
+
static runExit<A, E>(task: ResultTask<A, E, never>): Promise<Exit<A, E>>;
|
|
997
|
+
static runExit<A, E, R>(task: ResultTask<A, E, R>, ...args: ResultTaskRunArguments<R>): Promise<Exit<A, E | ScopeError<R>>>;
|
|
998
|
+
/** Returns single typed failures as Err; rejects defects, interruption, and composite causes. */
|
|
999
|
+
static runResult<A, E>(task: ResultTask<A, E, never>): Promise<Result<A, E>>;
|
|
1000
|
+
static runResult<A, E, R>(task: ResultTask<A, E, R>, ...args: ResultTaskRunArguments<R>): Promise<Result<A, E | ScopeError<R>>>;
|
|
1001
|
+
/** Runs a task and returns the success value, rejecting on typed failures or defects. */
|
|
1002
|
+
static runPromise<A, E>(task: ResultTask<A, E, never>): Promise<A>;
|
|
1003
|
+
static runPromise<A, E, R>(task: ResultTask<A, E, R>, ...args: ResultTaskRunArguments<R>): Promise<A>;
|
|
1004
|
+
}
|
|
1005
|
+
//#endregion
|
|
714
1006
|
//#region src/result-async.d.ts
|
|
715
1007
|
type ResultAsyncFinalizer<T, E> = (value: T | undefined, error: E | undefined) => void | Promise<void>;
|
|
716
1008
|
/**
|
|
@@ -1126,6 +1418,10 @@ declare class ResultAsync<T, E> extends Pipeable implements PromiseLike<Result<T
|
|
|
1126
1418
|
* @return {ResultAsync<T, E>} A ResultAsync instance with the given promise and error type E.
|
|
1127
1419
|
*/
|
|
1128
1420
|
static fromSafePromise<T, E = never>(this: void, promise: PromiseLike<T>): ResultAsync<T, E>;
|
|
1421
|
+
/**
|
|
1422
|
+
* Eagerly executes a ResultTask using the standard runtime and wraps it in a ResultAsync.
|
|
1423
|
+
*/
|
|
1424
|
+
static fromTask<T, E>(this: void, task: ResultTask<T, E, never>): ResultAsync<T, E>;
|
|
1129
1425
|
/**
|
|
1130
1426
|
* Returns a ResultAsync instance that is resolved with a Result.ok(value) or Result.err(error)
|
|
1131
1427
|
* based on the provided promise.
|
|
@@ -1531,128 +1827,6 @@ declare const isRedacted: (value: unknown) => value is Redacted<unknown>;
|
|
|
1531
1827
|
*/
|
|
1532
1828
|
declare const revealRedacted: <T>(value: Redacted<T>) => T;
|
|
1533
1829
|
//#endregion
|
|
1534
|
-
//#region src/result-task.d.ts
|
|
1535
|
-
/** A failure cause produced by a `ResultTask` execution. */
|
|
1536
|
-
type Cause<E> = {
|
|
1537
|
-
readonly _tag: "Fail";
|
|
1538
|
-
readonly error: E;
|
|
1539
|
-
} | {
|
|
1540
|
-
readonly _tag: "Die";
|
|
1541
|
-
readonly defect: unknown;
|
|
1542
|
-
};
|
|
1543
|
-
/** The complete outcome of a `ResultTask` execution. */
|
|
1544
|
-
type Exit<A, E> = {
|
|
1545
|
-
readonly _tag: "Success";
|
|
1546
|
-
readonly value: A;
|
|
1547
|
-
} | {
|
|
1548
|
-
readonly _tag: "Failure";
|
|
1549
|
-
readonly cause: Cause<E>;
|
|
1550
|
-
};
|
|
1551
|
-
/** A service that can be requested from a `ResultTask.gen` workflow. */
|
|
1552
|
-
interface ServiceTag<Identifier extends string, Service> {
|
|
1553
|
-
readonly _tag: "ServiceTag";
|
|
1554
|
-
readonly identifier: Identifier;
|
|
1555
|
-
readonly key: symbol;
|
|
1556
|
-
readonly [Symbol.iterator]: () => Generator<ResultTaskServiceYield<ServiceTag<Identifier, Service>>, Service, Service>;
|
|
1557
|
-
}
|
|
1558
|
-
/** Options for running a `ResultTask` with an optional signal and its required services. */
|
|
1559
|
-
type ResultTaskRunOptions<R = never> = {
|
|
1560
|
-
readonly signal?: AbortSignal;
|
|
1561
|
-
} & ([R] extends [never] ? {
|
|
1562
|
-
readonly services?: never;
|
|
1563
|
-
} : {
|
|
1564
|
-
readonly services: ResultTaskServices<R>;
|
|
1565
|
-
});
|
|
1566
|
-
/** The object-shaped service environment required by a task. */
|
|
1567
|
-
type ResultTaskServices<R> = { readonly [Tag in Extract<R, AnyServiceTag> as Tag["identifier"]]: ServiceForTag<Tag>; };
|
|
1568
|
-
/** Options for creating a synchronous task with an explicit error boundary. */
|
|
1569
|
-
interface ResultTaskTryOptions<A, E> {
|
|
1570
|
-
readonly try: () => A;
|
|
1571
|
-
readonly catch: (cause: unknown) => E;
|
|
1572
|
-
}
|
|
1573
|
-
/** Options for creating a lazy promise-producing task with an explicit error boundary. */
|
|
1574
|
-
interface ResultTaskTryPromiseOptions<A, E> {
|
|
1575
|
-
readonly try: (signal: AbortSignal) => PromiseLike<A>;
|
|
1576
|
-
readonly catch: (cause: unknown) => E;
|
|
1577
|
-
}
|
|
1578
|
-
type AnyServiceTag = Pick<ServiceTag<string, unknown>, "_tag" | "identifier" | "key">;
|
|
1579
|
-
type ServiceForTag<Tag> = Tag extends ServiceTag<string, infer Service> ? Service : never;
|
|
1580
|
-
interface ResultTaskYield<A, E, R> {
|
|
1581
|
-
readonly _tag: "ResultTask";
|
|
1582
|
-
readonly task: ResultTask<A, E, R>;
|
|
1583
|
-
}
|
|
1584
|
-
interface ResultTaskServiceYield<Tag extends AnyServiceTag> {
|
|
1585
|
-
readonly _tag: "Service";
|
|
1586
|
-
readonly tag: Tag;
|
|
1587
|
-
}
|
|
1588
|
-
type GeneratorError<Yield> = Yield extends {
|
|
1589
|
-
readonly _tag: "ResultTask";
|
|
1590
|
-
readonly task: infer Task;
|
|
1591
|
-
} ? Task extends ResultTask<infer _A, infer E, infer _R> ? E : never : never;
|
|
1592
|
-
type GeneratorRequirements<Yield> = Yield extends {
|
|
1593
|
-
readonly _tag: "ResultTask";
|
|
1594
|
-
readonly task: infer Task;
|
|
1595
|
-
} ? Task extends ResultTask<infer _A, infer _E, infer R> ? R : never : Yield extends {
|
|
1596
|
-
readonly _tag: "Service";
|
|
1597
|
-
readonly tag: infer Tag;
|
|
1598
|
-
} ? Tag : never;
|
|
1599
|
-
type ResultTaskRunArguments<R> = [R] extends [never] ? [options?: ResultTaskRunOptions<R>] : [options: ResultTaskRunOptions<R>];
|
|
1600
|
-
/**
|
|
1601
|
-
* A lazy, composable workflow that can succeed with `A` or fail with `E`.
|
|
1602
|
-
*
|
|
1603
|
-
* Constructing a `ResultTask` never runs its work. Use `runResult`, `runExit`, or `runPromise` at an
|
|
1604
|
-
* explicit application boundary to execute it.
|
|
1605
|
-
*/
|
|
1606
|
-
declare class ResultTask<A, E = never, R = never> extends Pipeable {
|
|
1607
|
-
private readonly execute;
|
|
1608
|
-
private constructor();
|
|
1609
|
-
private readonly typeWitness;
|
|
1610
|
-
/** Creates a task that succeeds with `value` when it is executed. */
|
|
1611
|
-
static succeed<A, E = never>(value: A): ResultTask<A, E>;
|
|
1612
|
-
/** Creates a task that fails with `error` when it is executed. */
|
|
1613
|
-
static fail<const E>(error: E): ResultTask<never, E>;
|
|
1614
|
-
/** Lifts an already computed Result into a lazy task. */
|
|
1615
|
-
static fromResult<A, E>(result: Result<A, E>): ResultTask<A, E>;
|
|
1616
|
-
/** Creates a task for synchronous work. Thrown values are defects, not typed failures. */
|
|
1617
|
-
static sync<A>(evaluate: () => A): ResultTask<A>;
|
|
1618
|
-
/** Creates a task that maps synchronous throws into the typed error channel. */
|
|
1619
|
-
static try<A, E>(options: ResultTaskTryOptions<A, E>): ResultTask<A, E>;
|
|
1620
|
-
/** Creates a lazy task that maps synchronous throws and promise rejections into `E`. */
|
|
1621
|
-
static tryPromise<A, E>(options: ResultTaskTryPromiseOptions<A, E>): ResultTask<A, E>;
|
|
1622
|
-
/** Creates a service tag that can be requested with `yield*` inside `ResultTask.gen`. */
|
|
1623
|
-
static service<Service, const Identifier extends string>(identifier: Identifier): ServiceTag<Identifier, Service>;
|
|
1624
|
-
/** Builds a task from a generator and short-circuits on the first failed task. */
|
|
1625
|
-
static gen<Yield, Return, Next>(body: () => Generator<Yield, Return, Next>): ResultTask<Return, GeneratorError<Yield>, GeneratorRequirements<Yield>>;
|
|
1626
|
-
/** Maps the success value without executing the task. */
|
|
1627
|
-
map<B>(f: (value: A) => B): ResultTask<B, E, R>;
|
|
1628
|
-
/** Chains another task from the success value without executing either task immediately. */
|
|
1629
|
-
flatMap<B, E2, R2>(f: (value: A) => ResultTask<B, E2, R2>): ResultTask<B, E | E2, R | R2>;
|
|
1630
|
-
/** Alias for `flatMap`, matching the existing Resultar vocabulary. */
|
|
1631
|
-
andThen<B, E2, R2>(f: (value: A) => ResultTask<B, E2, R2>): ResultTask<B, E | E2, R | R2>;
|
|
1632
|
-
/** Recovers from a typed failure without recovering from a runtime defect. */
|
|
1633
|
-
catchAll<B, E2, R2>(f: (error: E) => ResultTask<B, E2, R2>): ResultTask<A | B, E2, R | R2>;
|
|
1634
|
-
/** Enables `yield* task` inside `ResultTask.gen` workflows. */
|
|
1635
|
-
[Symbol.iterator](): Generator<ResultTaskYield<A, E, R>, A, Exit<A, E>>;
|
|
1636
|
-
/** Provides one required service and removes it from the task's requirements. */
|
|
1637
|
-
static provideService<A, E, R, Tag extends Extract<R, AnyServiceTag>>(task: ResultTask<A, E, R>, tag: Tag, service: ServiceForTag<Tag>): ResultTask<A, E, Exclude<R, Tag>>;
|
|
1638
|
-
/** Provides all requirements using an object keyed by service identifier. */
|
|
1639
|
-
static provideServices<A, E, R>(task: ResultTask<A, E, R>, services: ResultTaskServices<R>): ResultTask<A, E>;
|
|
1640
|
-
/** Maps the success value using the canonical functional form. */
|
|
1641
|
-
static map<A, E, R, B>(task: ResultTask<A, E, R>, f: (value: A) => B): ResultTask<B, E, R>;
|
|
1642
|
-
/** Chains a task using the canonical functional form. */
|
|
1643
|
-
static flatMap<A, E, R, B, E2, R2>(task: ResultTask<A, E, R>, f: (value: A) => ResultTask<B, E2, R2>): ResultTask<B, E | E2, R | R2>;
|
|
1644
|
-
/** Recovers from a typed failure using the canonical functional form. */
|
|
1645
|
-
static catchAll<A, E, R, B, E2, R2>(task: ResultTask<A, E, R>, f: (error: E) => ResultTask<B, E2, R2>): ResultTask<A | B, E2, R | R2>;
|
|
1646
|
-
private static runExitInternal;
|
|
1647
|
-
private static runResultInternal;
|
|
1648
|
-
/** Runs a task and preserves success, typed failure, and runtime defects in an `Exit`. */
|
|
1649
|
-
static runExit<A, E, R>(task: ResultTask<A, E, R>, ...args: ResultTaskRunArguments<R>): Promise<Exit<A, E>>;
|
|
1650
|
-
/** Runs a task and returns a Result, rejecting only when a runtime defect occurs. */
|
|
1651
|
-
static runResult<A, E, R>(task: ResultTask<A, E, R>, ...args: ResultTaskRunArguments<R>): Promise<Result<A, E>>;
|
|
1652
|
-
/** Runs a task and returns the success value, rejecting on typed failures or defects. */
|
|
1653
|
-
static runPromise<A, E, R>(task: ResultTask<A, E, R>, ...args: ResultTaskRunArguments<R>): Promise<A>;
|
|
1654
|
-
}
|
|
1655
|
-
//#endregion
|
|
1656
1830
|
//#region src/tagged-error.d.ts
|
|
1657
1831
|
type Alpha = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" | "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" | "_";
|
|
1658
1832
|
type Digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
|
|
@@ -1817,4 +1991,4 @@ declare const matchError: <ErrorType extends Error, ReturnType>(error: ErrorType
|
|
|
1817
1991
|
*/
|
|
1818
1992
|
declare const matchErrorPartial: <ErrorType extends Error, ReturnType>(error: ErrorType, handlers: PartialMatchHandlers<ErrorType, ReturnType>, fallback: (error: ErrorType) => ReturnType) => ReturnType;
|
|
1819
1993
|
//#endregion
|
|
1820
|
-
export { AbortError, type Cause, DisposableResult, DisposableResultAsync, type ErrResult, type Exit, type OkResult, type Redacted, Result, ResultAsync, type ResultAsyncAbortSignal, type ResultAsyncCallbackCleanup, type ResultAsyncCallbackContext, type ResultAsyncConcurrency, type ResultAsyncFromCallbackOptions, type ResultAsyncRaceHandle, type ResultAsyncRaceTask, type ResultAsyncResourceAcquire, type ResultAsyncResourceEffect, type ResultAsyncResourceRelease, type ResultAsyncResourceReleaseContext, type ResultAsyncResourceUse, type ResultAsyncRetryContext, type ResultAsyncRetryOptions, type ResultAsyncRetryOrElseOptions, type ResultAsyncRetryTask, type ResultAsyncTimeoutOptions, type ResultAsyncWithResourceOptions, type ResultOperations, ResultTask, type ResultTaskRunOptions, type ResultTaskServices, type ResultTaskTryOptions, type ResultTaskTryPromiseOptions, type SafeTryAsyncOptions, type SafeTryOptions, type ServiceTag, type StrictResult, type StrictResultAsync, type TaggedEnum, type TaggedEnumFactory, type TaggedErrorClass, type TaggedErrorInstance, type TaggedErrorOptions, type TryResultAsyncOptions, type TryResultOptions, createTaggedError, tryResult as default, tryResult as try, tryResult, err, errAsync, findCause, fromCallback, fromPromise, fromSafePromise, fromThrowable, fromThrowableAsync, isAbortError, isError, isRedacted, matchError, matchErrorPartial, ok, okAsync, redact, revealRedacted, runPromise, runSync, safeTry, taggedEnum, tryResultAsync as tryAsync, tryResultAsync, tryCatch, tryCatchAsync, unit, unitAsync };
|
|
1994
|
+
export { AbortError, type Cause, DisposableResult, DisposableResultAsync, type ErrResult, type Exit, MissingServiceError, type OkResult, type Redacted, Result, ResultAsync, type ResultAsyncAbortSignal, type ResultAsyncCallbackCleanup, type ResultAsyncCallbackContext, type ResultAsyncConcurrency, type ResultAsyncFromCallbackOptions, type ResultAsyncRaceHandle, type ResultAsyncRaceTask, type ResultAsyncResourceAcquire, type ResultAsyncResourceEffect, type ResultAsyncResourceRelease, type ResultAsyncResourceReleaseContext, type ResultAsyncResourceUse, type ResultAsyncRetryContext, type ResultAsyncRetryOptions, type ResultAsyncRetryOrElseOptions, type ResultAsyncRetryTask, type ResultAsyncTimeoutOptions, type ResultAsyncWithResourceOptions, type ResultOperations, ResultTask, type ResultTaskAcquireReleaseOptions, ResultTaskCauseError, type ResultTaskMatchOptions, type ResultTaskRunOptions, type ResultTaskScope, type ResultTaskScopeOwner, type ResultTaskServiceResolver, type ResultTaskServices, type ResultTaskTryOptions, type ResultTaskTryPromiseOptions, ResultTaskTypeId, ResultTaskYieldTypeId, type SafeTryAsyncOptions, type SafeTryOptions, type ServiceTag, ServiceTagTypeId, type StrictResult, type StrictResultAsync, type TaggedEnum, type TaggedEnumFactory, type TaggedErrorClass, type TaggedErrorInstance, type TaggedErrorOptions, type TryResultAsyncOptions, type TryResultOptions, createTaggedError, tryResult as default, tryResult as try, tryResult, err, errAsync, findCause, fromCallback, fromPromise, fromSafePromise, fromThrowable, fromThrowableAsync, isAbortError, isError, isRedacted, isResultTask, isServiceTag, matchError, matchErrorPartial, ok, okAsync, redact, revealRedacted, runPromise, runSync, safeTry, serviceTag, taggedEnum, tryResultAsync as tryAsync, tryResultAsync, tryCatch, tryCatchAsync, unit, unitAsync };
|