@oscarpalmer/atoms 0.212.0 → 0.213.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.
@@ -1,4 +1,3 @@
1
- import "../internal/subscription.mjs";
2
1
  import { herald } from "../internal/herald.mjs";
3
2
  import { COLOR_NAME, COLOR_PROPERTY, COLOR_SYMBOL, COLOR_TYPE, colorSubscription } from "./constants.mjs";
4
3
  import { getColorAlpha, setColorAlpha } from "./misc/alpha.mjs";
package/dist/index.d.mts CHANGED
@@ -63,7 +63,7 @@ type _NestedValue<Value, Path extends string> = Path extends `${infer ItemKey}.$
63
63
  /**
64
64
  * The nested _(keyed)_ values of an object _(up to 5 levels deep)_
65
65
  */
66
- export type NestedValues<Value extends PlainObject> = { [Path in NestedKeys<Value>]: NestedValue<Value, Path>; };
66
+ export type NestedValues<Value extends PlainObject> = Simplify<{ [Path in NestedKeys<Value>]: NestedValue<Value, Path>; }>;
67
67
  /**
68
68
  * The numerical keys of an object
69
69
  */
@@ -71,7 +71,7 @@ export type NumericalKeys<Value> = { [ItemKey in keyof Value]: ItemKey extends n
71
71
  /**
72
72
  * The numerical values of an object
73
73
  */
74
- export type NumericalValues<Item extends PlainObject> = { [ItemKey in keyof Item as Item[ItemKey] extends number ? ItemKey : never]: Item[ItemKey]; };
74
+ export type NumericalValues<Item extends PlainObject> = Simplify<{ [ItemKey in keyof Item as Item[ItemKey] extends number ? ItemKey : never]: Item[ItemKey]; }>;
75
75
  /**
76
76
  * An asynchronous function that can only be called once, returning the same value on subsequent calls
77
77
  */
@@ -131,7 +131,7 @@ export type Primitive = null | undefined | string | number | boolean | symbol |
131
131
  /**
132
132
  * Set required keys for a type
133
133
  */
134
- export type RequiredKeys<Model extends object, Keys extends keyof Model> = Required<Pick<Model, Keys>> & Omit<Model, Keys>;
134
+ export type RequiredKeys<Model extends object, Keys extends keyof Model> = Simplify<Required<Pick<Model, Keys>> & Omit<Model, Keys>>;
135
135
  /**
136
136
  * Flattens the type to improve type hints in IDEs
137
137
  *
@@ -4597,22 +4597,22 @@ type AsyncPlan<Yielded, Returned, Parameters extends unknown[]> = {
4597
4597
  *
4598
4598
  * @returns Asynchronous generator
4599
4599
  */
4600
- [Symbol.asyncIterator]: () => AsyncGenerator<Yielded, Returned, unknown>;
4600
+ [Symbol.asyncIterator]: (...parameters: Parameters) => AsyncGenerator<Yielded, Returned>;
4601
4601
  /**
4602
4602
  * Attempt to run the plan to completion
4603
4603
  *
4604
4604
  * _Returns a promised {@link Result} instead of a raw value or throwing an error_
4605
4605
  *
4606
- * @returns Promised result
4606
+ * @returns Attempted result
4607
4607
  */
4608
- attempt(...parameters: Parameters): Promise<Result<PlanResult<Returned>, PlanError<Yielded, Returned>>>;
4608
+ attempt(...parameters: Parameters): Promise<Result<PlanOk<Returned>, PlanError<Yielded, Returned>>>;
4609
4609
  /**
4610
4610
  * Run the plan to completion
4611
4611
  *
4612
4612
  * @throws {PlanError<Yielded, Returned>}
4613
4613
  * @returns Result
4614
4614
  */
4615
- run(...parameters: Parameters): Promise<PlanResult<Returned>>;
4615
+ run(...parameters: Parameters): Promise<PlanReturned<Returned>>;
4616
4616
  };
4617
4617
  /**
4618
4618
  * A plan of execution that can yield intermediate results and eventually return a result
@@ -4623,26 +4623,28 @@ type Plan<Yielded, Returned, Parameters extends unknown[]> = {
4623
4623
  *
4624
4624
  * @returns Generator
4625
4625
  */
4626
- [Symbol.iterator]: () => Generator<Yielded, Returned, unknown>;
4626
+ [Symbol.iterator]: (...parameters: Parameters) => Generator<Yielded, Returned>;
4627
4627
  /**
4628
4628
  * Attempt to run the plan to completion
4629
4629
  *
4630
4630
  * _Returns a {@link Result} instead of a raw value or throwing an error_
4631
4631
  *
4632
- * @returns Result
4632
+ * @returns Attempted result
4633
4633
  */
4634
- attempt(...parameters: Parameters): Result<PlanResult<Returned>, PlanError<Yielded, Returned>>;
4634
+ attempt(...parameters: Parameters): Result<PlanOk<Returned>, PlanError<Yielded, Returned>>;
4635
4635
  /**
4636
4636
  * Run the plan to completion
4637
4637
  *
4638
4638
  * @throws {PlanError<Yielded, Returned>}
4639
4639
  * @returns Result
4640
4640
  */
4641
- run(...parameters: Parameters): PlanResult<Returned>;
4641
+ run(...parameters: Parameters): PlanReturned<Returned>;
4642
4642
  };
4643
- type PlanErrorValues<Original> = Original extends Error ? Original : Original extends Err<infer Error> ? Error : Original extends Result<infer _, infer Error> ? Error : never;
4644
- type PlanError<Yielded, Returned> = PlanErrorValues<Yielded> | PlanErrorValues<Returned> | Error;
4645
- type PlanResult<Returned> = Returned extends Error ? never : Returned extends Err<infer _> ? never : Returned extends Ok<infer Value> ? Value : Returned extends Result<infer Value, infer _> ? Value : Returned;
4643
+ type PlanOk<Returned> = Returned extends Error ? never : Returned extends Err<infer _> ? never : Returned extends Ok<infer Value> ? Value : Returned;
4644
+ type PlanErrors<Yielded, Returned> = PlanErrorValues<Yielded> | PlanErrorValues<Returned>;
4645
+ type PlanError<Yielded, Returned> = [PlanErrors<Yielded, Returned>] extends [never] ? Error : PlanErrors<Yielded, Returned>;
4646
+ type PlanErrorValues<Original> = Original extends Error ? Original : Original extends Err<infer Error> ? Error : never;
4647
+ type PlanReturned<Returned> = Returned extends Error ? never : Returned extends Err<infer _> ? never : Returned;
4646
4648
  //#endregion
4647
4649
  //#region src/plan/result.d.ts
4648
4650
  /**
@@ -4652,7 +4654,7 @@ type PlanResult<Returned> = Returned extends Error ? never : Returned extends Er
4652
4654
  *
4653
4655
  * @returns Promised result
4654
4656
  */
4655
- export declare function asyncAttemptRun<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => AsyncGenerator<Yielded, Returned, unknown>, ...parameters: Parameters): Promise<Result<PlanResult<Returned>, PlanError<Yielded, Returned>>>;
4657
+ export declare function asyncAttemptRun<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => AsyncGenerator<Yielded, Returned>, ...parameters: Parameters): Promise<Result<PlanOk<Returned>, PlanError<Yielded, Returned>>>;
4656
4658
  /**
4657
4659
  * Attempt to run the plan to completion
4658
4660
  *
@@ -4660,7 +4662,7 @@ export declare function asyncAttemptRun<Yielded, Returned, Parameters extends un
4660
4662
  *
4661
4663
  * @returns Promised result
4662
4664
  */
4663
- export declare function asyncAttemptRun<Yielded, Returned, Parameters extends unknown[]>(plan: AsyncPlan<Yielded, Returned, Parameters>, ...parameters: Parameters): Promise<Result<PlanResult<Returned>, PlanError<Yielded, Returned>>>;
4665
+ export declare function asyncAttemptRun<Yielded, Returned, Parameters extends unknown[]>(plan: AsyncPlan<Yielded, Returned, Parameters>, ...parameters: Parameters): Promise<Result<PlanOk<Returned>, PlanError<Yielded, Returned>>>;
4664
4666
  /**
4665
4667
  * Attempt to run the generator to completion
4666
4668
  *
@@ -4668,7 +4670,7 @@ export declare function asyncAttemptRun<Yielded, Returned, Parameters extends un
4668
4670
  *
4669
4671
  * @returns Result
4670
4672
  */
4671
- export declare function attemptRun<Yielded, Returned>(generator: () => Generator<Yielded, Returned, unknown>, ...parameters: Parameters<typeof generator>): Result<PlanResult<Returned>, PlanError<Yielded, Returned>>;
4673
+ export declare function attemptRun<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => Generator<Yielded, Returned>, ...parameters: Parameters): Result<PlanOk<Returned>, PlanError<Yielded, Returned>>;
4672
4674
  /**
4673
4675
  * Attempt to run the plan to completion
4674
4676
  *
@@ -4676,7 +4678,7 @@ export declare function attemptRun<Yielded, Returned>(generator: () => Generator
4676
4678
  *
4677
4679
  * @returns Result
4678
4680
  */
4679
- export declare function attemptRun<Yielded, Returned, Parameters extends unknown[]>(plan: Plan<Yielded, Returned, Parameters>, ...parameters: Parameters): Result<PlanResult<Returned>, PlanError<Yielded, Returned>>;
4681
+ export declare function attemptRun<Yielded, Returned, Parameters extends unknown[]>(plan: Plan<Yielded, Returned, Parameters>, ...parameters: Parameters): Result<PlanOk<Returned>, PlanError<Yielded, Returned>>;
4680
4682
  export declare namespace attemptRun {
4681
4683
  export var async: typeof asyncAttemptRun;
4682
4684
  }
@@ -4688,28 +4690,28 @@ export declare namespace attemptRun {
4688
4690
  * @param generator Generator to run
4689
4691
  * @returns Result
4690
4692
  */
4691
- export declare function asyncRun<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => AsyncGenerator<Yielded, Returned, unknown>, ...parameters: Parameters): Promise<PlanResult<Returned>>;
4693
+ export declare function asyncRun<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => AsyncGenerator<Yielded, Returned>, ...parameters: Parameters): Promise<PlanReturned<Returned>>;
4692
4694
  /**
4693
4695
  * Run an asynchronous plan to completion
4694
4696
  *
4695
4697
  * @param plan Plan to run
4696
4698
  * @returns Result
4697
4699
  */
4698
- export declare function asyncRun<Yielded, Returned, Parameters extends unknown[]>(plan: AsyncPlan<Yielded, Returned, Parameters>, ...parameters: Parameters): Promise<PlanResult<Returned>>;
4700
+ export declare function asyncRun<Yielded, Returned, Parameters extends unknown[]>(plan: AsyncPlan<Yielded, Returned, Parameters>, ...parameters: Parameters): Promise<PlanReturned<Returned>>;
4699
4701
  /**
4700
4702
  * Run a generator to completion
4701
4703
  *
4702
4704
  * @param generator Generator to run
4703
4705
  * @returns Result
4704
4706
  */
4705
- export declare function run<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => Generator<Yielded, Returned, unknown>, ...parameters: Parameters): PlanResult<Returned> | PlanError<Yielded, Returned>;
4707
+ export declare function run<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => Generator<Yielded, Returned>, ...parameters: Parameters): PlanReturned<Returned>;
4706
4708
  /**
4707
4709
  * Run a plan to completion
4708
4710
  *
4709
4711
  * @param plan Plan to run
4710
4712
  * @returns Result
4711
4713
  */
4712
- export declare function run<Yielded, Returned, Parameters extends unknown[]>(plan: Plan<Yielded, Returned, Parameters>, ...parameters: Parameters): PlanResult<Returned> | PlanError<Yielded, Returned>;
4714
+ export declare function run<Yielded, Returned, Parameters extends unknown[]>(plan: Plan<Yielded, Returned, Parameters>, ...parameters: Parameters): PlanReturned<Returned>;
4713
4715
  export declare namespace asyncRun {
4714
4716
  export var attempt: typeof asyncAttemptRun;
4715
4717
  }
@@ -4734,14 +4736,7 @@ export declare function plan<Yielded, Returned, Parameters extends unknown[]>(ge
4734
4736
  */
4735
4737
  export declare function plan<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => Generator<Yielded, Returned>): Plan<Yielded, Returned, Parameters>;
4736
4738
  //#endregion
4737
- //#region src/internal/plan.d.ts
4738
- /**
4739
- * Create an immediately failing generator
4740
- *
4741
- * @param reason Failure reason
4742
- * @returns Failing generator
4743
- */
4744
- export declare function fail<Reason>(reason: Reason): Generator<unknown, never>;
4739
+ //#region src/plan/is.d.ts
4745
4740
  /**
4746
4741
  * Is the value an asynchronous generator function?
4747
4742
  *
@@ -4770,13 +4765,26 @@ export declare function isGenerator(value: unknown): value is () => Generator;
4770
4765
  * @returns `true` if the value is a plan, otherwise `false`
4771
4766
  */
4772
4767
  export declare function isPlan<Yielded = unknown, Returned = unknown, Parameters extends unknown[] = unknown[]>(value: unknown): value is Plan<Yielded, Returned, Parameters>;
4768
+ //#endregion
4769
+ //#region src/plan/misc.d.ts
4773
4770
  /**
4774
- * Create an immediately succeeding generator
4771
+ * Create an immediately failing plan
4772
+ *
4773
+ * @param reason Failure reason
4774
+ * @returns Plan failure
4775
+ */
4776
+ export declare function fail<Reason>(reason: Reason): Generator<Reason, void>;
4777
+ /**
4778
+ * Create an immediately succeeding plan
4775
4779
  *
4776
4780
  * @param value Success value
4777
- * @returns Succeeding generator
4781
+ * @returns Plan success
4778
4782
  */
4779
- export declare function succeed<Value>(value: Value): Generator<unknown, Value>;
4783
+ export declare function succeed<Value>(value: Value): Generator<never, Value>;
4784
+ export declare function succeedResult<Returned>(value: Returned): Generator<never, Ok<Returned>>;
4785
+ export declare namespace succeed {
4786
+ export var result: typeof succeedResult;
4787
+ }
4780
4788
  //#endregion
4781
4789
  //#region src/internal/aborter.d.ts
4782
4790
  type Aborter = {
@@ -4859,7 +4867,7 @@ export type PromiseStrategy = "complete" | "first";
4859
4867
  export declare class PromiseTimeoutError extends Error {
4860
4868
  constructor();
4861
4869
  }
4862
- export type PromisesItems<Items extends ArrayOrPlainObject> = { [ItemsKey in keyof Items]: Items[ItemsKey] extends GenericCallback ? ReturnType<Items[ItemsKey]> extends Promise<infer Value> ? Promise<Value> : never : Items[ItemsKey] extends Promise<infer Value> ? Promise<Value> : Promise<Items[ItemsKey]>; };
4870
+ export type PromisesItems<Items extends ArrayOrPlainObject> = { [ItemsKey in keyof Items]: Items[ItemsKey] extends GenericCallback ? ReturnType<Items[ItemsKey]> extends Promise<infer Value> ? Promise<Value> : never : Items[ItemsKey] extends Promise<infer Value> ? Promise<Value> : Promise<Items[ItemsKey]>; } extends (infer Result) ? Result : never;
4863
4871
  /**
4864
4872
  * Options for handling multiple _Promises_
4865
4873
  */
@@ -4874,9 +4882,9 @@ export type PromisesOptions = {
4874
4882
  strategy?: PromiseStrategy;
4875
4883
  };
4876
4884
  export type PromisesResult<Items extends ArrayOrPlainObject> = { [ItemsKey in keyof Items]: Items[ItemsKey] extends Promise<infer Value> ? Result<Awaited<Value>> : never; };
4877
- export type PromisesUnwrapped<Items extends ArrayOrPlainObject> = { [ItemsKey in keyof Items]: Items[ItemsKey] extends GenericCallback ? ReturnType<Items[ItemsKey]> extends Promise<infer Value> ? Awaited<Value> : never : Items[ItemsKey] extends Promise<infer Value> ? Awaited<Value> : never; };
4878
- export type PromisesValue<Value> = FulfilledPromise<Value> | RejectedPromise;
4879
- export type PromisesValues<Items extends ArrayOrPlainObject> = { [ItemsKey in keyof Items]: Items[ItemsKey] extends Promise<infer Value> ? PromisesValue<Awaited<Value>> : never; };
4885
+ export type PromisesUnwrapped<Items extends ArrayOrPlainObject> = { [ItemsKey in keyof Items]: Items[ItemsKey] extends GenericCallback ? ReturnType<Items[ItemsKey]> extends Promise<infer Value> ? Awaited<Value> : never : Items[ItemsKey] extends Promise<infer Value> ? Awaited<Value> : never; } extends (infer Result) ? Result : never;
4886
+ export type PromisesValue<Value> = (FulfilledPromise<Value> | RejectedPromise);
4887
+ export type PromisesValues<Items extends ArrayOrPlainObject> = { [ItemsKey in keyof Items]: Items[ItemsKey] extends Promise<infer Value> ? PromisesValue<Awaited<Value>> : never; } extends (infer Result) ? Result : never;
4880
4888
  /**
4881
4889
  * A _Promise_ that was rejected
4882
4890
  */
@@ -6350,7 +6358,7 @@ export declare function pick<Value extends PlainObject, ValueKey extends keyof V
6350
6358
  /**
6351
6359
  * A shaken object, without any `undefined` values
6352
6360
  */
6353
- type Shaken<Value extends PlainObject> = { [Key in keyof Value]: Value[Key] extends undefined ? never : Value[Key]; };
6361
+ type Shaken<Value extends PlainObject> = Simplify<{ [Key in keyof Value as undefined extends Value[Key] ? never : Key]: Value[Key]; } & { [Key in keyof Value as undefined extends Value[Key] ? [Value[Key]] extends [undefined] ? never : Key : never]?: Exclude<Value[Key], undefined>; }>;
6354
6362
  /**
6355
6363
  * Shake an object, removing all keys with `undefined` values
6356
6364
  *
package/dist/index.mjs CHANGED
@@ -2756,19 +2756,7 @@ const PLAN_SYMBOL = Symbol("plan");
2756
2756
  const PLAN_TYPE_PLAN_ASYNC = "asyncPlan";
2757
2757
  const PLAN_TYPE_PLAN_SYNC = "plan";
2758
2758
  //#endregion
2759
- //#region src/internal/plan.ts
2760
- /**
2761
- * Create an immediately failing generator
2762
- *
2763
- * @param reason Failure reason
2764
- * @returns Failing generator
2765
- */
2766
- function fail(reason) {
2767
- return (function* () {
2768
- yield;
2769
- throw reason;
2770
- })();
2771
- }
2759
+ //#region src/plan/is.ts
2772
2760
  /**
2773
2761
  * Is the value an asynchronous generator function?
2774
2762
  *
@@ -2811,21 +2799,9 @@ function isPlan(value) {
2811
2799
  function isPlanInstance(type, value) {
2812
2800
  return typeof value === "object" && value !== null && PLAN_SYMBOL in value && value[PLAN_SYMBOL].type === type;
2813
2801
  }
2814
- /**
2815
- * Create an immediately succeeding generator
2816
- *
2817
- * @param value Success value
2818
- * @returns Succeeding generator
2819
- */
2820
- function succeed(value) {
2821
- return (function* () {
2822
- yield;
2823
- return value;
2824
- })();
2825
- }
2826
2802
  //#endregion
2827
2803
  //#region src/plan/generate.ts
2828
- async function asyncGenerate(callback, parameters) {
2804
+ async function asyncGenerate(callback, parameters, unwrap) {
2829
2805
  const generator = callback(...parameters);
2830
2806
  let success = true;
2831
2807
  let lastValue;
@@ -2845,10 +2821,10 @@ async function asyncGenerate(callback, parameters) {
2845
2821
  } finally {
2846
2822
  await generator?.return(lastValue);
2847
2823
  }
2848
- if (success) return lastValue;
2824
+ if (success) return unwrap && isOk(lastValue) ? lastValue.value : lastValue;
2849
2825
  throw lastValue;
2850
2826
  }
2851
- function generate(callback, parameters) {
2827
+ function generate(callback, parameters, unwrap) {
2852
2828
  const generator = callback(...parameters);
2853
2829
  let success = true;
2854
2830
  let lastValue;
@@ -2868,45 +2844,45 @@ function generate(callback, parameters) {
2868
2844
  } finally {
2869
2845
  generator.return(lastValue);
2870
2846
  }
2871
- if (success) return lastValue;
2847
+ if (success) return unwrap && isOk(lastValue) ? lastValue.value : lastValue;
2872
2848
  throw lastValue;
2873
2849
  }
2874
2850
  //#endregion
2875
2851
  //#region src/plan/result.ts
2876
2852
  function asyncAttemptRun(input, ...parameters) {
2877
2853
  if (isAsyncPlan(input)) return input.attempt(...parameters);
2878
- if (isAsyncGenerator(input)) return asyncAttempt(() => asyncGenerate(input, parameters));
2854
+ if (isAsyncGenerator(input)) return asyncAttempt(() => asyncGenerate(input, parameters, true));
2879
2855
  throw new Error(PLAN_MESSAGE_RUN_INPUT);
2880
2856
  }
2881
2857
  function attemptRun(input, ...parameters) {
2882
2858
  if (isPlan(input)) return input.attempt(...parameters);
2883
- if (isGenerator(input)) return attempt(() => generate(input, parameters));
2859
+ if (isGenerator(input)) return attempt(() => generate(input, parameters, true));
2884
2860
  throw new Error(PLAN_MESSAGE_RUN_INPUT);
2885
2861
  }
2886
2862
  function attemptRunAsyncPlan(...parameters) {
2887
- return asyncAttempt(() => this.run(...parameters));
2863
+ return asyncAttempt(() => asyncGenerate(this[PLAN_SYMBOL].generator, parameters, true));
2888
2864
  }
2889
2865
  function attemptRunPlan(...parameters) {
2890
- return attempt(() => this.run(...parameters));
2866
+ return attempt(() => generate(this[PLAN_SYMBOL].generator, parameters, true));
2891
2867
  }
2892
2868
  attemptRun.async = asyncAttemptRun;
2893
2869
  //#endregion
2894
2870
  //#region src/plan/run.ts
2895
2871
  function asyncRun(input, ...parameters) {
2896
2872
  if (isAsyncPlan(input)) return input.run(...parameters);
2897
- if (isAsyncGenerator(input)) return asyncGenerate(input, parameters);
2873
+ if (isAsyncGenerator(input)) return asyncGenerate(input, parameters, false);
2898
2874
  throw new Error(PLAN_MESSAGE_RUN_INPUT);
2899
2875
  }
2900
2876
  function run(input, ...parameters) {
2901
2877
  if (isPlan(input)) return input.run(...parameters);
2902
- if (isGenerator(input)) return generate(input, parameters);
2878
+ if (isGenerator(input)) return generate(input, parameters, false);
2903
2879
  throw new Error(PLAN_MESSAGE_RUN_INPUT);
2904
2880
  }
2905
2881
  function runAsyncPlan(...parameters) {
2906
- return asyncGenerate(this[PLAN_SYMBOL].generator, parameters);
2882
+ return asyncGenerate(this[PLAN_SYMBOL].generator, parameters, false);
2907
2883
  }
2908
2884
  function runPlan(...parameters) {
2909
- return generate(this[PLAN_SYMBOL].generator, parameters);
2885
+ return generate(this[PLAN_SYMBOL].generator, parameters, false);
2910
2886
  }
2911
2887
  asyncRun.attempt = asyncAttemptRun;
2912
2888
  run.async = asyncRun;
@@ -2941,6 +2917,36 @@ function plan(generator) {
2941
2917
  throw new Error(PLAN_MESSAGE_PLAN_INPUT);
2942
2918
  }
2943
2919
  //#endregion
2920
+ //#region src/plan/misc.ts
2921
+ /**
2922
+ * Create an immediately failing plan
2923
+ *
2924
+ * @param reason Failure reason
2925
+ * @returns Plan failure
2926
+ */
2927
+ function fail(reason) {
2928
+ return (function* () {
2929
+ throw reason;
2930
+ })();
2931
+ }
2932
+ /**
2933
+ * Create an immediately succeeding plan
2934
+ *
2935
+ * @param value Success value
2936
+ * @returns Plan success
2937
+ */
2938
+ function succeed(value) {
2939
+ return (function* () {
2940
+ return value;
2941
+ })();
2942
+ }
2943
+ function succeedResult(value) {
2944
+ return (function* () {
2945
+ return ok(value);
2946
+ })();
2947
+ }
2948
+ succeed.result = succeedResult;
2949
+ //#endregion
2944
2950
  //#region src/internal/aborter.ts
2945
2951
  function createAborter(value, onAbort) {
2946
2952
  if (!(value instanceof AbortSignal)) return;
@@ -7043,4 +7049,4 @@ var SizedSet = class extends Set {
7043
7049
  }
7044
7050
  };
7045
7051
  //#endregion
7046
- export { CancelablePromise, Logger, PromiseTimeoutError, QueueError, RetryError, SORT_DIRECTION_ASCENDING, SORT_DIRECTION_DESCENDING, SizedMap, SizedSet, push as append, push, assert, assertCondition, assertDefined, assertInstanceOf, assertIs, assertProperty, assign, asyncAttempt, asyncAttemptRun, asyncDebounce, asyncFlow, asyncMatchResult, asyncOnce, asyncPipe, asyncRun, asyncThrottle, attempt, attemptAsyncFlow, attemptAsyncPipe, attemptFlow, attemptPipe, attemptPromise, attemptRun, average, beacon, between, camelCase, cancelable, capitalize, ceil, chunk, clamp, clone, compact, compare, copy, count, debounce, deburr, dedent, delay, deregisterCloner, deregisterComparator, deregisterEqualizer, diff, difference, drop, endsWith, endsWithArray, equal, error, exclude, exists, fail, filter, filterAndMap, filterAndMap as select, find, findLast, first, firstOrDefault, flatFreeze, flatten, floor, flow, freeze, fromQuery, toPromise as fromResult, toPromise, fuzzy, fuzzyMatch, getArray, getArrayComparison, getColor, getForegroundColor, getHexColor, getHexaColor, getHslColor, getHslaColor, getHwbColor, getHwbaColor, getNormalizedHex, getNumber, getRandomBoolean, getRandomCharacters, getRandomColor, getRandomFloatingNumber as getRandomFloat, getRandomHex, getRandomInteger, getRandomItem, getRandomItems, getRgbColor, getRgbaColor, getSortedIndex, getString, getTimedPromise, getUuid, getValue, groupArraysBy, groupBy, handleResult, hasValue, hasValueResult, herald, hexToHsl, hexToHsla, hexToHwb, hexToHwba, hexToRgb, hexToRgba, hslToHex, hslToHwb, hslToHwba, hslToRgb, hslToRgba, hwbToHex, hwbToHsl, hwbToHsla, hwbToRgb, hwbToRgba, ignoreKey, inMap, inSet, includes, includesArray, indexOf, indexOfArray, initializeAssigner, initializeCloner, initializeEqualizer, initializeMerger, initializeNormalizer, initializeSorter, initializeTemplater, initializeTransformer, insert, interpolate, intersection, isArrayOrPlainObject, isAsyncGenerator, isAsyncOnce, isAsyncPlan, isBeacon, isBeaconSubscription, isColor, isConstructor, isEmpty, isError, isFrozen, isFulfilled, isFuzzy, isGenerator, isHerald, isHeraldEvents, isHeraldSubscription, isHexColor, isHslColor, isHslaColor, isHwbColor, isHwbaColor, isInstanceOf, isKey, isKeyedQueue, isLogger, isNonArrayOrPlainObject, isNonConstructor, isNonEmpty, isNonInstanceOf, isNonKey, isNonNullable, isNonNullableOrEmpty, isNonNullableOrWhitespace, isNonNumber, isNonNumerical, isNonObject, isNonPlainObject, isNonPrimitive, isNonTemplateStringsArray, isNonTypedArray, isNullable, isNullableOrEmpty, isNullableOrWhitespace, isNumber, isNumerical, isObject, isObservable, isOk, isOnce, isPlainObject, isPlan, isPrimitive, isQueue, isQueueInstance, isRejected, isResult, isRgbColor, isRgbaColor, isSorted, isSubscription, isSubscriptions, isTemplateStringsArray, isTimeLogger, isTypedArray, join, kebabCase, keyedQueue, last, lastIndexOf, lastOrDefault, lowerCase, mapAndFilter, mapAndFilter as reverseSelect, matchResult, max, median, memoize, merge, min, move, moveIndices, moveToIndex, noop, normalize, ok, omit, once, parse, partition, pascalCase, pick, pipe, plan, promises, queue, range, registerCloner, registerComparator, registerEqualizer, resultPromises, retry, reverse, rgbToHex, rgbToHsl, rgbToHsla, rgbToHwb, rgbToHwba, round, run, setValue, settlePromise, shake, shuffle, single, slice, smush, snakeCase, sort, splice, startsWith, startsWithArray, subscriptions, succeed, sum, swap, take, template, throttle, timed, times, titleCase, toMap, toMapArrays, toQuery, toRecord, toRecordArrays, toResult, toSet, toggle, transform, trim, truncate, tryDecode, tryEncode, union, unique, unsmush, unwrap, update, upperCase, words };
7052
+ export { CancelablePromise, Logger, PromiseTimeoutError, QueueError, RetryError, SORT_DIRECTION_ASCENDING, SORT_DIRECTION_DESCENDING, SizedMap, SizedSet, push as append, push, assert, assertCondition, assertDefined, assertInstanceOf, assertIs, assertProperty, assign, asyncAttempt, asyncAttemptRun, asyncDebounce, asyncFlow, asyncMatchResult, asyncOnce, asyncPipe, asyncRun, asyncThrottle, attempt, attemptAsyncFlow, attemptAsyncPipe, attemptFlow, attemptPipe, attemptPromise, attemptRun, average, beacon, between, camelCase, cancelable, capitalize, ceil, chunk, clamp, clone, compact, compare, copy, count, debounce, deburr, dedent, delay, deregisterCloner, deregisterComparator, deregisterEqualizer, diff, difference, drop, endsWith, endsWithArray, equal, error, exclude, exists, fail, filter, filterAndMap, filterAndMap as select, find, findLast, first, firstOrDefault, flatFreeze, flatten, floor, flow, freeze, fromQuery, toPromise as fromResult, toPromise, fuzzy, fuzzyMatch, getArray, getArrayComparison, getColor, getForegroundColor, getHexColor, getHexaColor, getHslColor, getHslaColor, getHwbColor, getHwbaColor, getNormalizedHex, getNumber, getRandomBoolean, getRandomCharacters, getRandomColor, getRandomFloatingNumber as getRandomFloat, getRandomHex, getRandomInteger, getRandomItem, getRandomItems, getRgbColor, getRgbaColor, getSortedIndex, getString, getTimedPromise, getUuid, getValue, groupArraysBy, groupBy, handleResult, hasValue, hasValueResult, herald, hexToHsl, hexToHsla, hexToHwb, hexToHwba, hexToRgb, hexToRgba, hslToHex, hslToHwb, hslToHwba, hslToRgb, hslToRgba, hwbToHex, hwbToHsl, hwbToHsla, hwbToRgb, hwbToRgba, ignoreKey, inMap, inSet, includes, includesArray, indexOf, indexOfArray, initializeAssigner, initializeCloner, initializeEqualizer, initializeMerger, initializeNormalizer, initializeSorter, initializeTemplater, initializeTransformer, insert, interpolate, intersection, isArrayOrPlainObject, isAsyncGenerator, isAsyncOnce, isAsyncPlan, isBeacon, isBeaconSubscription, isColor, isConstructor, isEmpty, isError, isFrozen, isFulfilled, isFuzzy, isGenerator, isHerald, isHeraldEvents, isHeraldSubscription, isHexColor, isHslColor, isHslaColor, isHwbColor, isHwbaColor, isInstanceOf, isKey, isKeyedQueue, isLogger, isNonArrayOrPlainObject, isNonConstructor, isNonEmpty, isNonInstanceOf, isNonKey, isNonNullable, isNonNullableOrEmpty, isNonNullableOrWhitespace, isNonNumber, isNonNumerical, isNonObject, isNonPlainObject, isNonPrimitive, isNonTemplateStringsArray, isNonTypedArray, isNullable, isNullableOrEmpty, isNullableOrWhitespace, isNumber, isNumerical, isObject, isObservable, isOk, isOnce, isPlainObject, isPlan, isPrimitive, isQueue, isQueueInstance, isRejected, isResult, isRgbColor, isRgbaColor, isSorted, isSubscription, isSubscriptions, isTemplateStringsArray, isTimeLogger, isTypedArray, join, kebabCase, keyedQueue, last, lastIndexOf, lastOrDefault, lowerCase, mapAndFilter, mapAndFilter as reverseSelect, matchResult, max, median, memoize, merge, min, move, moveIndices, moveToIndex, noop, normalize, ok, omit, once, parse, partition, pascalCase, pick, pipe, plan, promises, queue, range, registerCloner, registerComparator, registerEqualizer, resultPromises, retry, reverse, rgbToHex, rgbToHsl, rgbToHsla, rgbToHwb, rgbToHwba, round, run, setValue, settlePromise, shake, shuffle, single, slice, smush, snakeCase, sort, splice, startsWith, startsWithArray, subscriptions, succeed, succeedResult, sum, swap, take, template, throttle, timed, times, titleCase, toMap, toMapArrays, toQuery, toRecord, toRecordArrays, toResult, toSet, toggle, transform, trim, truncate, tryDecode, tryEncode, union, unique, unsmush, unwrap, update, upperCase, words };
@@ -9,22 +9,22 @@ export type AsyncPlan<Yielded, Returned, Parameters extends unknown[]> = {
9
9
  *
10
10
  * @returns Asynchronous generator
11
11
  */
12
- [Symbol.asyncIterator]: () => AsyncGenerator<Yielded, Returned, unknown>;
12
+ [Symbol.asyncIterator]: (...parameters: Parameters) => AsyncGenerator<Yielded, Returned>;
13
13
  /**
14
14
  * Attempt to run the plan to completion
15
15
  *
16
16
  * _Returns a promised {@link Result} instead of a raw value or throwing an error_
17
17
  *
18
- * @returns Promised result
18
+ * @returns Attempted result
19
19
  */
20
- attempt(...parameters: Parameters): Promise<Result<PlanResult<Returned>, PlanError<Yielded, Returned>>>;
20
+ attempt(...parameters: Parameters): Promise<Result<PlanOk<Returned>, PlanError<Yielded, Returned>>>;
21
21
  /**
22
22
  * Run the plan to completion
23
23
  *
24
24
  * @throws {PlanError<Yielded, Returned>}
25
25
  * @returns Result
26
26
  */
27
- run(...parameters: Parameters): Promise<PlanResult<Returned>>;
27
+ run(...parameters: Parameters): Promise<PlanReturned<Returned>>;
28
28
  };
29
29
  type AsyncPlanState = {
30
30
  generator(...parameters: unknown[]): AsyncGenerator;
@@ -47,30 +47,32 @@ export type Plan<Yielded, Returned, Parameters extends unknown[]> = {
47
47
  *
48
48
  * @returns Generator
49
49
  */
50
- [Symbol.iterator]: () => Generator<Yielded, Returned, unknown>;
50
+ [Symbol.iterator]: (...parameters: Parameters) => Generator<Yielded, Returned>;
51
51
  /**
52
52
  * Attempt to run the plan to completion
53
53
  *
54
54
  * _Returns a {@link Result} instead of a raw value or throwing an error_
55
55
  *
56
- * @returns Result
56
+ * @returns Attempted result
57
57
  */
58
- attempt(...parameters: Parameters): Result<PlanResult<Returned>, PlanError<Yielded, Returned>>;
58
+ attempt(...parameters: Parameters): Result<PlanOk<Returned>, PlanError<Yielded, Returned>>;
59
59
  /**
60
60
  * Run the plan to completion
61
61
  *
62
62
  * @throws {PlanError<Yielded, Returned>}
63
63
  * @returns Result
64
64
  */
65
- run(...parameters: Parameters): PlanResult<Returned>;
65
+ run(...parameters: Parameters): PlanReturned<Returned>;
66
66
  };
67
- type PlanErrorValues<Original> = Original extends Error ? Original : Original extends Err<infer Error> ? Error : Original extends Result<infer _, infer Error> ? Error : never;
68
- export type PlanError<Yielded, Returned> = PlanErrorValues<Yielded> | PlanErrorValues<Returned> | Error;
69
- export type PlanResult<Returned> = Returned extends Error ? never : Returned extends Err<infer _> ? never : Returned extends Ok<infer Value> ? Value : Returned extends Result<infer Value, infer _> ? Value : Returned;
67
+ export type PlanOk<Returned> = Returned extends Error ? never : Returned extends Err<infer _> ? never : Returned extends Ok<infer Value> ? Value : Returned;
68
+ type PlanErrors<Yielded, Returned> = PlanErrorValues<Yielded> | PlanErrorValues<Returned>;
69
+ export type PlanError<Yielded, Returned> = [PlanErrors<Yielded, Returned>] extends [never] ? Error : PlanErrors<Yielded, Returned>;
70
+ type PlanErrorValues<Original> = Original extends Error ? Original : Original extends Err<infer Error> ? Error : never;
71
+ export type PlanReturned<Returned> = Returned extends Error ? never : Returned extends Err<infer _> ? never : Returned;
70
72
  type PlanState = {
71
73
  generator(...parameters: unknown[]): Generator;
72
74
  } & BaseState<typeof PLAN_TYPE_PLAN_SYNC>;
73
- export type PlanType = "asyncPlan" | "plan" | "stop";
75
+ export type PlanType = "asyncPlan" | "plan";
74
76
  export declare const GENERATOR_NAME_ASYNC = "AsyncGeneratorFunction";
75
77
  export declare const GENERATOR_NAME_SYNC = "GeneratorFunction";
76
78
  export declare const PLAN_MESSAGE_PLAN_INPUT = "plan requires a generator function";
@@ -1,5 +1,4 @@
1
1
  import { unwrap } from "../result/misc.mjs";
2
- import "../../result/misc.mjs";
3
2
  import { attempt } from "../result/attempt.mjs";
4
3
  //#region src/internal/string/misc.ts
5
4
  /**
package/dist/models.d.mts CHANGED
@@ -63,7 +63,7 @@ type _NestedValue<Value, Path extends string> = Path extends `${infer ItemKey}.$
63
63
  /**
64
64
  * The nested _(keyed)_ values of an object _(up to 5 levels deep)_
65
65
  */
66
- export type NestedValues<Value extends PlainObject> = { [Path in NestedKeys<Value>]: NestedValue<Value, Path>; };
66
+ export type NestedValues<Value extends PlainObject> = Simplify<{ [Path in NestedKeys<Value>]: NestedValue<Value, Path>; }>;
67
67
  /**
68
68
  * The numerical keys of an object
69
69
  */
@@ -71,7 +71,7 @@ export type NumericalKeys<Value> = { [ItemKey in keyof Value]: ItemKey extends n
71
71
  /**
72
72
  * The numerical values of an object
73
73
  */
74
- export type NumericalValues<Item extends PlainObject> = { [ItemKey in keyof Item as Item[ItemKey] extends number ? ItemKey : never]: Item[ItemKey]; };
74
+ export type NumericalValues<Item extends PlainObject> = Simplify<{ [ItemKey in keyof Item as Item[ItemKey] extends number ? ItemKey : never]: Item[ItemKey]; }>;
75
75
  /**
76
76
  * An asynchronous function that can only be called once, returning the same value on subsequent calls
77
77
  */
@@ -131,7 +131,7 @@ export type Primitive = null | undefined | string | number | boolean | symbol |
131
131
  /**
132
132
  * Set required keys for a type
133
133
  */
134
- export type RequiredKeys<Model extends object, Keys extends keyof Model> = Required<Pick<Model, Keys>> & Omit<Model, Keys>;
134
+ export type RequiredKeys<Model extends object, Keys extends keyof Model> = Simplify<Required<Pick<Model, Keys>> & Omit<Model, Keys>>;
135
135
  /**
136
136
  * Flattens the type to improve type hints in IDEs
137
137
  *
@@ -1,4 +1,4 @@
1
1
  //#region src/plan/generate.d.ts
2
- export declare function asyncGenerate(callback: (...parameters: unknown[]) => AsyncGenerator, parameters: unknown[]): Promise<unknown>;
3
- export declare function generate(callback: (...parameters: unknown[]) => Generator, parameters: unknown[]): unknown;
2
+ export declare function asyncGenerate(callback: (...parameters: unknown[]) => AsyncGenerator, parameters: unknown[], unwrap: boolean): Promise<unknown>;
3
+ export declare function generate(callback: (...parameters: unknown[]) => Generator, parameters: unknown[], unwrap: boolean): unknown;
4
4
  //#endregion
@@ -1,6 +1,6 @@
1
- import { isError } from "../internal/result/misc.mjs";
1
+ import { isError, isOk } from "../internal/result/misc.mjs";
2
2
  //#region src/plan/generate.ts
3
- async function asyncGenerate(callback, parameters) {
3
+ async function asyncGenerate(callback, parameters, unwrap) {
4
4
  const generator = callback(...parameters);
5
5
  let success = true;
6
6
  let lastValue;
@@ -20,10 +20,10 @@ async function asyncGenerate(callback, parameters) {
20
20
  } finally {
21
21
  await generator?.return(lastValue);
22
22
  }
23
- if (success) return lastValue;
23
+ if (success) return unwrap && isOk(lastValue) ? lastValue.value : lastValue;
24
24
  throw lastValue;
25
25
  }
26
- function generate(callback, parameters) {
26
+ function generate(callback, parameters, unwrap) {
27
27
  const generator = callback(...parameters);
28
28
  let success = true;
29
29
  let lastValue;
@@ -43,7 +43,7 @@ function generate(callback, parameters) {
43
43
  } finally {
44
44
  generator.return(lastValue);
45
45
  }
46
- if (success) return lastValue;
46
+ if (success) return unwrap && isOk(lastValue) ? lastValue.value : lastValue;
47
47
  throw lastValue;
48
48
  }
49
49
  //#endregion
@@ -1,5 +1,5 @@
1
1
  import { PLAN_MESSAGE_PLAN_INPUT, PLAN_SYMBOL, PLAN_TYPE_PLAN_ASYNC, PLAN_TYPE_PLAN_SYNC } from "../internal/models/plan.model.mjs";
2
- import { isAsyncGenerator, isGenerator } from "../internal/plan.mjs";
2
+ import { isAsyncGenerator, isGenerator } from "./is.mjs";
3
3
  import { asyncAttemptRun, attemptRun, attemptRunAsyncPlan, attemptRunPlan } from "./result.mjs";
4
4
  import { asyncRun, run, runAsyncPlan, runPlan } from "./run.mjs";
5
5
  //#region src/plan/index.ts
@@ -1,2 +1,31 @@
1
- import { isAsyncGenerator, isAsyncPlan, isGenerator, isPlan } from "../internal/plan.mjs";
2
- export { isAsyncGenerator, isAsyncPlan, isGenerator, isPlan };
1
+ import { AsyncPlan, Plan } from "../internal/models/plan.model.mjs";
2
+ //#region src/plan/is.d.ts
3
+ /**
4
+ * Is the value an asynchronous generator function?
5
+ *
6
+ * @param value Value to check
7
+ * @returns `true` if the value is an asynchronous generator function, otherwise `false`
8
+ */
9
+ export declare function isAsyncGenerator(value: unknown): value is () => AsyncGenerator;
10
+ /**
11
+ * Is the value an asynchronous plan?
12
+ *
13
+ * @param value Value to check
14
+ * @returns `true` if the value is an asynchronous plan, otherwise `false`
15
+ */
16
+ export declare function isAsyncPlan<Yielded = unknown, Returned = unknown, Parameters extends unknown[] = unknown[]>(value: unknown): value is AsyncPlan<Yielded, Returned, Parameters>;
17
+ /**
18
+ * Is the value a generator function?
19
+ *
20
+ * @param value Value to check
21
+ * @returns `true` if the value is a generator function, otherwise `false`
22
+ */
23
+ export declare function isGenerator(value: unknown): value is () => Generator;
24
+ /**
25
+ * Is the value a plan?
26
+ *
27
+ * @param value Value to check
28
+ * @returns `true` if the value is a plan, otherwise `false`
29
+ */
30
+ export declare function isPlan<Yielded = unknown, Returned = unknown, Parameters extends unknown[] = unknown[]>(value: unknown): value is Plan<Yielded, Returned, Parameters>;
31
+ //#endregion
package/dist/plan/is.mjs CHANGED
@@ -1,2 +1,46 @@
1
- import { isAsyncGenerator, isAsyncPlan, isGenerator, isPlan } from "../internal/plan.mjs";
1
+ import { GENERATOR_NAME_ASYNC, GENERATOR_NAME_SYNC, PLAN_SYMBOL, PLAN_TYPE_PLAN_ASYNC, PLAN_TYPE_PLAN_SYNC } from "../internal/models/plan.model.mjs";
2
+ //#region src/plan/is.ts
3
+ /**
4
+ * Is the value an asynchronous generator function?
5
+ *
6
+ * @param value Value to check
7
+ * @returns `true` if the value is an asynchronous generator function, otherwise `false`
8
+ */
9
+ function isAsyncGenerator(value) {
10
+ return isGeneratorInstance(GENERATOR_NAME_ASYNC, value);
11
+ }
12
+ /**
13
+ * Is the value an asynchronous plan?
14
+ *
15
+ * @param value Value to check
16
+ * @returns `true` if the value is an asynchronous plan, otherwise `false`
17
+ */
18
+ function isAsyncPlan(value) {
19
+ return isPlanInstance(PLAN_TYPE_PLAN_ASYNC, value);
20
+ }
21
+ /**
22
+ * Is the value a generator function?
23
+ *
24
+ * @param value Value to check
25
+ * @returns `true` if the value is a generator function, otherwise `false`
26
+ */
27
+ function isGenerator(value) {
28
+ return isGeneratorInstance(GENERATOR_NAME_SYNC, value);
29
+ }
30
+ function isGeneratorInstance(name, value) {
31
+ return typeof value === "function" && value !== null && value.constructor.name === name && typeof value.prototype.next === "function" && typeof value.prototype.return === "function" && typeof value.prototype.throw === "function";
32
+ }
33
+ /**
34
+ * Is the value a plan?
35
+ *
36
+ * @param value Value to check
37
+ * @returns `true` if the value is a plan, otherwise `false`
38
+ */
39
+ function isPlan(value) {
40
+ return isPlanInstance(PLAN_TYPE_PLAN_SYNC, value);
41
+ }
42
+ function isPlanInstance(type, value) {
43
+ return typeof value === "object" && value !== null && PLAN_SYMBOL in value && value[PLAN_SYMBOL].type === type;
44
+ }
45
+ //#endregion
2
46
  export { isAsyncGenerator, isAsyncPlan, isGenerator, isPlan };
@@ -1,2 +1,21 @@
1
- import { fail, succeed } from "../internal/plan.mjs";
2
- export { fail, succeed };
1
+ import { Ok } from "../internal/models/result.model.mjs";
2
+ //#region src/plan/misc.d.ts
3
+ /**
4
+ * Create an immediately failing plan
5
+ *
6
+ * @param reason Failure reason
7
+ * @returns Plan failure
8
+ */
9
+ export declare function fail<Reason>(reason: Reason): Generator<Reason, void>;
10
+ /**
11
+ * Create an immediately succeeding plan
12
+ *
13
+ * @param value Success value
14
+ * @returns Plan success
15
+ */
16
+ export declare function succeed<Value>(value: Value): Generator<never, Value>;
17
+ export declare function succeedResult<Returned>(value: Returned): Generator<never, Ok<Returned>>;
18
+ export declare namespace succeed {
19
+ export var result: typeof succeedResult;
20
+ }
21
+ //#endregion
@@ -1,2 +1,32 @@
1
- import { fail, succeed } from "../internal/plan.mjs";
2
- export { fail, succeed };
1
+ import { ok } from "../internal/result/misc.mjs";
2
+ //#region src/plan/misc.ts
3
+ /**
4
+ * Create an immediately failing plan
5
+ *
6
+ * @param reason Failure reason
7
+ * @returns Plan failure
8
+ */
9
+ function fail(reason) {
10
+ return (function* () {
11
+ throw reason;
12
+ })();
13
+ }
14
+ /**
15
+ * Create an immediately succeeding plan
16
+ *
17
+ * @param value Success value
18
+ * @returns Plan success
19
+ */
20
+ function succeed(value) {
21
+ return (function* () {
22
+ return value;
23
+ })();
24
+ }
25
+ function succeedResult(value) {
26
+ return (function* () {
27
+ return ok(value);
28
+ })();
29
+ }
30
+ succeed.result = succeedResult;
31
+ //#endregion
32
+ export { fail, succeed, succeedResult };
@@ -1,5 +1,5 @@
1
1
  import { Result } from "../internal/models/result.model.mjs";
2
- import { AsyncPlan, InternalPlan, Plan, PlanError, PlanResult } from "../internal/models/plan.model.mjs";
2
+ import { AsyncPlan, InternalAsyncPlan, InternalPlan, Plan, PlanError, PlanOk } from "../internal/models/plan.model.mjs";
3
3
  //#region src/plan/result.d.ts
4
4
  /**
5
5
  * Attempt to run the generator to completion
@@ -8,7 +8,7 @@ import { AsyncPlan, InternalPlan, Plan, PlanError, PlanResult } from "../interna
8
8
  *
9
9
  * @returns Promised result
10
10
  */
11
- export declare function asyncAttemptRun<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => AsyncGenerator<Yielded, Returned, unknown>, ...parameters: Parameters): Promise<Result<PlanResult<Returned>, PlanError<Yielded, Returned>>>;
11
+ export declare function asyncAttemptRun<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => AsyncGenerator<Yielded, Returned>, ...parameters: Parameters): Promise<Result<PlanOk<Returned>, PlanError<Yielded, Returned>>>;
12
12
  /**
13
13
  * Attempt to run the plan to completion
14
14
  *
@@ -16,7 +16,7 @@ export declare function asyncAttemptRun<Yielded, Returned, Parameters extends un
16
16
  *
17
17
  * @returns Promised result
18
18
  */
19
- export declare function asyncAttemptRun<Yielded, Returned, Parameters extends unknown[]>(plan: AsyncPlan<Yielded, Returned, Parameters>, ...parameters: Parameters): Promise<Result<PlanResult<Returned>, PlanError<Yielded, Returned>>>;
19
+ export declare function asyncAttemptRun<Yielded, Returned, Parameters extends unknown[]>(plan: AsyncPlan<Yielded, Returned, Parameters>, ...parameters: Parameters): Promise<Result<PlanOk<Returned>, PlanError<Yielded, Returned>>>;
20
20
  /**
21
21
  * Attempt to run the generator to completion
22
22
  *
@@ -24,7 +24,7 @@ export declare function asyncAttemptRun<Yielded, Returned, Parameters extends un
24
24
  *
25
25
  * @returns Result
26
26
  */
27
- export declare function attemptRun<Yielded, Returned>(generator: () => Generator<Yielded, Returned, unknown>, ...parameters: Parameters<typeof generator>): Result<PlanResult<Returned>, PlanError<Yielded, Returned>>;
27
+ export declare function attemptRun<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => Generator<Yielded, Returned>, ...parameters: Parameters): Result<PlanOk<Returned>, PlanError<Yielded, Returned>>;
28
28
  /**
29
29
  * Attempt to run the plan to completion
30
30
  *
@@ -32,8 +32,8 @@ export declare function attemptRun<Yielded, Returned>(generator: () => Generator
32
32
  *
33
33
  * @returns Result
34
34
  */
35
- export declare function attemptRun<Yielded, Returned, Parameters extends unknown[]>(plan: Plan<Yielded, Returned, Parameters>, ...parameters: Parameters): Result<PlanResult<Returned>, PlanError<Yielded, Returned>>;
36
- export declare function attemptRunAsyncPlan(this: InternalPlan, ...parameters: unknown[]): Promise<unknown>;
35
+ export declare function attemptRun<Yielded, Returned, Parameters extends unknown[]>(plan: Plan<Yielded, Returned, Parameters>, ...parameters: Parameters): Result<PlanOk<Returned>, PlanError<Yielded, Returned>>;
36
+ export declare function attemptRunAsyncPlan(this: InternalAsyncPlan, ...parameters: unknown[]): Promise<unknown>;
37
37
  export declare function attemptRunPlan(this: InternalPlan, ...parameters: unknown[]): unknown;
38
38
  export declare namespace attemptRun {
39
39
  export var async: typeof asyncAttemptRun;
@@ -1,23 +1,23 @@
1
1
  import { asyncAttempt, attempt } from "../internal/result/attempt.mjs";
2
- import { PLAN_MESSAGE_RUN_INPUT } from "../internal/models/plan.model.mjs";
3
- import { isAsyncGenerator, isAsyncPlan, isGenerator, isPlan } from "../internal/plan.mjs";
2
+ import { PLAN_MESSAGE_RUN_INPUT, PLAN_SYMBOL } from "../internal/models/plan.model.mjs";
3
+ import { isAsyncGenerator, isAsyncPlan, isGenerator, isPlan } from "./is.mjs";
4
4
  import { asyncGenerate, generate } from "./generate.mjs";
5
5
  //#region src/plan/result.ts
6
6
  function asyncAttemptRun(input, ...parameters) {
7
7
  if (isAsyncPlan(input)) return input.attempt(...parameters);
8
- if (isAsyncGenerator(input)) return asyncAttempt(() => asyncGenerate(input, parameters));
8
+ if (isAsyncGenerator(input)) return asyncAttempt(() => asyncGenerate(input, parameters, true));
9
9
  throw new Error(PLAN_MESSAGE_RUN_INPUT);
10
10
  }
11
11
  function attemptRun(input, ...parameters) {
12
12
  if (isPlan(input)) return input.attempt(...parameters);
13
- if (isGenerator(input)) return attempt(() => generate(input, parameters));
13
+ if (isGenerator(input)) return attempt(() => generate(input, parameters, true));
14
14
  throw new Error(PLAN_MESSAGE_RUN_INPUT);
15
15
  }
16
16
  function attemptRunAsyncPlan(...parameters) {
17
- return asyncAttempt(() => this.run(...parameters));
17
+ return asyncAttempt(() => asyncGenerate(this[PLAN_SYMBOL].generator, parameters, true));
18
18
  }
19
19
  function attemptRunPlan(...parameters) {
20
- return attempt(() => this.run(...parameters));
20
+ return attempt(() => generate(this[PLAN_SYMBOL].generator, parameters, true));
21
21
  }
22
22
  attemptRun.async = asyncAttemptRun;
23
23
  //#endregion
@@ -1,4 +1,4 @@
1
- import { AsyncPlan, InternalAsyncPlan, InternalPlan, Plan, PlanError, PlanResult } from "../internal/models/plan.model.mjs";
1
+ import { AsyncPlan, InternalAsyncPlan, InternalPlan, Plan, PlanReturned } from "../internal/models/plan.model.mjs";
2
2
  import { asyncAttemptRun, attemptRun } from "./result.mjs";
3
3
  //#region src/plan/run.d.ts
4
4
  /**
@@ -7,28 +7,28 @@ import { asyncAttemptRun, attemptRun } from "./result.mjs";
7
7
  * @param generator Generator to run
8
8
  * @returns Result
9
9
  */
10
- export declare function asyncRun<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => AsyncGenerator<Yielded, Returned, unknown>, ...parameters: Parameters): Promise<PlanResult<Returned>>;
10
+ export declare function asyncRun<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => AsyncGenerator<Yielded, Returned>, ...parameters: Parameters): Promise<PlanReturned<Returned>>;
11
11
  /**
12
12
  * Run an asynchronous plan to completion
13
13
  *
14
14
  * @param plan Plan to run
15
15
  * @returns Result
16
16
  */
17
- export declare function asyncRun<Yielded, Returned, Parameters extends unknown[]>(plan: AsyncPlan<Yielded, Returned, Parameters>, ...parameters: Parameters): Promise<PlanResult<Returned>>;
17
+ export declare function asyncRun<Yielded, Returned, Parameters extends unknown[]>(plan: AsyncPlan<Yielded, Returned, Parameters>, ...parameters: Parameters): Promise<PlanReturned<Returned>>;
18
18
  /**
19
19
  * Run a generator to completion
20
20
  *
21
21
  * @param generator Generator to run
22
22
  * @returns Result
23
23
  */
24
- export declare function run<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => Generator<Yielded, Returned, unknown>, ...parameters: Parameters): PlanResult<Returned> | PlanError<Yielded, Returned>;
24
+ export declare function run<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => Generator<Yielded, Returned>, ...parameters: Parameters): PlanReturned<Returned>;
25
25
  /**
26
26
  * Run a plan to completion
27
27
  *
28
28
  * @param plan Plan to run
29
29
  * @returns Result
30
30
  */
31
- export declare function run<Yielded, Returned, Parameters extends unknown[]>(plan: Plan<Yielded, Returned, Parameters>, ...parameters: Parameters): PlanResult<Returned> | PlanError<Yielded, Returned>;
31
+ export declare function run<Yielded, Returned, Parameters extends unknown[]>(plan: Plan<Yielded, Returned, Parameters>, ...parameters: Parameters): PlanReturned<Returned>;
32
32
  export declare function runAsyncPlan(this: InternalAsyncPlan, ...parameters: unknown[]): Promise<unknown>;
33
33
  export declare function runPlan(this: InternalPlan, ...parameters: unknown[]): unknown;
34
34
  export declare namespace asyncRun {
package/dist/plan/run.mjs CHANGED
@@ -1,23 +1,23 @@
1
1
  import { PLAN_MESSAGE_RUN_INPUT, PLAN_SYMBOL } from "../internal/models/plan.model.mjs";
2
- import { isAsyncGenerator, isAsyncPlan, isGenerator, isPlan } from "../internal/plan.mjs";
2
+ import { isAsyncGenerator, isAsyncPlan, isGenerator, isPlan } from "./is.mjs";
3
3
  import { asyncGenerate, generate } from "./generate.mjs";
4
4
  import { asyncAttemptRun, attemptRun } from "./result.mjs";
5
5
  //#region src/plan/run.ts
6
6
  function asyncRun(input, ...parameters) {
7
7
  if (isAsyncPlan(input)) return input.run(...parameters);
8
- if (isAsyncGenerator(input)) return asyncGenerate(input, parameters);
8
+ if (isAsyncGenerator(input)) return asyncGenerate(input, parameters, false);
9
9
  throw new Error(PLAN_MESSAGE_RUN_INPUT);
10
10
  }
11
11
  function run(input, ...parameters) {
12
12
  if (isPlan(input)) return input.run(...parameters);
13
- if (isGenerator(input)) return generate(input, parameters);
13
+ if (isGenerator(input)) return generate(input, parameters, false);
14
14
  throw new Error(PLAN_MESSAGE_RUN_INPUT);
15
15
  }
16
16
  function runAsyncPlan(...parameters) {
17
- return asyncGenerate(this[PLAN_SYMBOL].generator, parameters);
17
+ return asyncGenerate(this[PLAN_SYMBOL].generator, parameters, false);
18
18
  }
19
19
  function runPlan(...parameters) {
20
- return generate(this[PLAN_SYMBOL].generator, parameters);
20
+ return generate(this[PLAN_SYMBOL].generator, parameters, false);
21
21
  }
22
22
  asyncRun.attempt = asyncAttemptRun;
23
23
  run.async = asyncRun;
@@ -72,7 +72,7 @@ export type PromiseStrategy = "complete" | "first";
72
72
  export declare class PromiseTimeoutError extends Error {
73
73
  constructor();
74
74
  }
75
- export type PromisesItems<Items extends ArrayOrPlainObject> = { [ItemsKey in keyof Items]: Items[ItemsKey] extends GenericCallback ? ReturnType<Items[ItemsKey]> extends Promise<infer Value> ? Promise<Value> : never : Items[ItemsKey] extends Promise<infer Value> ? Promise<Value> : Promise<Items[ItemsKey]>; };
75
+ export type PromisesItems<Items extends ArrayOrPlainObject> = { [ItemsKey in keyof Items]: Items[ItemsKey] extends GenericCallback ? ReturnType<Items[ItemsKey]> extends Promise<infer Value> ? Promise<Value> : never : Items[ItemsKey] extends Promise<infer Value> ? Promise<Value> : Promise<Items[ItemsKey]>; } extends (infer Result) ? Result : never;
76
76
  /**
77
77
  * Options for handling multiple _Promises_
78
78
  */
@@ -87,9 +87,9 @@ export type PromisesOptions = {
87
87
  strategy?: PromiseStrategy;
88
88
  };
89
89
  export type PromisesResult<Items extends ArrayOrPlainObject> = { [ItemsKey in keyof Items]: Items[ItemsKey] extends Promise<infer Value> ? Result<Awaited<Value>> : never; };
90
- export type PromisesUnwrapped<Items extends ArrayOrPlainObject> = { [ItemsKey in keyof Items]: Items[ItemsKey] extends GenericCallback ? ReturnType<Items[ItemsKey]> extends Promise<infer Value> ? Awaited<Value> : never : Items[ItemsKey] extends Promise<infer Value> ? Awaited<Value> : never; };
91
- export type PromisesValue<Value> = FulfilledPromise<Value> | RejectedPromise;
92
- export type PromisesValues<Items extends ArrayOrPlainObject> = { [ItemsKey in keyof Items]: Items[ItemsKey] extends Promise<infer Value> ? PromisesValue<Awaited<Value>> : never; };
90
+ export type PromisesUnwrapped<Items extends ArrayOrPlainObject> = { [ItemsKey in keyof Items]: Items[ItemsKey] extends GenericCallback ? ReturnType<Items[ItemsKey]> extends Promise<infer Value> ? Awaited<Value> : never : Items[ItemsKey] extends Promise<infer Value> ? Awaited<Value> : never; } extends (infer Result) ? Result : never;
91
+ export type PromisesValue<Value> = (FulfilledPromise<Value> | RejectedPromise);
92
+ export type PromisesValues<Items extends ArrayOrPlainObject> = { [ItemsKey in keyof Items]: Items[ItemsKey] extends Promise<infer Value> ? PromisesValue<Awaited<Value>> : never; } extends (infer Result) ? Result : never;
93
93
  /**
94
94
  * A _Promise_ that was rejected
95
95
  */
@@ -1,7 +1,6 @@
1
1
  import { isError, isOk } from "../../internal/result/misc.mjs";
2
2
  import { asyncAttempt, attempt } from "../../internal/result/attempt.mjs";
3
3
  import { asyncFlow, flow } from "../../internal/function/work.mjs";
4
- import "../index.mjs";
5
4
  //#region src/result/work/flow.ts
6
5
  function attemptAsyncFlow(...fns) {
7
6
  let Flow;
@@ -1,7 +1,6 @@
1
1
  import { isError, isOk } from "../../internal/result/misc.mjs";
2
2
  import { asyncAttempt, attempt } from "../../internal/result/attempt.mjs";
3
3
  import { asyncPipe, pipe } from "../../internal/function/work.mjs";
4
- import "../index.mjs";
5
4
  //#region src/result/work/pipe.ts
6
5
  async function attemptAsyncPipe(initial, first, ...seconds) {
7
6
  return asyncAttempt(() => {
@@ -1,9 +1,9 @@
1
- import { PlainObject } from "../models.mjs";
1
+ import { PlainObject, Simplify } from "../models.mjs";
2
2
  //#region src/value/shake.d.ts
3
3
  /**
4
4
  * A shaken object, without any `undefined` values
5
5
  */
6
- export type Shaken<Value extends PlainObject> = { [Key in keyof Value]: Value[Key] extends undefined ? never : Value[Key]; };
6
+ export type Shaken<Value extends PlainObject> = Simplify<{ [Key in keyof Value as undefined extends Value[Key] ? never : Key]: Value[Key]; } & { [Key in keyof Value as undefined extends Value[Key] ? [Value[Key]] extends [undefined] ? never : Key : never]?: Exclude<Value[Key], undefined>; }>;
7
7
  /**
8
8
  * Shake an object, removing all keys with `undefined` values
9
9
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oscarpalmer/atoms",
3
- "version": "0.212.0",
3
+ "version": "0.213.0",
4
4
  "description": "Atomic utilities for making your JavaScript better.",
5
5
  "keywords": [
6
6
  "array",
@@ -295,6 +295,7 @@
295
295
  "default": "./dist/value/transform.mjs"
296
296
  }
297
297
  },
298
+ "sideEffects": false,
298
299
  "scripts": {
299
300
  "build": "npx vp pack && npm run tsdown:build",
300
301
  "tsdown:build": "npx tsdown -c ./tsdown.config.ts",
@@ -1,45 +0,0 @@
1
- import { AsyncPlan, Plan } from "./models/plan.model.mjs";
2
- //#region src/internal/plan.d.ts
3
- /**
4
- * Create an immediately failing generator
5
- *
6
- * @param reason Failure reason
7
- * @returns Failing generator
8
- */
9
- export declare function fail<Reason>(reason: Reason): Generator<unknown, never>;
10
- /**
11
- * Is the value an asynchronous generator function?
12
- *
13
- * @param value Value to check
14
- * @returns `true` if the value is an asynchronous generator function, otherwise `false`
15
- */
16
- export declare function isAsyncGenerator(value: unknown): value is () => AsyncGenerator;
17
- /**
18
- * Is the value an asynchronous plan?
19
- *
20
- * @param value Value to check
21
- * @returns `true` if the value is an asynchronous plan, otherwise `false`
22
- */
23
- export declare function isAsyncPlan<Yielded = unknown, Returned = unknown, Parameters extends unknown[] = unknown[]>(value: unknown): value is AsyncPlan<Yielded, Returned, Parameters>;
24
- /**
25
- * Is the value a generator function?
26
- *
27
- * @param value Value to check
28
- * @returns `true` if the value is a generator function, otherwise `false`
29
- */
30
- export declare function isGenerator(value: unknown): value is () => Generator;
31
- /**
32
- * Is the value a plan?
33
- *
34
- * @param value Value to check
35
- * @returns `true` if the value is a plan, otherwise `false`
36
- */
37
- export declare function isPlan<Yielded = unknown, Returned = unknown, Parameters extends unknown[] = unknown[]>(value: unknown): value is Plan<Yielded, Returned, Parameters>;
38
- /**
39
- * Create an immediately succeeding generator
40
- *
41
- * @param value Success value
42
- * @returns Succeeding generator
43
- */
44
- export declare function succeed<Value>(value: Value): Generator<unknown, Value>;
45
- //#endregion
@@ -1,70 +0,0 @@
1
- import { GENERATOR_NAME_ASYNC, GENERATOR_NAME_SYNC, PLAN_SYMBOL, PLAN_TYPE_PLAN_ASYNC, PLAN_TYPE_PLAN_SYNC } from "./models/plan.model.mjs";
2
- //#region src/internal/plan.ts
3
- /**
4
- * Create an immediately failing generator
5
- *
6
- * @param reason Failure reason
7
- * @returns Failing generator
8
- */
9
- function fail(reason) {
10
- return (function* () {
11
- yield;
12
- throw reason;
13
- })();
14
- }
15
- /**
16
- * Is the value an asynchronous generator function?
17
- *
18
- * @param value Value to check
19
- * @returns `true` if the value is an asynchronous generator function, otherwise `false`
20
- */
21
- function isAsyncGenerator(value) {
22
- return isGeneratorInstance(GENERATOR_NAME_ASYNC, value);
23
- }
24
- /**
25
- * Is the value an asynchronous plan?
26
- *
27
- * @param value Value to check
28
- * @returns `true` if the value is an asynchronous plan, otherwise `false`
29
- */
30
- function isAsyncPlan(value) {
31
- return isPlanInstance(PLAN_TYPE_PLAN_ASYNC, value);
32
- }
33
- /**
34
- * Is the value a generator function?
35
- *
36
- * @param value Value to check
37
- * @returns `true` if the value is a generator function, otherwise `false`
38
- */
39
- function isGenerator(value) {
40
- return isGeneratorInstance(GENERATOR_NAME_SYNC, value);
41
- }
42
- function isGeneratorInstance(name, value) {
43
- return typeof value === "function" && value !== null && value.constructor.name === name && typeof value.prototype.next === "function" && typeof value.prototype.return === "function" && typeof value.prototype.throw === "function";
44
- }
45
- /**
46
- * Is the value a plan?
47
- *
48
- * @param value Value to check
49
- * @returns `true` if the value is a plan, otherwise `false`
50
- */
51
- function isPlan(value) {
52
- return isPlanInstance(PLAN_TYPE_PLAN_SYNC, value);
53
- }
54
- function isPlanInstance(type, value) {
55
- return typeof value === "object" && value !== null && PLAN_SYMBOL in value && value[PLAN_SYMBOL].type === type;
56
- }
57
- /**
58
- * Create an immediately succeeding generator
59
- *
60
- * @param value Success value
61
- * @returns Succeeding generator
62
- */
63
- function succeed(value) {
64
- return (function* () {
65
- yield;
66
- return value;
67
- })();
68
- }
69
- //#endregion
70
- export { fail, isAsyncGenerator, isAsyncPlan, isGenerator, isPlan, succeed };