Skip to content

Commit 84d6f35

Browse files
committed
async generators
1 parent e61c1b1 commit 84d6f35

File tree

4 files changed

+51
-65
lines changed

4 files changed

+51
-65
lines changed

src/client/stdlib/generators/input.js

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,36 @@
11
import {observe} from "./observe.js";
22

3-
export function input(input) {
4-
return observe(function (change) {
5-
var event = eventof(input),
6-
value = valueof(input);
7-
function inputted() {
8-
change(valueof(input));
9-
}
10-
input.addEventListener(event, inputted);
3+
export function input(element) {
4+
return observe((change) => {
5+
const event = eventof(element);
6+
let value = valueof(element);
7+
const inputted = () => change(valueof(element));
8+
element.addEventListener(event, inputted);
119
if (value !== undefined) change(value);
12-
return function () {
13-
input.removeEventListener(event, inputted);
14-
};
10+
return () => element.removeEventListener(event, inputted);
1511
});
1612
}
1713

18-
function valueof(input) {
19-
switch (input.type) {
14+
function valueof(element) {
15+
switch (element.type) {
2016
case "range":
2117
case "number":
22-
return input.valueAsNumber;
18+
return element.valueAsNumber;
2319
case "date":
24-
return input.valueAsDate;
20+
return element.valueAsDate;
2521
case "checkbox":
26-
return input.checked;
22+
return element.checked;
2723
case "file":
28-
return input.multiple ? input.files : input.files[0];
24+
return element.multiple ? element.files : element.files[0];
2925
case "select-multiple":
30-
return Array.from(input.selectedOptions, (o) => o.value);
26+
return Array.from(element.selectedOptions, (o) => o.value);
3127
default:
32-
return input.value;
28+
return element.value;
3329
}
3430
}
3531

36-
function eventof(input) {
37-
switch (input.type) {
32+
function eventof(element) {
33+
switch (element.type) {
3834
case "button":
3935
case "submit":
4036
case "checkbox":
Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1-
import {that} from "./that.js";
2-
3-
export function observe(initialize) {
4-
let stale = false;
5-
let value;
1+
export async function* observe(initialize) {
62
let resolve;
7-
const dispose = initialize(change);
3+
let value;
4+
let stale = false;
5+
6+
const dispose = initialize((x) => {
7+
value = x;
8+
if (resolve) resolve(x), (resolve = null);
9+
else stale = true;
10+
return x;
11+
});
812

913
if (dispose != null && typeof dispose !== "function") {
1014
throw new Error(
@@ -14,20 +18,13 @@ export function observe(initialize) {
1418
);
1519
}
1620

17-
function change(x) {
18-
if (resolve) resolve(x), (resolve = null);
19-
else stale = true;
20-
return (value = x);
21-
}
22-
23-
function next() {
24-
return {done: false, value: stale ? ((stale = false), Promise.resolve(value)) : new Promise((_) => (resolve = _))};
21+
try {
22+
while (true) {
23+
yield stale ? ((stale = false), value) : new Promise((_) => (resolve = _));
24+
}
25+
} finally {
26+
if (dispose != null) {
27+
dispose();
28+
}
2529
}
26-
27-
return {
28-
[Symbol.iterator]: that,
29-
throw: () => ({done: true}),
30-
return: () => (dispose != null && dispose(), {done: true}),
31-
next
32-
};
3330
}

src/client/stdlib/generators/queue.js

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
import {that} from "./that.js";
2-
3-
export function queue(initialize) {
1+
export async function* queue(initialize) {
42
let resolve;
5-
const queue = [];
6-
const dispose = initialize(push);
3+
const values = [];
4+
5+
const dispose = initialize((x) => {
6+
values.push(x);
7+
if (resolve) resolve(values.shift()), (resolve = null);
8+
return x;
9+
});
710

811
if (dispose != null && typeof dispose !== "function") {
912
throw new Error(
@@ -13,20 +16,13 @@ export function queue(initialize) {
1316
);
1417
}
1518

16-
function push(x) {
17-
queue.push(x);
18-
if (resolve) resolve(queue.shift()), (resolve = null);
19-
return x;
19+
try {
20+
while (true) {
21+
yield values.length ? values.shift() : new Promise((_) => (resolve = _));
22+
}
23+
} finally {
24+
if (dispose != null) {
25+
dispose();
26+
}
2027
}
21-
22-
function next() {
23-
return {done: false, value: queue.length ? Promise.resolve(queue.shift()) : new Promise((_) => (resolve = _))};
24-
}
25-
26-
return {
27-
[Symbol.iterator]: that,
28-
throw: () => ({done: true}),
29-
return: () => (dispose != null && dispose(), {done: true}),
30-
next
31-
};
3228
}

src/client/stdlib/generators/that.js

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)