@oscarpalmer/atoms 0.210.0 → 0.211.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.
@@ -53,7 +53,7 @@ export type ArrayValueSorter<Item> = {
53
53
  /**
54
54
  * Value to sort by
55
55
  */
56
- value: (item: Item) => unknown;
56
+ value(item: Item): unknown;
57
57
  };
58
58
  /**
59
59
  * Comparator to use when comparing items and values
@@ -187,16 +187,16 @@ export type Color = {
187
187
  unsubscribe(): void;
188
188
  };
189
189
  export type ColorChanges = {
190
- "*": (value: Color) => void;
191
- alpha: (value: number) => void;
192
- hex: (value: string) => void;
193
- hexa: (value: string) => void;
194
- hsl: (value: HSLColor) => void;
195
- hsla: (value: HSLAColor) => void;
196
- hwb: (value: HWBColor) => void;
197
- hwba: (value: HWBAColor) => void;
198
- rgb: (value: RGBColor) => void;
199
- rgba: (value: RGBAColor) => void;
190
+ "*"(value: Color): void;
191
+ alpha(value: number): void;
192
+ hex(value: string): void;
193
+ hexa(value: string): void;
194
+ hsl(value: HSLColor): void;
195
+ hsla(value: HSLAColor): void;
196
+ hwb(value: HWBColor): void;
197
+ hwba(value: HWBAColor): void;
198
+ rgb(value: RGBColor): void;
199
+ rgba(value: RGBAColor): void;
200
200
  };
201
201
  export type ColorDefaults = {
202
202
  alpha: Alpha;
package/dist/index.d.mts CHANGED
@@ -90,7 +90,7 @@ export type OnceAsync<Callback extends GenericAsyncCallback> = {
90
90
  * @param parameters Callback parameters
91
91
  * @returns Call result
92
92
  */
93
- run: (...parameters: Parameters<Callback>) => ReturnType<Callback>;
93
+ run(...parameters: Parameters<Callback>): ReturnType<Callback>;
94
94
  } & OnceProperties;
95
95
  /**
96
96
  * A callback function that can only be called once, returning the same value on subsequent calls
@@ -102,7 +102,7 @@ export type Once<Callback extends GenericCallback> = {
102
102
  * @param parameters Callback parameters
103
103
  * @returns Call result
104
104
  */
105
- run: (...parameters: Parameters<Callback>) => ReturnType<Callback>;
105
+ run(...parameters: Parameters<Callback>): ReturnType<Callback>;
106
106
  } & OnceProperties;
107
107
  type OnceProperties = {
108
108
  /**
@@ -116,7 +116,7 @@ type OnceProperties = {
116
116
  /**
117
117
  * Clear the callback's cached value
118
118
  */
119
- clear: () => void;
119
+ clear(): void;
120
120
  };
121
121
  /**
122
122
  * A generic object
@@ -2615,7 +2615,7 @@ export type ArrayValueSorter<Item> = {
2615
2615
  /**
2616
2616
  * Value to sort by
2617
2617
  */
2618
- value: (item: Item) => unknown;
2618
+ value(item: Item): unknown;
2619
2619
  };
2620
2620
  /**
2621
2621
  * Comparator to use when comparing items and values
@@ -3711,14 +3711,14 @@ export type ResultMatch<Value, Returned, E = Error> = {
3711
3711
  * @param original Original error, if available
3712
3712
  * @returns Value to return
3713
3713
  */
3714
- error: (error: E, original?: Error) => Returned;
3714
+ error(error: E, original?: Error): Returned;
3715
3715
  /**
3716
3716
  * Callback for ok result
3717
3717
  *
3718
3718
  * @param value Ok value
3719
3719
  * @returns Value to return
3720
3720
  */
3721
- ok: (value: Value) => Returned;
3721
+ ok(value: Value): Returned;
3722
3722
  };
3723
3723
  /**
3724
3724
  * Unwrap a result value
@@ -4257,9 +4257,9 @@ type BaseHandler = {
4257
4257
  handlers: WeakMap<WeakKey, string | GenericCallback>;
4258
4258
  options: BaseHandlerOptions;
4259
4259
  owner: GenericCallback;
4260
- deregister: (constructor: Constructor) => void;
4261
- get: (first: unknown, second: unknown) => string | GenericCallback | undefined;
4262
- register: (constructor: Constructor, handler?: string | GenericCallback) => void;
4260
+ deregister(constructor: Constructor): void;
4261
+ get(first: unknown, second: unknown): string | GenericCallback | undefined;
4262
+ register(constructor: Constructor, handler?: string | GenericCallback): void;
4263
4263
  };
4264
4264
  type BaseHandlerOptions = {
4265
4265
  callback: GenericCallback;
@@ -4591,86 +4591,148 @@ export declare function setValue<Data extends PlainObject>(data: Data, path: str
4591
4591
  /**
4592
4592
  * An asynchronous plan of execution that can yield intermediate results and eventually return a result
4593
4593
  */
4594
- type AsyncPlan<Yielded, Returned> = {
4594
+ type AsyncPlan<Yielded, Returned, Parameters extends unknown[]> = {
4595
4595
  /**
4596
4596
  * Get the asynchronous generator for the plan
4597
4597
  *
4598
4598
  * @returns Asynchronous generator
4599
4599
  */
4600
4600
  [Symbol.asyncIterator]: () => AsyncGenerator<Yielded, Returned, unknown>;
4601
+ /**
4602
+ * Attempt to run the plan to completion
4603
+ *
4604
+ * _Returns a promised {@link Result} instead of a raw value or throwing an error_
4605
+ *
4606
+ * @returns Promised result
4607
+ */
4608
+ attempt(...parameters: Parameters): Promise<Result<PlanResult<Returned>, PlanError<Yielded, Returned>>>;
4601
4609
  /**
4602
4610
  * Run the plan to completion
4603
4611
  *
4604
4612
  * @throws {PlanError<Yielded, Returned>}
4605
4613
  * @returns Result
4606
4614
  */
4607
- run: () => Promise<PlanResult<Returned>>;
4615
+ run(...parameters: Parameters): Promise<PlanResult<Returned>>;
4608
4616
  };
4609
4617
  /**
4610
4618
  * A plan of execution that can yield intermediate results and eventually return a result
4611
4619
  */
4612
- type Plan<Yielded, Returned> = {
4620
+ type Plan<Yielded, Returned, Parameters extends unknown[]> = {
4613
4621
  /**
4614
4622
  * Get the generator for the plan
4615
4623
  *
4616
4624
  * @returns Generator
4617
4625
  */
4618
4626
  [Symbol.iterator]: () => Generator<Yielded, Returned, unknown>;
4627
+ /**
4628
+ * Attempt to run the plan to completion
4629
+ *
4630
+ * _Returns a {@link Result} instead of a raw value or throwing an error_
4631
+ *
4632
+ * @returns Result
4633
+ */
4634
+ attempt(...parameters: Parameters): Result<PlanResult<Returned>, PlanError<Yielded, Returned>>;
4619
4635
  /**
4620
4636
  * Run the plan to completion
4621
4637
  *
4622
4638
  * @throws {PlanError<Yielded, Returned>}
4623
4639
  * @returns Result
4624
4640
  */
4625
- run: () => PlanResult<Returned>;
4641
+ run(...parameters: Parameters): PlanResult<Returned>;
4626
4642
  };
4627
- type PlanErrorValues<Original> = Original extends Error ? Original : never;
4643
+ type PlanErrorValues<Original> = Original extends Error ? Original : Original extends Err<infer Error> ? Error : Original extends Result<infer _, infer Error> ? Error : never;
4628
4644
  type PlanError<Yielded, Returned> = PlanErrorValues<Yielded> | PlanErrorValues<Returned> | Error;
4629
- type PlanResult<Returned> = Returned extends Error ? never : Returned;
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;
4630
4646
  //#endregion
4631
- //#region src/plan/index.d.ts
4647
+ //#region src/plan/result.d.ts
4632
4648
  /**
4633
- * Create a plan for an asynchronous generator function
4649
+ * Attempt to run the generator to completion
4634
4650
  *
4635
- * @param generator Generator to plan for
4636
- * @returns Generator plan
4651
+ * _Returns a promised {@link Result} instead of a raw value or throwing an error_
4652
+ *
4653
+ * @returns Promised result
4637
4654
  */
4638
- export declare function plan<Yielded, Returned>(generator: () => AsyncGenerator<Yielded, Returned>): AsyncPlan<Yielded, Returned>;
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>>>;
4639
4656
  /**
4640
- * Create a plan for a generator function
4657
+ * Attempt to run the plan to completion
4641
4658
  *
4642
- * @param generator Generator to plan for
4643
- * @returns Generator plan
4659
+ * _Returns a promised {@link Result} instead of a raw value or throwing an error_
4660
+ *
4661
+ * @returns Promised result
4644
4662
  */
4645
- export declare function plan<Yielded, Returned>(generator: () => Generator<Yielded, Returned>): Plan<Yielded, Returned>;
4663
+ export declare function asyncAttemptRun<Yielded, Returned, Parameters extends unknown[]>(plan: AsyncPlan<Yielded, Returned, Parameters>, ...parameters: Parameters): Promise<Result<PlanResult<Returned>, PlanError<Yielded, Returned>>>;
4664
+ /**
4665
+ * Attempt to run the generator to completion
4666
+ *
4667
+ * _Returns a {@link Result} instead of a raw value or throwing an error_
4668
+ *
4669
+ * @returns Result
4670
+ */
4671
+ export declare function attemptRun<Yielded, Returned>(generator: () => Generator<Yielded, Returned, unknown>, ...parameters: Parameters<typeof generator>): Result<PlanResult<Returned>, PlanError<Yielded, Returned>>;
4672
+ /**
4673
+ * Attempt to run the plan to completion
4674
+ *
4675
+ * _Returns a {@link Result} instead of a raw value or throwing an error_
4676
+ *
4677
+ * @returns Result
4678
+ */
4679
+ export declare function attemptRun<Yielded, Returned, Parameters extends unknown[]>(plan: Plan<Yielded, Returned, Parameters>, ...parameters: Parameters): Result<PlanResult<Returned>, PlanError<Yielded, Returned>>;
4680
+ export declare namespace attemptRun {
4681
+ export var async: typeof asyncAttemptRun;
4682
+ }
4683
+ //#endregion
4684
+ //#region src/plan/run.d.ts
4646
4685
  /**
4647
4686
  * Run an asynchronous generator to completion
4648
4687
  *
4649
4688
  * @param generator Generator to run
4650
4689
  * @returns Result
4651
4690
  */
4652
- export declare function run<Yielded, Returned>(generator: () => AsyncGenerator<Yielded, Returned>): Promise<PlanResult<Returned> | PlanError<Yielded, Returned>>;
4691
+ export declare function asyncRun<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => AsyncGenerator<Yielded, Returned, unknown>, ...parameters: Parameters): Promise<PlanResult<Returned>>;
4653
4692
  /**
4654
4693
  * Run an asynchronous plan to completion
4655
4694
  *
4656
4695
  * @param plan Plan to run
4657
4696
  * @returns Result
4658
4697
  */
4659
- export declare function run<Yielded, Returned>(plan: AsyncPlan<Yielded, Returned>): Promise<PlanResult<Returned> | PlanError<Yielded, Returned>>;
4698
+ export declare function asyncRun<Yielded, Returned, Parameters extends unknown[]>(plan: AsyncPlan<Yielded, Returned, Parameters>, ...parameters: Parameters): Promise<PlanResult<Returned>>;
4660
4699
  /**
4661
4700
  * Run a generator to completion
4662
4701
  *
4663
4702
  * @param generator Generator to run
4664
4703
  * @returns Result
4665
4704
  */
4666
- export declare function run<Yielded, Returned>(generator: () => Generator<Yielded, Returned>): PlanResult<Returned> | PlanError<Yielded, Returned>;
4705
+ export declare function run<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => Generator<Yielded, Returned, unknown>, ...parameters: Parameters): PlanResult<Returned> | PlanError<Yielded, Returned>;
4667
4706
  /**
4668
4707
  * Run a plan to completion
4669
4708
  *
4670
4709
  * @param plan Plan to run
4671
4710
  * @returns Result
4672
4711
  */
4673
- export declare function run<Yielded, Returned>(plan: Plan<Yielded, Returned>): PlanResult<Returned> | PlanError<Yielded, Returned>;
4712
+ export declare function run<Yielded, Returned, Parameters extends unknown[]>(plan: Plan<Yielded, Returned, Parameters>, ...parameters: Parameters): PlanResult<Returned> | PlanError<Yielded, Returned>;
4713
+ export declare namespace asyncRun {
4714
+ export var attempt: typeof asyncAttemptRun;
4715
+ }
4716
+ export declare namespace run {
4717
+ export var async: typeof asyncRun;
4718
+ export var attempt: typeof attemptRun;
4719
+ }
4720
+ //#endregion
4721
+ //#region src/plan/index.d.ts
4722
+ /**
4723
+ * Create a plan for an asynchronous generator function
4724
+ *
4725
+ * @param generator Generator to plan for
4726
+ * @returns Generator plan
4727
+ */
4728
+ export declare function plan<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => AsyncGenerator<Yielded, Returned>): AsyncPlan<Yielded, Returned, Parameters>;
4729
+ /**
4730
+ * Create a plan for a generator function
4731
+ *
4732
+ * @param generator Generator to plan for
4733
+ * @returns Generator plan
4734
+ */
4735
+ export declare function plan<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => Generator<Yielded, Returned>): Plan<Yielded, Returned, Parameters>;
4674
4736
  //#endregion
4675
4737
  //#region src/internal/plan.d.ts
4676
4738
  /**
@@ -4679,7 +4741,7 @@ export declare function run<Yielded, Returned>(plan: Plan<Yielded, Returned>): P
4679
4741
  * @param reason Failure reason
4680
4742
  * @returns Failing generator
4681
4743
  */
4682
- export declare function fail<Reason>(reason: Reason): Generator<never, never>;
4744
+ export declare function fail<Reason>(reason: Reason): Generator<unknown, never>;
4683
4745
  /**
4684
4746
  * Is the value an asynchronous generator function?
4685
4747
  *
@@ -4693,7 +4755,7 @@ export declare function isAsyncGenerator(value: unknown): value is () => AsyncGe
4693
4755
  * @param value Value to check
4694
4756
  * @returns `true` if the value is an asynchronous plan, otherwise `false`
4695
4757
  */
4696
- export declare function isAsyncPlan<Yielded = unknown, Returned = unknown>(value: unknown): value is AsyncPlan<Yielded, Returned>;
4758
+ export declare function isAsyncPlan<Yielded = unknown, Returned = unknown, Parameters extends unknown[] = unknown[]>(value: unknown): value is AsyncPlan<Yielded, Returned, Parameters>;
4697
4759
  /**
4698
4760
  * Is the value a generator function?
4699
4761
  *
@@ -4707,20 +4769,20 @@ export declare function isGenerator(value: unknown): value is () => Generator;
4707
4769
  * @param value Value to check
4708
4770
  * @returns `true` if the value is a plan, otherwise `false`
4709
4771
  */
4710
- export declare function isPlan<Yielded = unknown, Returned = unknown>(value: unknown): value is Plan<Yielded, Returned>;
4772
+ export declare function isPlan<Yielded = unknown, Returned = unknown, Parameters extends unknown[] = unknown[]>(value: unknown): value is Plan<Yielded, Returned, Parameters>;
4711
4773
  /**
4712
4774
  * Create an immediately succeeding generator
4713
4775
  *
4714
4776
  * @param value Success value
4715
4777
  * @returns Succeeding generator
4716
4778
  */
4717
- export declare function succeed<Value>(value: Value): Generator<never, Value>;
4779
+ export declare function succeed<Value>(value: Value): Generator<unknown, Value>;
4718
4780
  //#endregion
4719
4781
  //#region src/internal/aborter.d.ts
4720
4782
  type Aborter = {
4721
4783
  callback: GenericCallback;
4784
+ cancel(): void;
4722
4785
  signal: AbortSignal;
4723
- cancel: () => void;
4724
4786
  };
4725
4787
  //#endregion
4726
4788
  //#region src/promise/constants.d.ts
@@ -4759,8 +4821,8 @@ export type PromiseData = {
4759
4821
  result: ArrayOrPlainObject;
4760
4822
  };
4761
4823
  export type PromiseHandlers = {
4762
- resolve: (value: unknown[]) => void;
4763
- reject: (reason: unknown) => void;
4824
+ resolve(value: unknown[]): void;
4825
+ reject(reason: unknown): void;
4764
4826
  };
4765
4827
  /**
4766
4828
  * Options for a _Promise_-handling function
@@ -6556,14 +6618,14 @@ type Subscriptions<Value = unknown> = {
6556
6618
  /**
6557
6619
  * Clear all subscriptions
6558
6620
  */
6559
- clear: () => void;
6621
+ clear(): void;
6560
6622
  /**
6561
6623
  * Create _(or retrieve)_ a subscription
6562
6624
  *
6563
6625
  * @param parameters Subscription parameters
6564
6626
  * @returns Tuple holding subsccription and existing boolean
6565
6627
  */
6566
- create: (parameters: SubscriptionParameters) => [Subscription, boolean];
6628
+ create(parameters: SubscriptionParameters): [Subscription, boolean];
6567
6629
  };
6568
6630
  /**
6569
6631
  * Parameters for creating a subscription store
@@ -6983,16 +7045,16 @@ type Color = {
6983
7045
  unsubscribe(): void;
6984
7046
  };
6985
7047
  type ColorChanges = {
6986
- "*": (value: Color) => void;
6987
- alpha: (value: number) => void;
6988
- hex: (value: string) => void;
6989
- hexa: (value: string) => void;
6990
- hsl: (value: HSLColor) => void;
6991
- hsla: (value: HSLAColor) => void;
6992
- hwb: (value: HWBColor) => void;
6993
- hwba: (value: HWBAColor) => void;
6994
- rgb: (value: RGBColor) => void;
6995
- rgba: (value: RGBAColor) => void;
7048
+ "*"(value: Color): void;
7049
+ alpha(value: number): void;
7050
+ hex(value: string): void;
7051
+ hexa(value: string): void;
7052
+ hsl(value: HSLColor): void;
7053
+ hsla(value: HSLAColor): void;
7054
+ hwb(value: HWBColor): void;
7055
+ hwba(value: HWBAColor): void;
7056
+ rgb(value: RGBColor): void;
7057
+ rgba(value: RGBAColor): void;
6996
7058
  };
6997
7059
  type ColorWithAlpha = {
6998
7060
  /**
package/dist/index.mjs CHANGED
@@ -2737,7 +2737,7 @@ function setValue(data, path, value, ignoreCase) {
2737
2737
  let next = unwrap(handleValue(target, currentPath, null, true, shouldIgnoreCase), void 0);
2738
2738
  if (typeof next !== "object" || next === null) {
2739
2739
  const nextPath = paths[index + 1];
2740
- if (SET_EXPRESSION_INDEX.test(nextPath)) next = Array.from({ length: Number(nextPath) + 1 }, () => void 0);
2740
+ if (SET_EXPRESSION_INDEX.test(nextPath)) next = Array.from({ length: +nextPath + 1 }, () => void 0);
2741
2741
  else next = {};
2742
2742
  target[currentPath] = next;
2743
2743
  }
@@ -2765,6 +2765,7 @@ const PLAN_TYPE_PLAN_SYNC = "plan";
2765
2765
  */
2766
2766
  function fail(reason) {
2767
2767
  return (function* () {
2768
+ yield;
2768
2769
  throw reason;
2769
2770
  })();
2770
2771
  }
@@ -2818,33 +2819,14 @@ function isPlanInstance(type, value) {
2818
2819
  */
2819
2820
  function succeed(value) {
2820
2821
  return (function* () {
2822
+ yield;
2821
2823
  return value;
2822
2824
  })();
2823
2825
  }
2824
2826
  //#endregion
2825
- //#region src/plan/index.ts
2826
- function AsyncPlan(generator) {
2827
- this[PLAN_SYMBOL] = {
2828
- generator,
2829
- type: PLAN_TYPE_PLAN_ASYNC
2830
- };
2831
- }
2832
- AsyncPlan.prototype[Symbol.asyncIterator] = function() {
2833
- return this[PLAN_SYMBOL].generator();
2834
- };
2835
- AsyncPlan.prototype.run = runAsyncPlan;
2836
- function Plan(generator) {
2837
- this[PLAN_SYMBOL] = {
2838
- generator,
2839
- type: PLAN_TYPE_PLAN_SYNC
2840
- };
2841
- }
2842
- Plan.prototype[Symbol.iterator] = function() {
2843
- return this[PLAN_SYMBOL].generator();
2844
- };
2845
- Plan.prototype.run = runPlan;
2846
- async function asyncExecute(callback) {
2847
- const generator = callback();
2827
+ //#region src/plan/generate.ts
2828
+ async function asyncGenerate(callback, parameters) {
2829
+ const generator = callback(...parameters);
2848
2830
  let success = true;
2849
2831
  let lastValue;
2850
2832
  try {
@@ -2853,6 +2835,7 @@ async function asyncExecute(callback) {
2853
2835
  const { done } = next;
2854
2836
  let { value } = next;
2855
2837
  if (value instanceof Error) throw value;
2838
+ if (isError(value)) throw value.error;
2856
2839
  lastValue = value;
2857
2840
  if (done === true) break;
2858
2841
  }
@@ -2860,21 +2843,22 @@ async function asyncExecute(callback) {
2860
2843
  lastValue = error;
2861
2844
  success = false;
2862
2845
  } finally {
2863
- generator?.return(lastValue);
2846
+ await generator?.return(lastValue);
2864
2847
  }
2865
2848
  if (success) return lastValue;
2866
2849
  throw lastValue;
2867
2850
  }
2868
- function execute(callback) {
2869
- const generator = callback();
2851
+ function generate(callback, parameters) {
2852
+ const generator = callback(...parameters);
2870
2853
  let success = true;
2871
2854
  let lastValue;
2872
2855
  try {
2873
2856
  while (true) {
2874
2857
  const next = generator.next(lastValue);
2875
2858
  const done = next.done === true;
2876
- let { value } = next;
2859
+ const { value } = next;
2877
2860
  if (value instanceof Error) throw value;
2861
+ if (isError(value)) throw value.error;
2878
2862
  lastValue = value;
2879
2863
  if (done) break;
2880
2864
  }
@@ -2887,22 +2871,74 @@ function execute(callback) {
2887
2871
  if (success) return lastValue;
2888
2872
  throw lastValue;
2889
2873
  }
2890
- function plan(generator) {
2891
- if (isAsyncGenerator(generator)) return new AsyncPlan(generator);
2892
- if (isGenerator(generator)) return new Plan(generator);
2893
- throw new Error(PLAN_MESSAGE_PLAN_INPUT);
2874
+ //#endregion
2875
+ //#region src/plan/result.ts
2876
+ function asyncAttemptRun(input, ...parameters) {
2877
+ if (isAsyncPlan(input)) return input.attempt(...parameters);
2878
+ if (isAsyncGenerator(input)) return asyncAttempt(() => asyncGenerate(input, parameters));
2879
+ throw new Error(PLAN_MESSAGE_RUN_INPUT);
2880
+ }
2881
+ function attemptRun(input, ...parameters) {
2882
+ if (isPlan(input)) return input.attempt(...parameters);
2883
+ if (isGenerator(input)) return attempt(() => generate(input, parameters));
2884
+ throw new Error(PLAN_MESSAGE_RUN_INPUT);
2894
2885
  }
2895
- function run(input) {
2896
- if (isAsyncPlan(input) || isPlan(input)) return input.run();
2897
- if (isAsyncGenerator(input)) return asyncExecute(input);
2898
- if (isGenerator(input)) return execute(input);
2886
+ function attemptRunAsyncPlan(...parameters) {
2887
+ return asyncAttempt(() => this.run(...parameters));
2888
+ }
2889
+ function attemptRunPlan(...parameters) {
2890
+ return attempt(() => this.run(...parameters));
2891
+ }
2892
+ attemptRun.async = asyncAttemptRun;
2893
+ //#endregion
2894
+ //#region src/plan/run.ts
2895
+ function asyncRun(input, ...parameters) {
2896
+ if (isAsyncPlan(input)) return input.run(...parameters);
2897
+ if (isAsyncGenerator(input)) return asyncGenerate(input, parameters);
2898
+ throw new Error(PLAN_MESSAGE_RUN_INPUT);
2899
+ }
2900
+ function run(input, ...parameters) {
2901
+ if (isPlan(input)) return input.run(...parameters);
2902
+ if (isGenerator(input)) return generate(input, parameters);
2899
2903
  throw new Error(PLAN_MESSAGE_RUN_INPUT);
2900
2904
  }
2901
- function runAsyncPlan() {
2902
- return asyncExecute(this[PLAN_SYMBOL].generator);
2905
+ function runAsyncPlan(...parameters) {
2906
+ return asyncGenerate(this[PLAN_SYMBOL].generator, parameters);
2907
+ }
2908
+ function runPlan(...parameters) {
2909
+ return generate(this[PLAN_SYMBOL].generator, parameters);
2910
+ }
2911
+ asyncRun.attempt = asyncAttemptRun;
2912
+ run.async = asyncRun;
2913
+ run.attempt = attemptRun;
2914
+ //#endregion
2915
+ //#region src/plan/index.ts
2916
+ function AsyncPlan(generator) {
2917
+ this[PLAN_SYMBOL] = {
2918
+ generator,
2919
+ type: PLAN_TYPE_PLAN_ASYNC
2920
+ };
2921
+ }
2922
+ AsyncPlan.prototype[Symbol.asyncIterator] = function() {
2923
+ return this[PLAN_SYMBOL].generator();
2924
+ };
2925
+ AsyncPlan.prototype.attempt = attemptRunAsyncPlan;
2926
+ AsyncPlan.prototype.run = runAsyncPlan;
2927
+ function Plan(generator) {
2928
+ this[PLAN_SYMBOL] = {
2929
+ generator,
2930
+ type: PLAN_TYPE_PLAN_SYNC
2931
+ };
2903
2932
  }
2904
- function runPlan() {
2905
- return execute(this[PLAN_SYMBOL].generator);
2933
+ Plan.prototype[Symbol.iterator] = function() {
2934
+ return this[PLAN_SYMBOL].generator();
2935
+ };
2936
+ Plan.prototype.attempt = attemptRunPlan;
2937
+ Plan.prototype.run = runPlan;
2938
+ function plan(generator) {
2939
+ if (isAsyncGenerator(generator)) return new AsyncPlan(generator);
2940
+ if (isGenerator(generator)) return new Plan(generator);
2941
+ throw new Error(PLAN_MESSAGE_PLAN_INPUT);
2906
2942
  }
2907
2943
  //#endregion
2908
2944
  //#region src/internal/aborter.ts
@@ -7005,4 +7041,4 @@ var SizedSet = class extends Set {
7005
7041
  }
7006
7042
  };
7007
7043
  //#endregion
7008
- 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, asyncDebounce, asyncFlow, asyncMatchResult, asyncOnce, asyncPipe, asyncThrottle, attempt, attemptAsyncFlow, attemptAsyncPipe, attemptFlow, attemptPipe, attemptPromise, 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 };
7044
+ 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 };
@@ -2,8 +2,8 @@ import { GenericCallback } from "../models.mjs";
2
2
  //#region src/internal/aborter.d.ts
3
3
  export type Aborter = {
4
4
  callback: GenericCallback;
5
+ cancel(): void;
5
6
  signal: AbortSignal;
6
- cancel: () => void;
7
7
  };
8
8
  export declare function createAborter(value: unknown, onAbort: () => void): Aborter | undefined;
9
9
  //#endregion
@@ -1,57 +1,74 @@
1
+ import { Err, Ok, Result } from "./result.model.mjs";
1
2
  //#region src/internal/models/plan.model.d.ts
2
3
  /**
3
4
  * An asynchronous plan of execution that can yield intermediate results and eventually return a result
4
5
  */
5
- export type AsyncPlan<Yielded, Returned> = {
6
+ export type AsyncPlan<Yielded, Returned, Parameters extends unknown[]> = {
6
7
  /**
7
8
  * Get the asynchronous generator for the plan
8
9
  *
9
10
  * @returns Asynchronous generator
10
11
  */
11
12
  [Symbol.asyncIterator]: () => AsyncGenerator<Yielded, Returned, unknown>;
13
+ /**
14
+ * Attempt to run the plan to completion
15
+ *
16
+ * _Returns a promised {@link Result} instead of a raw value or throwing an error_
17
+ *
18
+ * @returns Promised result
19
+ */
20
+ attempt(...parameters: Parameters): Promise<Result<PlanResult<Returned>, PlanError<Yielded, Returned>>>;
12
21
  /**
13
22
  * Run the plan to completion
14
23
  *
15
24
  * @throws {PlanError<Yielded, Returned>}
16
25
  * @returns Result
17
26
  */
18
- run: () => Promise<PlanResult<Returned>>;
27
+ run(...parameters: Parameters): Promise<PlanResult<Returned>>;
19
28
  };
20
29
  type AsyncPlanState = {
21
- generator: () => AsyncGenerator;
30
+ generator(...parameters: unknown[]): AsyncGenerator;
22
31
  } & BaseState<typeof PLAN_TYPE_PLAN_ASYNC>;
23
32
  type BaseState<Type extends PlanType> = {
24
33
  type: Type;
25
34
  };
26
35
  export type InternalAsyncPlan = {
27
36
  [PLAN_SYMBOL]: AsyncPlanState;
28
- } & AsyncPlan<never, never>;
37
+ } & AsyncPlan<never, never, unknown[]>;
29
38
  export type InternalPlan = {
30
39
  [PLAN_SYMBOL]: PlanState;
31
- } & Plan<never, never>;
40
+ } & Plan<never, never, unknown[]>;
32
41
  /**
33
42
  * A plan of execution that can yield intermediate results and eventually return a result
34
43
  */
35
- export type Plan<Yielded, Returned> = {
44
+ export type Plan<Yielded, Returned, Parameters extends unknown[]> = {
36
45
  /**
37
46
  * Get the generator for the plan
38
47
  *
39
48
  * @returns Generator
40
49
  */
41
50
  [Symbol.iterator]: () => Generator<Yielded, Returned, unknown>;
51
+ /**
52
+ * Attempt to run the plan to completion
53
+ *
54
+ * _Returns a {@link Result} instead of a raw value or throwing an error_
55
+ *
56
+ * @returns Result
57
+ */
58
+ attempt(...parameters: Parameters): Result<PlanResult<Returned>, PlanError<Yielded, Returned>>;
42
59
  /**
43
60
  * Run the plan to completion
44
61
  *
45
62
  * @throws {PlanError<Yielded, Returned>}
46
63
  * @returns Result
47
64
  */
48
- run: () => PlanResult<Returned>;
65
+ run(...parameters: Parameters): PlanResult<Returned>;
49
66
  };
50
- type PlanErrorValues<Original> = Original extends Error ? Original : never;
67
+ type PlanErrorValues<Original> = Original extends Error ? Original : Original extends Err<infer Error> ? Error : Original extends Result<infer _, infer Error> ? Error : never;
51
68
  export type PlanError<Yielded, Returned> = PlanErrorValues<Yielded> | PlanErrorValues<Returned> | Error;
52
- export type PlanResult<Returned> = Returned extends Error ? never : Returned;
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;
53
70
  type PlanState = {
54
- generator: () => Generator;
71
+ generator(...parameters: unknown[]): Generator;
55
72
  } & BaseState<typeof PLAN_TYPE_PLAN_SYNC>;
56
73
  export type PlanType = "asyncPlan" | "plan" | "stop";
57
74
  export declare const GENERATOR_NAME_ASYNC = "AsyncGeneratorFunction";
@@ -43,14 +43,14 @@ export type ResultMatch<Value, Returned, E = Error> = {
43
43
  * @param original Original error, if available
44
44
  * @returns Value to return
45
45
  */
46
- error: (error: E, original?: Error) => Returned;
46
+ error(error: E, original?: Error): Returned;
47
47
  /**
48
48
  * Callback for ok result
49
49
  *
50
50
  * @param value Ok value
51
51
  * @returns Value to return
52
52
  */
53
- ok: (value: Value) => Returned;
53
+ ok(value: Value): Returned;
54
54
  };
55
55
  /**
56
56
  * Unwrap a result value
@@ -6,7 +6,7 @@ import { AsyncPlan, Plan } from "./models/plan.model.mjs";
6
6
  * @param reason Failure reason
7
7
  * @returns Failing generator
8
8
  */
9
- export declare function fail<Reason>(reason: Reason): Generator<never, never>;
9
+ export declare function fail<Reason>(reason: Reason): Generator<unknown, never>;
10
10
  /**
11
11
  * Is the value an asynchronous generator function?
12
12
  *
@@ -20,7 +20,7 @@ export declare function isAsyncGenerator(value: unknown): value is () => AsyncGe
20
20
  * @param value Value to check
21
21
  * @returns `true` if the value is an asynchronous plan, otherwise `false`
22
22
  */
23
- export declare function isAsyncPlan<Yielded = unknown, Returned = unknown>(value: unknown): value is AsyncPlan<Yielded, Returned>;
23
+ export declare function isAsyncPlan<Yielded = unknown, Returned = unknown, Parameters extends unknown[] = unknown[]>(value: unknown): value is AsyncPlan<Yielded, Returned, Parameters>;
24
24
  /**
25
25
  * Is the value a generator function?
26
26
  *
@@ -34,12 +34,12 @@ export declare function isGenerator(value: unknown): value is () => Generator;
34
34
  * @param value Value to check
35
35
  * @returns `true` if the value is a plan, otherwise `false`
36
36
  */
37
- export declare function isPlan<Yielded = unknown, Returned = unknown>(value: unknown): value is Plan<Yielded, Returned>;
37
+ export declare function isPlan<Yielded = unknown, Returned = unknown, Parameters extends unknown[] = unknown[]>(value: unknown): value is Plan<Yielded, Returned, Parameters>;
38
38
  /**
39
39
  * Create an immediately succeeding generator
40
40
  *
41
41
  * @param value Success value
42
42
  * @returns Succeeding generator
43
43
  */
44
- export declare function succeed<Value>(value: Value): Generator<never, Value>;
44
+ export declare function succeed<Value>(value: Value): Generator<unknown, Value>;
45
45
  //#endregion
@@ -8,6 +8,7 @@ import { GENERATOR_NAME_ASYNC, GENERATOR_NAME_SYNC, PLAN_SYMBOL, PLAN_TYPE_PLAN_
8
8
  */
9
9
  function fail(reason) {
10
10
  return (function* () {
11
+ yield;
11
12
  throw reason;
12
13
  })();
13
14
  }
@@ -61,6 +62,7 @@ function isPlanInstance(type, value) {
61
62
  */
62
63
  function succeed(value) {
63
64
  return (function* () {
65
+ yield;
64
66
  return value;
65
67
  })();
66
68
  }
@@ -65,14 +65,14 @@ export type Subscriptions<Value = unknown> = {
65
65
  /**
66
66
  * Clear all subscriptions
67
67
  */
68
- clear: () => void;
68
+ clear(): void;
69
69
  /**
70
70
  * Create _(or retrieve)_ a subscription
71
71
  *
72
72
  * @param parameters Subscription parameters
73
73
  * @returns Tuple holding subsccription and existing boolean
74
74
  */
75
- create: (parameters: SubscriptionParameters) => [Subscription, boolean];
75
+ create(parameters: SubscriptionParameters): [Subscription, boolean];
76
76
  };
77
77
  /**
78
78
  * Parameters for creating a subscription store
@@ -4,9 +4,9 @@ type BaseHandler = {
4
4
  handlers: WeakMap<WeakKey, string | GenericCallback>;
5
5
  options: BaseHandlerOptions;
6
6
  owner: GenericCallback;
7
- deregister: (constructor: Constructor) => void;
8
- get: (first: unknown, second: unknown) => string | GenericCallback | undefined;
9
- register: (constructor: Constructor, handler?: string | GenericCallback) => void;
7
+ deregister(constructor: Constructor): void;
8
+ get(first: unknown, second: unknown): string | GenericCallback | undefined;
9
+ register(constructor: Constructor, handler?: string | GenericCallback): void;
10
10
  };
11
11
  type BaseHandlerOptions = {
12
12
  callback: GenericCallback;
@@ -21,7 +21,7 @@ function setValue(data, path, value, ignoreCase) {
21
21
  let next = unwrap(handleValue(target, currentPath, null, true, shouldIgnoreCase), void 0);
22
22
  if (typeof next !== "object" || next === null) {
23
23
  const nextPath = paths[index + 1];
24
- if (SET_EXPRESSION_INDEX.test(nextPath)) next = Array.from({ length: Number(nextPath) + 1 }, () => void 0);
24
+ if (SET_EXPRESSION_INDEX.test(nextPath)) next = Array.from({ length: +nextPath + 1 }, () => void 0);
25
25
  else next = {};
26
26
  target[currentPath] = next;
27
27
  }
package/dist/models.d.mts CHANGED
@@ -90,7 +90,7 @@ export type OnceAsync<Callback extends GenericAsyncCallback> = {
90
90
  * @param parameters Callback parameters
91
91
  * @returns Call result
92
92
  */
93
- run: (...parameters: Parameters<Callback>) => ReturnType<Callback>;
93
+ run(...parameters: Parameters<Callback>): ReturnType<Callback>;
94
94
  } & OnceProperties;
95
95
  /**
96
96
  * A callback function that can only be called once, returning the same value on subsequent calls
@@ -102,7 +102,7 @@ export type Once<Callback extends GenericCallback> = {
102
102
  * @param parameters Callback parameters
103
103
  * @returns Call result
104
104
  */
105
- run: (...parameters: Parameters<Callback>) => ReturnType<Callback>;
105
+ run(...parameters: Parameters<Callback>): ReturnType<Callback>;
106
106
  } & OnceProperties;
107
107
  type OnceProperties = {
108
108
  /**
@@ -116,7 +116,7 @@ type OnceProperties = {
116
116
  /**
117
117
  * Clear the callback's cached value
118
118
  */
119
- clear: () => void;
119
+ clear(): void;
120
120
  };
121
121
  /**
122
122
  * A generic object
@@ -0,0 +1,4 @@
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;
4
+ //#endregion
@@ -0,0 +1,50 @@
1
+ import { isError } from "../internal/result/misc.mjs";
2
+ //#region src/plan/generate.ts
3
+ async function asyncGenerate(callback, parameters) {
4
+ const generator = callback(...parameters);
5
+ let success = true;
6
+ let lastValue;
7
+ try {
8
+ while (true) {
9
+ const next = await generator.next(lastValue);
10
+ const { done } = next;
11
+ let { value } = next;
12
+ if (value instanceof Error) throw value;
13
+ if (isError(value)) throw value.error;
14
+ lastValue = value;
15
+ if (done === true) break;
16
+ }
17
+ } catch (error) {
18
+ lastValue = error;
19
+ success = false;
20
+ } finally {
21
+ await generator?.return(lastValue);
22
+ }
23
+ if (success) return lastValue;
24
+ throw lastValue;
25
+ }
26
+ function generate(callback, parameters) {
27
+ const generator = callback(...parameters);
28
+ let success = true;
29
+ let lastValue;
30
+ try {
31
+ while (true) {
32
+ const next = generator.next(lastValue);
33
+ const done = next.done === true;
34
+ const { value } = next;
35
+ if (value instanceof Error) throw value;
36
+ if (isError(value)) throw value.error;
37
+ lastValue = value;
38
+ if (done) break;
39
+ }
40
+ } catch (error) {
41
+ lastValue = error;
42
+ success = false;
43
+ } finally {
44
+ generator.return(lastValue);
45
+ }
46
+ if (success) return lastValue;
47
+ throw lastValue;
48
+ }
49
+ //#endregion
50
+ export { asyncGenerate, generate };
@@ -1,4 +1,6 @@
1
- import { AsyncPlan, Plan, PlanError, PlanResult } from "../internal/models/plan.model.mjs";
1
+ import { AsyncPlan, Plan } from "../internal/models/plan.model.mjs";
2
+ import { asyncAttemptRun, attemptRun } from "./result.mjs";
3
+ import { asyncRun, run } from "./run.mjs";
2
4
  //#region src/plan/index.d.ts
3
5
  /**
4
6
  * Create a plan for an asynchronous generator function
@@ -6,40 +8,13 @@ import { AsyncPlan, Plan, PlanError, PlanResult } from "../internal/models/plan.
6
8
  * @param generator Generator to plan for
7
9
  * @returns Generator plan
8
10
  */
9
- export declare function plan<Yielded, Returned>(generator: () => AsyncGenerator<Yielded, Returned>): AsyncPlan<Yielded, Returned>;
11
+ export declare function plan<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => AsyncGenerator<Yielded, Returned>): AsyncPlan<Yielded, Returned, Parameters>;
10
12
  /**
11
13
  * Create a plan for a generator function
12
14
  *
13
15
  * @param generator Generator to plan for
14
16
  * @returns Generator plan
15
17
  */
16
- export declare function plan<Yielded, Returned>(generator: () => Generator<Yielded, Returned>): Plan<Yielded, Returned>;
17
- /**
18
- * Run an asynchronous generator to completion
19
- *
20
- * @param generator Generator to run
21
- * @returns Result
22
- */
23
- export declare function run<Yielded, Returned>(generator: () => AsyncGenerator<Yielded, Returned>): Promise<PlanResult<Returned> | PlanError<Yielded, Returned>>;
24
- /**
25
- * Run an asynchronous plan to completion
26
- *
27
- * @param plan Plan to run
28
- * @returns Result
29
- */
30
- export declare function run<Yielded, Returned>(plan: AsyncPlan<Yielded, Returned>): Promise<PlanResult<Returned> | PlanError<Yielded, Returned>>;
31
- /**
32
- * Run a generator to completion
33
- *
34
- * @param generator Generator to run
35
- * @returns Result
36
- */
37
- export declare function run<Yielded, Returned>(generator: () => Generator<Yielded, Returned>): PlanResult<Returned> | PlanError<Yielded, Returned>;
38
- /**
39
- * Run a plan to completion
40
- *
41
- * @param plan Plan to run
42
- * @returns Result
43
- */
44
- export declare function run<Yielded, Returned>(plan: Plan<Yielded, Returned>): PlanResult<Returned> | PlanError<Yielded, Returned>;
45
- //#endregion
18
+ export declare function plan<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => Generator<Yielded, Returned>): Plan<Yielded, Returned, Parameters>;
19
+ //#endregion
20
+ export { asyncAttemptRun, asyncRun, attemptRun, run };
@@ -1,5 +1,7 @@
1
- import { PLAN_MESSAGE_PLAN_INPUT, PLAN_MESSAGE_RUN_INPUT, PLAN_SYMBOL, PLAN_TYPE_PLAN_ASYNC, PLAN_TYPE_PLAN_SYNC } from "../internal/models/plan.model.mjs";
2
- import { isAsyncGenerator, isAsyncPlan, isGenerator, isPlan } from "../internal/plan.mjs";
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";
3
+ import { asyncAttemptRun, attemptRun, attemptRunAsyncPlan, attemptRunPlan } from "./result.mjs";
4
+ import { asyncRun, run, runAsyncPlan, runPlan } from "./run.mjs";
3
5
  //#region src/plan/index.ts
4
6
  function AsyncPlan(generator) {
5
7
  this[PLAN_SYMBOL] = {
@@ -10,6 +12,7 @@ function AsyncPlan(generator) {
10
12
  AsyncPlan.prototype[Symbol.asyncIterator] = function() {
11
13
  return this[PLAN_SYMBOL].generator();
12
14
  };
15
+ AsyncPlan.prototype.attempt = attemptRunAsyncPlan;
13
16
  AsyncPlan.prototype.run = runAsyncPlan;
14
17
  function Plan(generator) {
15
18
  this[PLAN_SYMBOL] = {
@@ -20,67 +23,12 @@ function Plan(generator) {
20
23
  Plan.prototype[Symbol.iterator] = function() {
21
24
  return this[PLAN_SYMBOL].generator();
22
25
  };
26
+ Plan.prototype.attempt = attemptRunPlan;
23
27
  Plan.prototype.run = runPlan;
24
- async function asyncExecute(callback) {
25
- const generator = callback();
26
- let success = true;
27
- let lastValue;
28
- try {
29
- while (true) {
30
- const next = await generator.next(lastValue);
31
- const { done } = next;
32
- let { value } = next;
33
- if (value instanceof Error) throw value;
34
- lastValue = value;
35
- if (done === true) break;
36
- }
37
- } catch (error) {
38
- lastValue = error;
39
- success = false;
40
- } finally {
41
- generator?.return(lastValue);
42
- }
43
- if (success) return lastValue;
44
- throw lastValue;
45
- }
46
- function execute(callback) {
47
- const generator = callback();
48
- let success = true;
49
- let lastValue;
50
- try {
51
- while (true) {
52
- const next = generator.next(lastValue);
53
- const done = next.done === true;
54
- let { value } = next;
55
- if (value instanceof Error) throw value;
56
- lastValue = value;
57
- if (done) break;
58
- }
59
- } catch (error) {
60
- lastValue = error;
61
- success = false;
62
- } finally {
63
- generator.return(lastValue);
64
- }
65
- if (success) return lastValue;
66
- throw lastValue;
67
- }
68
28
  function plan(generator) {
69
29
  if (isAsyncGenerator(generator)) return new AsyncPlan(generator);
70
30
  if (isGenerator(generator)) return new Plan(generator);
71
31
  throw new Error(PLAN_MESSAGE_PLAN_INPUT);
72
32
  }
73
- function run(input) {
74
- if (isAsyncPlan(input) || isPlan(input)) return input.run();
75
- if (isAsyncGenerator(input)) return asyncExecute(input);
76
- if (isGenerator(input)) return execute(input);
77
- throw new Error(PLAN_MESSAGE_RUN_INPUT);
78
- }
79
- function runAsyncPlan() {
80
- return asyncExecute(this[PLAN_SYMBOL].generator);
81
- }
82
- function runPlan() {
83
- return execute(this[PLAN_SYMBOL].generator);
84
- }
85
33
  //#endregion
86
- export { plan, run };
34
+ export { asyncAttemptRun, asyncRun, attemptRun, plan, run };
@@ -0,0 +1,41 @@
1
+ import { Result } from "../internal/models/result.model.mjs";
2
+ import { AsyncPlan, InternalPlan, Plan, PlanError, PlanResult } from "../internal/models/plan.model.mjs";
3
+ //#region src/plan/result.d.ts
4
+ /**
5
+ * Attempt to run the generator to completion
6
+ *
7
+ * _Returns a promised {@link Result} instead of a raw value or throwing an error_
8
+ *
9
+ * @returns Promised result
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>>>;
12
+ /**
13
+ * Attempt to run the plan to completion
14
+ *
15
+ * _Returns a promised {@link Result} instead of a raw value or throwing an error_
16
+ *
17
+ * @returns Promised result
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>>>;
20
+ /**
21
+ * Attempt to run the generator to completion
22
+ *
23
+ * _Returns a {@link Result} instead of a raw value or throwing an error_
24
+ *
25
+ * @returns Result
26
+ */
27
+ export declare function attemptRun<Yielded, Returned>(generator: () => Generator<Yielded, Returned, unknown>, ...parameters: Parameters<typeof generator>): Result<PlanResult<Returned>, PlanError<Yielded, Returned>>;
28
+ /**
29
+ * Attempt to run the plan to completion
30
+ *
31
+ * _Returns a {@link Result} instead of a raw value or throwing an error_
32
+ *
33
+ * @returns Result
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>;
37
+ export declare function attemptRunPlan(this: InternalPlan, ...parameters: unknown[]): unknown;
38
+ export declare namespace attemptRun {
39
+ export var async: typeof asyncAttemptRun;
40
+ }
41
+ //#endregion
@@ -0,0 +1,24 @@
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";
4
+ import { asyncGenerate, generate } from "./generate.mjs";
5
+ //#region src/plan/result.ts
6
+ function asyncAttemptRun(input, ...parameters) {
7
+ if (isAsyncPlan(input)) return input.attempt(...parameters);
8
+ if (isAsyncGenerator(input)) return asyncAttempt(() => asyncGenerate(input, parameters));
9
+ throw new Error(PLAN_MESSAGE_RUN_INPUT);
10
+ }
11
+ function attemptRun(input, ...parameters) {
12
+ if (isPlan(input)) return input.attempt(...parameters);
13
+ if (isGenerator(input)) return attempt(() => generate(input, parameters));
14
+ throw new Error(PLAN_MESSAGE_RUN_INPUT);
15
+ }
16
+ function attemptRunAsyncPlan(...parameters) {
17
+ return asyncAttempt(() => this.run(...parameters));
18
+ }
19
+ function attemptRunPlan(...parameters) {
20
+ return attempt(() => this.run(...parameters));
21
+ }
22
+ attemptRun.async = asyncAttemptRun;
23
+ //#endregion
24
+ export { asyncAttemptRun, attemptRun, attemptRunAsyncPlan, attemptRunPlan };
@@ -0,0 +1,41 @@
1
+ import { AsyncPlan, InternalAsyncPlan, InternalPlan, Plan, PlanError, PlanResult } from "../internal/models/plan.model.mjs";
2
+ import { asyncAttemptRun, attemptRun } from "./result.mjs";
3
+ //#region src/plan/run.d.ts
4
+ /**
5
+ * Run an asynchronous generator to completion
6
+ *
7
+ * @param generator Generator to run
8
+ * @returns Result
9
+ */
10
+ export declare function asyncRun<Yielded, Returned, Parameters extends unknown[]>(generator: (...parameters: Parameters) => AsyncGenerator<Yielded, Returned, unknown>, ...parameters: Parameters): Promise<PlanResult<Returned>>;
11
+ /**
12
+ * Run an asynchronous plan to completion
13
+ *
14
+ * @param plan Plan to run
15
+ * @returns Result
16
+ */
17
+ export declare function asyncRun<Yielded, Returned, Parameters extends unknown[]>(plan: AsyncPlan<Yielded, Returned, Parameters>, ...parameters: Parameters): Promise<PlanResult<Returned>>;
18
+ /**
19
+ * Run a generator to completion
20
+ *
21
+ * @param generator Generator to run
22
+ * @returns Result
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>;
25
+ /**
26
+ * Run a plan to completion
27
+ *
28
+ * @param plan Plan to run
29
+ * @returns Result
30
+ */
31
+ export declare function run<Yielded, Returned, Parameters extends unknown[]>(plan: Plan<Yielded, Returned, Parameters>, ...parameters: Parameters): PlanResult<Returned> | PlanError<Yielded, Returned>;
32
+ export declare function runAsyncPlan(this: InternalAsyncPlan, ...parameters: unknown[]): Promise<unknown>;
33
+ export declare function runPlan(this: InternalPlan, ...parameters: unknown[]): unknown;
34
+ export declare namespace asyncRun {
35
+ export var attempt: typeof asyncAttemptRun;
36
+ }
37
+ export declare namespace run {
38
+ export var async: typeof asyncRun;
39
+ export var attempt: typeof attemptRun;
40
+ }
41
+ //#endregion
@@ -0,0 +1,26 @@
1
+ import { PLAN_MESSAGE_RUN_INPUT, PLAN_SYMBOL } from "../internal/models/plan.model.mjs";
2
+ import { isAsyncGenerator, isAsyncPlan, isGenerator, isPlan } from "../internal/plan.mjs";
3
+ import { asyncGenerate, generate } from "./generate.mjs";
4
+ import { asyncAttemptRun, attemptRun } from "./result.mjs";
5
+ //#region src/plan/run.ts
6
+ function asyncRun(input, ...parameters) {
7
+ if (isAsyncPlan(input)) return input.run(...parameters);
8
+ if (isAsyncGenerator(input)) return asyncGenerate(input, parameters);
9
+ throw new Error(PLAN_MESSAGE_RUN_INPUT);
10
+ }
11
+ function run(input, ...parameters) {
12
+ if (isPlan(input)) return input.run(...parameters);
13
+ if (isGenerator(input)) return generate(input, parameters);
14
+ throw new Error(PLAN_MESSAGE_RUN_INPUT);
15
+ }
16
+ function runAsyncPlan(...parameters) {
17
+ return asyncGenerate(this[PLAN_SYMBOL].generator, parameters);
18
+ }
19
+ function runPlan(...parameters) {
20
+ return generate(this[PLAN_SYMBOL].generator, parameters);
21
+ }
22
+ asyncRun.attempt = asyncAttemptRun;
23
+ run.async = asyncRun;
24
+ run.attempt = attemptRun;
25
+ //#endregion
26
+ export { asyncRun, run, runAsyncPlan, runPlan };
@@ -34,8 +34,8 @@ export type PromiseData = {
34
34
  result: ArrayOrPlainObject;
35
35
  };
36
36
  export type PromiseHandlers = {
37
- resolve: (value: unknown[]) => void;
38
- reject: (reason: unknown) => void;
37
+ resolve(value: unknown[]): void;
38
+ reject(reason: unknown): void;
39
39
  };
40
40
  /**
41
41
  * Options for a _Promise_-handling function
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oscarpalmer/atoms",
3
- "version": "0.210.0",
3
+ "version": "0.211.0",
4
4
  "description": "Atomic utilities for making your JavaScript better.",
5
5
  "keywords": [
6
6
  "array",