yieldkit 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +221 -0
- package/dist/async-generators.d.ts +13 -0
- package/dist/async-generators.d.ts.map +1 -0
- package/dist/async-generators.js +124 -0
- package/dist/async-generators.js.map +1 -0
- package/dist/compositions.d.ts +2 -0
- package/dist/compositions.d.ts.map +1 -0
- package/dist/compositions.js +6 -0
- package/dist/compositions.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/listeners.d.ts +8 -0
- package/dist/listeners.d.ts.map +1 -0
- package/dist/listeners.js +29 -0
- package/dist/listeners.js.map +1 -0
- package/dist/sync-generators.d.ts +12 -0
- package/dist/sync-generators.d.ts.map +1 -0
- package/dist/sync-generators.js +130 -0
- package/dist/sync-generators.js.map +1 -0
- package/package.json +41 -0
package/README.md
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# yieldkit
|
|
2
|
+
|
|
3
|
+
Composable synchronous and asynchronous generator helpers for working with iterable data structures in a **lazy**, **memory-efficient** way, without materializing entire datasets upfront.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { filter, map, take } from 'yieldkit/async'
|
|
7
|
+
|
|
8
|
+
async function* users() {
|
|
9
|
+
for (let page = 1; ; page++) {
|
|
10
|
+
const batch = await getPage(page)
|
|
11
|
+
if (!batch.length) return
|
|
12
|
+
yield* batch
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
for await (const email of map(
|
|
17
|
+
take(filter(users(), (user) => user.active), 50),
|
|
18
|
+
[(user) => ({ to: user.email, subject: `Welcome, ${user.name}!` })],
|
|
19
|
+
)) send(email)
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import { enumerate, zip, filter, map } from 'yieldkit/sync'
|
|
24
|
+
|
|
25
|
+
const catalog = map(
|
|
26
|
+
filter(
|
|
27
|
+
zip(
|
|
28
|
+
enumerate(["shirts", "hats", "mugs"]),
|
|
29
|
+
zip([1999, 1299, 899], [12, 0, 44]),
|
|
30
|
+
),
|
|
31
|
+
([, [, quantity]]) => quantity > 0,
|
|
32
|
+
),
|
|
33
|
+
[([[i, name], [price, quantity]]) => `#${i + 1} ${name} — $${price / 100} (${quantity})`],
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
[...catalog] // ['#1 shirts — $19.99 (12)', '#3 mugs — $8.99 (44)']
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
import { on, once } from 'yieldkit'
|
|
41
|
+
import { watch, filter, sequence, every, any, onlyEvent } from 'yieldkit/async'
|
|
42
|
+
|
|
43
|
+
const target = document.createElement('div')
|
|
44
|
+
|
|
45
|
+
const drags = watch(() =>
|
|
46
|
+
filter(
|
|
47
|
+
sequence(
|
|
48
|
+
once(target, 'mousedown'),
|
|
49
|
+
every(
|
|
50
|
+
any(on(window, 'mousemove'), on(window, 'mouseup')),
|
|
51
|
+
onlyEvent('mousemove'),
|
|
52
|
+
),
|
|
53
|
+
),
|
|
54
|
+
onlyEvent('mousemove'),
|
|
55
|
+
),
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
for await (const event of drags) {
|
|
59
|
+
console.log(event.clientX, event.clientY)
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Lazy evaluation
|
|
64
|
+
|
|
65
|
+
`yieldkit` evaluates data **on demand** — one value at a time, as you pull it through the pipeline. That makes **streams** and **large datasets** practical to work with, synchronously or asynchronously, without holding everything in memory.
|
|
66
|
+
|
|
67
|
+
### Functional purity
|
|
68
|
+
|
|
69
|
+
The helpers are small, stateless functions that take data in and yield data out. You chain transformations declaratively — filter, then map, then take — and get code that is more **predictable, testable, and maintainable**.
|
|
70
|
+
|
|
71
|
+
### Unified composition
|
|
72
|
+
|
|
73
|
+
Whether you are chaining arrays, custom iterables, async generators, or event listeners, `yieldkit` offers a **single, consistent vocabulary** — `sequence`, `filter`, `take`, `map`, `zip`, and the rest work the same way across sync and async modules. One composition model for iterable data, instead of a different ad-hoc pattern for each source.
|
|
74
|
+
|
|
75
|
+
## Installation
|
|
76
|
+
|
|
77
|
+
```sh
|
|
78
|
+
npm install yieldkit
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
This package is published as ESM and includes TypeScript declarations.
|
|
82
|
+
|
|
83
|
+
## Synchronous Generators
|
|
84
|
+
|
|
85
|
+
The synchronous helpers compose regular `Iterable` values.
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
import { sequence, take } from 'yieldkit/sync'
|
|
89
|
+
|
|
90
|
+
const values = sequence(
|
|
91
|
+
[1, 2],
|
|
92
|
+
take([3, 4, 5], 2),
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
console.log([...values])
|
|
96
|
+
// [1, 2, 3, 4]
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Available helpers:
|
|
100
|
+
|
|
101
|
+
- `watch(executor)` repeats an iterable-producing function forever.
|
|
102
|
+
- `sequence(...iterables)` yields each iterable in order.
|
|
103
|
+
- `filter(iterable, predicate)` yields values that pass a predicate. Supports type-predicate narrowing with `onlyEvent`.
|
|
104
|
+
- `every(iterable, predicate)` yields values until the predicate fails.
|
|
105
|
+
- `take(iterable, count)` yields a fixed number of values, stopping early if the source ends.
|
|
106
|
+
- `map(iterable, mappers)` applies a pipeline of mapper functions to each value.
|
|
107
|
+
- `slice(iterable, start, stop, step?)` yields a sliced range of values.
|
|
108
|
+
- `enumerate(iterable)` yields `[index, value]` pairs.
|
|
109
|
+
- `zip(a, b)` yields `[a, b]` pairs; `zip` with 3+ same-type iterables yields rows, stopping at the shortest one.
|
|
110
|
+
- `onlyEvent(eventType)` returns a type predicate for matching DOM event types.
|
|
111
|
+
|
|
112
|
+
## Asynchronous Generators
|
|
113
|
+
|
|
114
|
+
The asynchronous helpers compose `AsyncIterable` values.
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
import { sequence, take } from 'yieldkit/async'
|
|
118
|
+
|
|
119
|
+
async function* values(...items: number[]) {
|
|
120
|
+
yield* items
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const generated = sequence(
|
|
124
|
+
values(1, 2),
|
|
125
|
+
take(values(3, 4), 1),
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
for await (const value of generated) {
|
|
129
|
+
console.log(value)
|
|
130
|
+
}
|
|
131
|
+
// 1
|
|
132
|
+
// 2
|
|
133
|
+
// 3
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Available helpers:
|
|
137
|
+
|
|
138
|
+
- `watch(executor)` repeats an async iterable-producing function forever.
|
|
139
|
+
- `sequence(...iterables)` yields each async iterable in order.
|
|
140
|
+
- `filter(iterable, predicate)` yields values that pass a predicate. Supports type-predicate narrowing with `onlyEvent`.
|
|
141
|
+
- `every(iterable, predicate)` yields values until the predicate fails.
|
|
142
|
+
- `any(...iterables)` yields whichever async iterable resolves first.
|
|
143
|
+
- `take(iterable, count)` yields a fixed number of values, stopping early if the source ends.
|
|
144
|
+
- `map(iterable, mappers)` applies a pipeline of mapper functions to each value.
|
|
145
|
+
- `slice(iterable, start, stop, step?)` yields a sliced range of values.
|
|
146
|
+
- `enumerate(iterable)` yields `[index, value]` pairs.
|
|
147
|
+
- `zip(a, b)` yields `[a, b]` pairs; `zip` with 3+ same-type iterables yields rows, stopping at the shortest one.
|
|
148
|
+
- `onlyEvent(eventType)` returns a type predicate for matching DOM event types.
|
|
149
|
+
|
|
150
|
+
## DOM Events
|
|
151
|
+
|
|
152
|
+
`on` and `once` expose DOM events as async iterators. They accept a `Target` (`Window`, `Document`, or `HTMLElement`) and return iterators typed to the matching event for that target.
|
|
153
|
+
|
|
154
|
+
```ts
|
|
155
|
+
import { on } from 'yieldkit'
|
|
156
|
+
|
|
157
|
+
const button = document.querySelector('button')!
|
|
158
|
+
const clicks = on(button, 'click')
|
|
159
|
+
|
|
160
|
+
for await (const event of clicks) {
|
|
161
|
+
console.log(event.type)
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Use `once` when you only want the first matching event:
|
|
166
|
+
|
|
167
|
+
```ts
|
|
168
|
+
import { once } from 'yieldkit'
|
|
169
|
+
|
|
170
|
+
const button = document.querySelector('button')!
|
|
171
|
+
const firstClick = once(button, 'click')
|
|
172
|
+
const { value } = await firstClick.next()
|
|
173
|
+
|
|
174
|
+
console.log(value.type)
|
|
175
|
+
// click
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Drag And Drop
|
|
179
|
+
|
|
180
|
+
`dndWatcher` listens for a `mousedown` on a target element, then yields `window` `mousemove` events until a `mouseup` event occurs.
|
|
181
|
+
|
|
182
|
+
```ts
|
|
183
|
+
import { dndWatcher } from 'yieldkit'
|
|
184
|
+
|
|
185
|
+
const handle = document.createElement('div')
|
|
186
|
+
const drags = dndWatcher(handle)
|
|
187
|
+
|
|
188
|
+
for await (const event of drags) {
|
|
189
|
+
console.log(event.clientX, event.clientY)
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Development
|
|
194
|
+
|
|
195
|
+
Install dependencies:
|
|
196
|
+
|
|
197
|
+
```sh
|
|
198
|
+
npm install
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
Run tests:
|
|
202
|
+
|
|
203
|
+
```sh
|
|
204
|
+
npm test
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Run TypeScript checks:
|
|
208
|
+
|
|
209
|
+
```sh
|
|
210
|
+
npm run check
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Build the package:
|
|
214
|
+
|
|
215
|
+
```sh
|
|
216
|
+
npm run build
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## License
|
|
220
|
+
|
|
221
|
+
MIT
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function sequence<T>(...asyncIterables: AsyncIterable<T>[]): AsyncGenerator<T>;
|
|
2
|
+
export declare function map<T>(asyncIterable: AsyncIterable<T>, mappers: Array<(value: T) => unknown>): AsyncGenerator<unknown>;
|
|
3
|
+
export declare function filter<T, S extends T>(asyncIterable: AsyncIterable<T>, onFilter: (value: T) => value is S): AsyncGenerator<S>;
|
|
4
|
+
export declare function filter<T>(asyncIterable: AsyncIterable<T>, onFilter: (value: T) => boolean): AsyncGenerator<T>;
|
|
5
|
+
export declare function every<T>(asyncIterable: AsyncIterable<T>, predicate: (value: T) => boolean): AsyncGenerator<T>;
|
|
6
|
+
export declare function any<T>(...asyncIterables: AsyncIterable<T>[]): AsyncGenerator<T>;
|
|
7
|
+
export declare function take<T>(asyncIterable: AsyncIterable<T>, count: number): AsyncGenerator<T>;
|
|
8
|
+
export declare function slice<T>(asyncIterable: AsyncIterable<T> | AsyncIterableIterator<T>, start: number, stop: number, step?: number): AsyncGenerator<T>;
|
|
9
|
+
export declare function enumerate<T>(asyncIterable: AsyncIterable<T> | AsyncIterableIterator<T>): AsyncGenerator<[number, T]>;
|
|
10
|
+
export declare function zip<T>(...asyncIterables: AsyncIterable<T>[]): AsyncGenerator<T[]>;
|
|
11
|
+
export declare function watch<T>(executor: () => AsyncIterable<T>): AsyncGenerator<T>;
|
|
12
|
+
export declare function onlyEvent<E extends keyof HTMLElementEventMap>(eventType: E): (event: Event) => event is HTMLElementEventMap[E];
|
|
13
|
+
//# sourceMappingURL=async-generators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-generators.d.ts","sourceRoot":"","sources":["../src/async-generators.ts"],"names":[],"mappings":"AAAA,wBAAuB,QAAQ,CAAC,CAAC,EAChC,GAAG,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,GACnC,cAAc,CAAC,CAAC,CAAC,CAMnB;AAED,wBAAuB,GAAG,CAAC,CAAC,EAC3B,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,EAC/B,OAAO,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,GACnC,cAAc,CAAC,OAAO,CAAC,CAazB;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EACpC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,EAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,GAChC,cAAc,CAAC,CAAC,CAAC,CAAC;AAErB,wBAAgB,MAAM,CAAC,CAAC,EACvB,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,EAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAC7B,cAAc,CAAC,CAAC,CAAC,CAAC;AAerB,wBAAuB,KAAK,CAAC,CAAC,EAC7B,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,EAC/B,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAC9B,cAAc,CAAC,CAAC,CAAC,CAKnB;AAED,wBAAuB,GAAG,CAAC,CAAC,EAC3B,GAAG,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,GACnC,cAAc,CAAC,CAAC,CAAC,CA0BnB;AAED,wBAAuB,IAAI,CAAC,CAAC,EAC5B,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,EAC/B,KAAK,EAAE,MAAM,GACX,cAAc,CAAC,CAAC,CAAC,CAUnB;AAED,wBAAuB,KAAK,CAAC,CAAC,EAC7B,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,EAC1D,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAU,GACd,cAAc,CAAC,CAAC,CAAC,CAwBnB;AAED,wBAAuB,SAAS,CAAC,CAAC,EACjC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,GACxD,cAAc,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAU7B;AAED,wBAAuB,GAAG,CAAC,CAAC,EAC3B,GAAG,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,GACnC,cAAc,CAAC,CAAC,EAAE,CAAC,CAoBrB;AAED,wBAAuB,KAAK,CAAC,CAAC,EAC7B,QAAQ,EAAE,MAAM,aAAa,CAAC,CAAC,CAAC,GAC9B,cAAc,CAAC,CAAC,CAAC,CAMnB;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,mBAAmB,EAC5D,SAAS,EAAE,CAAC,GACV,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAEnD"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
export async function* sequence(...asyncIterables) {
|
|
2
|
+
for (const iterable of asyncIterables) {
|
|
3
|
+
for await (const item of iterable) {
|
|
4
|
+
yield item;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export async function* map(asyncIterable, mappers) {
|
|
9
|
+
for await (const value of asyncIterable) {
|
|
10
|
+
const mapperIterator = mappers[Symbol.iterator]();
|
|
11
|
+
let mapper = mapperIterator.next();
|
|
12
|
+
let result = value;
|
|
13
|
+
while (!mapper.done) {
|
|
14
|
+
result = mapper.value(result);
|
|
15
|
+
mapper = mapperIterator.next();
|
|
16
|
+
}
|
|
17
|
+
yield result;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export async function* filter(asyncIterable, onFilter) {
|
|
21
|
+
const asyncIterator = asyncIterable[Symbol.asyncIterator]();
|
|
22
|
+
while (true) {
|
|
23
|
+
const { done, value } = await asyncIterator.next();
|
|
24
|
+
if (done)
|
|
25
|
+
return;
|
|
26
|
+
if (onFilter(value))
|
|
27
|
+
yield value;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export async function* every(asyncIterable, predicate) {
|
|
31
|
+
for await (const value of asyncIterable) {
|
|
32
|
+
if (!predicate(value))
|
|
33
|
+
break;
|
|
34
|
+
yield value;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function* any(...asyncIterables) {
|
|
38
|
+
const entries = asyncIterables.map((item) => ({
|
|
39
|
+
iterator: item[Symbol.asyncIterator](),
|
|
40
|
+
}));
|
|
41
|
+
const pendingResult = async (entry) => {
|
|
42
|
+
entry.pending ??= entry.iterator.next();
|
|
43
|
+
return { entry, result: await entry.pending };
|
|
44
|
+
};
|
|
45
|
+
while (entries.length > 0) {
|
|
46
|
+
const { entry, result } = await Promise.race(entries.map(pendingResult));
|
|
47
|
+
entry.pending = undefined;
|
|
48
|
+
if (result.done) {
|
|
49
|
+
entries.splice(entries.indexOf(entry), 1);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
yield result.value;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export async function* take(asyncIterable, count) {
|
|
57
|
+
const asyncIterator = asyncIterable[Symbol.asyncIterator]();
|
|
58
|
+
let cursor = 0;
|
|
59
|
+
while (cursor < count) {
|
|
60
|
+
const { done, value } = await asyncIterator.next();
|
|
61
|
+
if (done)
|
|
62
|
+
return;
|
|
63
|
+
yield value;
|
|
64
|
+
cursor++;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export async function* slice(asyncIterable, start, stop, step = 1) {
|
|
68
|
+
const iterator = asyncIterable[Symbol.asyncIterator]();
|
|
69
|
+
while (start > 0) {
|
|
70
|
+
const { done } = await iterator.next();
|
|
71
|
+
if (done)
|
|
72
|
+
return;
|
|
73
|
+
--start;
|
|
74
|
+
--stop;
|
|
75
|
+
}
|
|
76
|
+
while (stop > 0) {
|
|
77
|
+
const current = await iterator.next();
|
|
78
|
+
if (current.done)
|
|
79
|
+
return;
|
|
80
|
+
yield current.value;
|
|
81
|
+
--stop;
|
|
82
|
+
let n = step;
|
|
83
|
+
while (n > 1) {
|
|
84
|
+
const skipped = await iterator.next();
|
|
85
|
+
if (skipped.done)
|
|
86
|
+
return;
|
|
87
|
+
--n;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export async function* enumerate(asyncIterable) {
|
|
92
|
+
const iterator = asyncIterable[Symbol.asyncIterator]();
|
|
93
|
+
let cursor = 0;
|
|
94
|
+
while (true) {
|
|
95
|
+
const current = await iterator.next();
|
|
96
|
+
if (current.done)
|
|
97
|
+
return;
|
|
98
|
+
yield [cursor++, current.value];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export async function* zip(...asyncIterables) {
|
|
102
|
+
const iterators = asyncIterables.map((iterable) => iterable[Symbol.asyncIterator]());
|
|
103
|
+
if (iterators.length === 0) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
while (true) {
|
|
107
|
+
const results = await Promise.all(iterators.map((iterator) => iterator.next()));
|
|
108
|
+
if (results.some((result) => result.done)) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
yield results.map((result) => result.value);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export async function* watch(executor) {
|
|
115
|
+
while (true) {
|
|
116
|
+
for await (const value of executor()) {
|
|
117
|
+
yield value;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
export function onlyEvent(eventType) {
|
|
122
|
+
return (event) => event.type === eventType;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=async-generators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-generators.js","sourceRoot":"","sources":["../src/async-generators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compositions.d.ts","sourceRoot":"","sources":["../src/compositions.ts"],"names":[],"mappings":"AAUA,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,CAAC,UAAU,CAAC,CAa1E"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { any, every, filter, onlyEvent, sequence, watch, } from "./async-generators.js";
|
|
2
|
+
import { on, once } from "./listeners.js";
|
|
3
|
+
export function dndWatcher(target) {
|
|
4
|
+
return watch(() => filter(sequence(once(target, "mousedown"), every(any(on(window, "mousemove"), on(window, "mouseup")), onlyEvent("mousemove"))), onlyEvent("mousemove")));
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=compositions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compositions.js","sourceRoot":"","sources":["../src/compositions.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,GAAG,EACH,KAAK,EACL,MAAM,EACN,SAAS,EACT,QAAQ,EACR,KAAK,GACL,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,UAAU,UAAU,CAAC,MAAmB;IAC7C,OAAO,KAAK,CAAC,GAAG,EAAE,CACjB,MAAM,CACL,QAAQ,CACP,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EACzB,KAAK,CACJ,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EACnD,SAAS,CAAC,WAAW,CAAC,CACtB,CACD,EACD,SAAS,CAAC,WAAW,CAAC,CACtB,CACD,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAe,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type Target = (Window & typeof globalThis) | Document | HTMLElement;
|
|
2
|
+
export declare function on<T extends HTMLElement, E extends keyof HTMLElementEventMap>(target: T, eventType: E): AsyncIterableIterator<HTMLElementEventMap[E]>;
|
|
3
|
+
export declare function on<T extends Document, E extends keyof DocumentEventMap>(target: T, eventType: E): AsyncIterableIterator<DocumentEventMap[E]>;
|
|
4
|
+
export declare function on<T extends Window & typeof globalThis, E extends keyof WindowEventMap>(target: T, eventType: E): AsyncIterableIterator<WindowEventMap[E]>;
|
|
5
|
+
export declare function once<T extends HTMLElement, E extends keyof HTMLElementEventMap>(target: T, eventType: E): AsyncIterableIterator<HTMLElementEventMap[E]>;
|
|
6
|
+
export declare function once<T extends Document, E extends keyof DocumentEventMap>(target: T, eventType: E): AsyncIterableIterator<DocumentEventMap[E]>;
|
|
7
|
+
export declare function once<T extends Window & typeof globalThis, E extends keyof WindowEventMap>(target: T, eventType: E): AsyncIterableIterator<WindowEventMap[E]>;
|
|
8
|
+
//# sourceMappingURL=listeners.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listeners.d.ts","sourceRoot":"","sources":["../src/listeners.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,OAAO,UAAU,CAAC,GAAG,QAAQ,GAAG,WAAW,CAAC;AAoC3E,wBAAgB,EAAE,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,MAAM,mBAAmB,EAC5E,MAAM,EAAE,CAAC,EACT,SAAS,EAAE,CAAC,GACV,qBAAqB,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjD,wBAAgB,EAAE,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,MAAM,gBAAgB,EACtE,MAAM,EAAE,CAAC,EACT,SAAS,EAAE,CAAC,GACV,qBAAqB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9C,wBAAgB,EAAE,CACjB,CAAC,SAAS,MAAM,GAAG,OAAO,UAAU,EACpC,CAAC,SAAS,MAAM,cAAc,EAC7B,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AASrE,wBAAgB,IAAI,CACnB,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,MAAM,mBAAmB,EAClC,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,qBAAqB,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1E,wBAAgB,IAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,MAAM,gBAAgB,EACxE,MAAM,EAAE,CAAC,EACT,SAAS,EAAE,CAAC,GACV,qBAAqB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9C,wBAAgB,IAAI,CACnB,CAAC,SAAS,MAAM,GAAG,OAAO,UAAU,EACpC,CAAC,SAAS,MAAM,cAAc,EAC7B,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
function createAsyncListener(target, eventType, exhaustAfterFirst) {
|
|
2
|
+
let isEventFired = false;
|
|
3
|
+
return {
|
|
4
|
+
[Symbol.asyncIterator]() {
|
|
5
|
+
return this;
|
|
6
|
+
},
|
|
7
|
+
async next() {
|
|
8
|
+
return new Promise((resolve) => {
|
|
9
|
+
if (exhaustAfterFirst && isEventFired) {
|
|
10
|
+
resolve({ done: true, value: undefined });
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
target.addEventListener(eventType, (event) => {
|
|
14
|
+
if (exhaustAfterFirst) {
|
|
15
|
+
isEventFired = true;
|
|
16
|
+
}
|
|
17
|
+
resolve({ done: false, value: event });
|
|
18
|
+
}, { once: true });
|
|
19
|
+
});
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function on(target, eventType) {
|
|
24
|
+
return createAsyncListener(target, eventType, false);
|
|
25
|
+
}
|
|
26
|
+
export function once(target, eventType) {
|
|
27
|
+
return createAsyncListener(target, eventType, true);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=listeners.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listeners.js","sourceRoot":"","sources":["../src/listeners.ts"],"names":[],"mappings":"AAEA,SAAS,mBAAmB,CAC3B,MAAc,EACd,SAAiB,EACjB,iBAA0B;IAE1B,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,OAAO;QACN,CAAC,MAAM,CAAC,aAAa,CAAC;YACrB,OAAO,IAAI,CAAC;QACb,CAAC;QAED,KAAK,CAAC,IAAI;YACT,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC9B,IAAI,iBAAiB,IAAI,YAAY,EAAE,CAAC;oBACvC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;oBAC1C,OAAO;gBACR,CAAC;gBAED,MAAM,CAAC,gBAAgB,CACtB,SAAS,EACT,CAAC,KAAK,EAAE,EAAE;oBACT,IAAI,iBAAiB,EAAE,CAAC;wBACvB,YAAY,GAAG,IAAI,CAAC;oBACrB,CAAC;oBACD,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;gBACxC,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACd,CAAC;YACH,CAAC,CAAC,CAAC;QACJ,CAAC;KACD,CAAC;AACH,CAAC;AAiBD,MAAM,UAAU,EAAE,CACjB,MAAc,EACd,SAAiB;IAEjB,OAAO,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC;AAiBD,MAAM,UAAU,IAAI,CACnB,MAAc,EACd,SAAiB;IAEjB,OAAO,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function sequence<T>(...iterables: Iterable<T>[]): Generator<T>;
|
|
2
|
+
export declare function map<T>(iterable: Iterable<T>, mappers: Array<(value: T) => unknown>): IterableIterator<unknown>;
|
|
3
|
+
export declare function filter<T, S extends T>(iterable: Iterable<T>, onFilter: (value: T) => value is S): Generator<S>;
|
|
4
|
+
export declare function filter<T>(iterable: Iterable<T>, onFilter: (value: T) => boolean): Generator<T>;
|
|
5
|
+
export declare function every<T>(iterable: Iterable<T>, predicate: (value: T) => boolean): Generator<T>;
|
|
6
|
+
export declare function take<T>(iterable: Iterable<T>, count: number): Generator<T>;
|
|
7
|
+
export declare function slice<T>(iterable: Iterable<T> | IterableIterator<T>, start: number, stop: number, step?: number): Generator<T>;
|
|
8
|
+
export declare function enumerate<T>(iterable: Iterable<T> | IterableIterator<T>): IterableIterator<[number, T]>;
|
|
9
|
+
export declare function zip<T>(...iterables: Iterable<T>[]): IterableIterator<T[]>;
|
|
10
|
+
export declare function watch<T>(executor: () => Iterable<T>): Generator<T>;
|
|
11
|
+
export declare function onlyEvent<E extends keyof HTMLElementEventMap>(eventType: E): (event: Event) => event is HTMLElementEventMap[E];
|
|
12
|
+
//# sourceMappingURL=sync-generators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-generators.d.ts","sourceRoot":"","sources":["../src/sync-generators.ts"],"names":[],"mappings":"AAAA,wBAAiB,QAAQ,CAAC,CAAC,EAAE,GAAG,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAMtE;AAED,wBAAgB,GAAG,CAAC,CAAC,EACpB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,OAAO,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,GACnC,gBAAgB,CAAC,OAAO,CAAC,CA2B3B;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EACpC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,GAChC,SAAS,CAAC,CAAC,CAAC,CAAC;AAEhB,wBAAgB,MAAM,CAAC,CAAC,EACvB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAC7B,SAAS,CAAC,CAAC,CAAC,CAAC;AAehB,wBAAiB,KAAK,CAAC,CAAC,EACvB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAC9B,SAAS,CAAC,CAAC,CAAC,CAKd;AAED,wBAAiB,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAU3E;AAED,wBAAiB,KAAK,CAAC,CAAC,EACvB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,EAC3C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAU,GACd,SAAS,CAAC,CAAC,CAAC,CAsBd;AAED,wBAAgB,SAAS,CAAC,CAAC,EAC1B,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,GACzC,gBAAgB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAsB/B;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,GAAG,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAyBzE;AAED,wBAAiB,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAMnE;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,mBAAmB,EAC5D,SAAS,EAAE,CAAC,GACV,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAEnD"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
export function* sequence(...iterables) {
|
|
2
|
+
for (const iterable of iterables) {
|
|
3
|
+
for (const item of iterable) {
|
|
4
|
+
yield item;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export function map(iterable, mappers) {
|
|
9
|
+
const collectionIterator = iterable[Symbol.iterator]();
|
|
10
|
+
return {
|
|
11
|
+
[Symbol.iterator]() {
|
|
12
|
+
return this;
|
|
13
|
+
},
|
|
14
|
+
next() {
|
|
15
|
+
const mapperIterator = mappers[Symbol.iterator]();
|
|
16
|
+
let mapper = mapperIterator.next();
|
|
17
|
+
const next = collectionIterator.next();
|
|
18
|
+
if (next.done) {
|
|
19
|
+
return { done: true, value: undefined };
|
|
20
|
+
}
|
|
21
|
+
let value = next.value;
|
|
22
|
+
while (!mapper.done) {
|
|
23
|
+
value = mapper.value(value);
|
|
24
|
+
mapper = mapperIterator.next();
|
|
25
|
+
}
|
|
26
|
+
return { done: false, value };
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function* filter(iterable, onFilter) {
|
|
31
|
+
const iterator = iterable[Symbol.iterator]();
|
|
32
|
+
while (true) {
|
|
33
|
+
const { done, value } = iterator.next();
|
|
34
|
+
if (done)
|
|
35
|
+
return;
|
|
36
|
+
if (onFilter(value))
|
|
37
|
+
yield value;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function* every(iterable, predicate) {
|
|
41
|
+
for (const value of iterable) {
|
|
42
|
+
if (!predicate(value))
|
|
43
|
+
break;
|
|
44
|
+
yield value;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function* take(iterable, count) {
|
|
48
|
+
const iterator = iterable[Symbol.iterator]();
|
|
49
|
+
let cursor = 0;
|
|
50
|
+
while (cursor < count) {
|
|
51
|
+
const { done, value } = iterator.next();
|
|
52
|
+
if (done)
|
|
53
|
+
return;
|
|
54
|
+
yield value;
|
|
55
|
+
cursor++;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export function* slice(iterable, start, stop, step = 1) {
|
|
59
|
+
const iterator = iterable[Symbol.iterator]();
|
|
60
|
+
while (start > 0) {
|
|
61
|
+
if (iterator.next().done)
|
|
62
|
+
return;
|
|
63
|
+
--start;
|
|
64
|
+
--stop;
|
|
65
|
+
}
|
|
66
|
+
while (stop > 0) {
|
|
67
|
+
const current = iterator.next();
|
|
68
|
+
if (current.done)
|
|
69
|
+
return;
|
|
70
|
+
yield current.value;
|
|
71
|
+
--stop;
|
|
72
|
+
let n = step;
|
|
73
|
+
while (n > 1) {
|
|
74
|
+
if (iterator.next().done)
|
|
75
|
+
return;
|
|
76
|
+
--n;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export function enumerate(iterable) {
|
|
81
|
+
const iterator = iterable[Symbol.iterator]();
|
|
82
|
+
let cursor = 0;
|
|
83
|
+
return {
|
|
84
|
+
[Symbol.iterator]() {
|
|
85
|
+
return this;
|
|
86
|
+
},
|
|
87
|
+
next() {
|
|
88
|
+
const current = iterator.next();
|
|
89
|
+
if (current.done) {
|
|
90
|
+
return { done: true, value: undefined };
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
done: false,
|
|
94
|
+
value: [cursor++, current.value],
|
|
95
|
+
};
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
export function zip(...iterables) {
|
|
100
|
+
const iterators = iterables.map((iterable) => iterable[Symbol.iterator]());
|
|
101
|
+
return {
|
|
102
|
+
[Symbol.iterator]() {
|
|
103
|
+
return this;
|
|
104
|
+
},
|
|
105
|
+
next() {
|
|
106
|
+
if (iterators.length === 0) {
|
|
107
|
+
return { done: true, value: undefined };
|
|
108
|
+
}
|
|
109
|
+
const results = iterators.map((iterator) => iterator.next());
|
|
110
|
+
if (results.some((result) => result.done)) {
|
|
111
|
+
return { done: true, value: undefined };
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
done: false,
|
|
115
|
+
value: results.map((result) => result.value),
|
|
116
|
+
};
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
export function* watch(executor) {
|
|
121
|
+
while (true) {
|
|
122
|
+
for (const value of executor()) {
|
|
123
|
+
yield value;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export function onlyEvent(eventType) {
|
|
128
|
+
return (event) => event.type === eventType;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=sync-generators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-generators.js","sourceRoot":"","sources":["../src/sync-generators.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "yieldkit",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./async": {
|
|
16
|
+
"types": "./dist/async-generators.d.ts",
|
|
17
|
+
"import": "./dist/async-generators.js",
|
|
18
|
+
"default": "./dist/async-generators.js"
|
|
19
|
+
},
|
|
20
|
+
"./sync": {
|
|
21
|
+
"types": "./dist/sync-generators.d.ts",
|
|
22
|
+
"import": "./dist/sync-generators.js",
|
|
23
|
+
"default": "./dist/sync-generators.js"
|
|
24
|
+
},
|
|
25
|
+
"./package.json": "./package.json"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist"
|
|
29
|
+
],
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc -p tsconfig.json",
|
|
32
|
+
"test": "vitest run",
|
|
33
|
+
"check": "tsc -p tsconfig.json --noEmit"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/node": "^22.8.6",
|
|
37
|
+
"jsdom": "^25.0.1",
|
|
38
|
+
"typescript": "^5.6.3",
|
|
39
|
+
"vitest": "^2.1.9"
|
|
40
|
+
}
|
|
41
|
+
}
|