synstate 3.0.0 → 3.0.1

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.
Files changed (137) hide show
  1. package/dist/core/base/create-child-observable.mjs +164 -140
  2. package/dist/core/base/create-child-observable.mjs.map +1 -1
  3. package/dist/core/base/create-observable-base.mjs +148 -152
  4. package/dist/core/base/create-observable-base.mjs.map +1 -1
  5. package/dist/core/base/create-root-observable.mjs +48 -34
  6. package/dist/core/base/create-root-observable.mjs.map +1 -1
  7. package/dist/core/base/index.mjs +3 -3
  8. package/dist/core/base/index.mjs.map +1 -1
  9. package/dist/core/combine/combine.mjs +129 -37
  10. package/dist/core/combine/combine.mjs.map +1 -1
  11. package/dist/core/combine/index.mjs +4 -4
  12. package/dist/core/combine/index.mjs.map +1 -1
  13. package/dist/core/combine/merge.mjs +75 -24
  14. package/dist/core/combine/merge.mjs.map +1 -1
  15. package/dist/core/combine/zip.mjs +120 -39
  16. package/dist/core/combine/zip.mjs.map +1 -1
  17. package/dist/core/create/counter.mjs +81 -45
  18. package/dist/core/create/counter.mjs.map +1 -1
  19. package/dist/core/create/from-abortable-promise.mjs +63 -38
  20. package/dist/core/create/from-abortable-promise.mjs.map +1 -1
  21. package/dist/core/create/from-promise.mjs +67 -25
  22. package/dist/core/create/from-promise.mjs.map +1 -1
  23. package/dist/core/create/from-subscribable.mjs +70 -26
  24. package/dist/core/create/from-subscribable.mjs.map +1 -1
  25. package/dist/core/create/index.mjs +8 -8
  26. package/dist/core/create/index.mjs.map +1 -1
  27. package/dist/core/create/just.mjs +36 -13
  28. package/dist/core/create/just.mjs.map +1 -1
  29. package/dist/core/create/source.mjs +15 -19
  30. package/dist/core/create/source.mjs.map +1 -1
  31. package/dist/core/create/timer.mjs +66 -37
  32. package/dist/core/create/timer.mjs.map +1 -1
  33. package/dist/core/index.mjs +6 -41
  34. package/dist/core/index.mjs.map +1 -1
  35. package/dist/core/operators/audit.mjs +126 -39
  36. package/dist/core/operators/audit.mjs.map +1 -1
  37. package/dist/core/operators/debounce.mjs +114 -37
  38. package/dist/core/operators/debounce.mjs.map +1 -1
  39. package/dist/core/operators/filter.mjs +39 -24
  40. package/dist/core/operators/filter.mjs.map +1 -1
  41. package/dist/core/operators/index.mjs +18 -18
  42. package/dist/core/operators/index.mjs.map +1 -1
  43. package/dist/core/operators/map.mjs +74 -26
  44. package/dist/core/operators/map.mjs.map +1 -1
  45. package/dist/core/operators/merge-map.mjs +128 -35
  46. package/dist/core/operators/merge-map.mjs.map +1 -1
  47. package/dist/core/operators/pairwise.mjs +73 -23
  48. package/dist/core/operators/pairwise.mjs.map +1 -1
  49. package/dist/core/operators/scan.mjs +59 -15
  50. package/dist/core/operators/scan.mjs.map +1 -1
  51. package/dist/core/operators/skip-if-no-change.mjs +89 -31
  52. package/dist/core/operators/skip-if-no-change.mjs.map +1 -1
  53. package/dist/core/operators/skip-until.mjs +71 -29
  54. package/dist/core/operators/skip-until.mjs.map +1 -1
  55. package/dist/core/operators/skip-while.mjs +79 -27
  56. package/dist/core/operators/skip-while.mjs.map +1 -1
  57. package/dist/core/operators/switch-map.mjs +118 -31
  58. package/dist/core/operators/switch-map.mjs.map +1 -1
  59. package/dist/core/operators/take-until.mjs +70 -35
  60. package/dist/core/operators/take-until.mjs.map +1 -1
  61. package/dist/core/operators/take-while.mjs +97 -25
  62. package/dist/core/operators/take-while.mjs.map +1 -1
  63. package/dist/core/operators/throttle.mjs +108 -38
  64. package/dist/core/operators/throttle.mjs.map +1 -1
  65. package/dist/core/operators/with-buffered-from.mjs +94 -47
  66. package/dist/core/operators/with-buffered-from.mjs.map +1 -1
  67. package/dist/core/operators/with-current-value-from.mjs +78 -23
  68. package/dist/core/operators/with-current-value-from.mjs.map +1 -1
  69. package/dist/core/operators/with-initial-value.mjs +64 -14
  70. package/dist/core/operators/with-initial-value.mjs.map +1 -1
  71. package/dist/core/predefined/index.mjs +2 -12
  72. package/dist/core/predefined/index.mjs.map +1 -1
  73. package/dist/core/predefined/operators/attach-index.mjs +55 -7
  74. package/dist/core/predefined/operators/attach-index.mjs.map +1 -1
  75. package/dist/core/predefined/operators/index.mjs +12 -12
  76. package/dist/core/predefined/operators/index.mjs.map +1 -1
  77. package/dist/core/predefined/operators/map-optional.mjs +48 -5
  78. package/dist/core/predefined/operators/map-optional.mjs.map +1 -1
  79. package/dist/core/predefined/operators/map-result-err.mjs +48 -5
  80. package/dist/core/predefined/operators/map-result-err.mjs.map +1 -1
  81. package/dist/core/predefined/operators/map-result-ok.mjs +48 -5
  82. package/dist/core/predefined/operators/map-result-ok.mjs.map +1 -1
  83. package/dist/core/predefined/operators/map-to.mjs +41 -6
  84. package/dist/core/predefined/operators/map-to.mjs.map +1 -1
  85. package/dist/core/predefined/operators/pluck.mjs +45 -7
  86. package/dist/core/predefined/operators/pluck.mjs.map +1 -1
  87. package/dist/core/predefined/operators/skip.mjs +49 -6
  88. package/dist/core/predefined/operators/skip.mjs.map +1 -1
  89. package/dist/core/predefined/operators/take.mjs +42 -6
  90. package/dist/core/predefined/operators/take.mjs.map +1 -1
  91. package/dist/core/predefined/operators/unwrap-optional.mjs +43 -8
  92. package/dist/core/predefined/operators/unwrap-optional.mjs.map +1 -1
  93. package/dist/core/predefined/operators/unwrap-result-err.mjs +41 -5
  94. package/dist/core/predefined/operators/unwrap-result-err.mjs.map +1 -1
  95. package/dist/core/predefined/operators/unwrap-result-ok.mjs +43 -8
  96. package/dist/core/predefined/operators/unwrap-result-ok.mjs.map +1 -1
  97. package/dist/core/types/id.mjs +2 -2
  98. package/dist/core/types/id.mjs.map +1 -1
  99. package/dist/core/types/index.mjs +7 -3
  100. package/dist/core/types/index.mjs.map +1 -1
  101. package/dist/core/types/observable-family.mjs +14 -2
  102. package/dist/core/types/observable-family.mjs.map +1 -1
  103. package/dist/core/types/observable-kind.mjs +2 -2
  104. package/dist/core/types/observable-kind.mjs.map +1 -1
  105. package/dist/core/types/observable.mjs +14 -6
  106. package/dist/core/types/observable.mjs.map +1 -1
  107. package/dist/core/types/timer.mjs +2 -2
  108. package/dist/core/types/timer.mjs.map +1 -1
  109. package/dist/core/types/types.mjs +9 -2
  110. package/dist/core/types/types.mjs.map +1 -1
  111. package/dist/core/utils/id-maker.mjs +10 -11
  112. package/dist/core/utils/id-maker.mjs.map +1 -1
  113. package/dist/core/utils/index.mjs +5 -5
  114. package/dist/core/utils/index.mjs.map +1 -1
  115. package/dist/core/utils/max-depth.mjs +7 -4
  116. package/dist/core/utils/max-depth.mjs.map +1 -1
  117. package/dist/core/utils/observable-utils.mjs +4 -7
  118. package/dist/core/utils/observable-utils.mjs.map +1 -1
  119. package/dist/core/utils/utils.mjs +32 -28
  120. package/dist/core/utils/utils.mjs.map +1 -1
  121. package/dist/entry-point.mjs +2 -46
  122. package/dist/entry-point.mjs.map +1 -1
  123. package/dist/index.mjs +3 -46
  124. package/dist/index.mjs.map +1 -1
  125. package/dist/utils/collect-to-array.mjs +8 -13
  126. package/dist/utils/collect-to-array.mjs.map +1 -1
  127. package/dist/utils/create-boolean-state.mjs +47 -22
  128. package/dist/utils/create-boolean-state.mjs.map +1 -1
  129. package/dist/utils/create-event-emitter.mjs +67 -19
  130. package/dist/utils/create-event-emitter.mjs.map +1 -1
  131. package/dist/utils/create-reducer.mjs +54 -16
  132. package/dist/utils/create-reducer.mjs.map +1 -1
  133. package/dist/utils/create-state.mjs +54 -27
  134. package/dist/utils/create-state.mjs.map +1 -1
  135. package/dist/utils/index.mjs +6 -6
  136. package/dist/utils/index.mjs.map +1 -1
  137. package/package.json +11 -12
@@ -1,45 +1,126 @@
1
1
  import { Arr, Optional, createQueue } from 'ts-data-forge';
2
- import { createSyncChildObservable } from '../base/create-child-observable.mjs';
3
- import '../utils/id-maker.mjs';
2
+ import { createSyncChildObservable } from '../base/index.mjs';
4
3
 
5
- const zip = (parents) => (
6
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
7
- createZipObservable(parents)
8
- );
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+ export const zip = (parents) =>
55
+
56
+ createZipObservable(parents);
9
57
  const createZipObservable = (parents) => {
10
- const parentsValues = Arr.map(
11
- parents,
12
- (p) => p.getSnapshot()
13
- );
14
- const initialValue = Arr.every(
15
- parentsValues,
16
- Optional.isSome
17
- ) ? Optional.some(Arr.map(parentsValues, (c) => c.value)) : Optional.none;
18
- const queues = Arr.map(parents, () => createQueue());
19
- return createSyncChildObservable(
20
- {
21
- parents,
22
- initialValue
23
- },
24
- ({ setNext }) => (updateToken) => {
25
- for (const [index, par] of parents.entries()) {
26
- const sn = par.getSnapshot();
27
- if (par.updateToken === updateToken && Optional.isSome(sn)) {
28
- queues[index]?.enqueue(sn.value);
58
+ const parentsValues = Arr.map(parents, (p) => p.getSnapshot());
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+ const initialValue = Arr.every(parentsValues, Optional.isSome)
68
+ ? Optional.some(Arr.map(parentsValues, (c) => c.value))
69
+ : Optional.none;
70
+ const queues = Arr.map(parents, () => createQueue());
71
+ return createSyncChildObservable({
72
+ parents,
73
+ initialValue,
74
+ }, ({ setNext }) => (updateToken) => {
75
+ for (const [index, par] of parents.entries()) {
76
+ const sn = par.getSnapshot();
77
+ if (par.updateToken === updateToken && Optional.isSome(sn)) {
78
+ queues[index]?.enqueue(sn.value);
79
+ }
80
+ }
81
+ if (queues.every((list) => !list.isEmpty)) {
82
+ const nextValue =
83
+
84
+
85
+
86
+ Arr.map(queues, (q) => Optional.unwrap(q.dequeue()));
87
+ setNext(nextValue, updateToken);
29
88
  }
30
- }
31
- if (queues.every((list) => !list.isEmpty)) {
32
- const nextValue = (
33
- // `Arr.map` has a single result element type, so it reports
34
- // `A[number] | undefined` per position rather than `A[P]`.
35
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
36
- Arr.map(queues, (q) => Optional.unwrap(q.dequeue()))
37
- );
38
- setNext(nextValue, updateToken);
39
- }
40
- }
41
- );
89
+ });
42
90
  };
43
91
 
44
- export { zip };
45
- //# sourceMappingURL=zip.mjs.map
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+
108
+
109
+
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+ //# sourceMappingURL=zip.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"zip.mjs","sources":["../../../src/core/combine/zip.mts"],"sourcesContent":["import { Arr, Optional, createQueue, expectType } from 'ts-data-forge';\nimport { type NonEmptyTuple, type Tuple } from 'ts-type-forge';\nimport { createSyncChildObservable } from '../base/index.mjs';\nimport { source } from '../create/index.mjs';\nimport { withInitialValue } from '../operators/index.mjs';\nimport {\n type InitializedObservable,\n type InitializedSyncChildObservable,\n type NonEmptyUnknownList,\n type Observable,\n type SyncChildObservable,\n type TupleToQueueTuple,\n type Wrap,\n type ZipObservable,\n type ZipObservableRefined,\n} from '../types/index.mjs';\n\n/**\n * Combines multiple observables by pairing their emissions by index.\n * Waits for all sources to emit their nth value before emitting the nth tuple.\n * Completes when any source completes.\n *\n * @template OS - Tuple type of source observables\n * @param parents - Array of observables to zip\n * @returns A zipped observable emitting tuples of values\n *\n * @example\n * ```ts\n * // Timeline:\n * //\n * // letters$ 'A' 'B' 'C'\n * // numbers$ 1 2 3\n * // zipped$ ['A',1] ['B',2] ['C',3]\n * //\n * // Explanation:\n * // - zip pairs values by their index from multiple sources\n * // - Waits for all sources to emit at the same index\n * // - Completes when any source completes\n *\n * const [letters$, setLetter] = createState<string>('A');\n *\n * const [numbers$, setNumber] = createState<number>(1);\n *\n * const zipped$ = zip([letters$, numbers$]);\n *\n * const valueHistory: (readonly [string, number])[] = [];\n *\n * zipped$.subscribe(([letter, num]) => {\n * valueHistory.push([letter, num]);\n * });\n *\n * for (const letter of ['B', 'C']) {\n * setLetter(letter);\n * }\n *\n * for (const num of [2, 3]) {\n * setNumber(num);\n * }\n *\n * assert.deepStrictEqual(valueHistory, [\n * ['A', 1],\n * ['B', 2],\n * ['C', 3],\n * ]);\n * ```\n */\nexport const zip = <const OS extends NonEmptyTuple<Observable<unknown>>>(\n parents: OS,\n): ZipObservableRefined<OS> =>\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n createZipObservable(parents) as unknown as ZipObservableRefined<OS>;\n\nconst createZipObservable = <const A extends NonEmptyUnknownList>(\n parents: Wrap<A>,\n): ZipObservable<A> => {\n const parentsValues: Tuple.MapTo<Optional<A[number]>, A> = Arr.map(\n parents,\n (p) => p.getSnapshot(),\n );\n\n // The annotation on `initialValue` is what replaces the type assertion.\n // `Arr.map` carries a single result element type, so it reports `A[number]`\n // at every position, and `Tuple.MapTo<A[number], A>` — the uniform mapping\n // — is *not* assignable back to `A`. The positional\n // `Readonly<{ [K in keyof A]: A[K] }>` is, and TypeScript accepts the\n // uniform result into it because the two mapped types share `keyof A`. So\n // it is the annotation, not an assertion, that records the position-wise\n // fact the checker cannot derive on its own.\n const initialValue: Optional<Readonly<{ [K in keyof A]: A[K] }>> = Arr.every(\n parentsValues,\n Optional.isSome,\n )\n ? Optional.some(Arr.map(parentsValues, (c) => c.value))\n : Optional.none;\n\n const queues: TupleToQueueTuple<A> = Arr.map(parents, () => createQueue());\n\n return createSyncChildObservable<A, A>(\n {\n parents,\n initialValue,\n },\n ({ setNext }) =>\n (updateToken) => {\n for (const [index, par] of parents.entries()) {\n const sn = par.getSnapshot();\n\n if (par.updateToken === updateToken && Optional.isSome(sn)) {\n queues[index]?.enqueue(sn.value);\n }\n }\n\n if (queues.every((list) => !list.isEmpty)) {\n const nextValue =\n // `Arr.map` has a single result element type, so it reports\n // `A[number] | undefined` per position rather than `A[P]`.\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n Arr.map(queues, (q) => Optional.unwrap(q.dequeue())) as A;\n\n setNext(nextValue, updateToken);\n }\n },\n );\n};\n\nif (import.meta.vitest !== undefined) {\n test('type test', () => {\n expect(1).toBe(1); // dummy\n });\n\n {\n const s1: Observable<1> = source<1>();\n\n const s2: Observable<2> = source<2>();\n\n const _d = zip([s1, s2]);\n\n expectType<typeof _d, ZipObservable<readonly [1, 2]>>('=');\n\n expectType<typeof _d, Observable<readonly [1, 2]>>('<=');\n }\n\n {\n const s1: InitializedObservable<1> = source<1>().pipe(withInitialValue(1));\n\n const s2: Observable<2> = source<2>();\n\n const _d = zip([s1, s2]);\n\n expectType<typeof _d, ZipObservable<readonly [1, 2]>>('=');\n\n expectType<typeof _d, Observable<readonly [1, 2]>>('<=');\n }\n\n {\n const s1: InitializedObservable<1> = source<1>().pipe(withInitialValue(1));\n\n const s2: InitializedObservable<2> = source<2>().pipe(withInitialValue(2));\n\n const _d = zip([s1, s2]);\n\n // Returns InitializedObservable if all OS are InitializedObservable\n expectType<typeof _d, InitializedObservable<readonly [1, 2]>>('<=');\n }\n\n const r1 = source(1);\n\n const r2 = source('a');\n\n const _z = zip([r1, r2]);\n\n const _zi = zip([\n r1.pipe(withInitialValue(0)),\n r2.pipe(withInitialValue('0')),\n ]);\n\n expectType<typeof _z, SyncChildObservable<readonly [number, string]>>('<=');\n\n expectType<\n typeof _zi,\n InitializedSyncChildObservable<readonly [number, string]>\n >('<=');\n}\n"],"names":[],"mappings":";;;;AAkEO,MAAM,MAAM,CACjB,OAAA;AAAA;AAAA,EAGA,oBAAoB,OAAO;AAAA;AAE7B,MAAM,mBAAA,GAAsB,CAC1B,OAAA,KACqB;AACrB,EAAA,MAAM,gBAAqD,GAAA,CAAI,GAAA;AAAA,IAC7D,OAAA;AAAA,IACA,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA;AAAY,GACvB;AAUA,EAAA,MAAM,eAA6D,GAAA,CAAI,KAAA;AAAA,IACrE,aAAA;AAAA,IACA,QAAA,CAAS;AAAA,GACX,GACI,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAC,CAAA,GACpD,QAAA,CAAS,IAAA;AAEb,EAAA,MAAM,SAA+B,GAAA,CAAI,GAAA,CAAI,OAAA,EAAS,MAAM,aAAa,CAAA;AAEzE,EAAA,OAAO,yBAAA;AAAA,IACL;AAAA,MACE,OAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,CAAC,EAAE,OAAA,EAAQ,KACT,CAAC,WAAA,KAAgB;AACf,MAAA,KAAA,MAAW,CAAC,KAAA,EAAO,GAAG,CAAA,IAAK,OAAA,CAAQ,SAAQ,EAAG;AAC5C,QAAA,MAAM,EAAA,GAAK,IAAI,WAAA,EAAY;AAE3B,QAAA,IAAI,IAAI,WAAA,KAAgB,WAAA,IAAe,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,EAAG;AAC1D,UAAA,MAAA,CAAO,KAAK,CAAA,EAAG,OAAA,CAAQ,EAAA,CAAG,KAAK,CAAA;AAAA,QAAA;AACjC,MAAA;AAGF,MAAA,IAAI,OAAO,KAAA,CAAM,CAAC,SAAS,CAAC,IAAA,CAAK,OAAO,CAAA,EAAG;AACzC,QAAA,MAAM,SAAA;AAAA;AAAA;AAAA;AAAA,UAIJ,GAAA,CAAI,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA,KAAM,SAAS,MAAA,CAAO,CAAA,CAAE,OAAA,EAAS,CAAC;AAAA,SAAA;AAErD,QAAA,OAAA,CAAQ,WAAW,WAAW,CAAA;AAAA,MAAA;AAChC,IAAA;AACF,GACJ;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"zip.mjs","sourceRoot":"","sources":["../../../src/core/combine/zip.mts"],"names":[],"mappings":"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"}
@@ -1,47 +1,83 @@
1
- import { asSafeUint, SafeUint, Optional } from 'ts-data-forge';
2
- import '../utils/id-maker.mjs';
3
- import { createRootObservable } from '../base/create-root-observable.mjs';
4
-
5
- const counter = (intervalMilliSeconds, options) => {
6
- let mut_counter = asSafeUint(0);
7
- let mut_timerId0 = void 0;
8
- let mut_timerId = void 0;
9
- let mut_isStarted = false;
10
- const resetTimer = () => {
11
- if (mut_timerId0 === void 0 || mut_timerId === void 0) {
12
- return;
13
- }
14
- clearInterval(mut_timerId0);
15
- clearInterval(mut_timerId);
16
- };
17
- const observable = createRootObservable(
18
- { initialValue: Optional.none, onComplete: resetTimer },
19
- ({ startUpdate, isCompleted }) => ({
20
- start: () => {
21
- if (mut_isStarted) {
22
- console.warn("cannot start twice");
23
- return;
24
- }
25
- mut_isStarted = true;
26
- if (isCompleted()) {
27
- console.warn("cannot restart stopped CounterObservable");
28
- return;
1
+ import { asSafeUint, Optional, SafeUint } from 'ts-data-forge';
2
+ import { createRootObservable } from '../base/index.mjs';
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+ export const counter = (intervalMilliSeconds, options) => {
47
+ let mut_counter = asSafeUint(0);
48
+ let mut_timerId0 = undefined;
49
+ let mut_timerId = undefined;
50
+ let mut_isStarted = false;
51
+ const resetTimer = () => {
52
+ if (mut_timerId0 === undefined || mut_timerId === undefined) {
53
+ return;
29
54
  }
30
- mut_timerId0 = setTimeout(() => {
31
- startUpdate(mut_counter);
32
- }, 0);
33
- mut_timerId = setInterval(() => {
34
- mut_counter = SafeUint.add(1, mut_counter);
35
- startUpdate(mut_counter);
36
- }, intervalMilliSeconds);
37
- }
38
- })
39
- );
40
- if (!(options?.startManually ?? false)) {
41
- observable.start();
42
- }
43
- return observable;
55
+ clearInterval(mut_timerId0);
56
+ clearInterval(mut_timerId);
57
+ };
58
+ const observable = createRootObservable({ initialValue: Optional.none, onComplete: resetTimer }, ({ startUpdate, isCompleted }) => ({
59
+ start: () => {
60
+ if (mut_isStarted) {
61
+ console.warn('cannot start twice');
62
+ return;
63
+ }
64
+ mut_isStarted = true;
65
+ if (isCompleted()) {
66
+ console.warn('cannot restart stopped CounterObservable');
67
+ return;
68
+ }
69
+ mut_timerId0 = setTimeout(() => {
70
+ startUpdate(mut_counter);
71
+ }, 0);
72
+ mut_timerId = setInterval(() => {
73
+ mut_counter = SafeUint.add(1, mut_counter);
74
+ startUpdate(mut_counter);
75
+ }, intervalMilliSeconds);
76
+ },
77
+ }));
78
+ if (!(options?.startManually ?? false)) {
79
+ observable.start();
80
+ }
81
+ return observable;
44
82
  };
45
-
46
- export { counter };
47
- //# sourceMappingURL=counter.mjs.map
83
+ //# sourceMappingURL=counter.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"counter.mjs","sources":["../../../src/core/create/counter.mts"],"sourcesContent":["import { asSafeUint, Optional, SafeUint } from 'ts-data-forge';\nimport { createRootObservable } from '../base/index.mjs';\nimport { type CounterObservable, type TimerId } from '../types/index.mjs';\n\n/**\n * Creates an observable that emits incremental numbers at a specified interval.\n * Starts with 0 immediately after subscription, then emits 1, 2, 3, ... every interval.\n *\n * @param intervalMilliSeconds - The interval duration in milliseconds\n * @param startManually - If true, waits for manual start (default: false)\n * @returns An observable that emits sequential numbers\n *\n * @example\n * ```ts\n * // Timeline:\n * //\n * // Time(s) 0 1 2 3 4 5\n * // tick$ 0 1 2 3 4 5 ...\n * //\n * // Explanation:\n * // - counter emits incrementing numbers at specified intervals\n * // - Starts at 0 and continues indefinitely\n * // - Useful for periodic tasks or animations\n *\n * const tick$ = counter(100);\n *\n * const valueHistory: number[] = [];\n *\n * const subscription = tick$.subscribe((count) => {\n * valueHistory.push(count);\n * });\n *\n * await new Promise((resolve) => {\n * setTimeout(resolve, 350);\n * });\n *\n * subscription.unsubscribe();\n *\n * assert.isTrue(Arr.isMinLengthArray(3, valueHistory));\n *\n * assert.deepStrictEqual(valueHistory[0], 0);\n *\n * assert.deepStrictEqual(valueHistory[1], 1);\n *\n * assert.deepStrictEqual(valueHistory[2], 2);\n * ```\n */\nexport const counter = (\n intervalMilliSeconds: number,\n options?: Readonly<{\n startManually?: boolean;\n }>,\n): CounterObservable => {\n let mut_counter: SafeUint = asSafeUint(0);\n\n let mut_timerId0: TimerId | undefined = undefined;\n\n let mut_timerId: TimerId | undefined = undefined;\n\n let mut_isStarted = false;\n\n const resetTimer = (): void => {\n if (mut_timerId0 === undefined || mut_timerId === undefined) {\n return;\n }\n\n clearInterval(mut_timerId0);\n\n clearInterval(mut_timerId);\n };\n\n const observable = createRootObservable<\n SafeUint,\n Readonly<{ start: () => void }>\n >(\n { initialValue: Optional.none, onComplete: resetTimer },\n ({ startUpdate, isCompleted }) => ({\n start: () => {\n if (mut_isStarted) {\n console.warn('cannot start twice');\n\n return;\n }\n\n mut_isStarted = true;\n\n if (isCompleted()) {\n console.warn('cannot restart stopped CounterObservable');\n\n return;\n }\n\n mut_timerId0 = setTimeout(() => {\n startUpdate(mut_counter);\n }, 0);\n\n mut_timerId = setInterval(() => {\n mut_counter = SafeUint.add(1, mut_counter);\n\n startUpdate(mut_counter);\n }, intervalMilliSeconds);\n },\n }),\n );\n\n if (!(options?.startManually ?? false)) {\n observable.start();\n }\n\n return observable;\n};\n"],"names":[],"mappings":";;;;AA+CO,MAAM,OAAA,GAAU,CACrB,oBAAA,EACA,OAAA,KAGsB;AACtB,EAAA,IAAI,WAAA,GAAwB,WAAW,CAAC,CAAA;AAExC,EAAA,IAAI,YAAA,GAAoC,MAAA;AAExC,EAAA,IAAI,WAAA,GAAmC,MAAA;AAEvC,EAAA,IAAI,aAAA,GAAgB,KAAA;AAEpB,EAAA,MAAM,aAAa,MAAY;AAC7B,IAAA,IAAI,YAAA,KAAiB,MAAA,IAAa,WAAA,KAAgB,MAAA,EAAW;AAC3D,MAAA;AAAA,IACF;AAEA,IAAA,aAAA,CAAc,YAAY,CAAA;AAE1B,IAAA,aAAA,CAAc,WAAW,CAAA;AAAA,EAC3B,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,oBAAA;AAAA,IAIjB,EAAE,YAAA,EAAc,QAAA,CAAS,IAAA,EAAM,YAAY,UAAA,EAAW;AAAA,IACtD,CAAC,EAAE,WAAA,EAAa,WAAA,EAAY,MAAO;AAAA,MACjC,OAAO,MAAM;AACX,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,OAAA,CAAQ,KAAK,oBAAoB,CAAA;AAEjC,UAAA;AAAA,QACF;AAEA,QAAA,aAAA,GAAgB,IAAA;AAEhB,QAAA,IAAI,aAAY,EAAG;AACjB,UAAA,OAAA,CAAQ,KAAK,0CAA0C,CAAA;AAEvD,UAAA;AAAA,QACF;AAEA,QAAA,YAAA,GAAe,WAAW,MAAM;AAC9B,UAAA,WAAA,CAAY,WAAW,CAAA;AAAA,QACzB,GAAG,CAAC,CAAA;AAEJ,QAAA,WAAA,GAAc,YAAY,MAAM;AAC9B,UAAA,WAAA,GAAc,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,WAAW,CAAA;AAEzC,UAAA,WAAA,CAAY,WAAW,CAAA;AAAA,QACzB,GAAG,oBAAoB,CAAA;AAAA,MACzB;AAAA,KACF;AAAA,GACF;AAEA,EAAA,IAAI,EAAE,OAAA,EAAS,aAAA,IAAiB,KAAA,CAAA,EAAQ;AACtC,IAAA,UAAA,CAAW,KAAA,EAAM;AAAA,EACnB;AAEA,EAAA,OAAO,UAAA;AACT;;;;"}
1
+ {"version":3,"file":"counter.mjs","sourceRoot":"","sources":["../../../src/core/create/counter.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,oBAA4B,EAC5B,OAEE,EACiB,EAAE;IACrB,IAAI,WAAW,GAAa,UAAU,CAAC,CAAC,CAAC,CAAC;IAE1C,IAAI,YAAY,GAAwB,SAAS,CAAC;IAElD,IAAI,WAAW,GAAwB,SAAS,CAAC;IAEjD,IAAI,aAAa,GAAG,KAAK,CAAC;IAE1B,MAAM,UAAU,GAAG,GAAS,EAAE;QAC5B,IAAI,YAAY,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,aAAa,CAAC,YAAY,CAAC,CAAC;QAE5B,aAAa,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,oBAAoB,CAIrC,EAAE,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,EACvD,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QACjC,KAAK,EAAE,GAAG,EAAE;YACV,IAAI,aAAa,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBAEnC,OAAO;YACT,CAAC;YAED,aAAa,GAAG,IAAI,CAAC;YAErB,IAAI,WAAW,EAAE,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;gBAEzD,OAAO;YACT,CAAC;YAED,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC7B,WAAW,CAAC,WAAW,CAAC,CAAC;YAC3B,CAAC,EAAE,CAAC,CAAC,CAAC;YAEN,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;gBAC7B,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;gBAE3C,WAAW,CAAC,WAAW,CAAC,CAAC;YAC3B,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAC3B,CAAC;KACF,CAAC,CACH,CAAC;IAEF,IAAI,CAAC,CAAC,OAAO,EAAE,aAAa,IAAI,KAAK,CAAC,EAAE,CAAC;QACvC,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC"}
@@ -1,39 +1,64 @@
1
- import { Result, Optional } from 'ts-data-forge';
2
- import '../utils/id-maker.mjs';
3
- import { createRootObservable } from '../base/create-root-observable.mjs';
4
-
5
- const fromAbortablePromise = (factory) => {
6
- const abortController = new AbortController();
7
- return createRootObservable(
8
- {
9
- initialValue: Optional.none,
10
- onComplete: () => {
11
- abortController.abort();
12
- }
13
- },
14
- ({ startUpdate, isCompleted, complete }) => {
15
- const promise = factory(abortController.signal);
16
- promise.then((value) => {
17
- if (isCompleted()) return;
18
- startUpdate(Result.ok(value));
19
- }).catch((error) => {
20
- if (isCompleted()) return;
21
- if (error instanceof DOMException && error.name === "AbortError") {
22
- return;
23
- }
24
- startUpdate(
25
- Result.err(
26
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
27
- error
28
- )
29
- );
30
- }).finally(() => {
31
- complete();
32
- });
33
- return {};
34
- }
35
- );
36
- };
1
+ import { Optional, Result } from 'ts-data-forge';
2
+ import { createRootObservable } from '../base/index.mjs';
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
37
18
 
38
- export { fromAbortablePromise };
39
- //# sourceMappingURL=from-abortable-promise.mjs.map
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+ export const fromAbortablePromise = (
30
+
31
+ factory) => {
32
+ const abortController = new AbortController();
33
+ return createRootObservable({
34
+ initialValue: Optional.none,
35
+ onComplete: () => {
36
+ abortController.abort();
37
+ },
38
+ }, ({ startUpdate, isCompleted, complete }) => {
39
+ const promise = factory(abortController.signal);
40
+ promise
41
+ .then((value) => {
42
+ if (isCompleted())
43
+ return;
44
+ startUpdate(Result.ok(value));
45
+ })
46
+ .catch((error) => {
47
+ if (isCompleted())
48
+ return;
49
+
50
+
51
+ if (error instanceof DOMException && error.name === 'AbortError') {
52
+ return;
53
+ }
54
+ startUpdate(Result.err(
55
+
56
+ error));
57
+ })
58
+ .finally(() => {
59
+ complete();
60
+ });
61
+ return {};
62
+ });
63
+ };
64
+ //# sourceMappingURL=from-abortable-promise.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"from-abortable-promise.mjs","sources":["../../../src/core/create/from-abortable-promise.mts"],"sourcesContent":["import { Optional, Result } from 'ts-data-forge';\nimport { createRootObservable } from '../base/index.mjs';\nimport { type FromPromiseObservable } from '../types/index.mjs';\n\n/**\n * Creates an observable from a Promise factory that receives an `AbortSignal`.\n * When the observable is completed (e.g., by `switchMap` switching to a new\n * inner observable), the `AbortController` is automatically aborted, cancelling\n * the in-flight request.\n *\n * Emits `Result.ok(value)` when the promise resolves, or `Result.err(error)`\n * when it rejects. Rejections caused by abort (`AbortError`) are silently\n * ignored and do not emit.\n *\n * @template A - The type of the resolved value\n * @template E - The type of the error (excluding AbortError)\n * @param factory - A function that receives an `AbortSignal` and returns a Promise\n * @returns An observable that emits the promise result\n *\n * @example\n * ```ts\n * const results$ = query.pipe(\n * switchMap((q) =>\n * fromAbortablePromise((signal) =>\n * fetch(`/api/search?q=${q}`, { signal }).then((r) => r.json()),\n * ),\n * ),\n * );\n * ```\n */\nexport const fromAbortablePromise = <A, E = unknown>(\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\n factory: (signal: AbortSignal) => Promise<A>,\n): FromPromiseObservable<A, E> => {\n const abortController = new AbortController();\n\n return createRootObservable<Result<A, E>>(\n {\n initialValue: Optional.none,\n onComplete: () => {\n abortController.abort();\n },\n },\n ({ startUpdate, isCompleted, complete }) => {\n const promise = factory(abortController.signal);\n\n promise\n .then((value) => {\n if (isCompleted()) return;\n\n startUpdate(Result.ok(value));\n })\n .catch((error: unknown) => {\n if (isCompleted()) return;\n\n // Silently ignore AbortError — it means the observable was\n // intentionally completed (e.g., by switchMap).\n if (error instanceof DOMException && error.name === 'AbortError') {\n return;\n }\n\n startUpdate(\n Result.err(\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n error as E,\n ),\n );\n })\n .finally(() => {\n complete();\n });\n\n return {};\n },\n );\n};\n"],"names":[],"mappings":";;;;AA8BO,MAAM,oBAAA,GAAuB,CAElC,OAAA,KACgC;AAChC,EAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAE5C,EAAA,OAAO,oBAAA;AAAA,IACL;AAAA,MACE,cAAc,QAAA,CAAS,IAAA;AAAA,MACvB,YAAY,MAAM;AAChB,QAAA,eAAA,CAAgB,KAAA,EAAM;AAAA,MACxB;AAAA,KACF;AAAA,IACA,CAAC,EAAE,WAAA,EAAa,WAAA,EAAa,UAAS,KAAM;AAC1C,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,eAAA,CAAgB,MAAM,CAAA;AAE9C,MAAA,OAAA,CACG,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,QAAA,IAAI,aAAY,EAAG;AAEnB,QAAA,WAAA,CAAY,MAAA,CAAO,EAAA,CAAG,KAAK,CAAC,CAAA;AAAA,MAC9B,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,QAAA,IAAI,aAAY,EAAG;AAInB,QAAA,IAAI,KAAA,YAAiB,YAAA,IAAgB,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AAChE,UAAA;AAAA,QACF;AAEA,QAAA,WAAA;AAAA,UACE,MAAA,CAAO,GAAA;AAAA;AAAA,YAEL;AAAA;AACF,SACF;AAAA,MACF,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,QAAA,QAAA,EAAS;AAAA,MACX,CAAC,CAAA;AAEH,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"from-abortable-promise.mjs","sourceRoot":"","sources":["../../../src/core/create/from-abortable-promise.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;AAClC,8EAA8E;AAC9E,OAA4C,EACf,EAAE;IAC/B,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAE9C,OAAO,oBAAoB,CACzB;QACE,YAAY,EAAE,QAAQ,CAAC,IAAI;QAC3B,UAAU,EAAE,GAAG,EAAE;YACf,eAAe,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC;KACF,EACD,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAEhD,OAAO;aACJ,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YACd,IAAI,WAAW,EAAE;gBAAE,OAAO;YAE1B,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACxB,IAAI,WAAW,EAAE;gBAAE,OAAO;YAE1B,2DAA2D;YAC3D,gDAAgD;YAChD,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACjE,OAAO;YACT,CAAC;YAED,WAAW,CACT,MAAM,CAAC,GAAG;YACR,oEAAoE;YACpE,KAAU,CACX,CACF,CAAC;QACJ,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,QAAQ,EAAE,CAAC;QACb,CAAC,CAAC,CAAC;QAEL,OAAO,EAAE,CAAC;IACZ,CAAC,CACF,CAAC;AACJ,CAAC,CAAC"}
@@ -1,27 +1,69 @@
1
- import { Result, Optional } from 'ts-data-forge';
2
- import '../utils/id-maker.mjs';
3
- import { createRootObservable } from '../base/create-root-observable.mjs';
4
-
5
- const fromPromise = (promise) => createRootObservable(
6
- { initialValue: Optional.none },
7
- ({ startUpdate, isCompleted, complete }) => {
8
- promise.then((value) => {
9
- if (isCompleted()) return;
10
- startUpdate(Result.ok(value));
11
- }).catch((error) => {
12
- if (isCompleted()) return;
13
- startUpdate(
14
- Result.err(
15
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
16
- error
17
- )
18
- );
19
- }).finally(() => {
20
- complete();
1
+ import { Optional, Result } from 'ts-data-forge';
2
+ import { createRootObservable } from '../base/index.mjs';
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+ export const fromPromise = (promise) => createRootObservable({ initialValue: Optional.none }, ({ startUpdate, isCompleted, complete }) => {
51
+ promise
52
+ .then((value) => {
53
+ if (isCompleted())
54
+ return;
55
+ startUpdate(Result.ok(value));
56
+ })
57
+ .catch((error) => {
58
+ if (isCompleted())
59
+ return;
60
+ startUpdate(Result.err(
61
+
62
+ error));
63
+ })
64
+ .finally(() => {
65
+ complete();
21
66
  });
22
67
  return {};
23
- }
24
- );
25
-
26
- export { fromPromise };
27
- //# sourceMappingURL=from-promise.mjs.map
68
+ });
69
+ //# sourceMappingURL=from-promise.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"from-promise.mjs","sources":["../../../src/core/create/from-promise.mts"],"sourcesContent":["import { Optional, Result } from 'ts-data-forge';\nimport { createRootObservable } from '../base/index.mjs';\nimport { type FromPromiseObservable } from '../types/index.mjs';\n\n/**\n * Creates an observable from a Promise.\n * Emits Result.ok when the promise resolves, or Result.err when it rejects.\n *\n * @template A - The type of the resolved value\n * @template E - The type of the error\n * @param promise - The promise to convert to observable\n * @returns An observable that emits the promise result\n *\n * @example\n * ```ts\n * // Timeline:\n * //\n * // promise [pending...] -> resolved/rejected\n * // data$ Ok(value) or Err(error)\n * //\n * // Explanation:\n * // - fromPromise converts a Promise into an observable\n * // - Emits a Result type: Ok(value) on success, Err(error) on failure\n * // - Completes after emitting the result\n * // - Useful for integrating async operations into reactive flows\n *\n * const fetchData = async (): Promise<Readonly<{ value: number }>> =>\n * ({\n * value: 42,\n * }) as const;\n *\n * const data$ = fromPromise(fetchData());\n *\n * const valueHistory: Readonly<{ value: number }>[] = [];\n *\n * await new Promise<void>((resolve) => {\n * data$.subscribe(\n * (result) => {\n * if (Result.isOk(result)) {\n * valueHistory.push(result.value);\n * }\n * },\n * () => {\n * resolve();\n * },\n * );\n * });\n *\n * assert.deepStrictEqual(valueHistory, [{ value: 42 }]);\n * ```\n */\nexport const fromPromise = <A, E = unknown>(\n promise: Promise<A>,\n): FromPromiseObservable<A, E> =>\n createRootObservable<Result<A, E>>(\n { initialValue: Optional.none },\n ({ startUpdate, isCompleted, complete }) => {\n promise\n .then((value) => {\n if (isCompleted()) return;\n\n startUpdate(Result.ok(value));\n })\n .catch((error: unknown) => {\n if (isCompleted()) return;\n\n startUpdate(\n Result.err(\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n error as E,\n ),\n );\n })\n .finally(() => {\n complete();\n });\n\n return {};\n },\n );\n"],"names":[],"mappings":";;;;AAmDO,MAAM,WAAA,GAAc,CACzB,OAAA,KAEA,oBAAA;AAAA,EACE,EAAE,YAAA,EAAc,QAAA,CAAS,IAAA,EAAK;AAAA,EAC9B,CAAC,EAAE,WAAA,EAAa,WAAA,EAAa,UAAS,KAAM;AAC1C,IAAA,OAAA,CACG,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,MAAA,IAAI,aAAY,EAAG;AAEnB,MAAA,WAAA,CAAY,MAAA,CAAO,EAAA,CAAG,KAAK,CAAC,CAAA;AAAA,IAC9B,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,MAAA,IAAI,aAAY,EAAG;AAEnB,MAAA,WAAA;AAAA,QACE,MAAA,CAAO,GAAA;AAAA;AAAA,UAEL;AAAA;AACF,OACF;AAAA,IACF,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,MAAA,QAAA,EAAS;AAAA,IACX,CAAC,CAAA;AAEH,IAAA,OAAO,EAAC;AAAA,EACV;AACF;;;;"}
1
+ {"version":3,"file":"from-promise.mjs","sourceRoot":"","sources":["../../../src/core/create/from-promise.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,OAAmB,EACU,EAAE,CAC/B,oBAAoB,CAClB,EAAE,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,EAC/B,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;IACzC,OAAO;SACJ,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACd,IAAI,WAAW,EAAE;YAAE,OAAO;QAE1B,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACxB,IAAI,WAAW,EAAE;YAAE,OAAO;QAE1B,WAAW,CACT,MAAM,CAAC,GAAG;QACR,oEAAoE;QACpE,KAAU,CACX,CACF,CAAC;IACJ,CAAC,CAAC;SACD,OAAO,CAAC,GAAG,EAAE;QACZ,QAAQ,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEL,OAAO,EAAE,CAAC;AACZ,CAAC,CACF,CAAC"}