create messy reactivity-ish test stuff.

(it works but it's messy.)
This commit is contained in:
trans_soup 2023-07-18 17:45:30 +02:00
parent 975cde8a31
commit 8e3aa4228c
2 changed files with 40 additions and 5 deletions

View File

@ -12,7 +12,7 @@ export function json_as_html (json, state = new Map()) {
}
if (typeof json === "function") {
return json_as_html(json(state), state);
return from_function(json, state);
}
const [type, attributes = [], children = []] = json;
@ -32,3 +32,21 @@ export function json_as_html (json, state = new Map()) {
return elem;
}
// these two functions are pretty messy.
function from_function (fn, state) {
const [after, has_run_after] = delayed(fn => elem => fn(elem));
const initial = json_as_html(fn(state, after), state);
if (has_run_after()) after(initial);
return initial;
}
function delayed (fn) {
let has_run_once = false;
let initial_result = undefined;
return [(...args) => {
if (has_run_once) return initial_result(...args);
has_run_once = true;
initial_result = fn(...args);
return initial_result;
}, _ => has_run_once];
}

View File

@ -15,10 +15,16 @@ const demo = [
state => ["button", [
["onclick", _ => {
state.set("clicked", true);
render();
trigger_event("button_pressed");
}]
], "it can even do buttons!"],
state => ["p", [], state.get("clicked") ? "clicked" : "not clicked"],
(state, after) => {
// this is very messy.
const generate = _ => ["p", [], state.get("clicked") ? "clicked" : "not clicked"];
after(elem => listen_event("button_pressed", _ => elem.replaceWith(json_as_html(generate(), state))));
return generate();
},
["ul",
[],
[
@ -29,11 +35,22 @@ const demo = [
],
];
const state = new Map();
let event_listeners = new Map();
function trigger_event (name) {
if (event_listeners.has(name)) {
event_listeners.get(name).forEach(fn => fn());
}
}
function listen_event (name, fn) {
if (!event_listeners.has(name)) event_listeners.set(name, []);
event_listeners.get(name).push(fn);
}
function render () {
document.body.innerHTML = "";
document.body.appendChild(json_as_html(demo, state));
document.body.appendChild(json_as_html(demo));
}
render();