milkio 1.0.0-alpha.94 → 1.0.0-alpha.95

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 (2) hide show
  1. package/flow/index.ts +58 -36
  2. package/package.json +1 -1
package/flow/index.ts CHANGED
@@ -1,38 +1,60 @@
1
- export type MilkioFlow<T> = {
2
- emit: (flow: T) => void;
3
- next: () => Promise<T>;
4
- }
1
+ export type MilkioFlow<T> = AsyncIterator<T | undefined> & { emit: (flow: T) => void };
2
+
3
+ export function createFlow<T>(): MilkioFlow<T> {
4
+ const flows: Array<{
5
+ blank: boolean;
6
+ promise: Promise<T>;
7
+ resolve: (value?: T | PromiseLike<T>) => void;
8
+ reject: (reason?: any) => void;
9
+ }> = [];
5
10
 
6
- export function createFlow<T extends unknown>(): MilkioFlow<T> {
7
- const flows: Array<{
8
- blank: boolean;
9
- promise: Promise<T>;
10
- resolve: (value?: T | PromiseLike<T>) => void;
11
- reject: (reason?: any) => void;
12
- }> = [];
11
+ const iterator = {
12
+ emit: (flow: T) => {
13
+ if (flows.at(-1)?.blank === true) {
14
+ const item = flows.at(-1)!;
15
+ item.blank = false;
16
+ item.resolve(flow);
17
+ return;
18
+ } else {
19
+ const resolvers = Promise.withResolvers<T>();
20
+ resolvers.resolve(flow);
21
+ flows.push({ ...resolvers, blank: false });
22
+ }
23
+ },
24
+ ...({
25
+ async next(): Promise<IteratorResult<T>> {
26
+ if (flows.length === 0) {
27
+ const resolvers = Promise.withResolvers<T>();
28
+ flows.push({ ...resolvers, blank: true });
29
+ }
30
+ const flow = flows.at(0)!;
31
+ const result = await flow.promise;
32
+ flows.shift();
33
+ return { done: false, value: result };
34
+ },
35
+ async return(): Promise<IteratorResult<void>> {
36
+ for (const flow of flows) {
37
+ flow.blank = false;
38
+ flow.resolve(undefined);
39
+ }
40
+ return { done: true, value: undefined };
41
+ },
42
+ async throw(err: any): Promise<IteratorResult<void>> {
43
+ if (flows.length === 0) {
44
+ const resolvers = Promise.withResolvers<T>();
45
+ flows.push({ ...resolvers, blank: true });
46
+ }
47
+ for (const flow of flows) {
48
+ flow.blank = false;
49
+ flow.reject(err);
50
+ }
51
+ return { done: true, value: undefined };
52
+ },
53
+ } satisfies AsyncIterator<unknown>),
54
+ [Symbol.asyncIterator]() {
55
+ return this;
56
+ },
57
+ };
13
58
 
14
- return {
15
- emit: (flow: T) => {
16
- if (flows.at(-1)?.blank === true) {
17
- const item = flows.at(-1)!;
18
- item.blank = false;
19
- item.resolve(flow);
20
- return;
21
- } else {
22
- const resolvers = Promise.withResolvers<T>();
23
- resolvers.resolve(flow);
24
- flows.push({ ...resolvers, blank: false });
25
- }
26
- },
27
- next: async () => {
28
- if (flows.length === 0) {
29
- const resolvers = Promise.withResolvers<T>();
30
- flows.push({ ...resolvers, blank: true });
31
- }
32
- const flow = flows.at(0)!;
33
- const result = await flow.promise;
34
- flows.shift();
35
- return result;
36
- },
37
- }
38
- }
59
+ return iterator as MilkioFlow<T>;
60
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "milkio",
3
3
  "type": "module",
4
- "version": "1.0.0-alpha.94",
4
+ "version": "1.0.0-alpha.95",
5
5
  "module": "index.ts",
6
6
  "scripts": {},
7
7
  "peerDependencies": {