Skip to content

Commit e4dab87

Browse files
committed
A signals example/proposal
1 parent 59c140e commit e4dab87

File tree

8 files changed

+4485
-12
lines changed

8 files changed

+4485
-12
lines changed

docs/index.js

Lines changed: 4428 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/index.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/pyodide/index.html

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33
<head>
44
<meta charset="UTF-8">
55
<meta name="viewport" content="width=device-width,initial-scale=1.0">
6+
<script>
7+
globalThis.fn = () => ({ test() { return 1 } }).test.bind(null);
8+
</script>
69
<script type="module" src="../../dist/index.js"></script>
710
<script type="pyodide" async worker>
8-
from polyscript import xworker
9-
print(xworker.window.Function('return 1')())
11+
from polyscript import xworker
12+
print(xworker.window.fn()())
1013
</script>
1114
</head>
1215
</html>

test/raw/pyodide/index.html

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@
44
<meta charset="UTF-8">
55
<meta name="viewport" content="width=device-width,initial-scale=1.0">
66
<script type="module">
7-
import { serialize } from 'https://esm.run/@ungap/serialization-registry';
8-
import '../converter.js';
9-
10-
globalThis.test = arg => {
11-
console.log(...serialize(arg));
12-
};
13-
7+
globalThis.test = () => new Proxy(() => 1, {
8+
apply(target, thisArg, argumentsList) {
9+
for (const k in thisArg);
10+
return target(...argumentsList);
11+
}
12+
});
1413
const base = 'https://cdn.jsdelivr.net/npm/pyodide@latest';
1514
const { loadPyodide } = await import(`${base}/pyodide.mjs`);
1615
const interpreter = await loadPyodide();
@@ -19,7 +18,7 @@
1918
</script>
2019
<script type="pyodide" async>
2120
import js
22-
js.test([{'a': 123}, {'a': 456}])
21+
js.test()()
2322
</script>
2423
</head>
2524
</html>

test/signals/config.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[files]
2+
"./signals.py" = ""

test/signals/index.html

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<script type="module">
7+
// PyScript (actually just Polyscript)
8+
import "../../dist/index.js";
9+
10+
// the smallest signals library I could think of
11+
import * as signals from "https://esm.run/dom-cue";
12+
globalThis.signals = signals;
13+
</script>
14+
</head>
15+
<body>
16+
<button id="increment">+</button>
17+
<span id="value"></span>
18+
<button id="decrement">-</button>
19+
<script type="micropython" config="./config.toml" src="./main.py"></script>
20+
</body>
21+
</html>

test/signals/main.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from js import document
2+
from signals import signal, effect
3+
4+
increment, value, decrement, = document.querySelectorAll("#increment, #value, #decrement")
5+
6+
counter = signal(0)
7+
8+
@effect
9+
def track_state():
10+
value.textContent = counter.value
11+
12+
def add(value):
13+
counter.value += value
14+
15+
increment.onclick = lambda _: add(1)
16+
decrement.onclick = lambda _: add(-1)

test/signals/signals.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import js
2+
signal = js.signals.signal
3+
4+
def effect(fn):
5+
js.signals.effect(fn)

0 commit comments

Comments
 (0)