6344 lines
193 KiB
JavaScript
6344 lines
193 KiB
JavaScript
// build/dev/javascript/prelude.mjs
|
||
class CustomType {
|
||
withFields(fields) {
|
||
let properties = Object.keys(this).map((label) => (label in fields) ? fields[label] : this[label]);
|
||
return new this.constructor(...properties);
|
||
}
|
||
}
|
||
|
||
class List {
|
||
static fromArray(array, tail) {
|
||
let t = tail || new Empty;
|
||
for (let i = array.length - 1;i >= 0; --i) {
|
||
t = new NonEmpty(array[i], t);
|
||
}
|
||
return t;
|
||
}
|
||
[Symbol.iterator]() {
|
||
return new ListIterator(this);
|
||
}
|
||
toArray() {
|
||
return [...this];
|
||
}
|
||
atLeastLength(desired) {
|
||
let current = this;
|
||
while (desired-- > 0 && current)
|
||
current = current.tail;
|
||
return current !== undefined;
|
||
}
|
||
hasLength(desired) {
|
||
let current = this;
|
||
while (desired-- > 0 && current)
|
||
current = current.tail;
|
||
return desired === -1 && current instanceof Empty;
|
||
}
|
||
countLength() {
|
||
let current = this;
|
||
let length = 0;
|
||
while (current) {
|
||
current = current.tail;
|
||
length++;
|
||
}
|
||
return length - 1;
|
||
}
|
||
}
|
||
function prepend(element, tail) {
|
||
return new NonEmpty(element, tail);
|
||
}
|
||
function toList(elements, tail) {
|
||
return List.fromArray(elements, tail);
|
||
}
|
||
|
||
class ListIterator {
|
||
#current;
|
||
constructor(current) {
|
||
this.#current = current;
|
||
}
|
||
next() {
|
||
if (this.#current instanceof Empty) {
|
||
return { done: true };
|
||
} else {
|
||
let { head, tail } = this.#current;
|
||
this.#current = tail;
|
||
return { value: head, done: false };
|
||
}
|
||
}
|
||
}
|
||
|
||
class Empty extends List {
|
||
}
|
||
var List$Empty = () => new Empty;
|
||
var List$isEmpty = (value) => value instanceof Empty;
|
||
|
||
class NonEmpty extends List {
|
||
constructor(head, tail) {
|
||
super();
|
||
this.head = head;
|
||
this.tail = tail;
|
||
}
|
||
}
|
||
var List$NonEmpty = (head, tail) => new NonEmpty(head, tail);
|
||
var List$isNonEmpty = (value) => value instanceof NonEmpty;
|
||
var List$NonEmpty$first = (value) => value.head;
|
||
var List$NonEmpty$rest = (value) => value.tail;
|
||
|
||
class BitArray {
|
||
bitSize;
|
||
byteSize;
|
||
bitOffset;
|
||
rawBuffer;
|
||
constructor(buffer, bitSize, bitOffset) {
|
||
if (!(buffer instanceof Uint8Array)) {
|
||
throw globalThis.Error("BitArray can only be constructed from a Uint8Array");
|
||
}
|
||
this.bitSize = bitSize ?? buffer.length * 8;
|
||
this.byteSize = Math.trunc((this.bitSize + 7) / 8);
|
||
this.bitOffset = bitOffset ?? 0;
|
||
if (this.bitSize < 0) {
|
||
throw globalThis.Error(`BitArray bit size is invalid: ${this.bitSize}`);
|
||
}
|
||
if (this.bitOffset < 0 || this.bitOffset > 7) {
|
||
throw globalThis.Error(`BitArray bit offset is invalid: ${this.bitOffset}`);
|
||
}
|
||
if (buffer.length !== Math.trunc((this.bitOffset + this.bitSize + 7) / 8)) {
|
||
throw globalThis.Error("BitArray buffer length is invalid");
|
||
}
|
||
this.rawBuffer = buffer;
|
||
}
|
||
byteAt(index) {
|
||
if (index < 0 || index >= this.byteSize) {
|
||
return;
|
||
}
|
||
return bitArrayByteAt(this.rawBuffer, this.bitOffset, index);
|
||
}
|
||
equals(other) {
|
||
if (this.bitSize !== other.bitSize) {
|
||
return false;
|
||
}
|
||
const wholeByteCount = Math.trunc(this.bitSize / 8);
|
||
if (this.bitOffset === 0 && other.bitOffset === 0) {
|
||
for (let i = 0;i < wholeByteCount; i++) {
|
||
if (this.rawBuffer[i] !== other.rawBuffer[i]) {
|
||
return false;
|
||
}
|
||
}
|
||
const trailingBitsCount = this.bitSize % 8;
|
||
if (trailingBitsCount) {
|
||
const unusedLowBitCount = 8 - trailingBitsCount;
|
||
if (this.rawBuffer[wholeByteCount] >> unusedLowBitCount !== other.rawBuffer[wholeByteCount] >> unusedLowBitCount) {
|
||
return false;
|
||
}
|
||
}
|
||
} else {
|
||
for (let i = 0;i < wholeByteCount; i++) {
|
||
const a = bitArrayByteAt(this.rawBuffer, this.bitOffset, i);
|
||
const b = bitArrayByteAt(other.rawBuffer, other.bitOffset, i);
|
||
if (a !== b) {
|
||
return false;
|
||
}
|
||
}
|
||
const trailingBitsCount = this.bitSize % 8;
|
||
if (trailingBitsCount) {
|
||
const a = bitArrayByteAt(this.rawBuffer, this.bitOffset, wholeByteCount);
|
||
const b = bitArrayByteAt(other.rawBuffer, other.bitOffset, wholeByteCount);
|
||
const unusedLowBitCount = 8 - trailingBitsCount;
|
||
if (a >> unusedLowBitCount !== b >> unusedLowBitCount) {
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
get buffer() {
|
||
if (this.bitOffset !== 0 || this.bitSize % 8 !== 0) {
|
||
throw new globalThis.Error("BitArray.buffer does not support unaligned bit arrays");
|
||
}
|
||
return this.rawBuffer;
|
||
}
|
||
get length() {
|
||
if (this.bitOffset !== 0 || this.bitSize % 8 !== 0) {
|
||
throw new globalThis.Error("BitArray.length does not support unaligned bit arrays");
|
||
}
|
||
return this.rawBuffer.length;
|
||
}
|
||
}
|
||
function bitArrayByteAt(buffer, bitOffset, index) {
|
||
if (bitOffset === 0) {
|
||
return buffer[index] ?? 0;
|
||
} else {
|
||
const a = buffer[index] << bitOffset & 255;
|
||
const b = buffer[index + 1] >> 8 - bitOffset;
|
||
return a | b;
|
||
}
|
||
}
|
||
|
||
class UtfCodepoint {
|
||
constructor(value) {
|
||
this.value = value;
|
||
}
|
||
}
|
||
class Result extends CustomType {
|
||
static isResult(data2) {
|
||
return data2 instanceof Result;
|
||
}
|
||
}
|
||
|
||
class Ok extends Result {
|
||
constructor(value) {
|
||
super();
|
||
this[0] = value;
|
||
}
|
||
isOk() {
|
||
return true;
|
||
}
|
||
}
|
||
var Result$Ok = (value) => new Ok(value);
|
||
var Result$isOk = (value) => value instanceof Ok;
|
||
var Result$Ok$0 = (value) => value[0];
|
||
|
||
class Error extends Result {
|
||
constructor(detail) {
|
||
super();
|
||
this[0] = detail;
|
||
}
|
||
isOk() {
|
||
return false;
|
||
}
|
||
}
|
||
var Result$Error = (detail) => new Error(detail);
|
||
var Result$isError = (value) => value instanceof Error;
|
||
function isEqual(x, y) {
|
||
let values = [x, y];
|
||
while (values.length) {
|
||
let a = values.pop();
|
||
let b = values.pop();
|
||
if (a === b)
|
||
continue;
|
||
if (!isObject(a) || !isObject(b))
|
||
return false;
|
||
let unequal = !structurallyCompatibleObjects(a, b) || unequalDates(a, b) || unequalBuffers(a, b) || unequalArrays(a, b) || unequalMaps(a, b) || unequalSets(a, b) || unequalRegExps(a, b);
|
||
if (unequal)
|
||
return false;
|
||
const proto = Object.getPrototypeOf(a);
|
||
if (proto !== null && typeof proto.equals === "function") {
|
||
try {
|
||
if (a.equals(b))
|
||
continue;
|
||
else
|
||
return false;
|
||
} catch {}
|
||
}
|
||
let [keys, get] = getters(a);
|
||
const ka = keys(a);
|
||
const kb = keys(b);
|
||
if (ka.length !== kb.length)
|
||
return false;
|
||
for (let k of ka) {
|
||
values.push(get(a, k), get(b, k));
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
function getters(object) {
|
||
if (object instanceof Map) {
|
||
return [(x) => x.keys(), (x, y) => x.get(y)];
|
||
} else {
|
||
let extra = object instanceof globalThis.Error ? ["message"] : [];
|
||
return [(x) => [...extra, ...Object.keys(x)], (x, y) => x[y]];
|
||
}
|
||
}
|
||
function unequalDates(a, b) {
|
||
return a instanceof Date && (a > b || a < b);
|
||
}
|
||
function unequalBuffers(a, b) {
|
||
return !(a instanceof BitArray) && a.buffer instanceof ArrayBuffer && a.BYTES_PER_ELEMENT && !(a.byteLength === b.byteLength && a.every((n, i) => n === b[i]));
|
||
}
|
||
function unequalArrays(a, b) {
|
||
return Array.isArray(a) && a.length !== b.length;
|
||
}
|
||
function unequalMaps(a, b) {
|
||
return a instanceof Map && a.size !== b.size;
|
||
}
|
||
function unequalSets(a, b) {
|
||
return a instanceof Set && (a.size != b.size || [...a].some((e) => !b.has(e)));
|
||
}
|
||
function unequalRegExps(a, b) {
|
||
return a instanceof RegExp && (a.source !== b.source || a.flags !== b.flags);
|
||
}
|
||
function isObject(a) {
|
||
return typeof a === "object" && a !== null;
|
||
}
|
||
function structurallyCompatibleObjects(a, b) {
|
||
if (typeof a !== "object" && typeof b !== "object" && (!a || !b))
|
||
return false;
|
||
let nonstructural = [Promise, WeakSet, WeakMap, Function];
|
||
if (nonstructural.some((c) => a instanceof c))
|
||
return false;
|
||
return a.constructor === b.constructor;
|
||
}
|
||
function makeError(variant, file, module, line, fn, message, extra) {
|
||
let error = new globalThis.Error(message);
|
||
error.gleam_error = variant;
|
||
error.file = file;
|
||
error.module = module;
|
||
error.line = line;
|
||
error.function = fn;
|
||
error.fn = fn;
|
||
for (let k in extra)
|
||
error[k] = extra[k];
|
||
return error;
|
||
}
|
||
// build/dev/javascript/gleam_stdlib/dict.mjs
|
||
var referenceMap = /* @__PURE__ */ new WeakMap;
|
||
var tempDataView = /* @__PURE__ */ new DataView(/* @__PURE__ */ new ArrayBuffer(8));
|
||
var referenceUID = 0;
|
||
function hashByReference(o) {
|
||
const known = referenceMap.get(o);
|
||
if (known !== undefined) {
|
||
return known;
|
||
}
|
||
const hash = referenceUID++;
|
||
if (referenceUID === 2147483647) {
|
||
referenceUID = 0;
|
||
}
|
||
referenceMap.set(o, hash);
|
||
return hash;
|
||
}
|
||
function hashMerge(a, b) {
|
||
return a ^ b + 2654435769 + (a << 6) + (a >> 2) | 0;
|
||
}
|
||
function hashString(s) {
|
||
let hash = 0;
|
||
const len = s.length;
|
||
for (let i = 0;i < len; i++) {
|
||
hash = Math.imul(31, hash) + s.charCodeAt(i) | 0;
|
||
}
|
||
return hash;
|
||
}
|
||
function hashNumber(n) {
|
||
tempDataView.setFloat64(0, n);
|
||
const i = tempDataView.getInt32(0);
|
||
const j = tempDataView.getInt32(4);
|
||
return Math.imul(73244475, i >> 16 ^ i) ^ j;
|
||
}
|
||
function hashBigInt(n) {
|
||
return hashString(n.toString());
|
||
}
|
||
function hashObject(o) {
|
||
const proto = Object.getPrototypeOf(o);
|
||
if (proto !== null && typeof proto.hashCode === "function") {
|
||
try {
|
||
const code = o.hashCode(o);
|
||
if (typeof code === "number") {
|
||
return code;
|
||
}
|
||
} catch {}
|
||
}
|
||
if (o instanceof Promise || o instanceof WeakSet || o instanceof WeakMap) {
|
||
return hashByReference(o);
|
||
}
|
||
if (o instanceof Date) {
|
||
return hashNumber(o.getTime());
|
||
}
|
||
let h = 0;
|
||
if (o instanceof ArrayBuffer) {
|
||
o = new Uint8Array(o);
|
||
}
|
||
if (Array.isArray(o) || o instanceof Uint8Array) {
|
||
for (let i = 0;i < o.length; i++) {
|
||
h = Math.imul(31, h) + getHash(o[i]) | 0;
|
||
}
|
||
} else if (o instanceof Set) {
|
||
o.forEach((v) => {
|
||
h = h + getHash(v) | 0;
|
||
});
|
||
} else if (o instanceof Map) {
|
||
o.forEach((v, k) => {
|
||
h = h + hashMerge(getHash(v), getHash(k)) | 0;
|
||
});
|
||
} else {
|
||
const keys = Object.keys(o);
|
||
for (let i = 0;i < keys.length; i++) {
|
||
const k = keys[i];
|
||
const v = o[k];
|
||
h = h + hashMerge(getHash(v), hashString(k)) | 0;
|
||
}
|
||
}
|
||
return h;
|
||
}
|
||
function getHash(u) {
|
||
if (u === null)
|
||
return 1108378658;
|
||
if (u === undefined)
|
||
return 1108378659;
|
||
if (u === true)
|
||
return 1108378657;
|
||
if (u === false)
|
||
return 1108378656;
|
||
switch (typeof u) {
|
||
case "number":
|
||
return hashNumber(u);
|
||
case "string":
|
||
return hashString(u);
|
||
case "bigint":
|
||
return hashBigInt(u);
|
||
case "object":
|
||
return hashObject(u);
|
||
case "symbol":
|
||
return hashByReference(u);
|
||
case "function":
|
||
return hashByReference(u);
|
||
default:
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
class Dict {
|
||
constructor(size, root) {
|
||
this.size = size;
|
||
this.root = root;
|
||
}
|
||
}
|
||
var bits = 5;
|
||
var mask = (1 << bits) - 1;
|
||
var noElementMarker = Symbol();
|
||
var generationKey = Symbol();
|
||
var emptyNode = /* @__PURE__ */ newNode(0);
|
||
var emptyDict = /* @__PURE__ */ new Dict(0, emptyNode);
|
||
var errorNil = /* @__PURE__ */ Result$Error(undefined);
|
||
function makeNode(generation, datamap, nodemap, data2) {
|
||
return {
|
||
datamap,
|
||
nodemap,
|
||
data: data2,
|
||
[generationKey]: generation
|
||
};
|
||
}
|
||
function newNode(generation) {
|
||
return makeNode(generation, 0, 0, []);
|
||
}
|
||
function copyNode(node, generation) {
|
||
if (node[generationKey] === generation) {
|
||
return node;
|
||
}
|
||
const newData = node.data.slice(0);
|
||
return makeNode(generation, node.datamap, node.nodemap, newData);
|
||
}
|
||
function copyAndSet(node, generation, idx, val) {
|
||
if (node.data[idx] === val) {
|
||
return node;
|
||
}
|
||
node = copyNode(node, generation);
|
||
node.data[idx] = val;
|
||
return node;
|
||
}
|
||
function copyAndInsertPair(node, generation, bit, idx, key, val) {
|
||
const data2 = node.data;
|
||
const length = data2.length;
|
||
const newData = new Array(length + 2);
|
||
let readIndex = 0;
|
||
let writeIndex = 0;
|
||
while (readIndex < idx)
|
||
newData[writeIndex++] = data2[readIndex++];
|
||
newData[writeIndex++] = key;
|
||
newData[writeIndex++] = val;
|
||
while (readIndex < length)
|
||
newData[writeIndex++] = data2[readIndex++];
|
||
return makeNode(generation, node.datamap | bit, node.nodemap, newData);
|
||
}
|
||
function make() {
|
||
return emptyDict;
|
||
}
|
||
function get(dict, key) {
|
||
const result = lookup(dict.root, key, getHash(key));
|
||
return result !== noElementMarker ? Result$Ok(result) : errorNil;
|
||
}
|
||
function lookup(node, key, hash) {
|
||
for (let shift = 0;shift < 32; shift += bits) {
|
||
const data2 = node.data;
|
||
const bit = hashbit(hash, shift);
|
||
if (node.nodemap & bit) {
|
||
node = data2[data2.length - 1 - index(node.nodemap, bit)];
|
||
} else if (node.datamap & bit) {
|
||
const dataidx = Math.imul(index(node.datamap, bit), 2);
|
||
return isEqual(key, data2[dataidx]) ? data2[dataidx + 1] : noElementMarker;
|
||
} else {
|
||
return noElementMarker;
|
||
}
|
||
}
|
||
const overflow = node.data;
|
||
for (let i = 0;i < overflow.length; i += 2) {
|
||
if (isEqual(key, overflow[i])) {
|
||
return overflow[i + 1];
|
||
}
|
||
}
|
||
return noElementMarker;
|
||
}
|
||
function toTransient(dict) {
|
||
return {
|
||
generation: nextGeneration(dict),
|
||
root: dict.root,
|
||
size: dict.size,
|
||
dict
|
||
};
|
||
}
|
||
function nextGeneration(dict) {
|
||
const root = dict.root;
|
||
if (root[generationKey] < Number.MAX_SAFE_INTEGER) {
|
||
return root[generationKey] + 1;
|
||
}
|
||
const queue = [root];
|
||
while (queue.length) {
|
||
const node = queue.pop();
|
||
node[generationKey] = 0;
|
||
const nodeStart = data.length - popcount(node.nodemap);
|
||
for (let i = nodeStart;i < node.data.length; ++i) {
|
||
queue.push(node.data[i]);
|
||
}
|
||
}
|
||
return 1;
|
||
}
|
||
var globalTransient = /* @__PURE__ */ toTransient(emptyDict);
|
||
function insert(dict, key, value) {
|
||
globalTransient.generation = nextGeneration(dict);
|
||
globalTransient.size = dict.size;
|
||
const hash = getHash(key);
|
||
const root = insertIntoNode(globalTransient, dict.root, key, value, hash, 0);
|
||
if (root === dict.root) {
|
||
return dict;
|
||
}
|
||
return new Dict(globalTransient.size, root);
|
||
}
|
||
function insertIntoNode(transient, node, key, value, hash, shift) {
|
||
const data2 = node.data;
|
||
const generation = transient.generation;
|
||
if (shift > 32) {
|
||
for (let i = 0;i < data2.length; i += 2) {
|
||
if (isEqual(key, data2[i])) {
|
||
return copyAndSet(node, generation, i + 1, value);
|
||
}
|
||
}
|
||
transient.size += 1;
|
||
return copyAndInsertPair(node, generation, 0, data2.length, key, value);
|
||
}
|
||
const bit = hashbit(hash, shift);
|
||
if (node.nodemap & bit) {
|
||
const nodeidx2 = data2.length - 1 - index(node.nodemap, bit);
|
||
let child2 = data2[nodeidx2];
|
||
child2 = insertIntoNode(transient, child2, key, value, hash, shift + bits);
|
||
return copyAndSet(node, generation, nodeidx2, child2);
|
||
}
|
||
const dataidx = Math.imul(index(node.datamap, bit), 2);
|
||
if ((node.datamap & bit) === 0) {
|
||
transient.size += 1;
|
||
return copyAndInsertPair(node, generation, bit, dataidx, key, value);
|
||
}
|
||
if (isEqual(key, data2[dataidx])) {
|
||
return copyAndSet(node, generation, dataidx + 1, value);
|
||
}
|
||
const childShift = shift + bits;
|
||
let child = emptyNode;
|
||
child = insertIntoNode(transient, child, key, value, hash, childShift);
|
||
const key2 = data2[dataidx];
|
||
const value2 = data2[dataidx + 1];
|
||
const hash2 = getHash(key2);
|
||
child = insertIntoNode(transient, child, key2, value2, hash2, childShift);
|
||
transient.size -= 1;
|
||
const length = data2.length;
|
||
const nodeidx = length - 1 - index(node.nodemap, bit);
|
||
const newData = new Array(length - 1);
|
||
let readIndex = 0;
|
||
let writeIndex = 0;
|
||
while (readIndex < dataidx)
|
||
newData[writeIndex++] = data2[readIndex++];
|
||
readIndex += 2;
|
||
while (readIndex <= nodeidx)
|
||
newData[writeIndex++] = data2[readIndex++];
|
||
newData[writeIndex++] = child;
|
||
while (readIndex < length)
|
||
newData[writeIndex++] = data2[readIndex++];
|
||
return makeNode(generation, node.datamap ^ bit, node.nodemap | bit, newData);
|
||
}
|
||
function fold(dict, state, fun) {
|
||
const queue = [dict.root];
|
||
while (queue.length) {
|
||
const node = queue.pop();
|
||
const data2 = node.data;
|
||
const edgesStart = data2.length - popcount(node.nodemap);
|
||
for (let i = 0;i < edgesStart; i += 2) {
|
||
state = fun(state, data2[i], data2[i + 1]);
|
||
}
|
||
for (let i = edgesStart;i < data2.length; ++i) {
|
||
queue.push(data2[i]);
|
||
}
|
||
}
|
||
return state;
|
||
}
|
||
function popcount(n) {
|
||
n -= n >>> 1 & 1431655765;
|
||
n = (n & 858993459) + (n >>> 2 & 858993459);
|
||
return Math.imul(n + (n >>> 4) & 252645135, 16843009) >>> 24;
|
||
}
|
||
function index(bitmap, bit) {
|
||
return popcount(bitmap & bit - 1);
|
||
}
|
||
function hashbit(hash, shift) {
|
||
return 1 << (hash >>> shift & mask);
|
||
}
|
||
|
||
// build/dev/javascript/gleam_stdlib/gleam/option.mjs
|
||
class Some extends CustomType {
|
||
constructor($0) {
|
||
super();
|
||
this[0] = $0;
|
||
}
|
||
}
|
||
var Option$isSome = (value) => value instanceof Some;
|
||
var Option$Some$0 = (value) => value[0];
|
||
|
||
class None extends CustomType {
|
||
}
|
||
function to_result(option, e) {
|
||
if (option instanceof Some) {
|
||
let a = option[0];
|
||
return new Ok(a);
|
||
} else {
|
||
return new Error(e);
|
||
}
|
||
}
|
||
function unwrap(option, default$) {
|
||
if (option instanceof Some) {
|
||
let x = option[0];
|
||
return x;
|
||
} else {
|
||
return default$;
|
||
}
|
||
}
|
||
|
||
// build/dev/javascript/gleam_stdlib/gleam/dict.mjs
|
||
function keys(dict) {
|
||
return fold(dict, toList([]), (acc, key, _) => {
|
||
return prepend(key, acc);
|
||
});
|
||
}
|
||
|
||
// build/dev/javascript/gleam_stdlib/gleam/order.mjs
|
||
class Lt extends CustomType {
|
||
}
|
||
var Order$Lt = () => new Lt;
|
||
class Eq extends CustomType {
|
||
}
|
||
var Order$Eq = () => new Eq;
|
||
class Gt extends CustomType {
|
||
}
|
||
var Order$Gt = () => new Gt;
|
||
|
||
// build/dev/javascript/gleam_stdlib/gleam/string.mjs
|
||
function concat_loop(loop$strings, loop$accumulator) {
|
||
while (true) {
|
||
let strings = loop$strings;
|
||
let accumulator = loop$accumulator;
|
||
if (strings instanceof Empty) {
|
||
return accumulator;
|
||
} else {
|
||
let string = strings.head;
|
||
let strings$1 = strings.tail;
|
||
loop$strings = strings$1;
|
||
loop$accumulator = accumulator + string;
|
||
}
|
||
}
|
||
}
|
||
function concat2(strings) {
|
||
return concat_loop(strings, "");
|
||
}
|
||
function split2(x, substring) {
|
||
if (substring === "") {
|
||
return graphemes(x);
|
||
} else {
|
||
let _pipe = x;
|
||
let _pipe$1 = identity(_pipe);
|
||
let _pipe$2 = split(_pipe$1, substring);
|
||
return map2(_pipe$2, identity);
|
||
}
|
||
}
|
||
|
||
// build/dev/javascript/gleam_stdlib/gleam/dynamic/decode.mjs
|
||
class DecodeError extends CustomType {
|
||
constructor(expected, found, path) {
|
||
super();
|
||
this.expected = expected;
|
||
this.found = found;
|
||
this.path = path;
|
||
}
|
||
}
|
||
class Decoder extends CustomType {
|
||
constructor(function$) {
|
||
super();
|
||
this.function = function$;
|
||
}
|
||
}
|
||
var int2 = /* @__PURE__ */ new Decoder(decode_int);
|
||
var float2 = /* @__PURE__ */ new Decoder(decode_float);
|
||
var string2 = /* @__PURE__ */ new Decoder(decode_string);
|
||
function run(data2, decoder) {
|
||
let $ = decoder.function(data2);
|
||
let maybe_invalid_data;
|
||
let errors;
|
||
maybe_invalid_data = $[0];
|
||
errors = $[1];
|
||
if (errors instanceof Empty) {
|
||
return new Ok(maybe_invalid_data);
|
||
} else {
|
||
return new Error(errors);
|
||
}
|
||
}
|
||
function success(data2) {
|
||
return new Decoder((_) => {
|
||
return [data2, toList([])];
|
||
});
|
||
}
|
||
function map3(decoder, transformer) {
|
||
return new Decoder((d) => {
|
||
let $ = decoder.function(d);
|
||
let data2;
|
||
let errors;
|
||
data2 = $[0];
|
||
errors = $[1];
|
||
return [transformer(data2), errors];
|
||
});
|
||
}
|
||
function run_decoders(loop$data, loop$failure, loop$decoders) {
|
||
while (true) {
|
||
let data2 = loop$data;
|
||
let failure = loop$failure;
|
||
let decoders = loop$decoders;
|
||
if (decoders instanceof Empty) {
|
||
return failure;
|
||
} else {
|
||
let decoder = decoders.head;
|
||
let decoders$1 = decoders.tail;
|
||
let $ = decoder.function(data2);
|
||
let layer;
|
||
let errors;
|
||
layer = $;
|
||
errors = $[1];
|
||
if (errors instanceof Empty) {
|
||
return layer;
|
||
} else {
|
||
loop$data = data2;
|
||
loop$failure = failure;
|
||
loop$decoders = decoders$1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function one_of(first, alternatives) {
|
||
return new Decoder((dynamic_data) => {
|
||
let $ = first.function(dynamic_data);
|
||
let layer;
|
||
let errors;
|
||
layer = $;
|
||
errors = $[1];
|
||
if (errors instanceof Empty) {
|
||
return layer;
|
||
} else {
|
||
return run_decoders(dynamic_data, layer, alternatives);
|
||
}
|
||
});
|
||
}
|
||
function run_dynamic_function(data2, name, f) {
|
||
let $ = f(data2);
|
||
if ($ instanceof Ok) {
|
||
let data$1 = $[0];
|
||
return [data$1, toList([])];
|
||
} else {
|
||
let placeholder = $[0];
|
||
return [
|
||
placeholder,
|
||
toList([new DecodeError(name, classify_dynamic(data2), toList([]))])
|
||
];
|
||
}
|
||
}
|
||
function decode_int(data2) {
|
||
return run_dynamic_function(data2, "Int", int);
|
||
}
|
||
function decode_float(data2) {
|
||
return run_dynamic_function(data2, "Float", float);
|
||
}
|
||
function decode_string(data2) {
|
||
return run_dynamic_function(data2, "String", string);
|
||
}
|
||
function path_segment_to_string(key) {
|
||
let decoder = one_of(string2, toList([
|
||
(() => {
|
||
let _pipe = int2;
|
||
return map3(_pipe, to_string);
|
||
})(),
|
||
(() => {
|
||
let _pipe = float2;
|
||
return map3(_pipe, float_to_string);
|
||
})()
|
||
]));
|
||
let $ = run(key, decoder);
|
||
if ($ instanceof Ok) {
|
||
let key$1 = $[0];
|
||
return key$1;
|
||
} else {
|
||
return "<" + classify_dynamic(key) + ">";
|
||
}
|
||
}
|
||
function push_path(layer, path) {
|
||
let path$1 = map2(path, (key) => {
|
||
let _pipe = key;
|
||
let _pipe$1 = identity(_pipe);
|
||
return path_segment_to_string(_pipe$1);
|
||
});
|
||
let errors = map2(layer[1], (error) => {
|
||
return new DecodeError(error.expected, error.found, append2(path$1, error.path));
|
||
});
|
||
return [layer[0], errors];
|
||
}
|
||
function index3(loop$path, loop$position, loop$inner, loop$data, loop$handle_miss) {
|
||
while (true) {
|
||
let path = loop$path;
|
||
let position = loop$position;
|
||
let inner = loop$inner;
|
||
let data2 = loop$data;
|
||
let handle_miss = loop$handle_miss;
|
||
if (path instanceof Empty) {
|
||
let _pipe = data2;
|
||
let _pipe$1 = inner(_pipe);
|
||
return push_path(_pipe$1, reverse(position));
|
||
} else {
|
||
let key = path.head;
|
||
let path$1 = path.tail;
|
||
let $ = index2(data2, key);
|
||
if ($ instanceof Ok) {
|
||
let $1 = $[0];
|
||
if ($1 instanceof Some) {
|
||
let data$1 = $1[0];
|
||
loop$path = path$1;
|
||
loop$position = prepend(key, position);
|
||
loop$inner = inner;
|
||
loop$data = data$1;
|
||
loop$handle_miss = handle_miss;
|
||
} else {
|
||
return handle_miss(data2, prepend(key, position));
|
||
}
|
||
} else {
|
||
let kind = $[0];
|
||
let $1 = inner(data2);
|
||
let default$;
|
||
default$ = $1[0];
|
||
let _pipe = [
|
||
default$,
|
||
toList([new DecodeError(kind, classify_dynamic(data2), toList([]))])
|
||
];
|
||
return push_path(_pipe, reverse(position));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function subfield(field_path, field_decoder, next) {
|
||
return new Decoder((data2) => {
|
||
let $ = index3(field_path, toList([]), field_decoder.function, data2, (data3, position) => {
|
||
let $12 = field_decoder.function(data3);
|
||
let default$;
|
||
default$ = $12[0];
|
||
let _pipe = [
|
||
default$,
|
||
toList([new DecodeError("Field", "Nothing", toList([]))])
|
||
];
|
||
return push_path(_pipe, reverse(position));
|
||
});
|
||
let out;
|
||
let errors1;
|
||
out = $[0];
|
||
errors1 = $[1];
|
||
let $1 = next(out).function(data2);
|
||
let out$1;
|
||
let errors2;
|
||
out$1 = $1[0];
|
||
errors2 = $1[1];
|
||
return [out$1, append2(errors1, errors2)];
|
||
});
|
||
}
|
||
|
||
// build/dev/javascript/gleam_stdlib/gleam_stdlib.mjs
|
||
var Nil = undefined;
|
||
function identity(x) {
|
||
return x;
|
||
}
|
||
function parse_int(value) {
|
||
if (/^[-+]?(\d+)$/.test(value)) {
|
||
return Result$Ok(parseInt(value));
|
||
} else {
|
||
return Result$Error(Nil);
|
||
}
|
||
}
|
||
function to_string(term) {
|
||
return term.toString();
|
||
}
|
||
function graphemes(string3) {
|
||
const iterator = graphemes_iterator(string3);
|
||
if (iterator) {
|
||
return arrayToList(Array.from(iterator).map((item) => item.segment));
|
||
} else {
|
||
return arrayToList(string3.match(/./gsu));
|
||
}
|
||
}
|
||
var segmenter = undefined;
|
||
function graphemes_iterator(string3) {
|
||
if (globalThis.Intl && Intl.Segmenter) {
|
||
segmenter ||= new Intl.Segmenter;
|
||
return segmenter.segment(string3)[Symbol.iterator]();
|
||
}
|
||
}
|
||
function pop_codeunit(str) {
|
||
return [str.charCodeAt(0) | 0, str.slice(1)];
|
||
}
|
||
function lowercase(string3) {
|
||
return string3.toLowerCase();
|
||
}
|
||
function split(xs, pattern) {
|
||
return arrayToList(xs.split(pattern));
|
||
}
|
||
function string_codeunit_slice(str, from2, length2) {
|
||
return str.slice(from2, from2 + length2);
|
||
}
|
||
function starts_with(haystack, needle) {
|
||
return haystack.startsWith(needle);
|
||
}
|
||
var unicode_whitespaces = [
|
||
" ",
|
||
"\t",
|
||
`
|
||
`,
|
||
"\v",
|
||
"\f",
|
||
"\r",
|
||
"
",
|
||
"\u2028",
|
||
"\u2029"
|
||
].join("");
|
||
var trim_start_regex = /* @__PURE__ */ new RegExp(`^[${unicode_whitespaces}]*`);
|
||
var trim_end_regex = /* @__PURE__ */ new RegExp(`[${unicode_whitespaces}]*$`);
|
||
function classify_dynamic(data2) {
|
||
if (typeof data2 === "string") {
|
||
return "String";
|
||
} else if (typeof data2 === "boolean") {
|
||
return "Bool";
|
||
} else if (isResult(data2)) {
|
||
return "Result";
|
||
} else if (isList(data2)) {
|
||
return "List";
|
||
} else if (data2 instanceof BitArray) {
|
||
return "BitArray";
|
||
} else if (data2 instanceof Dict) {
|
||
return "Dict";
|
||
} else if (Number.isInteger(data2)) {
|
||
return "Int";
|
||
} else if (Array.isArray(data2)) {
|
||
return `Array`;
|
||
} else if (typeof data2 === "number") {
|
||
return "Float";
|
||
} else if (data2 === null) {
|
||
return "Nil";
|
||
} else if (data2 === undefined) {
|
||
return "Nil";
|
||
} else {
|
||
const type = typeof data2;
|
||
return type.charAt(0).toUpperCase() + type.slice(1);
|
||
}
|
||
}
|
||
var MIN_I32 = -(2 ** 31);
|
||
var MAX_I32 = 2 ** 31 - 1;
|
||
var U32 = 2 ** 32;
|
||
var MAX_SAFE = Number.MAX_SAFE_INTEGER;
|
||
var MIN_SAFE = Number.MIN_SAFE_INTEGER;
|
||
function float_to_string(float3) {
|
||
const string3 = float3.toString().replace("+", "");
|
||
if (string3.indexOf(".") >= 0) {
|
||
return string3;
|
||
} else {
|
||
const index4 = string3.indexOf("e");
|
||
if (index4 >= 0) {
|
||
return string3.slice(0, index4) + ".0" + string3.slice(index4);
|
||
} else {
|
||
return string3 + ".0";
|
||
}
|
||
}
|
||
}
|
||
|
||
class Inspector {
|
||
#references = new Set;
|
||
inspect(v) {
|
||
const t = typeof v;
|
||
if (v === true)
|
||
return "True";
|
||
if (v === false)
|
||
return "False";
|
||
if (v === null)
|
||
return "//js(null)";
|
||
if (v === undefined)
|
||
return "Nil";
|
||
if (t === "string")
|
||
return this.#string(v);
|
||
if (t === "bigint" || Number.isInteger(v))
|
||
return v.toString();
|
||
if (t === "number")
|
||
return float_to_string(v);
|
||
if (v instanceof UtfCodepoint)
|
||
return this.#utfCodepoint(v);
|
||
if (v instanceof BitArray)
|
||
return this.#bit_array(v);
|
||
if (v instanceof RegExp)
|
||
return `//js(${v})`;
|
||
if (v instanceof Date)
|
||
return `//js(Date("${v.toISOString()}"))`;
|
||
if (v instanceof globalThis.Error)
|
||
return `//js(${v.toString()})`;
|
||
if (v instanceof Function) {
|
||
const args = [];
|
||
for (const i of Array(v.length).keys())
|
||
args.push(String.fromCharCode(i + 97));
|
||
return `//fn(${args.join(", ")}) { ... }`;
|
||
}
|
||
if (this.#references.size === this.#references.add(v).size) {
|
||
return "//js(circular reference)";
|
||
}
|
||
let printed;
|
||
if (Array.isArray(v)) {
|
||
printed = `#(${v.map((v2) => this.inspect(v2)).join(", ")})`;
|
||
} else if (isList(v)) {
|
||
printed = this.#list(v);
|
||
} else if (v instanceof CustomType) {
|
||
printed = this.#customType(v);
|
||
} else if (v instanceof Dict) {
|
||
printed = this.#dict(v);
|
||
} else if (v instanceof Set) {
|
||
return `//js(Set(${[...v].map((v2) => this.inspect(v2)).join(", ")}))`;
|
||
} else {
|
||
printed = this.#object(v);
|
||
}
|
||
this.#references.delete(v);
|
||
return printed;
|
||
}
|
||
#object(v) {
|
||
const name = Object.getPrototypeOf(v)?.constructor?.name || "Object";
|
||
const props = [];
|
||
for (const k of Object.keys(v)) {
|
||
props.push(`${this.inspect(k)}: ${this.inspect(v[k])}`);
|
||
}
|
||
const body = props.length ? " " + props.join(", ") + " " : "";
|
||
const head = name === "Object" ? "" : name + " ";
|
||
return `//js(${head}{${body}})`;
|
||
}
|
||
#dict(map4) {
|
||
let body = "dict.from_list([";
|
||
let first = true;
|
||
body = fold(map4, body, (body2, key, value) => {
|
||
if (!first)
|
||
body2 = body2 + ", ";
|
||
first = false;
|
||
return body2 + "#(" + this.inspect(key) + ", " + this.inspect(value) + ")";
|
||
});
|
||
return body + "])";
|
||
}
|
||
#customType(record) {
|
||
const props = Object.keys(record).map((label) => {
|
||
const value = this.inspect(record[label]);
|
||
return isNaN(parseInt(label)) ? `${label}: ${value}` : value;
|
||
}).join(", ");
|
||
return props ? `${record.constructor.name}(${props})` : record.constructor.name;
|
||
}
|
||
#list(list2) {
|
||
if (List$isEmpty(list2)) {
|
||
return "[]";
|
||
}
|
||
let char_out = 'charlist.from_string("';
|
||
let list_out = "[";
|
||
let current = list2;
|
||
while (List$isNonEmpty(current)) {
|
||
let element = current.head;
|
||
current = current.tail;
|
||
if (list_out !== "[") {
|
||
list_out += ", ";
|
||
}
|
||
list_out += this.inspect(element);
|
||
if (char_out) {
|
||
if (Number.isInteger(element) && element >= 32 && element <= 126) {
|
||
char_out += String.fromCharCode(element);
|
||
} else {
|
||
char_out = null;
|
||
}
|
||
}
|
||
}
|
||
if (char_out) {
|
||
return char_out + '")';
|
||
} else {
|
||
return list_out + "]";
|
||
}
|
||
}
|
||
#string(str) {
|
||
let new_str = '"';
|
||
for (let i = 0;i < str.length; i++) {
|
||
const char = str[i];
|
||
switch (char) {
|
||
case `
|
||
`:
|
||
new_str += "\\n";
|
||
break;
|
||
case "\r":
|
||
new_str += "\\r";
|
||
break;
|
||
case "\t":
|
||
new_str += "\\t";
|
||
break;
|
||
case "\f":
|
||
new_str += "\\f";
|
||
break;
|
||
case "\\":
|
||
new_str += "\\\\";
|
||
break;
|
||
case '"':
|
||
new_str += "\\\"";
|
||
break;
|
||
default:
|
||
if (char < " " || char > "~" && char < " ") {
|
||
new_str += "\\u{" + char.charCodeAt(0).toString(16).toUpperCase().padStart(4, "0") + "}";
|
||
} else {
|
||
new_str += char;
|
||
}
|
||
}
|
||
}
|
||
new_str += '"';
|
||
return new_str;
|
||
}
|
||
#utfCodepoint(codepoint2) {
|
||
return `//utfcodepoint(${String.fromCodePoint(codepoint2.value)})`;
|
||
}
|
||
#bit_array(bits2) {
|
||
if (bits2.bitSize === 0) {
|
||
return "<<>>";
|
||
}
|
||
let acc = "<<";
|
||
for (let i = 0;i < bits2.byteSize - 1; i++) {
|
||
acc += bits2.byteAt(i).toString();
|
||
acc += ", ";
|
||
}
|
||
if (bits2.byteSize * 8 === bits2.bitSize) {
|
||
acc += bits2.byteAt(bits2.byteSize - 1).toString();
|
||
} else {
|
||
const trailingBitsCount = bits2.bitSize % 8;
|
||
acc += bits2.byteAt(bits2.byteSize - 1) >> 8 - trailingBitsCount;
|
||
acc += `:size(${trailingBitsCount})`;
|
||
}
|
||
acc += ">>";
|
||
return acc;
|
||
}
|
||
}
|
||
function index2(data2, key) {
|
||
if (data2 instanceof Dict) {
|
||
const result = get(data2, key);
|
||
return Result$Ok(result.isOk() ? new Some(result[0]) : new None);
|
||
}
|
||
if (data2 instanceof WeakMap || data2 instanceof Map) {
|
||
const token = {};
|
||
const entry = data2.get(key, token);
|
||
if (entry === token)
|
||
return Result$Ok(new None);
|
||
return Result$Ok(new Some(entry));
|
||
}
|
||
const key_is_int = Number.isInteger(key);
|
||
if (key_is_int && key >= 0 && key < 8 && isList(data2)) {
|
||
let i = 0;
|
||
for (const value of data2) {
|
||
if (i === key)
|
||
return Result$Ok(new Some(value));
|
||
i++;
|
||
}
|
||
return Result$Error("Indexable");
|
||
}
|
||
if (key_is_int && Array.isArray(data2) || data2 && typeof data2 === "object" || data2 && Object.getPrototypeOf(data2) === Object.prototype) {
|
||
if (key in data2)
|
||
return Result$Ok(new Some(data2[key]));
|
||
return Result$Ok(new None);
|
||
}
|
||
return Result$Error(key_is_int ? "Indexable" : "Dict");
|
||
}
|
||
function float(data2) {
|
||
if (typeof data2 === "number")
|
||
return Result$Ok(data2);
|
||
return Result$Error(0);
|
||
}
|
||
function int(data2) {
|
||
if (Number.isInteger(data2))
|
||
return Result$Ok(data2);
|
||
return Result$Error(0);
|
||
}
|
||
function string(data2) {
|
||
if (typeof data2 === "string")
|
||
return Result$Ok(data2);
|
||
return Result$Error("");
|
||
}
|
||
function arrayToList(array) {
|
||
let list2 = List$Empty();
|
||
let i = array.length;
|
||
while (i--) {
|
||
list2 = List$NonEmpty(array[i], list2);
|
||
}
|
||
return list2;
|
||
}
|
||
function isList(data2) {
|
||
return List$isEmpty(data2) || List$isNonEmpty(data2);
|
||
}
|
||
function isResult(data2) {
|
||
return Result$isOk(data2) || Result$isError(data2);
|
||
}
|
||
|
||
// build/dev/javascript/gleam_stdlib/gleam/list.mjs
|
||
class Ascending extends CustomType {
|
||
}
|
||
|
||
class Descending extends CustomType {
|
||
}
|
||
function reverse_and_prepend(loop$prefix, loop$suffix) {
|
||
while (true) {
|
||
let prefix = loop$prefix;
|
||
let suffix = loop$suffix;
|
||
if (prefix instanceof Empty) {
|
||
return suffix;
|
||
} else {
|
||
let first$1 = prefix.head;
|
||
let rest$1 = prefix.tail;
|
||
loop$prefix = rest$1;
|
||
loop$suffix = prepend(first$1, suffix);
|
||
}
|
||
}
|
||
}
|
||
function reverse(list2) {
|
||
return reverse_and_prepend(list2, toList([]));
|
||
}
|
||
function map_loop(loop$list, loop$fun, loop$acc) {
|
||
while (true) {
|
||
let list2 = loop$list;
|
||
let fun = loop$fun;
|
||
let acc = loop$acc;
|
||
if (list2 instanceof Empty) {
|
||
return reverse(acc);
|
||
} else {
|
||
let first$1 = list2.head;
|
||
let rest$1 = list2.tail;
|
||
loop$list = rest$1;
|
||
loop$fun = fun;
|
||
loop$acc = prepend(fun(first$1), acc);
|
||
}
|
||
}
|
||
}
|
||
function map2(list2, fun) {
|
||
return map_loop(list2, fun, toList([]));
|
||
}
|
||
function index_map_loop(loop$list, loop$fun, loop$index, loop$acc) {
|
||
while (true) {
|
||
let list2 = loop$list;
|
||
let fun = loop$fun;
|
||
let index4 = loop$index;
|
||
let acc = loop$acc;
|
||
if (list2 instanceof Empty) {
|
||
return reverse(acc);
|
||
} else {
|
||
let first$1 = list2.head;
|
||
let rest$1 = list2.tail;
|
||
let acc$1 = prepend(fun(first$1, index4), acc);
|
||
loop$list = rest$1;
|
||
loop$fun = fun;
|
||
loop$index = index4 + 1;
|
||
loop$acc = acc$1;
|
||
}
|
||
}
|
||
}
|
||
function index_map(list2, fun) {
|
||
return index_map_loop(list2, fun, 0, toList([]));
|
||
}
|
||
function append_loop(loop$first, loop$second) {
|
||
while (true) {
|
||
let first = loop$first;
|
||
let second = loop$second;
|
||
if (first instanceof Empty) {
|
||
return second;
|
||
} else {
|
||
let first$1 = first.head;
|
||
let rest$1 = first.tail;
|
||
loop$first = rest$1;
|
||
loop$second = prepend(first$1, second);
|
||
}
|
||
}
|
||
}
|
||
function append2(first, second) {
|
||
return append_loop(reverse(first), second);
|
||
}
|
||
function prepend2(list2, item) {
|
||
return prepend(item, list2);
|
||
}
|
||
function fold2(loop$list, loop$initial, loop$fun) {
|
||
while (true) {
|
||
let list2 = loop$list;
|
||
let initial = loop$initial;
|
||
let fun = loop$fun;
|
||
if (list2 instanceof Empty) {
|
||
return initial;
|
||
} else {
|
||
let first$1 = list2.head;
|
||
let rest$1 = list2.tail;
|
||
loop$list = rest$1;
|
||
loop$initial = fun(initial, first$1);
|
||
loop$fun = fun;
|
||
}
|
||
}
|
||
}
|
||
function sequences(loop$list, loop$compare, loop$growing, loop$direction, loop$prev, loop$acc) {
|
||
while (true) {
|
||
let list2 = loop$list;
|
||
let compare3 = loop$compare;
|
||
let growing = loop$growing;
|
||
let direction = loop$direction;
|
||
let prev = loop$prev;
|
||
let acc = loop$acc;
|
||
let growing$1 = prepend(prev, growing);
|
||
if (list2 instanceof Empty) {
|
||
if (direction instanceof Ascending) {
|
||
return prepend(reverse(growing$1), acc);
|
||
} else {
|
||
return prepend(growing$1, acc);
|
||
}
|
||
} else {
|
||
let new$1 = list2.head;
|
||
let rest$1 = list2.tail;
|
||
let $ = compare3(prev, new$1);
|
||
if (direction instanceof Ascending) {
|
||
if ($ instanceof Lt) {
|
||
loop$list = rest$1;
|
||
loop$compare = compare3;
|
||
loop$growing = growing$1;
|
||
loop$direction = direction;
|
||
loop$prev = new$1;
|
||
loop$acc = acc;
|
||
} else if ($ instanceof Eq) {
|
||
loop$list = rest$1;
|
||
loop$compare = compare3;
|
||
loop$growing = growing$1;
|
||
loop$direction = direction;
|
||
loop$prev = new$1;
|
||
loop$acc = acc;
|
||
} else {
|
||
let _block;
|
||
if (direction instanceof Ascending) {
|
||
_block = prepend(reverse(growing$1), acc);
|
||
} else {
|
||
_block = prepend(growing$1, acc);
|
||
}
|
||
let acc$1 = _block;
|
||
if (rest$1 instanceof Empty) {
|
||
return prepend(toList([new$1]), acc$1);
|
||
} else {
|
||
let next = rest$1.head;
|
||
let rest$2 = rest$1.tail;
|
||
let _block$1;
|
||
let $1 = compare3(new$1, next);
|
||
if ($1 instanceof Lt) {
|
||
_block$1 = new Ascending;
|
||
} else if ($1 instanceof Eq) {
|
||
_block$1 = new Ascending;
|
||
} else {
|
||
_block$1 = new Descending;
|
||
}
|
||
let direction$1 = _block$1;
|
||
loop$list = rest$2;
|
||
loop$compare = compare3;
|
||
loop$growing = toList([new$1]);
|
||
loop$direction = direction$1;
|
||
loop$prev = next;
|
||
loop$acc = acc$1;
|
||
}
|
||
}
|
||
} else if ($ instanceof Lt) {
|
||
let _block;
|
||
if (direction instanceof Ascending) {
|
||
_block = prepend(reverse(growing$1), acc);
|
||
} else {
|
||
_block = prepend(growing$1, acc);
|
||
}
|
||
let acc$1 = _block;
|
||
if (rest$1 instanceof Empty) {
|
||
return prepend(toList([new$1]), acc$1);
|
||
} else {
|
||
let next = rest$1.head;
|
||
let rest$2 = rest$1.tail;
|
||
let _block$1;
|
||
let $1 = compare3(new$1, next);
|
||
if ($1 instanceof Lt) {
|
||
_block$1 = new Ascending;
|
||
} else if ($1 instanceof Eq) {
|
||
_block$1 = new Ascending;
|
||
} else {
|
||
_block$1 = new Descending;
|
||
}
|
||
let direction$1 = _block$1;
|
||
loop$list = rest$2;
|
||
loop$compare = compare3;
|
||
loop$growing = toList([new$1]);
|
||
loop$direction = direction$1;
|
||
loop$prev = next;
|
||
loop$acc = acc$1;
|
||
}
|
||
} else if ($ instanceof Eq) {
|
||
let _block;
|
||
if (direction instanceof Ascending) {
|
||
_block = prepend(reverse(growing$1), acc);
|
||
} else {
|
||
_block = prepend(growing$1, acc);
|
||
}
|
||
let acc$1 = _block;
|
||
if (rest$1 instanceof Empty) {
|
||
return prepend(toList([new$1]), acc$1);
|
||
} else {
|
||
let next = rest$1.head;
|
||
let rest$2 = rest$1.tail;
|
||
let _block$1;
|
||
let $1 = compare3(new$1, next);
|
||
if ($1 instanceof Lt) {
|
||
_block$1 = new Ascending;
|
||
} else if ($1 instanceof Eq) {
|
||
_block$1 = new Ascending;
|
||
} else {
|
||
_block$1 = new Descending;
|
||
}
|
||
let direction$1 = _block$1;
|
||
loop$list = rest$2;
|
||
loop$compare = compare3;
|
||
loop$growing = toList([new$1]);
|
||
loop$direction = direction$1;
|
||
loop$prev = next;
|
||
loop$acc = acc$1;
|
||
}
|
||
} else {
|
||
loop$list = rest$1;
|
||
loop$compare = compare3;
|
||
loop$growing = growing$1;
|
||
loop$direction = direction;
|
||
loop$prev = new$1;
|
||
loop$acc = acc;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function merge_ascendings(loop$list1, loop$list2, loop$compare, loop$acc) {
|
||
while (true) {
|
||
let list1 = loop$list1;
|
||
let list2 = loop$list2;
|
||
let compare3 = loop$compare;
|
||
let acc = loop$acc;
|
||
if (list1 instanceof Empty) {
|
||
let list3 = list2;
|
||
return reverse_and_prepend(list3, acc);
|
||
} else if (list2 instanceof Empty) {
|
||
let list3 = list1;
|
||
return reverse_and_prepend(list3, acc);
|
||
} else {
|
||
let first1 = list1.head;
|
||
let rest1 = list1.tail;
|
||
let first2 = list2.head;
|
||
let rest2 = list2.tail;
|
||
let $ = compare3(first1, first2);
|
||
if ($ instanceof Lt) {
|
||
loop$list1 = rest1;
|
||
loop$list2 = list2;
|
||
loop$compare = compare3;
|
||
loop$acc = prepend(first1, acc);
|
||
} else if ($ instanceof Eq) {
|
||
loop$list1 = list1;
|
||
loop$list2 = rest2;
|
||
loop$compare = compare3;
|
||
loop$acc = prepend(first2, acc);
|
||
} else {
|
||
loop$list1 = list1;
|
||
loop$list2 = rest2;
|
||
loop$compare = compare3;
|
||
loop$acc = prepend(first2, acc);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function merge_ascending_pairs(loop$sequences, loop$compare, loop$acc) {
|
||
while (true) {
|
||
let sequences2 = loop$sequences;
|
||
let compare3 = loop$compare;
|
||
let acc = loop$acc;
|
||
if (sequences2 instanceof Empty) {
|
||
return reverse(acc);
|
||
} else {
|
||
let $ = sequences2.tail;
|
||
if ($ instanceof Empty) {
|
||
let sequence = sequences2.head;
|
||
return reverse(prepend(reverse(sequence), acc));
|
||
} else {
|
||
let ascending1 = sequences2.head;
|
||
let ascending2 = $.head;
|
||
let rest$1 = $.tail;
|
||
let descending = merge_ascendings(ascending1, ascending2, compare3, toList([]));
|
||
loop$sequences = rest$1;
|
||
loop$compare = compare3;
|
||
loop$acc = prepend(descending, acc);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function merge_descendings(loop$list1, loop$list2, loop$compare, loop$acc) {
|
||
while (true) {
|
||
let list1 = loop$list1;
|
||
let list2 = loop$list2;
|
||
let compare3 = loop$compare;
|
||
let acc = loop$acc;
|
||
if (list1 instanceof Empty) {
|
||
let list3 = list2;
|
||
return reverse_and_prepend(list3, acc);
|
||
} else if (list2 instanceof Empty) {
|
||
let list3 = list1;
|
||
return reverse_and_prepend(list3, acc);
|
||
} else {
|
||
let first1 = list1.head;
|
||
let rest1 = list1.tail;
|
||
let first2 = list2.head;
|
||
let rest2 = list2.tail;
|
||
let $ = compare3(first1, first2);
|
||
if ($ instanceof Lt) {
|
||
loop$list1 = list1;
|
||
loop$list2 = rest2;
|
||
loop$compare = compare3;
|
||
loop$acc = prepend(first2, acc);
|
||
} else if ($ instanceof Eq) {
|
||
loop$list1 = rest1;
|
||
loop$list2 = list2;
|
||
loop$compare = compare3;
|
||
loop$acc = prepend(first1, acc);
|
||
} else {
|
||
loop$list1 = rest1;
|
||
loop$list2 = list2;
|
||
loop$compare = compare3;
|
||
loop$acc = prepend(first1, acc);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function merge_descending_pairs(loop$sequences, loop$compare, loop$acc) {
|
||
while (true) {
|
||
let sequences2 = loop$sequences;
|
||
let compare3 = loop$compare;
|
||
let acc = loop$acc;
|
||
if (sequences2 instanceof Empty) {
|
||
return reverse(acc);
|
||
} else {
|
||
let $ = sequences2.tail;
|
||
if ($ instanceof Empty) {
|
||
let sequence = sequences2.head;
|
||
return reverse(prepend(reverse(sequence), acc));
|
||
} else {
|
||
let descending1 = sequences2.head;
|
||
let descending2 = $.head;
|
||
let rest$1 = $.tail;
|
||
let ascending = merge_descendings(descending1, descending2, compare3, toList([]));
|
||
loop$sequences = rest$1;
|
||
loop$compare = compare3;
|
||
loop$acc = prepend(ascending, acc);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function merge_all(loop$sequences, loop$direction, loop$compare) {
|
||
while (true) {
|
||
let sequences2 = loop$sequences;
|
||
let direction = loop$direction;
|
||
let compare3 = loop$compare;
|
||
if (sequences2 instanceof Empty) {
|
||
return sequences2;
|
||
} else if (direction instanceof Ascending) {
|
||
let $ = sequences2.tail;
|
||
if ($ instanceof Empty) {
|
||
let sequence = sequences2.head;
|
||
return sequence;
|
||
} else {
|
||
let sequences$1 = merge_ascending_pairs(sequences2, compare3, toList([]));
|
||
loop$sequences = sequences$1;
|
||
loop$direction = new Descending;
|
||
loop$compare = compare3;
|
||
}
|
||
} else {
|
||
let $ = sequences2.tail;
|
||
if ($ instanceof Empty) {
|
||
let sequence = sequences2.head;
|
||
return reverse(sequence);
|
||
} else {
|
||
let sequences$1 = merge_descending_pairs(sequences2, compare3, toList([]));
|
||
loop$sequences = sequences$1;
|
||
loop$direction = new Ascending;
|
||
loop$compare = compare3;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function sort(list2, compare3) {
|
||
if (list2 instanceof Empty) {
|
||
return list2;
|
||
} else {
|
||
let $ = list2.tail;
|
||
if ($ instanceof Empty) {
|
||
return list2;
|
||
} else {
|
||
let x = list2.head;
|
||
let y = $.head;
|
||
let rest$1 = $.tail;
|
||
let _block;
|
||
let $1 = compare3(x, y);
|
||
if ($1 instanceof Lt) {
|
||
_block = new Ascending;
|
||
} else if ($1 instanceof Eq) {
|
||
_block = new Ascending;
|
||
} else {
|
||
_block = new Descending;
|
||
}
|
||
let direction = _block;
|
||
let sequences$1 = sequences(rest$1, compare3, toList([x]), direction, y, toList([]));
|
||
return merge_all(sequences$1, new Ascending, compare3);
|
||
}
|
||
}
|
||
}
|
||
function key_set_loop(loop$list, loop$key, loop$value, loop$inspected) {
|
||
while (true) {
|
||
let list2 = loop$list;
|
||
let key = loop$key;
|
||
let value = loop$value;
|
||
let inspected = loop$inspected;
|
||
if (list2 instanceof Empty) {
|
||
return reverse(prepend([key, value], inspected));
|
||
} else {
|
||
let k = list2.head[0];
|
||
if (isEqual(k, key)) {
|
||
let rest$1 = list2.tail;
|
||
return reverse_and_prepend(inspected, prepend([k, value], rest$1));
|
||
} else {
|
||
let first$1 = list2.head;
|
||
let rest$1 = list2.tail;
|
||
loop$list = rest$1;
|
||
loop$key = key;
|
||
loop$value = value;
|
||
loop$inspected = prepend(first$1, inspected);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function key_set(list2, key, value) {
|
||
return key_set_loop(list2, key, value, toList([]));
|
||
}
|
||
function each(loop$list, loop$f) {
|
||
while (true) {
|
||
let list2 = loop$list;
|
||
let f = loop$f;
|
||
if (list2 instanceof Empty) {
|
||
return;
|
||
} else {
|
||
let first$1 = list2.head;
|
||
let rest$1 = list2.tail;
|
||
f(first$1);
|
||
loop$list = rest$1;
|
||
loop$f = f;
|
||
}
|
||
}
|
||
}
|
||
|
||
// build/dev/javascript/gleam_stdlib/gleam/result.mjs
|
||
function map_error(result, fun) {
|
||
if (result instanceof Ok) {
|
||
return result;
|
||
} else {
|
||
let error = result[0];
|
||
return new Error(fun(error));
|
||
}
|
||
}
|
||
function try$(result, fun) {
|
||
if (result instanceof Ok) {
|
||
let x = result[0];
|
||
return fun(x);
|
||
} else {
|
||
return result;
|
||
}
|
||
}
|
||
function unwrap2(result, default$) {
|
||
if (result instanceof Ok) {
|
||
let v = result[0];
|
||
return v;
|
||
} else {
|
||
return default$;
|
||
}
|
||
}
|
||
function replace_error(result, error) {
|
||
if (result instanceof Ok) {
|
||
return result;
|
||
} else {
|
||
return new Error(error);
|
||
}
|
||
}
|
||
// build/dev/javascript/gleam_stdlib/gleam/bool.mjs
|
||
function guard(requirement, consequence, alternative) {
|
||
if (requirement) {
|
||
return consequence;
|
||
} else {
|
||
return alternative();
|
||
}
|
||
}
|
||
|
||
// build/dev/javascript/gleam_http/gleam/http.mjs
|
||
class Get extends CustomType {
|
||
}
|
||
class Post extends CustomType {
|
||
}
|
||
class Head extends CustomType {
|
||
}
|
||
class Put extends CustomType {
|
||
}
|
||
class Delete extends CustomType {
|
||
}
|
||
class Trace extends CustomType {
|
||
}
|
||
class Connect extends CustomType {
|
||
}
|
||
class Options extends CustomType {
|
||
}
|
||
class Patch extends CustomType {
|
||
}
|
||
class Http extends CustomType {
|
||
}
|
||
class Https extends CustomType {
|
||
}
|
||
function method_to_string(method) {
|
||
if (method instanceof Get) {
|
||
return "GET";
|
||
} else if (method instanceof Post) {
|
||
return "POST";
|
||
} else if (method instanceof Head) {
|
||
return "HEAD";
|
||
} else if (method instanceof Put) {
|
||
return "PUT";
|
||
} else if (method instanceof Delete) {
|
||
return "DELETE";
|
||
} else if (method instanceof Trace) {
|
||
return "TRACE";
|
||
} else if (method instanceof Connect) {
|
||
return "CONNECT";
|
||
} else if (method instanceof Options) {
|
||
return "OPTIONS";
|
||
} else if (method instanceof Patch) {
|
||
return "PATCH";
|
||
} else {
|
||
let method$1 = method[0];
|
||
return method$1;
|
||
}
|
||
}
|
||
function scheme_to_string(scheme) {
|
||
if (scheme instanceof Http) {
|
||
return "http";
|
||
} else {
|
||
return "https";
|
||
}
|
||
}
|
||
function scheme_from_string(scheme) {
|
||
let $ = lowercase(scheme);
|
||
if ($ === "http") {
|
||
return new Ok(new Http);
|
||
} else if ($ === "https") {
|
||
return new Ok(new Https);
|
||
} else {
|
||
return new Error(undefined);
|
||
}
|
||
}
|
||
|
||
// build/dev/javascript/gleam_http/gleam/http/response.mjs
|
||
class Response extends CustomType {
|
||
constructor(status, headers, body) {
|
||
super();
|
||
this.status = status;
|
||
this.headers = headers;
|
||
this.body = body;
|
||
}
|
||
}
|
||
// build/dev/javascript/gleam_stdlib/gleam/function.mjs
|
||
function identity2(x) {
|
||
return x;
|
||
}
|
||
// build/dev/javascript/gleam_json/gleam_json_ffi.mjs
|
||
function json_to_string(json) {
|
||
return JSON.stringify(json);
|
||
}
|
||
function object(entries) {
|
||
return Object.fromEntries(entries);
|
||
}
|
||
function identity3(x) {
|
||
return x;
|
||
}
|
||
function array(list2) {
|
||
const array2 = [];
|
||
while (List$isNonEmpty(list2)) {
|
||
array2.push(List$NonEmpty$first(list2));
|
||
list2 = List$NonEmpty$rest(list2);
|
||
}
|
||
return array2;
|
||
}
|
||
|
||
// build/dev/javascript/gleam_json/gleam/json.mjs
|
||
function to_string2(json) {
|
||
return json_to_string(json);
|
||
}
|
||
function string3(input) {
|
||
return identity3(input);
|
||
}
|
||
function bool(input) {
|
||
return identity3(input);
|
||
}
|
||
function int3(input) {
|
||
return identity3(input);
|
||
}
|
||
function object2(entries) {
|
||
return object(entries);
|
||
}
|
||
function preprocessed_array(from2) {
|
||
return array(from2);
|
||
}
|
||
function array2(entries, inner_type) {
|
||
let _pipe = entries;
|
||
let _pipe$1 = map2(_pipe, inner_type);
|
||
return preprocessed_array(_pipe$1);
|
||
}
|
||
|
||
// build/dev/javascript/houdini/houdini.ffi.mjs
|
||
function do_escape(string4) {
|
||
return string4.replaceAll(/[><&"']/g, (replaced) => {
|
||
switch (replaced) {
|
||
case ">":
|
||
return ">";
|
||
case "<":
|
||
return "<";
|
||
case "'":
|
||
return "'";
|
||
case "&":
|
||
return "&";
|
||
case '"':
|
||
return """;
|
||
default:
|
||
return replaced;
|
||
}
|
||
});
|
||
}
|
||
|
||
// build/dev/javascript/houdini/houdini/internal/escape_js.mjs
|
||
function escape(text) {
|
||
return do_escape(text);
|
||
}
|
||
|
||
// build/dev/javascript/houdini/houdini.mjs
|
||
function escape2(string4) {
|
||
return escape(string4);
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre/internals/constants.mjs
|
||
var empty_list = /* @__PURE__ */ toList([]);
|
||
var error_nil = /* @__PURE__ */ new Error(undefined);
|
||
|
||
// build/dev/javascript/lustre/lustre/vdom/vattr.ffi.mjs
|
||
var GT = /* @__PURE__ */ Order$Gt();
|
||
var LT = /* @__PURE__ */ Order$Lt();
|
||
var EQ = /* @__PURE__ */ Order$Eq();
|
||
function compare3(a, b) {
|
||
if (a.name === b.name) {
|
||
return EQ;
|
||
} else if (a.name < b.name) {
|
||
return LT;
|
||
} else {
|
||
return GT;
|
||
}
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre/vdom/vattr.mjs
|
||
class Attribute extends CustomType {
|
||
constructor(kind, name, value) {
|
||
super();
|
||
this.kind = kind;
|
||
this.name = name;
|
||
this.value = value;
|
||
}
|
||
}
|
||
class Property extends CustomType {
|
||
constructor(kind, name, value) {
|
||
super();
|
||
this.kind = kind;
|
||
this.name = name;
|
||
this.value = value;
|
||
}
|
||
}
|
||
class Event2 extends CustomType {
|
||
constructor(kind, name, handler, include, prevent_default, stop_propagation, debounce, throttle) {
|
||
super();
|
||
this.kind = kind;
|
||
this.name = name;
|
||
this.handler = handler;
|
||
this.include = include;
|
||
this.prevent_default = prevent_default;
|
||
this.stop_propagation = stop_propagation;
|
||
this.debounce = debounce;
|
||
this.throttle = throttle;
|
||
}
|
||
}
|
||
class Handler extends CustomType {
|
||
constructor(prevent_default, stop_propagation, message) {
|
||
super();
|
||
this.prevent_default = prevent_default;
|
||
this.stop_propagation = stop_propagation;
|
||
this.message = message;
|
||
}
|
||
}
|
||
class Never extends CustomType {
|
||
constructor(kind) {
|
||
super();
|
||
this.kind = kind;
|
||
}
|
||
}
|
||
var attribute_kind = 0;
|
||
var property_kind = 1;
|
||
var event_kind = 2;
|
||
var never_kind = 0;
|
||
var never = /* @__PURE__ */ new Never(never_kind);
|
||
var always_kind = 2;
|
||
function merge(loop$attributes, loop$merged) {
|
||
while (true) {
|
||
let attributes = loop$attributes;
|
||
let merged = loop$merged;
|
||
if (attributes instanceof Empty) {
|
||
return merged;
|
||
} else {
|
||
let $ = attributes.head;
|
||
if ($ instanceof Attribute) {
|
||
let $1 = $.name;
|
||
if ($1 === "") {
|
||
let rest = attributes.tail;
|
||
loop$attributes = rest;
|
||
loop$merged = merged;
|
||
} else if ($1 === "class") {
|
||
let $2 = $.value;
|
||
if ($2 === "") {
|
||
let rest = attributes.tail;
|
||
loop$attributes = rest;
|
||
loop$merged = merged;
|
||
} else {
|
||
let $3 = attributes.tail;
|
||
if ($3 instanceof Empty) {
|
||
let attribute$1 = $;
|
||
let rest = $3;
|
||
loop$attributes = rest;
|
||
loop$merged = prepend(attribute$1, merged);
|
||
} else {
|
||
let $4 = $3.head;
|
||
if ($4 instanceof Attribute) {
|
||
let $5 = $4.name;
|
||
if ($5 === "class") {
|
||
let kind = $.kind;
|
||
let class1 = $2;
|
||
let rest = $3.tail;
|
||
let class2 = $4.value;
|
||
let value = class1 + " " + class2;
|
||
let attribute$1 = new Attribute(kind, "class", value);
|
||
loop$attributes = prepend(attribute$1, rest);
|
||
loop$merged = merged;
|
||
} else {
|
||
let attribute$1 = $;
|
||
let rest = $3;
|
||
loop$attributes = rest;
|
||
loop$merged = prepend(attribute$1, merged);
|
||
}
|
||
} else {
|
||
let attribute$1 = $;
|
||
let rest = $3;
|
||
loop$attributes = rest;
|
||
loop$merged = prepend(attribute$1, merged);
|
||
}
|
||
}
|
||
}
|
||
} else if ($1 === "style") {
|
||
let $2 = $.value;
|
||
if ($2 === "") {
|
||
let rest = attributes.tail;
|
||
loop$attributes = rest;
|
||
loop$merged = merged;
|
||
} else {
|
||
let $3 = attributes.tail;
|
||
if ($3 instanceof Empty) {
|
||
let attribute$1 = $;
|
||
let rest = $3;
|
||
loop$attributes = rest;
|
||
loop$merged = prepend(attribute$1, merged);
|
||
} else {
|
||
let $4 = $3.head;
|
||
if ($4 instanceof Attribute) {
|
||
let $5 = $4.name;
|
||
if ($5 === "style") {
|
||
let kind = $.kind;
|
||
let style1 = $2;
|
||
let rest = $3.tail;
|
||
let style2 = $4.value;
|
||
let value = style1 + ";" + style2;
|
||
let attribute$1 = new Attribute(kind, "style", value);
|
||
loop$attributes = prepend(attribute$1, rest);
|
||
loop$merged = merged;
|
||
} else {
|
||
let attribute$1 = $;
|
||
let rest = $3;
|
||
loop$attributes = rest;
|
||
loop$merged = prepend(attribute$1, merged);
|
||
}
|
||
} else {
|
||
let attribute$1 = $;
|
||
let rest = $3;
|
||
loop$attributes = rest;
|
||
loop$merged = prepend(attribute$1, merged);
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
let attribute$1 = $;
|
||
let rest = attributes.tail;
|
||
loop$attributes = rest;
|
||
loop$merged = prepend(attribute$1, merged);
|
||
}
|
||
} else {
|
||
let attribute$1 = $;
|
||
let rest = attributes.tail;
|
||
loop$attributes = rest;
|
||
loop$merged = prepend(attribute$1, merged);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function prepare(attributes) {
|
||
if (attributes instanceof Empty) {
|
||
return attributes;
|
||
} else {
|
||
let $ = attributes.tail;
|
||
if ($ instanceof Empty) {
|
||
return attributes;
|
||
} else {
|
||
let _pipe = attributes;
|
||
let _pipe$1 = sort(_pipe, (a, b) => {
|
||
return compare3(b, a);
|
||
});
|
||
return merge(_pipe$1, empty_list);
|
||
}
|
||
}
|
||
}
|
||
function attribute(name, value) {
|
||
return new Attribute(attribute_kind, name, value);
|
||
}
|
||
function property(name, value) {
|
||
return new Property(property_kind, name, value);
|
||
}
|
||
function event(name, handler, include, prevent_default, stop_propagation, debounce, throttle) {
|
||
return new Event2(event_kind, name, handler, include, prevent_default, stop_propagation, debounce, throttle);
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre/attribute.mjs
|
||
function attribute2(name, value) {
|
||
return attribute(name, value);
|
||
}
|
||
function property2(name, value) {
|
||
return property(name, value);
|
||
}
|
||
function boolean_attribute(name, value) {
|
||
if (value) {
|
||
return attribute2(name, "");
|
||
} else {
|
||
return property2(name, bool(false));
|
||
}
|
||
}
|
||
function class$(name) {
|
||
return attribute2("class", name);
|
||
}
|
||
function style(property3, value) {
|
||
if (property3 === "") {
|
||
return class$("");
|
||
} else if (value === "") {
|
||
return class$("");
|
||
} else {
|
||
return attribute2("style", property3 + ":" + value + ";");
|
||
}
|
||
}
|
||
function do_styles(loop$properties, loop$styles) {
|
||
while (true) {
|
||
let properties = loop$properties;
|
||
let styles = loop$styles;
|
||
if (properties instanceof Empty) {
|
||
return styles;
|
||
} else {
|
||
let $ = properties.head[0];
|
||
if ($ === "") {
|
||
let rest = properties.tail;
|
||
loop$properties = rest;
|
||
loop$styles = styles;
|
||
} else {
|
||
let $1 = properties.head[1];
|
||
if ($1 === "") {
|
||
let rest = properties.tail;
|
||
loop$properties = rest;
|
||
loop$styles = styles;
|
||
} else {
|
||
let rest = properties.tail;
|
||
let name$1 = $;
|
||
let value$1 = $1;
|
||
loop$properties = rest;
|
||
loop$styles = styles + name$1 + ":" + value$1 + ";";
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function styles(properties) {
|
||
return attribute2("style", do_styles(properties, ""));
|
||
}
|
||
function disabled(is_disabled) {
|
||
return boolean_attribute("disabled", is_disabled);
|
||
}
|
||
function min2(value) {
|
||
return attribute2("min", value);
|
||
}
|
||
function placeholder(text) {
|
||
return attribute2("placeholder", text);
|
||
}
|
||
function type_(control_type) {
|
||
return attribute2("type", control_type);
|
||
}
|
||
function value(control_value) {
|
||
return attribute2("value", control_value);
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre/effect.mjs
|
||
class Effect extends CustomType {
|
||
constructor(synchronous, before_paint, after_paint) {
|
||
super();
|
||
this.synchronous = synchronous;
|
||
this.before_paint = before_paint;
|
||
this.after_paint = after_paint;
|
||
}
|
||
}
|
||
|
||
class Actions extends CustomType {
|
||
constructor(dispatch, emit, select, root, provide) {
|
||
super();
|
||
this.dispatch = dispatch;
|
||
this.emit = emit;
|
||
this.select = select;
|
||
this.root = root;
|
||
this.provide = provide;
|
||
}
|
||
}
|
||
var empty = /* @__PURE__ */ new Effect(/* @__PURE__ */ toList([]), /* @__PURE__ */ toList([]), /* @__PURE__ */ toList([]));
|
||
function perform(effect, dispatch, emit, select, root, provide) {
|
||
let actions = new Actions(dispatch, emit, select, root, provide);
|
||
return each(effect.synchronous, (run2) => {
|
||
return run2(actions);
|
||
});
|
||
}
|
||
function none() {
|
||
return empty;
|
||
}
|
||
function from2(effect) {
|
||
let task = (actions) => {
|
||
let dispatch = actions.dispatch;
|
||
return effect(dispatch);
|
||
};
|
||
return new Effect(toList([task]), empty.before_paint, empty.after_paint);
|
||
}
|
||
function batch(effects) {
|
||
return fold2(effects, empty, (acc, eff) => {
|
||
return new Effect(fold2(eff.synchronous, acc.synchronous, prepend2), fold2(eff.before_paint, acc.before_paint, prepend2), fold2(eff.after_paint, acc.after_paint, prepend2));
|
||
});
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre/internals/mutable_map.ffi.mjs
|
||
function empty2() {
|
||
return null;
|
||
}
|
||
function get2(map6, key) {
|
||
return map6?.get(key);
|
||
}
|
||
function get_or_compute(map6, key, compute) {
|
||
return map6?.get(key) ?? compute();
|
||
}
|
||
function has_key(map6, key) {
|
||
return map6 && map6.has(key);
|
||
}
|
||
function insert2(map6, key, value2) {
|
||
map6 ??= new Map;
|
||
map6.set(key, value2);
|
||
return map6;
|
||
}
|
||
function remove(map6, key) {
|
||
map6?.delete(key);
|
||
return map6;
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre/internals/ref.ffi.mjs
|
||
function sameValueZero(x, y) {
|
||
if (typeof x === "number" && typeof y === "number") {
|
||
return x === y || x !== x && y !== y;
|
||
}
|
||
return x === y;
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre/internals/ref.mjs
|
||
function equal_lists(loop$xs, loop$ys) {
|
||
while (true) {
|
||
let xs = loop$xs;
|
||
let ys = loop$ys;
|
||
if (xs instanceof Empty) {
|
||
if (ys instanceof Empty) {
|
||
return true;
|
||
} else {
|
||
return false;
|
||
}
|
||
} else if (ys instanceof Empty) {
|
||
return false;
|
||
} else {
|
||
let x = xs.head;
|
||
let xs$1 = xs.tail;
|
||
let y = ys.head;
|
||
let ys$1 = ys.tail;
|
||
let $ = sameValueZero(x, y);
|
||
if ($) {
|
||
loop$xs = xs$1;
|
||
loop$ys = ys$1;
|
||
} else {
|
||
return $;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre/vdom/vnode.mjs
|
||
class Fragment extends CustomType {
|
||
constructor(kind, key, children, keyed_children) {
|
||
super();
|
||
this.kind = kind;
|
||
this.key = key;
|
||
this.children = children;
|
||
this.keyed_children = keyed_children;
|
||
}
|
||
}
|
||
class Element extends CustomType {
|
||
constructor(kind, key, namespace, tag, attributes, children, keyed_children, self_closing, void$) {
|
||
super();
|
||
this.kind = kind;
|
||
this.key = key;
|
||
this.namespace = namespace;
|
||
this.tag = tag;
|
||
this.attributes = attributes;
|
||
this.children = children;
|
||
this.keyed_children = keyed_children;
|
||
this.self_closing = self_closing;
|
||
this.void = void$;
|
||
}
|
||
}
|
||
class Text extends CustomType {
|
||
constructor(kind, key, content) {
|
||
super();
|
||
this.kind = kind;
|
||
this.key = key;
|
||
this.content = content;
|
||
}
|
||
}
|
||
class UnsafeInnerHtml extends CustomType {
|
||
constructor(kind, key, namespace, tag, attributes, inner_html) {
|
||
super();
|
||
this.kind = kind;
|
||
this.key = key;
|
||
this.namespace = namespace;
|
||
this.tag = tag;
|
||
this.attributes = attributes;
|
||
this.inner_html = inner_html;
|
||
}
|
||
}
|
||
class Map2 extends CustomType {
|
||
constructor(kind, key, mapper, child) {
|
||
super();
|
||
this.kind = kind;
|
||
this.key = key;
|
||
this.mapper = mapper;
|
||
this.child = child;
|
||
}
|
||
}
|
||
class Memo extends CustomType {
|
||
constructor(kind, key, dependencies, view) {
|
||
super();
|
||
this.kind = kind;
|
||
this.key = key;
|
||
this.dependencies = dependencies;
|
||
this.view = view;
|
||
}
|
||
}
|
||
var fragment_kind = 0;
|
||
var element_kind = 1;
|
||
var text_kind = 2;
|
||
var unsafe_inner_html_kind = 3;
|
||
var map_kind = 4;
|
||
var memo_kind = 5;
|
||
function is_void_html_element(tag, namespace) {
|
||
if (namespace === "") {
|
||
if (tag === "area") {
|
||
return true;
|
||
} else if (tag === "base") {
|
||
return true;
|
||
} else if (tag === "br") {
|
||
return true;
|
||
} else if (tag === "col") {
|
||
return true;
|
||
} else if (tag === "embed") {
|
||
return true;
|
||
} else if (tag === "hr") {
|
||
return true;
|
||
} else if (tag === "img") {
|
||
return true;
|
||
} else if (tag === "input") {
|
||
return true;
|
||
} else if (tag === "link") {
|
||
return true;
|
||
} else if (tag === "meta") {
|
||
return true;
|
||
} else if (tag === "param") {
|
||
return true;
|
||
} else if (tag === "source") {
|
||
return true;
|
||
} else if (tag === "track") {
|
||
return true;
|
||
} else if (tag === "wbr") {
|
||
return true;
|
||
} else {
|
||
return false;
|
||
}
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
function to_keyed(key, node) {
|
||
if (node instanceof Fragment) {
|
||
return new Fragment(node.kind, key, node.children, node.keyed_children);
|
||
} else if (node instanceof Element) {
|
||
return new Element(node.kind, key, node.namespace, node.tag, node.attributes, node.children, node.keyed_children, node.self_closing, node.void);
|
||
} else if (node instanceof Text) {
|
||
return new Text(node.kind, key, node.content);
|
||
} else if (node instanceof UnsafeInnerHtml) {
|
||
return new UnsafeInnerHtml(node.kind, key, node.namespace, node.tag, node.attributes, node.inner_html);
|
||
} else if (node instanceof Map2) {
|
||
let child = node.child;
|
||
return new Map2(node.kind, key, node.mapper, to_keyed(key, child));
|
||
} else {
|
||
let view = node.view;
|
||
return new Memo(node.kind, key, node.dependencies, () => {
|
||
return to_keyed(key, view());
|
||
});
|
||
}
|
||
}
|
||
function fragment(key, children, keyed_children) {
|
||
return new Fragment(fragment_kind, key, children, keyed_children);
|
||
}
|
||
function element(key, namespace, tag, attributes, children, keyed_children, self_closing, void$) {
|
||
return new Element(element_kind, key, namespace, tag, prepare(attributes), children, keyed_children, self_closing, void$);
|
||
}
|
||
function text(key, content) {
|
||
return new Text(text_kind, key, content);
|
||
}
|
||
function map6(element2, mapper) {
|
||
if (element2 instanceof Map2) {
|
||
let child_mapper = element2.mapper;
|
||
return new Map2(map_kind, element2.key, (handler) => {
|
||
return identity2(mapper)(child_mapper(handler));
|
||
}, identity2(element2.child));
|
||
} else {
|
||
return new Map2(map_kind, element2.key, identity2(mapper), identity2(element2));
|
||
}
|
||
}
|
||
function memo(key, dependencies, view) {
|
||
return new Memo(memo_kind, key, dependencies, view);
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre/element.mjs
|
||
function element2(tag, attributes, children) {
|
||
return element("", "", tag, attributes, children, empty2(), false, is_void_html_element(tag, ""));
|
||
}
|
||
function text2(content) {
|
||
return text("", content);
|
||
}
|
||
function none2() {
|
||
return text("", "");
|
||
}
|
||
function memo2(dependencies, view) {
|
||
return memo("", dependencies, view);
|
||
}
|
||
function ref(value2) {
|
||
return identity2(value2);
|
||
}
|
||
function map7(element3, f) {
|
||
return map6(element3, f);
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre/element/html.mjs
|
||
function text3(content) {
|
||
return text2(content);
|
||
}
|
||
function h1(attrs, children) {
|
||
return element2("h1", attrs, children);
|
||
}
|
||
function div(attrs, children) {
|
||
return element2("div", attrs, children);
|
||
}
|
||
function li(attrs, children) {
|
||
return element2("li", attrs, children);
|
||
}
|
||
function p(attrs, children) {
|
||
return element2("p", attrs, children);
|
||
}
|
||
function ul(attrs, children) {
|
||
return element2("ul", attrs, children);
|
||
}
|
||
function span(attrs, children) {
|
||
return element2("span", attrs, children);
|
||
}
|
||
function button(attrs, children) {
|
||
return element2("button", attrs, children);
|
||
}
|
||
function input(attrs) {
|
||
return element2("input", attrs, empty_list);
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre/vdom/patch.mjs
|
||
class Patch2 extends CustomType {
|
||
constructor(index4, removed, changes, children) {
|
||
super();
|
||
this.index = index4;
|
||
this.removed = removed;
|
||
this.changes = changes;
|
||
this.children = children;
|
||
}
|
||
}
|
||
class ReplaceText extends CustomType {
|
||
constructor(kind, content) {
|
||
super();
|
||
this.kind = kind;
|
||
this.content = content;
|
||
}
|
||
}
|
||
class ReplaceInnerHtml extends CustomType {
|
||
constructor(kind, inner_html) {
|
||
super();
|
||
this.kind = kind;
|
||
this.inner_html = inner_html;
|
||
}
|
||
}
|
||
class Update extends CustomType {
|
||
constructor(kind, added, removed) {
|
||
super();
|
||
this.kind = kind;
|
||
this.added = added;
|
||
this.removed = removed;
|
||
}
|
||
}
|
||
class Move extends CustomType {
|
||
constructor(kind, key, before) {
|
||
super();
|
||
this.kind = kind;
|
||
this.key = key;
|
||
this.before = before;
|
||
}
|
||
}
|
||
class Replace extends CustomType {
|
||
constructor(kind, index4, with$) {
|
||
super();
|
||
this.kind = kind;
|
||
this.index = index4;
|
||
this.with = with$;
|
||
}
|
||
}
|
||
class Remove extends CustomType {
|
||
constructor(kind, index4) {
|
||
super();
|
||
this.kind = kind;
|
||
this.index = index4;
|
||
}
|
||
}
|
||
class Insert extends CustomType {
|
||
constructor(kind, children, before) {
|
||
super();
|
||
this.kind = kind;
|
||
this.children = children;
|
||
this.before = before;
|
||
}
|
||
}
|
||
var replace_text_kind = 0;
|
||
var replace_inner_html_kind = 1;
|
||
var update_kind = 2;
|
||
var move_kind = 3;
|
||
var remove_kind = 4;
|
||
var replace_kind = 5;
|
||
var insert_kind = 6;
|
||
function new$3(index4, removed, changes, children) {
|
||
return new Patch2(index4, removed, changes, children);
|
||
}
|
||
function replace_text(content) {
|
||
return new ReplaceText(replace_text_kind, content);
|
||
}
|
||
function replace_inner_html(inner_html) {
|
||
return new ReplaceInnerHtml(replace_inner_html_kind, inner_html);
|
||
}
|
||
function update(added, removed) {
|
||
return new Update(update_kind, added, removed);
|
||
}
|
||
function move(key, before) {
|
||
return new Move(move_kind, key, before);
|
||
}
|
||
function remove2(index4) {
|
||
return new Remove(remove_kind, index4);
|
||
}
|
||
function replace2(index4, with$) {
|
||
return new Replace(replace_kind, index4, with$);
|
||
}
|
||
function insert3(children, before) {
|
||
return new Insert(insert_kind, children, before);
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre/runtime/transport.mjs
|
||
class Mount extends CustomType {
|
||
constructor(kind, open_shadow_root, will_adopt_styles, observed_attributes, observed_properties, requested_contexts, provided_contexts, vdom, memos) {
|
||
super();
|
||
this.kind = kind;
|
||
this.open_shadow_root = open_shadow_root;
|
||
this.will_adopt_styles = will_adopt_styles;
|
||
this.observed_attributes = observed_attributes;
|
||
this.observed_properties = observed_properties;
|
||
this.requested_contexts = requested_contexts;
|
||
this.provided_contexts = provided_contexts;
|
||
this.vdom = vdom;
|
||
this.memos = memos;
|
||
}
|
||
}
|
||
class Reconcile extends CustomType {
|
||
constructor(kind, patch, memos) {
|
||
super();
|
||
this.kind = kind;
|
||
this.patch = patch;
|
||
this.memos = memos;
|
||
}
|
||
}
|
||
class Emit extends CustomType {
|
||
constructor(kind, name, data2) {
|
||
super();
|
||
this.kind = kind;
|
||
this.name = name;
|
||
this.data = data2;
|
||
}
|
||
}
|
||
class Provide extends CustomType {
|
||
constructor(kind, key, value2) {
|
||
super();
|
||
this.kind = kind;
|
||
this.key = key;
|
||
this.value = value2;
|
||
}
|
||
}
|
||
class Batch extends CustomType {
|
||
constructor(kind, messages) {
|
||
super();
|
||
this.kind = kind;
|
||
this.messages = messages;
|
||
}
|
||
}
|
||
var ServerMessage$isBatch = (value2) => value2 instanceof Batch;
|
||
class AttributeChanged extends CustomType {
|
||
constructor(kind, name, value2) {
|
||
super();
|
||
this.kind = kind;
|
||
this.name = name;
|
||
this.value = value2;
|
||
}
|
||
}
|
||
var ServerMessage$isAttributeChanged = (value2) => value2 instanceof AttributeChanged;
|
||
class PropertyChanged extends CustomType {
|
||
constructor(kind, name, value2) {
|
||
super();
|
||
this.kind = kind;
|
||
this.name = name;
|
||
this.value = value2;
|
||
}
|
||
}
|
||
var ServerMessage$isPropertyChanged = (value2) => value2 instanceof PropertyChanged;
|
||
class EventFired extends CustomType {
|
||
constructor(kind, path, name, event2) {
|
||
super();
|
||
this.kind = kind;
|
||
this.path = path;
|
||
this.name = name;
|
||
this.event = event2;
|
||
}
|
||
}
|
||
var ServerMessage$isEventFired = (value2) => value2 instanceof EventFired;
|
||
class ContextProvided extends CustomType {
|
||
constructor(kind, key, value2) {
|
||
super();
|
||
this.kind = kind;
|
||
this.key = key;
|
||
this.value = value2;
|
||
}
|
||
}
|
||
var ServerMessage$isContextProvided = (value2) => value2 instanceof ContextProvided;
|
||
var mount_kind = 0;
|
||
var reconcile_kind = 1;
|
||
var emit_kind = 2;
|
||
var provide_kind = 3;
|
||
function mount(open_shadow_root, will_adopt_styles, observed_attributes, observed_properties, requested_contexts, provided_contexts, vdom, memos) {
|
||
return new Mount(mount_kind, open_shadow_root, will_adopt_styles, observed_attributes, observed_properties, requested_contexts, provided_contexts, vdom, memos);
|
||
}
|
||
function reconcile(patch, memos) {
|
||
return new Reconcile(reconcile_kind, patch, memos);
|
||
}
|
||
function emit(name, data2) {
|
||
return new Emit(emit_kind, name, data2);
|
||
}
|
||
function provide(key, value2) {
|
||
return new Provide(provide_kind, key, value2);
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre/vdom/path.mjs
|
||
class Root extends CustomType {
|
||
}
|
||
|
||
class Key extends CustomType {
|
||
constructor(key, parent) {
|
||
super();
|
||
this.key = key;
|
||
this.parent = parent;
|
||
}
|
||
}
|
||
|
||
class Index extends CustomType {
|
||
constructor(index4, parent) {
|
||
super();
|
||
this.index = index4;
|
||
this.parent = parent;
|
||
}
|
||
}
|
||
|
||
class Subtree extends CustomType {
|
||
constructor(parent) {
|
||
super();
|
||
this.parent = parent;
|
||
}
|
||
}
|
||
var root = /* @__PURE__ */ new Root;
|
||
var separator_element = "\t";
|
||
var separator_subtree = "\r";
|
||
var separator_event = `
|
||
`;
|
||
function do_matches(loop$path, loop$candidates) {
|
||
while (true) {
|
||
let path = loop$path;
|
||
let candidates = loop$candidates;
|
||
if (candidates instanceof Empty) {
|
||
return false;
|
||
} else {
|
||
let candidate = candidates.head;
|
||
let rest = candidates.tail;
|
||
let $ = starts_with(path, candidate);
|
||
if ($) {
|
||
return $;
|
||
} else {
|
||
loop$path = path;
|
||
loop$candidates = rest;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function add2(parent, index4, key) {
|
||
if (key === "") {
|
||
return new Index(index4, parent);
|
||
} else {
|
||
return new Key(key, parent);
|
||
}
|
||
}
|
||
function subtree(path) {
|
||
return new Subtree(path);
|
||
}
|
||
function finish_to_string(acc) {
|
||
if (acc instanceof Empty) {
|
||
return "";
|
||
} else {
|
||
let segments = acc.tail;
|
||
return concat2(segments);
|
||
}
|
||
}
|
||
function split_subtree_path(path) {
|
||
return split2(path, separator_subtree);
|
||
}
|
||
function do_to_string(loop$full, loop$path, loop$acc) {
|
||
while (true) {
|
||
let full = loop$full;
|
||
let path = loop$path;
|
||
let acc = loop$acc;
|
||
if (path instanceof Root) {
|
||
return finish_to_string(acc);
|
||
} else if (path instanceof Key) {
|
||
let key = path.key;
|
||
let parent = path.parent;
|
||
loop$full = full;
|
||
loop$path = parent;
|
||
loop$acc = prepend(separator_element, prepend(key, acc));
|
||
} else if (path instanceof Index) {
|
||
let index4 = path.index;
|
||
let parent = path.parent;
|
||
let acc$1 = prepend(separator_element, prepend(to_string(index4), acc));
|
||
loop$full = full;
|
||
loop$path = parent;
|
||
loop$acc = acc$1;
|
||
} else if (!full) {
|
||
return finish_to_string(acc);
|
||
} else {
|
||
let parent = path.parent;
|
||
if (acc instanceof Empty) {
|
||
loop$full = full;
|
||
loop$path = parent;
|
||
loop$acc = acc;
|
||
} else {
|
||
let acc$1 = acc.tail;
|
||
loop$full = full;
|
||
loop$path = parent;
|
||
loop$acc = prepend(separator_subtree, acc$1);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function child(path) {
|
||
return do_to_string(false, path, empty_list);
|
||
}
|
||
function to_string4(path) {
|
||
return do_to_string(true, path, empty_list);
|
||
}
|
||
function matches(path, candidates) {
|
||
if (candidates instanceof Empty) {
|
||
return false;
|
||
} else {
|
||
return do_matches(to_string4(path), candidates);
|
||
}
|
||
}
|
||
function event2(path, event3) {
|
||
return do_to_string(false, path, prepend(separator_event, prepend(event3, empty_list)));
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre/vdom/cache.mjs
|
||
class Cache extends CustomType {
|
||
constructor(events, vdoms, old_vdoms, dispatched_paths, next_dispatched_paths) {
|
||
super();
|
||
this.events = events;
|
||
this.vdoms = vdoms;
|
||
this.old_vdoms = old_vdoms;
|
||
this.dispatched_paths = dispatched_paths;
|
||
this.next_dispatched_paths = next_dispatched_paths;
|
||
}
|
||
}
|
||
|
||
class Events extends CustomType {
|
||
constructor(handlers, children) {
|
||
super();
|
||
this.handlers = handlers;
|
||
this.children = children;
|
||
}
|
||
}
|
||
|
||
class Child extends CustomType {
|
||
constructor(mapper, events) {
|
||
super();
|
||
this.mapper = mapper;
|
||
this.events = events;
|
||
}
|
||
}
|
||
|
||
class AddedChildren extends CustomType {
|
||
constructor(handlers, children, vdoms) {
|
||
super();
|
||
this.handlers = handlers;
|
||
this.children = children;
|
||
this.vdoms = vdoms;
|
||
}
|
||
}
|
||
|
||
class DecodedEvent extends CustomType {
|
||
constructor(path, handler) {
|
||
super();
|
||
this.path = path;
|
||
this.handler = handler;
|
||
}
|
||
}
|
||
|
||
class DispatchedEvent extends CustomType {
|
||
constructor(path) {
|
||
super();
|
||
this.path = path;
|
||
}
|
||
}
|
||
function compose_mapper(mapper, child_mapper) {
|
||
return (msg) => {
|
||
return mapper(child_mapper(msg));
|
||
};
|
||
}
|
||
function new_events() {
|
||
return new Events(empty2(), empty2());
|
||
}
|
||
function new$4() {
|
||
return new Cache(new_events(), empty2(), empty2(), empty_list, empty_list);
|
||
}
|
||
function tick(cache) {
|
||
return new Cache(cache.events, empty2(), cache.vdoms, cache.next_dispatched_paths, empty_list);
|
||
}
|
||
function events(cache) {
|
||
return cache.events;
|
||
}
|
||
function update_events(cache, events2) {
|
||
return new Cache(events2, cache.vdoms, cache.old_vdoms, cache.dispatched_paths, cache.next_dispatched_paths);
|
||
}
|
||
function memos(cache) {
|
||
return cache.vdoms;
|
||
}
|
||
function get_old_memo(cache, old, new$5) {
|
||
return get_or_compute(cache.old_vdoms, old, new$5);
|
||
}
|
||
function keep_memo(cache, old, new$5) {
|
||
let node = get_or_compute(cache.old_vdoms, old, new$5);
|
||
let vdoms = insert2(cache.vdoms, new$5, node);
|
||
return new Cache(cache.events, vdoms, cache.old_vdoms, cache.dispatched_paths, cache.next_dispatched_paths);
|
||
}
|
||
function add_memo(cache, new$5, node) {
|
||
let vdoms = insert2(cache.vdoms, new$5, node);
|
||
return new Cache(cache.events, vdoms, cache.old_vdoms, cache.dispatched_paths, cache.next_dispatched_paths);
|
||
}
|
||
function get_subtree(events2, path, old_mapper) {
|
||
let child2 = get_or_compute(events2.children, path, () => {
|
||
return new Child(old_mapper, new_events());
|
||
});
|
||
return child2.events;
|
||
}
|
||
function update_subtree(parent, path, mapper, events2) {
|
||
let new_child = new Child(mapper, events2);
|
||
let children = insert2(parent.children, path, new_child);
|
||
return new Events(parent.handlers, children);
|
||
}
|
||
function do_add_event(handlers, path, name, handler) {
|
||
return insert2(handlers, event2(path, name), handler);
|
||
}
|
||
function add_event(events2, path, name, handler) {
|
||
let handlers = do_add_event(events2.handlers, path, name, handler);
|
||
return new Events(handlers, events2.children);
|
||
}
|
||
function do_remove_event(handlers, path, name) {
|
||
return remove(handlers, event2(path, name));
|
||
}
|
||
function remove_event(events2, path, name) {
|
||
let handlers = do_remove_event(events2.handlers, path, name);
|
||
return new Events(handlers, events2.children);
|
||
}
|
||
function add_attributes(handlers, path, attributes) {
|
||
return fold2(attributes, handlers, (events2, attribute3) => {
|
||
if (attribute3 instanceof Event2) {
|
||
let name = attribute3.name;
|
||
let handler = attribute3.handler;
|
||
return do_add_event(events2, path, name, handler);
|
||
} else {
|
||
return events2;
|
||
}
|
||
});
|
||
}
|
||
function do_add_children(loop$handlers, loop$children, loop$vdoms, loop$parent, loop$child_index, loop$nodes) {
|
||
while (true) {
|
||
let handlers = loop$handlers;
|
||
let children = loop$children;
|
||
let vdoms = loop$vdoms;
|
||
let parent = loop$parent;
|
||
let child_index = loop$child_index;
|
||
let nodes = loop$nodes;
|
||
let next = child_index + 1;
|
||
if (nodes instanceof Empty) {
|
||
return new AddedChildren(handlers, children, vdoms);
|
||
} else {
|
||
let $ = nodes.head;
|
||
if ($ instanceof Fragment) {
|
||
let rest = nodes.tail;
|
||
let key = $.key;
|
||
let nodes$1 = $.children;
|
||
let path = add2(parent, child_index, key);
|
||
let $1 = do_add_children(handlers, children, vdoms, path, 0, nodes$1);
|
||
let handlers$1;
|
||
let children$1;
|
||
let vdoms$1;
|
||
handlers$1 = $1.handlers;
|
||
children$1 = $1.children;
|
||
vdoms$1 = $1.vdoms;
|
||
loop$handlers = handlers$1;
|
||
loop$children = children$1;
|
||
loop$vdoms = vdoms$1;
|
||
loop$parent = parent;
|
||
loop$child_index = next;
|
||
loop$nodes = rest;
|
||
} else if ($ instanceof Element) {
|
||
let rest = nodes.tail;
|
||
let key = $.key;
|
||
let attributes = $.attributes;
|
||
let nodes$1 = $.children;
|
||
let path = add2(parent, child_index, key);
|
||
let handlers$1 = add_attributes(handlers, path, attributes);
|
||
let $1 = do_add_children(handlers$1, children, vdoms, path, 0, nodes$1);
|
||
let handlers$2;
|
||
let children$1;
|
||
let vdoms$1;
|
||
handlers$2 = $1.handlers;
|
||
children$1 = $1.children;
|
||
vdoms$1 = $1.vdoms;
|
||
loop$handlers = handlers$2;
|
||
loop$children = children$1;
|
||
loop$vdoms = vdoms$1;
|
||
loop$parent = parent;
|
||
loop$child_index = next;
|
||
loop$nodes = rest;
|
||
} else if ($ instanceof Text) {
|
||
let rest = nodes.tail;
|
||
loop$handlers = handlers;
|
||
loop$children = children;
|
||
loop$vdoms = vdoms;
|
||
loop$parent = parent;
|
||
loop$child_index = next;
|
||
loop$nodes = rest;
|
||
} else if ($ instanceof UnsafeInnerHtml) {
|
||
let rest = nodes.tail;
|
||
let key = $.key;
|
||
let attributes = $.attributes;
|
||
let path = add2(parent, child_index, key);
|
||
let handlers$1 = add_attributes(handlers, path, attributes);
|
||
loop$handlers = handlers$1;
|
||
loop$children = children;
|
||
loop$vdoms = vdoms;
|
||
loop$parent = parent;
|
||
loop$child_index = next;
|
||
loop$nodes = rest;
|
||
} else if ($ instanceof Map2) {
|
||
let rest = nodes.tail;
|
||
let key = $.key;
|
||
let mapper = $.mapper;
|
||
let child2 = $.child;
|
||
let path = add2(parent, child_index, key);
|
||
let added = do_add_children(empty2(), empty2(), vdoms, subtree(path), 0, prepend(child2, empty_list));
|
||
let vdoms$1 = added.vdoms;
|
||
let child_events = new Events(added.handlers, added.children);
|
||
let child$1 = new Child(mapper, child_events);
|
||
let children$1 = insert2(children, child(path), child$1);
|
||
loop$handlers = handlers;
|
||
loop$children = children$1;
|
||
loop$vdoms = vdoms$1;
|
||
loop$parent = parent;
|
||
loop$child_index = next;
|
||
loop$nodes = rest;
|
||
} else {
|
||
let rest = nodes.tail;
|
||
let view = $.view;
|
||
let child_node = view();
|
||
let vdoms$1 = insert2(vdoms, view, child_node);
|
||
let next$1 = child_index;
|
||
let rest$1 = prepend(child_node, rest);
|
||
loop$handlers = handlers;
|
||
loop$children = children;
|
||
loop$vdoms = vdoms$1;
|
||
loop$parent = parent;
|
||
loop$child_index = next$1;
|
||
loop$nodes = rest$1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function add_children(cache, events2, path, child_index, nodes) {
|
||
let vdoms = cache.vdoms;
|
||
let handlers;
|
||
let children;
|
||
handlers = events2.handlers;
|
||
children = events2.children;
|
||
let $ = do_add_children(handlers, children, vdoms, path, child_index, nodes);
|
||
let handlers$1;
|
||
let children$1;
|
||
let vdoms$1;
|
||
handlers$1 = $.handlers;
|
||
children$1 = $.children;
|
||
vdoms$1 = $.vdoms;
|
||
return [
|
||
new Cache(cache.events, vdoms$1, cache.old_vdoms, cache.dispatched_paths, cache.next_dispatched_paths),
|
||
new Events(handlers$1, children$1)
|
||
];
|
||
}
|
||
function add_child(cache, events2, parent, index4, child2) {
|
||
let children = prepend(child2, empty_list);
|
||
return add_children(cache, events2, parent, index4, children);
|
||
}
|
||
function from_node(root2) {
|
||
let cache = new$4();
|
||
let $ = add_child(cache, cache.events, root, 0, root2);
|
||
let cache$1;
|
||
let events$1;
|
||
cache$1 = $[0];
|
||
events$1 = $[1];
|
||
return new Cache(events$1, cache$1.vdoms, cache$1.old_vdoms, cache$1.dispatched_paths, cache$1.next_dispatched_paths);
|
||
}
|
||
function remove_attributes(handlers, path, attributes) {
|
||
return fold2(attributes, handlers, (events2, attribute3) => {
|
||
if (attribute3 instanceof Event2) {
|
||
let name = attribute3.name;
|
||
return do_remove_event(events2, path, name);
|
||
} else {
|
||
return events2;
|
||
}
|
||
});
|
||
}
|
||
function do_remove_children(loop$handlers, loop$children, loop$vdoms, loop$parent, loop$index, loop$nodes) {
|
||
while (true) {
|
||
let handlers = loop$handlers;
|
||
let children = loop$children;
|
||
let vdoms = loop$vdoms;
|
||
let parent = loop$parent;
|
||
let index4 = loop$index;
|
||
let nodes = loop$nodes;
|
||
let next = index4 + 1;
|
||
if (nodes instanceof Empty) {
|
||
return new Events(handlers, children);
|
||
} else {
|
||
let $ = nodes.head;
|
||
if ($ instanceof Fragment) {
|
||
let rest = nodes.tail;
|
||
let key = $.key;
|
||
let nodes$1 = $.children;
|
||
let path = add2(parent, index4, key);
|
||
let $1 = do_remove_children(handlers, children, vdoms, path, 0, nodes$1);
|
||
let handlers$1;
|
||
let children$1;
|
||
handlers$1 = $1.handlers;
|
||
children$1 = $1.children;
|
||
loop$handlers = handlers$1;
|
||
loop$children = children$1;
|
||
loop$vdoms = vdoms;
|
||
loop$parent = parent;
|
||
loop$index = next;
|
||
loop$nodes = rest;
|
||
} else if ($ instanceof Element) {
|
||
let rest = nodes.tail;
|
||
let key = $.key;
|
||
let attributes = $.attributes;
|
||
let nodes$1 = $.children;
|
||
let path = add2(parent, index4, key);
|
||
let handlers$1 = remove_attributes(handlers, path, attributes);
|
||
let $1 = do_remove_children(handlers$1, children, vdoms, path, 0, nodes$1);
|
||
let handlers$2;
|
||
let children$1;
|
||
handlers$2 = $1.handlers;
|
||
children$1 = $1.children;
|
||
loop$handlers = handlers$2;
|
||
loop$children = children$1;
|
||
loop$vdoms = vdoms;
|
||
loop$parent = parent;
|
||
loop$index = next;
|
||
loop$nodes = rest;
|
||
} else if ($ instanceof Text) {
|
||
let rest = nodes.tail;
|
||
loop$handlers = handlers;
|
||
loop$children = children;
|
||
loop$vdoms = vdoms;
|
||
loop$parent = parent;
|
||
loop$index = next;
|
||
loop$nodes = rest;
|
||
} else if ($ instanceof UnsafeInnerHtml) {
|
||
let rest = nodes.tail;
|
||
let key = $.key;
|
||
let attributes = $.attributes;
|
||
let path = add2(parent, index4, key);
|
||
let handlers$1 = remove_attributes(handlers, path, attributes);
|
||
loop$handlers = handlers$1;
|
||
loop$children = children;
|
||
loop$vdoms = vdoms;
|
||
loop$parent = parent;
|
||
loop$index = next;
|
||
loop$nodes = rest;
|
||
} else if ($ instanceof Map2) {
|
||
let rest = nodes.tail;
|
||
let key = $.key;
|
||
let path = add2(parent, index4, key);
|
||
let children$1 = remove(children, child(path));
|
||
loop$handlers = handlers;
|
||
loop$children = children$1;
|
||
loop$vdoms = vdoms;
|
||
loop$parent = parent;
|
||
loop$index = next;
|
||
loop$nodes = rest;
|
||
} else {
|
||
let rest = nodes.tail;
|
||
let view = $.view;
|
||
let $1 = has_key(vdoms, view);
|
||
if ($1) {
|
||
let child2 = get2(vdoms, view);
|
||
let nodes$1 = prepend(child2, rest);
|
||
loop$handlers = handlers;
|
||
loop$children = children;
|
||
loop$vdoms = vdoms;
|
||
loop$parent = parent;
|
||
loop$index = index4;
|
||
loop$nodes = nodes$1;
|
||
} else {
|
||
loop$handlers = handlers;
|
||
loop$children = children;
|
||
loop$vdoms = vdoms;
|
||
loop$parent = parent;
|
||
loop$index = next;
|
||
loop$nodes = rest;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function remove_child(cache, events2, parent, child_index, child2) {
|
||
return do_remove_children(events2.handlers, events2.children, cache.old_vdoms, parent, child_index, prepend(child2, empty_list));
|
||
}
|
||
function replace_child(cache, events2, parent, child_index, prev, next) {
|
||
let events$1 = remove_child(cache, events2, parent, child_index, prev);
|
||
return add_child(cache, events$1, parent, child_index, next);
|
||
}
|
||
function dispatch(cache, event3) {
|
||
let next_dispatched_paths = prepend(event3.path, cache.next_dispatched_paths);
|
||
let cache$1 = new Cache(cache.events, cache.vdoms, cache.old_vdoms, cache.dispatched_paths, next_dispatched_paths);
|
||
if (event3 instanceof DecodedEvent) {
|
||
let handler = event3.handler;
|
||
return [cache$1, new Ok(handler)];
|
||
} else {
|
||
return [cache$1, error_nil];
|
||
}
|
||
}
|
||
function has_dispatched_events(cache, path) {
|
||
return matches(path, cache.dispatched_paths);
|
||
}
|
||
function get_handler(loop$events, loop$path, loop$mapper) {
|
||
while (true) {
|
||
let events2 = loop$events;
|
||
let path = loop$path;
|
||
let mapper = loop$mapper;
|
||
if (path instanceof Empty) {
|
||
return error_nil;
|
||
} else {
|
||
let $ = path.tail;
|
||
if ($ instanceof Empty) {
|
||
let key = path.head;
|
||
let $1 = has_key(events2.handlers, key);
|
||
if ($1) {
|
||
let handler = get2(events2.handlers, key);
|
||
return new Ok(map3(handler, (handler2) => {
|
||
return new Handler(handler2.prevent_default, handler2.stop_propagation, identity2(mapper)(handler2.message));
|
||
}));
|
||
} else {
|
||
return error_nil;
|
||
}
|
||
} else {
|
||
let key = path.head;
|
||
let path$1 = $;
|
||
let $1 = has_key(events2.children, key);
|
||
if ($1) {
|
||
let child2 = get2(events2.children, key);
|
||
let mapper$1 = compose_mapper(mapper, child2.mapper);
|
||
loop$events = child2.events;
|
||
loop$path = path$1;
|
||
loop$mapper = mapper$1;
|
||
} else {
|
||
return error_nil;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function decode2(cache, path, name, event3) {
|
||
let parts = split_subtree_path(path + separator_event + name);
|
||
let $ = get_handler(cache.events, parts, identity2);
|
||
if ($ instanceof Ok) {
|
||
let handler = $[0];
|
||
let $1 = run(event3, handler);
|
||
if ($1 instanceof Ok) {
|
||
let handler$1 = $1[0];
|
||
return new DecodedEvent(path, handler$1);
|
||
} else {
|
||
return new DispatchedEvent(path);
|
||
}
|
||
} else {
|
||
return new DispatchedEvent(path);
|
||
}
|
||
}
|
||
function handle(cache, path, name, event3) {
|
||
let _pipe = decode2(cache, path, name, event3);
|
||
return ((_capture) => {
|
||
return dispatch(cache, _capture);
|
||
})(_pipe);
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre/runtime/server/runtime.mjs
|
||
class ClientDispatchedMessage extends CustomType {
|
||
constructor(message) {
|
||
super();
|
||
this.message = message;
|
||
}
|
||
}
|
||
var Message$isClientDispatchedMessage = (value2) => value2 instanceof ClientDispatchedMessage;
|
||
class ClientRegisteredCallback extends CustomType {
|
||
constructor(callback) {
|
||
super();
|
||
this.callback = callback;
|
||
}
|
||
}
|
||
var Message$isClientRegisteredCallback = (value2) => value2 instanceof ClientRegisteredCallback;
|
||
class ClientDeregisteredCallback extends CustomType {
|
||
constructor(callback) {
|
||
super();
|
||
this.callback = callback;
|
||
}
|
||
}
|
||
var Message$isClientDeregisteredCallback = (value2) => value2 instanceof ClientDeregisteredCallback;
|
||
class EffectDispatchedMessage extends CustomType {
|
||
constructor(message) {
|
||
super();
|
||
this.message = message;
|
||
}
|
||
}
|
||
var Message$EffectDispatchedMessage = (message) => new EffectDispatchedMessage(message);
|
||
var Message$isEffectDispatchedMessage = (value2) => value2 instanceof EffectDispatchedMessage;
|
||
class EffectEmitEvent extends CustomType {
|
||
constructor(name, data2) {
|
||
super();
|
||
this.name = name;
|
||
this.data = data2;
|
||
}
|
||
}
|
||
var Message$EffectEmitEvent = (name, data2) => new EffectEmitEvent(name, data2);
|
||
var Message$isEffectEmitEvent = (value2) => value2 instanceof EffectEmitEvent;
|
||
class EffectProvidedValue extends CustomType {
|
||
constructor(key, value2) {
|
||
super();
|
||
this.key = key;
|
||
this.value = value2;
|
||
}
|
||
}
|
||
var Message$EffectProvidedValue = (key, value2) => new EffectProvidedValue(key, value2);
|
||
var Message$isEffectProvidedValue = (value2) => value2 instanceof EffectProvidedValue;
|
||
class SystemRequestedShutdown extends CustomType {
|
||
}
|
||
var Message$isSystemRequestedShutdown = (value2) => value2 instanceof SystemRequestedShutdown;
|
||
|
||
// build/dev/javascript/lustre/lustre/runtime/app.mjs
|
||
class App extends CustomType {
|
||
constructor(name, init, update2, view, config2) {
|
||
super();
|
||
this.name = name;
|
||
this.init = init;
|
||
this.update = update2;
|
||
this.view = view;
|
||
this.config = config2;
|
||
}
|
||
}
|
||
class Config2 extends CustomType {
|
||
constructor(open_shadow_root, adopt_styles, delegates_focus, attributes, properties, contexts, is_form_associated, on_form_autofill, on_form_reset, on_form_restore, on_connect, on_adopt, on_disconnect) {
|
||
super();
|
||
this.open_shadow_root = open_shadow_root;
|
||
this.adopt_styles = adopt_styles;
|
||
this.delegates_focus = delegates_focus;
|
||
this.attributes = attributes;
|
||
this.properties = properties;
|
||
this.contexts = contexts;
|
||
this.is_form_associated = is_form_associated;
|
||
this.on_form_autofill = on_form_autofill;
|
||
this.on_form_reset = on_form_reset;
|
||
this.on_form_restore = on_form_restore;
|
||
this.on_connect = on_connect;
|
||
this.on_adopt = on_adopt;
|
||
this.on_disconnect = on_disconnect;
|
||
}
|
||
}
|
||
var default_config = /* @__PURE__ */ new Config2(true, true, false, empty_list, empty_list, empty_list, false, /* @__PURE__ */ new None, /* @__PURE__ */ new None, /* @__PURE__ */ new None, /* @__PURE__ */ new None, /* @__PURE__ */ new None, /* @__PURE__ */ new None);
|
||
|
||
// build/dev/javascript/lustre/lustre/internals/equals.ffi.mjs
|
||
var isEqual2 = (a, b) => {
|
||
if (a === b) {
|
||
return true;
|
||
}
|
||
if (a == null || b == null) {
|
||
return false;
|
||
}
|
||
const type = typeof a;
|
||
if (type !== typeof b) {
|
||
return false;
|
||
}
|
||
if (type !== "object") {
|
||
return false;
|
||
}
|
||
const ctor = a.constructor;
|
||
if (ctor !== b.constructor) {
|
||
return false;
|
||
}
|
||
if (Array.isArray(a)) {
|
||
return areArraysEqual(a, b);
|
||
}
|
||
return areObjectsEqual(a, b);
|
||
};
|
||
var areArraysEqual = (a, b) => {
|
||
let index4 = a.length;
|
||
if (index4 !== b.length) {
|
||
return false;
|
||
}
|
||
while (index4--) {
|
||
if (!isEqual2(a[index4], b[index4])) {
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
};
|
||
var areObjectsEqual = (a, b) => {
|
||
const properties = Object.keys(a);
|
||
let index4 = properties.length;
|
||
if (Object.keys(b).length !== index4) {
|
||
return false;
|
||
}
|
||
while (index4--) {
|
||
const property3 = properties[index4];
|
||
if (!Object.hasOwn(b, property3)) {
|
||
return false;
|
||
}
|
||
if (!isEqual2(a[property3], b[property3])) {
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
};
|
||
|
||
// build/dev/javascript/lustre/lustre/vdom/diff.mjs
|
||
class Diff extends CustomType {
|
||
constructor(patch, cache) {
|
||
super();
|
||
this.patch = patch;
|
||
this.cache = cache;
|
||
}
|
||
}
|
||
class PartialDiff extends CustomType {
|
||
constructor(patch, cache, events2) {
|
||
super();
|
||
this.patch = patch;
|
||
this.cache = cache;
|
||
this.events = events2;
|
||
}
|
||
}
|
||
|
||
class AttributeChange extends CustomType {
|
||
constructor(added, removed, events2) {
|
||
super();
|
||
this.added = added;
|
||
this.removed = removed;
|
||
this.events = events2;
|
||
}
|
||
}
|
||
function is_controlled(cache, namespace, tag, path) {
|
||
if (tag === "input" && namespace === "") {
|
||
return has_dispatched_events(cache, path);
|
||
} else if (tag === "select" && namespace === "") {
|
||
return has_dispatched_events(cache, path);
|
||
} else if (tag === "textarea" && namespace === "") {
|
||
return has_dispatched_events(cache, path);
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
function diff_attributes(loop$controlled, loop$path, loop$events, loop$old, loop$new, loop$added, loop$removed) {
|
||
while (true) {
|
||
let controlled = loop$controlled;
|
||
let path = loop$path;
|
||
let events2 = loop$events;
|
||
let old = loop$old;
|
||
let new$5 = loop$new;
|
||
let added = loop$added;
|
||
let removed = loop$removed;
|
||
if (old instanceof Empty) {
|
||
if (new$5 instanceof Empty) {
|
||
return new AttributeChange(added, removed, events2);
|
||
} else {
|
||
let $ = new$5.head;
|
||
if ($ instanceof Event2) {
|
||
let next = $;
|
||
let new$1 = new$5.tail;
|
||
let name = $.name;
|
||
let handler = $.handler;
|
||
let events$1 = add_event(events2, path, name, handler);
|
||
let added$1 = prepend(next, added);
|
||
loop$controlled = controlled;
|
||
loop$path = path;
|
||
loop$events = events$1;
|
||
loop$old = old;
|
||
loop$new = new$1;
|
||
loop$added = added$1;
|
||
loop$removed = removed;
|
||
} else {
|
||
let next = $;
|
||
let new$1 = new$5.tail;
|
||
let added$1 = prepend(next, added);
|
||
loop$controlled = controlled;
|
||
loop$path = path;
|
||
loop$events = events2;
|
||
loop$old = old;
|
||
loop$new = new$1;
|
||
loop$added = added$1;
|
||
loop$removed = removed;
|
||
}
|
||
}
|
||
} else if (new$5 instanceof Empty) {
|
||
let $ = old.head;
|
||
if ($ instanceof Event2) {
|
||
let prev = $;
|
||
let old$1 = old.tail;
|
||
let name = $.name;
|
||
let events$1 = remove_event(events2, path, name);
|
||
let removed$1 = prepend(prev, removed);
|
||
loop$controlled = controlled;
|
||
loop$path = path;
|
||
loop$events = events$1;
|
||
loop$old = old$1;
|
||
loop$new = new$5;
|
||
loop$added = added;
|
||
loop$removed = removed$1;
|
||
} else {
|
||
let prev = $;
|
||
let old$1 = old.tail;
|
||
let removed$1 = prepend(prev, removed);
|
||
loop$controlled = controlled;
|
||
loop$path = path;
|
||
loop$events = events2;
|
||
loop$old = old$1;
|
||
loop$new = new$5;
|
||
loop$added = added;
|
||
loop$removed = removed$1;
|
||
}
|
||
} else {
|
||
let prev = old.head;
|
||
let remaining_old = old.tail;
|
||
let next = new$5.head;
|
||
let remaining_new = new$5.tail;
|
||
let $ = compare3(prev, next);
|
||
if ($ instanceof Lt) {
|
||
if (prev instanceof Event2) {
|
||
let name = prev.name;
|
||
loop$controlled = controlled;
|
||
loop$path = path;
|
||
loop$events = remove_event(events2, path, name);
|
||
loop$old = remaining_old;
|
||
loop$new = new$5;
|
||
loop$added = added;
|
||
loop$removed = prepend(prev, removed);
|
||
} else {
|
||
loop$controlled = controlled;
|
||
loop$path = path;
|
||
loop$events = events2;
|
||
loop$old = remaining_old;
|
||
loop$new = new$5;
|
||
loop$added = added;
|
||
loop$removed = prepend(prev, removed);
|
||
}
|
||
} else if ($ instanceof Eq) {
|
||
if (prev instanceof Attribute) {
|
||
if (next instanceof Attribute) {
|
||
let _block;
|
||
let $1 = next.name;
|
||
if ($1 === "value") {
|
||
_block = controlled || prev.value !== next.value;
|
||
} else if ($1 === "checked") {
|
||
_block = controlled || prev.value !== next.value;
|
||
} else if ($1 === "selected") {
|
||
_block = controlled || prev.value !== next.value;
|
||
} else {
|
||
_block = prev.value !== next.value;
|
||
}
|
||
let has_changes = _block;
|
||
let _block$1;
|
||
if (has_changes) {
|
||
_block$1 = prepend(next, added);
|
||
} else {
|
||
_block$1 = added;
|
||
}
|
||
let added$1 = _block$1;
|
||
loop$controlled = controlled;
|
||
loop$path = path;
|
||
loop$events = events2;
|
||
loop$old = remaining_old;
|
||
loop$new = remaining_new;
|
||
loop$added = added$1;
|
||
loop$removed = removed;
|
||
} else if (next instanceof Event2) {
|
||
let name = next.name;
|
||
let handler = next.handler;
|
||
loop$controlled = controlled;
|
||
loop$path = path;
|
||
loop$events = add_event(events2, path, name, handler);
|
||
loop$old = remaining_old;
|
||
loop$new = remaining_new;
|
||
loop$added = prepend(next, added);
|
||
loop$removed = prepend(prev, removed);
|
||
} else {
|
||
loop$controlled = controlled;
|
||
loop$path = path;
|
||
loop$events = events2;
|
||
loop$old = remaining_old;
|
||
loop$new = remaining_new;
|
||
loop$added = prepend(next, added);
|
||
loop$removed = prepend(prev, removed);
|
||
}
|
||
} else if (prev instanceof Property) {
|
||
if (next instanceof Property) {
|
||
let _block;
|
||
let $1 = next.name;
|
||
if ($1 === "scrollLeft") {
|
||
_block = true;
|
||
} else if ($1 === "scrollRight") {
|
||
_block = true;
|
||
} else if ($1 === "value") {
|
||
_block = controlled || !isEqual2(prev.value, next.value);
|
||
} else if ($1 === "checked") {
|
||
_block = controlled || !isEqual2(prev.value, next.value);
|
||
} else if ($1 === "selected") {
|
||
_block = controlled || !isEqual2(prev.value, next.value);
|
||
} else {
|
||
_block = !isEqual2(prev.value, next.value);
|
||
}
|
||
let has_changes = _block;
|
||
let _block$1;
|
||
if (has_changes) {
|
||
_block$1 = prepend(next, added);
|
||
} else {
|
||
_block$1 = added;
|
||
}
|
||
let added$1 = _block$1;
|
||
loop$controlled = controlled;
|
||
loop$path = path;
|
||
loop$events = events2;
|
||
loop$old = remaining_old;
|
||
loop$new = remaining_new;
|
||
loop$added = added$1;
|
||
loop$removed = removed;
|
||
} else if (next instanceof Event2) {
|
||
let name = next.name;
|
||
let handler = next.handler;
|
||
loop$controlled = controlled;
|
||
loop$path = path;
|
||
loop$events = add_event(events2, path, name, handler);
|
||
loop$old = remaining_old;
|
||
loop$new = remaining_new;
|
||
loop$added = prepend(next, added);
|
||
loop$removed = prepend(prev, removed);
|
||
} else {
|
||
loop$controlled = controlled;
|
||
loop$path = path;
|
||
loop$events = events2;
|
||
loop$old = remaining_old;
|
||
loop$new = remaining_new;
|
||
loop$added = prepend(next, added);
|
||
loop$removed = prepend(prev, removed);
|
||
}
|
||
} else if (next instanceof Event2) {
|
||
let name = next.name;
|
||
let handler = next.handler;
|
||
let has_changes = prev.prevent_default.kind !== next.prevent_default.kind || prev.stop_propagation.kind !== next.stop_propagation.kind || prev.debounce !== next.debounce || prev.throttle !== next.throttle;
|
||
let _block;
|
||
if (has_changes) {
|
||
_block = prepend(next, added);
|
||
} else {
|
||
_block = added;
|
||
}
|
||
let added$1 = _block;
|
||
loop$controlled = controlled;
|
||
loop$path = path;
|
||
loop$events = add_event(events2, path, name, handler);
|
||
loop$old = remaining_old;
|
||
loop$new = remaining_new;
|
||
loop$added = added$1;
|
||
loop$removed = removed;
|
||
} else {
|
||
let name = prev.name;
|
||
loop$controlled = controlled;
|
||
loop$path = path;
|
||
loop$events = remove_event(events2, path, name);
|
||
loop$old = remaining_old;
|
||
loop$new = remaining_new;
|
||
loop$added = prepend(next, added);
|
||
loop$removed = prepend(prev, removed);
|
||
}
|
||
} else if (next instanceof Event2) {
|
||
let name = next.name;
|
||
let handler = next.handler;
|
||
loop$controlled = controlled;
|
||
loop$path = path;
|
||
loop$events = add_event(events2, path, name, handler);
|
||
loop$old = old;
|
||
loop$new = remaining_new;
|
||
loop$added = prepend(next, added);
|
||
loop$removed = removed;
|
||
} else {
|
||
loop$controlled = controlled;
|
||
loop$path = path;
|
||
loop$events = events2;
|
||
loop$old = old;
|
||
loop$new = remaining_new;
|
||
loop$added = prepend(next, added);
|
||
loop$removed = removed;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function do_diff(loop$old, loop$old_keyed, loop$new, loop$new_keyed, loop$moved, loop$moved_offset, loop$removed, loop$node_index, loop$patch_index, loop$changes, loop$children, loop$path, loop$cache, loop$events) {
|
||
while (true) {
|
||
let old = loop$old;
|
||
let old_keyed = loop$old_keyed;
|
||
let new$5 = loop$new;
|
||
let new_keyed = loop$new_keyed;
|
||
let moved = loop$moved;
|
||
let moved_offset = loop$moved_offset;
|
||
let removed = loop$removed;
|
||
let node_index = loop$node_index;
|
||
let patch_index = loop$patch_index;
|
||
let changes = loop$changes;
|
||
let children = loop$children;
|
||
let path = loop$path;
|
||
let cache = loop$cache;
|
||
let events2 = loop$events;
|
||
if (old instanceof Empty) {
|
||
if (new$5 instanceof Empty) {
|
||
let patch = new Patch2(patch_index, removed, changes, children);
|
||
return new PartialDiff(patch, cache, events2);
|
||
} else {
|
||
let $ = add_children(cache, events2, path, node_index, new$5);
|
||
let cache$1;
|
||
let events$1;
|
||
cache$1 = $[0];
|
||
events$1 = $[1];
|
||
let insert4 = insert3(new$5, node_index - moved_offset);
|
||
let changes$1 = prepend(insert4, changes);
|
||
let patch = new Patch2(patch_index, removed, changes$1, children);
|
||
return new PartialDiff(patch, cache$1, events$1);
|
||
}
|
||
} else if (new$5 instanceof Empty) {
|
||
let prev = old.head;
|
||
let old$1 = old.tail;
|
||
let _block;
|
||
let $ = prev.key === "" || !has_key(moved, prev.key);
|
||
if ($) {
|
||
_block = removed + 1;
|
||
} else {
|
||
_block = removed;
|
||
}
|
||
let removed$1 = _block;
|
||
let events$1 = remove_child(cache, events2, path, node_index, prev);
|
||
loop$old = old$1;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new$5;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset;
|
||
loop$removed = removed$1;
|
||
loop$node_index = node_index;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = changes;
|
||
loop$children = children;
|
||
loop$path = path;
|
||
loop$cache = cache;
|
||
loop$events = events$1;
|
||
} else {
|
||
let prev = old.head;
|
||
let next = new$5.head;
|
||
if (prev.key !== next.key) {
|
||
let old_remaining = old.tail;
|
||
let new_remaining = new$5.tail;
|
||
let next_did_exist = has_key(old_keyed, next.key);
|
||
let prev_does_exist = has_key(new_keyed, prev.key);
|
||
if (prev_does_exist) {
|
||
if (next_did_exist) {
|
||
let $ = has_key(moved, prev.key);
|
||
if ($) {
|
||
loop$old = old_remaining;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new$5;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset - 1;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = changes;
|
||
loop$children = children;
|
||
loop$path = path;
|
||
loop$cache = cache;
|
||
loop$events = events2;
|
||
} else {
|
||
let match = get2(old_keyed, next.key);
|
||
let before = node_index - moved_offset;
|
||
let changes$1 = prepend(move(next.key, before), changes);
|
||
let moved$1 = insert2(moved, next.key, undefined);
|
||
loop$old = prepend(match, old);
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new$5;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved$1;
|
||
loop$moved_offset = moved_offset + 1;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = changes$1;
|
||
loop$children = children;
|
||
loop$path = path;
|
||
loop$cache = cache;
|
||
loop$events = events2;
|
||
}
|
||
} else {
|
||
let before = node_index - moved_offset;
|
||
let $ = add_child(cache, events2, path, node_index, next);
|
||
let cache$1;
|
||
let events$1;
|
||
cache$1 = $[0];
|
||
events$1 = $[1];
|
||
let insert4 = insert3(toList([next]), before);
|
||
let changes$1 = prepend(insert4, changes);
|
||
loop$old = old;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new_remaining;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset + 1;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index + 1;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = changes$1;
|
||
loop$children = children;
|
||
loop$path = path;
|
||
loop$cache = cache$1;
|
||
loop$events = events$1;
|
||
}
|
||
} else if (next_did_exist) {
|
||
let index4 = node_index - moved_offset;
|
||
let changes$1 = prepend(remove2(index4), changes);
|
||
let events$1 = remove_child(cache, events2, path, node_index, prev);
|
||
loop$old = old_remaining;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new$5;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset - 1;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = changes$1;
|
||
loop$children = children;
|
||
loop$path = path;
|
||
loop$cache = cache;
|
||
loop$events = events$1;
|
||
} else {
|
||
let change = replace2(node_index - moved_offset, next);
|
||
let $ = replace_child(cache, events2, path, node_index, prev, next);
|
||
let cache$1;
|
||
let events$1;
|
||
cache$1 = $[0];
|
||
events$1 = $[1];
|
||
loop$old = old_remaining;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new_remaining;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index + 1;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = prepend(change, changes);
|
||
loop$children = children;
|
||
loop$path = path;
|
||
loop$cache = cache$1;
|
||
loop$events = events$1;
|
||
}
|
||
} else {
|
||
let $ = old.head;
|
||
if ($ instanceof Fragment) {
|
||
let $1 = new$5.head;
|
||
if ($1 instanceof Fragment) {
|
||
let prev2 = $;
|
||
let old$1 = old.tail;
|
||
let next2 = $1;
|
||
let new$1 = new$5.tail;
|
||
let $2 = do_diff(prev2.children, prev2.keyed_children, next2.children, next2.keyed_children, empty2(), 0, 0, 0, node_index, empty_list, empty_list, add2(path, node_index, next2.key), cache, events2);
|
||
let patch;
|
||
let cache$1;
|
||
let events$1;
|
||
patch = $2.patch;
|
||
cache$1 = $2.cache;
|
||
events$1 = $2.events;
|
||
let _block;
|
||
let $3 = patch.changes;
|
||
if ($3 instanceof Empty) {
|
||
let $4 = patch.children;
|
||
if ($4 instanceof Empty) {
|
||
let $5 = patch.removed;
|
||
if ($5 === 0) {
|
||
_block = children;
|
||
} else {
|
||
_block = prepend(patch, children);
|
||
}
|
||
} else {
|
||
_block = prepend(patch, children);
|
||
}
|
||
} else {
|
||
_block = prepend(patch, children);
|
||
}
|
||
let children$1 = _block;
|
||
loop$old = old$1;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new$1;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index + 1;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = changes;
|
||
loop$children = children$1;
|
||
loop$path = path;
|
||
loop$cache = cache$1;
|
||
loop$events = events$1;
|
||
} else {
|
||
let prev2 = $;
|
||
let old_remaining = old.tail;
|
||
let next2 = $1;
|
||
let new_remaining = new$5.tail;
|
||
let change = replace2(node_index - moved_offset, next2);
|
||
let $2 = replace_child(cache, events2, path, node_index, prev2, next2);
|
||
let cache$1;
|
||
let events$1;
|
||
cache$1 = $2[0];
|
||
events$1 = $2[1];
|
||
loop$old = old_remaining;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new_remaining;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index + 1;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = prepend(change, changes);
|
||
loop$children = children;
|
||
loop$path = path;
|
||
loop$cache = cache$1;
|
||
loop$events = events$1;
|
||
}
|
||
} else if ($ instanceof Element) {
|
||
let $1 = new$5.head;
|
||
if ($1 instanceof Element) {
|
||
let prev2 = $;
|
||
let next2 = $1;
|
||
if (prev2.namespace === next2.namespace && prev2.tag === next2.tag) {
|
||
let old$1 = old.tail;
|
||
let new$1 = new$5.tail;
|
||
let child_path = add2(path, node_index, next2.key);
|
||
let controlled = is_controlled(cache, next2.namespace, next2.tag, child_path);
|
||
let $2 = diff_attributes(controlled, child_path, events2, prev2.attributes, next2.attributes, empty_list, empty_list);
|
||
let added_attrs;
|
||
let removed_attrs;
|
||
let events$1;
|
||
added_attrs = $2.added;
|
||
removed_attrs = $2.removed;
|
||
events$1 = $2.events;
|
||
let _block;
|
||
if (added_attrs instanceof Empty && removed_attrs instanceof Empty) {
|
||
_block = empty_list;
|
||
} else {
|
||
_block = toList([update(added_attrs, removed_attrs)]);
|
||
}
|
||
let initial_child_changes = _block;
|
||
let $3 = do_diff(prev2.children, prev2.keyed_children, next2.children, next2.keyed_children, empty2(), 0, 0, 0, node_index, initial_child_changes, empty_list, child_path, cache, events$1);
|
||
let patch;
|
||
let cache$1;
|
||
let events$2;
|
||
patch = $3.patch;
|
||
cache$1 = $3.cache;
|
||
events$2 = $3.events;
|
||
let _block$1;
|
||
let $4 = patch.changes;
|
||
if ($4 instanceof Empty) {
|
||
let $5 = patch.children;
|
||
if ($5 instanceof Empty) {
|
||
let $6 = patch.removed;
|
||
if ($6 === 0) {
|
||
_block$1 = children;
|
||
} else {
|
||
_block$1 = prepend(patch, children);
|
||
}
|
||
} else {
|
||
_block$1 = prepend(patch, children);
|
||
}
|
||
} else {
|
||
_block$1 = prepend(patch, children);
|
||
}
|
||
let children$1 = _block$1;
|
||
loop$old = old$1;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new$1;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index + 1;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = changes;
|
||
loop$children = children$1;
|
||
loop$path = path;
|
||
loop$cache = cache$1;
|
||
loop$events = events$2;
|
||
} else {
|
||
let prev3 = $;
|
||
let old_remaining = old.tail;
|
||
let next3 = $1;
|
||
let new_remaining = new$5.tail;
|
||
let change = replace2(node_index - moved_offset, next3);
|
||
let $2 = replace_child(cache, events2, path, node_index, prev3, next3);
|
||
let cache$1;
|
||
let events$1;
|
||
cache$1 = $2[0];
|
||
events$1 = $2[1];
|
||
loop$old = old_remaining;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new_remaining;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index + 1;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = prepend(change, changes);
|
||
loop$children = children;
|
||
loop$path = path;
|
||
loop$cache = cache$1;
|
||
loop$events = events$1;
|
||
}
|
||
} else {
|
||
let prev2 = $;
|
||
let old_remaining = old.tail;
|
||
let next2 = $1;
|
||
let new_remaining = new$5.tail;
|
||
let change = replace2(node_index - moved_offset, next2);
|
||
let $2 = replace_child(cache, events2, path, node_index, prev2, next2);
|
||
let cache$1;
|
||
let events$1;
|
||
cache$1 = $2[0];
|
||
events$1 = $2[1];
|
||
loop$old = old_remaining;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new_remaining;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index + 1;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = prepend(change, changes);
|
||
loop$children = children;
|
||
loop$path = path;
|
||
loop$cache = cache$1;
|
||
loop$events = events$1;
|
||
}
|
||
} else if ($ instanceof Text) {
|
||
let $1 = new$5.head;
|
||
if ($1 instanceof Text) {
|
||
let prev2 = $;
|
||
let next2 = $1;
|
||
if (prev2.content === next2.content) {
|
||
let old$1 = old.tail;
|
||
let new$1 = new$5.tail;
|
||
loop$old = old$1;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new$1;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index + 1;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = changes;
|
||
loop$children = children;
|
||
loop$path = path;
|
||
loop$cache = cache;
|
||
loop$events = events2;
|
||
} else {
|
||
let old$1 = old.tail;
|
||
let next3 = $1;
|
||
let new$1 = new$5.tail;
|
||
let child2 = new$3(node_index, 0, toList([replace_text(next3.content)]), empty_list);
|
||
loop$old = old$1;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new$1;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index + 1;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = changes;
|
||
loop$children = prepend(child2, children);
|
||
loop$path = path;
|
||
loop$cache = cache;
|
||
loop$events = events2;
|
||
}
|
||
} else {
|
||
let prev2 = $;
|
||
let old_remaining = old.tail;
|
||
let next2 = $1;
|
||
let new_remaining = new$5.tail;
|
||
let change = replace2(node_index - moved_offset, next2);
|
||
let $2 = replace_child(cache, events2, path, node_index, prev2, next2);
|
||
let cache$1;
|
||
let events$1;
|
||
cache$1 = $2[0];
|
||
events$1 = $2[1];
|
||
loop$old = old_remaining;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new_remaining;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index + 1;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = prepend(change, changes);
|
||
loop$children = children;
|
||
loop$path = path;
|
||
loop$cache = cache$1;
|
||
loop$events = events$1;
|
||
}
|
||
} else if ($ instanceof UnsafeInnerHtml) {
|
||
let $1 = new$5.head;
|
||
if ($1 instanceof UnsafeInnerHtml) {
|
||
let prev2 = $;
|
||
let old$1 = old.tail;
|
||
let next2 = $1;
|
||
let new$1 = new$5.tail;
|
||
let child_path = add2(path, node_index, next2.key);
|
||
let $2 = diff_attributes(false, child_path, events2, prev2.attributes, next2.attributes, empty_list, empty_list);
|
||
let added_attrs;
|
||
let removed_attrs;
|
||
let events$1;
|
||
added_attrs = $2.added;
|
||
removed_attrs = $2.removed;
|
||
events$1 = $2.events;
|
||
let _block;
|
||
if (added_attrs instanceof Empty && removed_attrs instanceof Empty) {
|
||
_block = empty_list;
|
||
} else {
|
||
_block = toList([update(added_attrs, removed_attrs)]);
|
||
}
|
||
let child_changes = _block;
|
||
let _block$1;
|
||
let $3 = prev2.inner_html === next2.inner_html;
|
||
if ($3) {
|
||
_block$1 = child_changes;
|
||
} else {
|
||
_block$1 = prepend(replace_inner_html(next2.inner_html), child_changes);
|
||
}
|
||
let child_changes$1 = _block$1;
|
||
let _block$2;
|
||
if (child_changes$1 instanceof Empty) {
|
||
_block$2 = children;
|
||
} else {
|
||
_block$2 = prepend(new$3(node_index, 0, child_changes$1, toList([])), children);
|
||
}
|
||
let children$1 = _block$2;
|
||
loop$old = old$1;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new$1;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index + 1;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = changes;
|
||
loop$children = children$1;
|
||
loop$path = path;
|
||
loop$cache = cache;
|
||
loop$events = events$1;
|
||
} else {
|
||
let prev2 = $;
|
||
let old_remaining = old.tail;
|
||
let next2 = $1;
|
||
let new_remaining = new$5.tail;
|
||
let change = replace2(node_index - moved_offset, next2);
|
||
let $2 = replace_child(cache, events2, path, node_index, prev2, next2);
|
||
let cache$1;
|
||
let events$1;
|
||
cache$1 = $2[0];
|
||
events$1 = $2[1];
|
||
loop$old = old_remaining;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new_remaining;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index + 1;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = prepend(change, changes);
|
||
loop$children = children;
|
||
loop$path = path;
|
||
loop$cache = cache$1;
|
||
loop$events = events$1;
|
||
}
|
||
} else if ($ instanceof Map2) {
|
||
let $1 = new$5.head;
|
||
if ($1 instanceof Map2) {
|
||
let prev2 = $;
|
||
let old$1 = old.tail;
|
||
let next2 = $1;
|
||
let new$1 = new$5.tail;
|
||
let child_path = add2(path, node_index, next2.key);
|
||
let child_key = child(child_path);
|
||
let $2 = do_diff(prepend(prev2.child, empty_list), empty2(), prepend(next2.child, empty_list), empty2(), empty2(), 0, 0, 0, node_index, empty_list, empty_list, subtree(child_path), cache, get_subtree(events2, child_key, prev2.mapper));
|
||
let patch;
|
||
let cache$1;
|
||
let child_events;
|
||
patch = $2.patch;
|
||
cache$1 = $2.cache;
|
||
child_events = $2.events;
|
||
let events$1 = update_subtree(events2, child_key, next2.mapper, child_events);
|
||
let _block;
|
||
let $3 = patch.changes;
|
||
if ($3 instanceof Empty) {
|
||
let $4 = patch.children;
|
||
if ($4 instanceof Empty) {
|
||
let $5 = patch.removed;
|
||
if ($5 === 0) {
|
||
_block = children;
|
||
} else {
|
||
_block = prepend(patch, children);
|
||
}
|
||
} else {
|
||
_block = prepend(patch, children);
|
||
}
|
||
} else {
|
||
_block = prepend(patch, children);
|
||
}
|
||
let children$1 = _block;
|
||
loop$old = old$1;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new$1;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index + 1;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = changes;
|
||
loop$children = children$1;
|
||
loop$path = path;
|
||
loop$cache = cache$1;
|
||
loop$events = events$1;
|
||
} else {
|
||
let prev2 = $;
|
||
let old_remaining = old.tail;
|
||
let next2 = $1;
|
||
let new_remaining = new$5.tail;
|
||
let change = replace2(node_index - moved_offset, next2);
|
||
let $2 = replace_child(cache, events2, path, node_index, prev2, next2);
|
||
let cache$1;
|
||
let events$1;
|
||
cache$1 = $2[0];
|
||
events$1 = $2[1];
|
||
loop$old = old_remaining;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new_remaining;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index + 1;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = prepend(change, changes);
|
||
loop$children = children;
|
||
loop$path = path;
|
||
loop$cache = cache$1;
|
||
loop$events = events$1;
|
||
}
|
||
} else {
|
||
let $1 = new$5.head;
|
||
if ($1 instanceof Memo) {
|
||
let prev2 = $;
|
||
let old$1 = old.tail;
|
||
let next2 = $1;
|
||
let new$1 = new$5.tail;
|
||
let $2 = equal_lists(prev2.dependencies, next2.dependencies);
|
||
if ($2) {
|
||
let cache$1 = keep_memo(cache, prev2.view, next2.view);
|
||
loop$old = old$1;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new$1;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index + 1;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = changes;
|
||
loop$children = children;
|
||
loop$path = path;
|
||
loop$cache = cache$1;
|
||
loop$events = events2;
|
||
} else {
|
||
let prev_node = get_old_memo(cache, prev2.view, prev2.view);
|
||
let next_node = next2.view();
|
||
let cache$1 = add_memo(cache, next2.view, next_node);
|
||
loop$old = prepend(prev_node, old$1);
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = prepend(next_node, new$1);
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = changes;
|
||
loop$children = children;
|
||
loop$path = path;
|
||
loop$cache = cache$1;
|
||
loop$events = events2;
|
||
}
|
||
} else {
|
||
let prev2 = $;
|
||
let old_remaining = old.tail;
|
||
let next2 = $1;
|
||
let new_remaining = new$5.tail;
|
||
let change = replace2(node_index - moved_offset, next2);
|
||
let $2 = replace_child(cache, events2, path, node_index, prev2, next2);
|
||
let cache$1;
|
||
let events$1;
|
||
cache$1 = $2[0];
|
||
events$1 = $2[1];
|
||
loop$old = old_remaining;
|
||
loop$old_keyed = old_keyed;
|
||
loop$new = new_remaining;
|
||
loop$new_keyed = new_keyed;
|
||
loop$moved = moved;
|
||
loop$moved_offset = moved_offset;
|
||
loop$removed = removed;
|
||
loop$node_index = node_index + 1;
|
||
loop$patch_index = patch_index;
|
||
loop$changes = prepend(change, changes);
|
||
loop$children = children;
|
||
loop$path = path;
|
||
loop$cache = cache$1;
|
||
loop$events = events$1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function diff(cache, old, new$5) {
|
||
let cache$1 = tick(cache);
|
||
let $ = do_diff(prepend(old, empty_list), empty2(), prepend(new$5, empty_list), empty2(), empty2(), 0, 0, 0, 0, empty_list, empty_list, root, cache$1, events(cache$1));
|
||
let patch;
|
||
let cache$2;
|
||
let events2;
|
||
patch = $.patch;
|
||
cache$2 = $.cache;
|
||
events2 = $.events;
|
||
return new Diff(patch, update_events(cache$2, events2));
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre/internals/list.ffi.mjs
|
||
var toList2 = (arr) => arr.reduceRight((xs, x) => List$NonEmpty(x, xs), empty_list);
|
||
var iterate = (list4, callback) => {
|
||
if (Array.isArray(list4)) {
|
||
for (let i = 0;i < list4.length; i++) {
|
||
callback(list4[i]);
|
||
}
|
||
} else if (list4) {
|
||
for (list4;List$NonEmpty$rest(list4); list4 = List$NonEmpty$rest(list4)) {
|
||
callback(List$NonEmpty$first(list4));
|
||
}
|
||
}
|
||
};
|
||
var append4 = (a, b) => {
|
||
if (!List$NonEmpty$rest(a)) {
|
||
return b;
|
||
} else if (!List$NonEmpty$rest(b)) {
|
||
return a;
|
||
} else {
|
||
return append2(a, b);
|
||
}
|
||
};
|
||
|
||
// build/dev/javascript/lustre/lustre/internals/constants.ffi.mjs
|
||
var NAMESPACE_HTML = "http://www.w3.org/1999/xhtml";
|
||
var ELEMENT_NODE = 1;
|
||
var TEXT_NODE = 3;
|
||
var COMMENT_NODE = 8;
|
||
var SUPPORTS_MOVE_BEFORE = !!globalThis.HTMLElement?.prototype?.moveBefore;
|
||
|
||
// build/dev/javascript/lustre/lustre/vdom/reconciler.ffi.mjs
|
||
var setTimeout = globalThis.setTimeout;
|
||
var clearTimeout = globalThis.clearTimeout;
|
||
var createElementNS = (ns, name) => globalThis.document.createElementNS(ns, name);
|
||
var createTextNode = (data2) => globalThis.document.createTextNode(data2);
|
||
var createComment = (data2) => globalThis.document.createComment(data2);
|
||
var createDocumentFragment = () => globalThis.document.createDocumentFragment();
|
||
var insertBefore = (parent, node, reference) => parent.insertBefore(node, reference);
|
||
var moveBefore = SUPPORTS_MOVE_BEFORE ? (parent, node, reference) => parent.moveBefore(node, reference) : insertBefore;
|
||
var removeChild = (parent, child2) => parent.removeChild(child2);
|
||
var getAttribute = (node, name) => node.getAttribute(name);
|
||
var setAttribute = (node, name, value2) => node.setAttribute(name, value2);
|
||
var removeAttribute = (node, name) => node.removeAttribute(name);
|
||
var addEventListener = (node, name, handler, options) => node.addEventListener(name, handler, options);
|
||
var removeEventListener = (node, name, handler) => node.removeEventListener(name, handler);
|
||
var setInnerHtml = (node, innerHtml) => node.innerHTML = innerHtml;
|
||
var setData = (node, data2) => node.data = data2;
|
||
var meta = Symbol("lustre");
|
||
|
||
class MetadataNode {
|
||
constructor(kind, parent, node, key) {
|
||
this.kind = kind;
|
||
this.key = key;
|
||
this.parent = parent;
|
||
this.children = [];
|
||
this.node = node;
|
||
this.endNode = null;
|
||
this.handlers = new Map;
|
||
this.throttles = new Map;
|
||
this.debouncers = new Map;
|
||
}
|
||
get isVirtual() {
|
||
return this.kind === fragment_kind || this.kind === map_kind;
|
||
}
|
||
get parentNode() {
|
||
return this.isVirtual ? this.node.parentNode : this.node;
|
||
}
|
||
}
|
||
var insertMetadataChild = (kind, parent, node, index4, key) => {
|
||
const child2 = new MetadataNode(kind, parent, node, key);
|
||
node[meta] = child2;
|
||
parent?.children.splice(index4, 0, child2);
|
||
return child2;
|
||
};
|
||
var getPath = (node) => {
|
||
let path = "";
|
||
for (let current = node[meta];current.parent; current = current.parent) {
|
||
const separator = current.parent && current.parent.kind === map_kind ? separator_subtree : separator_element;
|
||
if (current.key) {
|
||
path = `${separator}${current.key}${path}`;
|
||
} else {
|
||
const index4 = current.parent.children.indexOf(current);
|
||
path = `${separator}${index4}${path}`;
|
||
}
|
||
}
|
||
return path.slice(1);
|
||
};
|
||
|
||
class Reconciler {
|
||
#root = null;
|
||
#decodeEvent;
|
||
#dispatch;
|
||
#debug = false;
|
||
constructor(root2, decodeEvent, dispatch2, { debug = false } = {}) {
|
||
this.#root = root2;
|
||
this.#decodeEvent = decodeEvent;
|
||
this.#dispatch = dispatch2;
|
||
this.#debug = debug;
|
||
}
|
||
mount(vdom) {
|
||
insertMetadataChild(element_kind, null, this.#root, 0, null);
|
||
this.#insertChild(this.#root, null, this.#root[meta], 0, vdom);
|
||
}
|
||
push(patch, memos2 = null) {
|
||
this.#memos = memos2;
|
||
this.#stack.push({ node: this.#root[meta], patch });
|
||
this.#reconcile();
|
||
}
|
||
#memos;
|
||
#stack = [];
|
||
#reconcile() {
|
||
const stack = this.#stack;
|
||
while (stack.length) {
|
||
const { node, patch } = stack.pop();
|
||
const { children: childNodes } = node;
|
||
const { changes, removed, children: childPatches } = patch;
|
||
iterate(changes, (change) => this.#patch(node, change));
|
||
if (removed) {
|
||
this.#removeChildren(node, childNodes.length - removed, removed);
|
||
}
|
||
iterate(childPatches, (childPatch) => {
|
||
const child2 = childNodes[childPatch.index | 0];
|
||
this.#stack.push({ node: child2, patch: childPatch });
|
||
});
|
||
}
|
||
}
|
||
#patch(node, change) {
|
||
switch (change.kind) {
|
||
case replace_text_kind:
|
||
this.#replaceText(node, change);
|
||
break;
|
||
case replace_inner_html_kind:
|
||
this.#replaceInnerHtml(node, change);
|
||
break;
|
||
case update_kind:
|
||
this.#update(node, change);
|
||
break;
|
||
case move_kind:
|
||
this.#move(node, change);
|
||
break;
|
||
case remove_kind:
|
||
this.#remove(node, change);
|
||
break;
|
||
case replace_kind:
|
||
this.#replace(node, change);
|
||
break;
|
||
case insert_kind:
|
||
this.#insert(node, change);
|
||
break;
|
||
}
|
||
}
|
||
#insert(parent, { children, before }) {
|
||
const fragment2 = createDocumentFragment();
|
||
const beforeEl = this.#getReference(parent, before);
|
||
this.#insertChildren(fragment2, null, parent, before | 0, children);
|
||
insertBefore(parent.parentNode, fragment2, beforeEl);
|
||
}
|
||
#replace(parent, { index: index4, with: child2 }) {
|
||
this.#removeChildren(parent, index4 | 0, 1);
|
||
const beforeEl = this.#getReference(parent, index4);
|
||
this.#insertChild(parent.parentNode, beforeEl, parent, index4 | 0, child2);
|
||
}
|
||
#getReference(node, index4) {
|
||
index4 = index4 | 0;
|
||
const { children } = node;
|
||
const childCount = children.length;
|
||
if (index4 < childCount)
|
||
return children[index4].node;
|
||
if (node.endNode)
|
||
return node.endNode;
|
||
if (!node.isVirtual)
|
||
return null;
|
||
while (node.isVirtual && node.children.length) {
|
||
if (node.endNode)
|
||
return node.endNode.nextSibling;
|
||
node = node.children[node.children.length - 1];
|
||
}
|
||
return node.node.nextSibling;
|
||
}
|
||
#move(parent, { key, before }) {
|
||
before = before | 0;
|
||
const { children, parentNode } = parent;
|
||
const beforeEl = children[before].node;
|
||
let prev = children[before];
|
||
for (let i = before + 1;i < children.length; ++i) {
|
||
const next = children[i];
|
||
children[i] = prev;
|
||
prev = next;
|
||
if (next.key === key) {
|
||
children[before] = next;
|
||
break;
|
||
}
|
||
}
|
||
this.#moveChild(parentNode, prev, beforeEl);
|
||
}
|
||
#moveChildren(domParent, children, beforeEl) {
|
||
for (let i = 0;i < children.length; ++i) {
|
||
this.#moveChild(domParent, children[i], beforeEl);
|
||
}
|
||
}
|
||
#moveChild(domParent, child2, beforeEl) {
|
||
moveBefore(domParent, child2.node, beforeEl);
|
||
if (child2.isVirtual) {
|
||
this.#moveChildren(domParent, child2.children, beforeEl);
|
||
}
|
||
if (child2.endNode) {
|
||
moveBefore(domParent, child2.endNode, beforeEl);
|
||
}
|
||
}
|
||
#remove(parent, { index: index4 }) {
|
||
this.#removeChildren(parent, index4, 1);
|
||
}
|
||
#removeChildren(parent, index4, count) {
|
||
const { children, parentNode } = parent;
|
||
const deleted = children.splice(index4, count);
|
||
for (let i = 0;i < deleted.length; ++i) {
|
||
const child2 = deleted[i];
|
||
const { node, endNode, isVirtual, children: nestedChildren } = child2;
|
||
removeChild(parentNode, node);
|
||
if (endNode) {
|
||
removeChild(parentNode, endNode);
|
||
}
|
||
this.#removeDebouncers(child2);
|
||
if (isVirtual) {
|
||
deleted.push(...nestedChildren);
|
||
}
|
||
}
|
||
}
|
||
#removeDebouncers(node) {
|
||
const { debouncers, children } = node;
|
||
for (const { timeout } of debouncers.values()) {
|
||
if (timeout) {
|
||
clearTimeout(timeout);
|
||
}
|
||
}
|
||
debouncers.clear();
|
||
iterate(children, (child2) => this.#removeDebouncers(child2));
|
||
}
|
||
#update({ node, handlers, throttles, debouncers }, { added, removed }) {
|
||
iterate(removed, ({ name }) => {
|
||
if (handlers.delete(name)) {
|
||
removeEventListener(node, name, handleEvent);
|
||
this.#updateDebounceThrottle(throttles, name, 0);
|
||
this.#updateDebounceThrottle(debouncers, name, 0);
|
||
} else {
|
||
removeAttribute(node, name);
|
||
SYNCED_ATTRIBUTES[name]?.removed?.(node, name);
|
||
}
|
||
});
|
||
iterate(added, (attribute3) => this.#createAttribute(node, attribute3));
|
||
}
|
||
#replaceText({ node }, { content }) {
|
||
setData(node, content ?? "");
|
||
}
|
||
#replaceInnerHtml({ node }, { inner_html }) {
|
||
setInnerHtml(node, inner_html ?? "");
|
||
}
|
||
#insertChildren(domParent, beforeEl, metaParent, index4, children) {
|
||
iterate(children, (child2) => this.#insertChild(domParent, beforeEl, metaParent, index4++, child2));
|
||
}
|
||
#insertChild(domParent, beforeEl, metaParent, index4, vnode) {
|
||
switch (vnode.kind) {
|
||
case element_kind: {
|
||
const node = this.#createElement(metaParent, index4, vnode);
|
||
this.#insertChildren(node, null, node[meta], 0, vnode.children);
|
||
insertBefore(domParent, node, beforeEl);
|
||
break;
|
||
}
|
||
case text_kind: {
|
||
const node = this.#createTextNode(metaParent, index4, vnode);
|
||
insertBefore(domParent, node, beforeEl);
|
||
break;
|
||
}
|
||
case fragment_kind: {
|
||
const marker = "lustre:fragment";
|
||
const head = this.#createHead(marker, metaParent, index4, vnode);
|
||
insertBefore(domParent, head, beforeEl);
|
||
this.#insertChildren(domParent, beforeEl, head[meta], 0, vnode.children);
|
||
if (this.#debug) {
|
||
head[meta].endNode = createComment(` /${marker} `);
|
||
insertBefore(domParent, head[meta].endNode, beforeEl);
|
||
}
|
||
break;
|
||
}
|
||
case unsafe_inner_html_kind: {
|
||
const node = this.#createElement(metaParent, index4, vnode);
|
||
this.#replaceInnerHtml({ node }, vnode);
|
||
insertBefore(domParent, node, beforeEl);
|
||
break;
|
||
}
|
||
case map_kind: {
|
||
const head = this.#createHead("lustre:map", metaParent, index4, vnode);
|
||
insertBefore(domParent, head, beforeEl);
|
||
this.#insertChild(domParent, beforeEl, head[meta], 0, vnode.child);
|
||
break;
|
||
}
|
||
case memo_kind: {
|
||
const child2 = this.#memos?.get(vnode.view) ?? vnode.view();
|
||
this.#insertChild(domParent, beforeEl, metaParent, index4, child2);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
#createElement(parent, index4, { kind, key, tag, namespace, attributes }) {
|
||
const node = createElementNS(namespace || NAMESPACE_HTML, tag);
|
||
insertMetadataChild(kind, parent, node, index4, key);
|
||
if (this.#debug && key) {
|
||
setAttribute(node, "data-lustre-key", key);
|
||
}
|
||
iterate(attributes, (attribute3) => this.#createAttribute(node, attribute3));
|
||
return node;
|
||
}
|
||
#createTextNode(parent, index4, { kind, key, content }) {
|
||
const node = createTextNode(content ?? "");
|
||
insertMetadataChild(kind, parent, node, index4, key);
|
||
return node;
|
||
}
|
||
#createHead(marker, parent, index4, { kind, key }) {
|
||
const node = this.#debug ? createComment(markerComment(marker, key)) : createTextNode("");
|
||
insertMetadataChild(kind, parent, node, index4, key);
|
||
return node;
|
||
}
|
||
#createAttribute(node, attribute3) {
|
||
const { debouncers, handlers, throttles } = node[meta];
|
||
const {
|
||
kind,
|
||
name,
|
||
value: value2,
|
||
prevent_default: prevent,
|
||
debounce: debounceDelay,
|
||
throttle: throttleDelay
|
||
} = attribute3;
|
||
switch (kind) {
|
||
case attribute_kind: {
|
||
const valueOrDefault = value2 ?? "";
|
||
if (name === "virtual:defaultValue") {
|
||
node.defaultValue = valueOrDefault;
|
||
return;
|
||
} else if (name === "virtual:defaultChecked") {
|
||
node.defaultChecked = true;
|
||
return;
|
||
} else if (name === "virtual:defaultSelected") {
|
||
node.defaultSelected = true;
|
||
return;
|
||
}
|
||
if (valueOrDefault !== getAttribute(node, name)) {
|
||
setAttribute(node, name, valueOrDefault);
|
||
}
|
||
SYNCED_ATTRIBUTES[name]?.added?.(node, valueOrDefault);
|
||
break;
|
||
}
|
||
case property_kind:
|
||
node[name] = value2;
|
||
break;
|
||
case event_kind: {
|
||
if (handlers.has(name)) {
|
||
removeEventListener(node, name, handleEvent);
|
||
}
|
||
const passive = prevent.kind === never_kind;
|
||
addEventListener(node, name, handleEvent, { passive });
|
||
this.#updateDebounceThrottle(throttles, name, throttleDelay);
|
||
this.#updateDebounceThrottle(debouncers, name, debounceDelay);
|
||
handlers.set(name, (event3) => this.#handleEvent(attribute3, event3));
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
#updateDebounceThrottle(map8, name, delay) {
|
||
const debounceOrThrottle = map8.get(name);
|
||
if (delay > 0) {
|
||
if (debounceOrThrottle) {
|
||
debounceOrThrottle.delay = delay;
|
||
} else {
|
||
map8.set(name, { delay });
|
||
}
|
||
} else if (debounceOrThrottle) {
|
||
const { timeout } = debounceOrThrottle;
|
||
if (timeout) {
|
||
clearTimeout(timeout);
|
||
}
|
||
map8.delete(name);
|
||
}
|
||
}
|
||
#handleEvent(attribute3, event3) {
|
||
const { currentTarget, type } = event3;
|
||
const { debouncers, throttles } = currentTarget[meta];
|
||
const path = getPath(currentTarget);
|
||
const {
|
||
prevent_default: prevent,
|
||
stop_propagation: stop,
|
||
include
|
||
} = attribute3;
|
||
if (prevent.kind === always_kind)
|
||
event3.preventDefault();
|
||
if (stop.kind === always_kind)
|
||
event3.stopPropagation();
|
||
if (type === "submit") {
|
||
event3.detail ??= {};
|
||
event3.detail.formData = [
|
||
...new FormData(event3.target, event3.submitter).entries()
|
||
];
|
||
}
|
||
const data2 = this.#decodeEvent(event3, path, type, include);
|
||
const throttle = throttles.get(type);
|
||
if (throttle) {
|
||
const now = Date.now();
|
||
const last = throttle.last || 0;
|
||
if (now > last + throttle.delay) {
|
||
throttle.last = now;
|
||
throttle.lastEvent = event3;
|
||
this.#dispatch(event3, data2);
|
||
}
|
||
}
|
||
const debounce = debouncers.get(type);
|
||
if (debounce) {
|
||
clearTimeout(debounce.timeout);
|
||
debounce.timeout = setTimeout(() => {
|
||
if (event3 === throttles.get(type)?.lastEvent)
|
||
return;
|
||
this.#dispatch(event3, data2);
|
||
}, debounce.delay);
|
||
}
|
||
if (!throttle && !debounce) {
|
||
this.#dispatch(event3, data2);
|
||
}
|
||
}
|
||
}
|
||
var markerComment = (marker, key) => {
|
||
if (key) {
|
||
return ` ${marker} key="${escape2(key)}" `;
|
||
} else {
|
||
return ` ${marker} `;
|
||
}
|
||
};
|
||
var handleEvent = (event3) => {
|
||
const { currentTarget, type } = event3;
|
||
const handler = currentTarget[meta].handlers.get(type);
|
||
handler(event3);
|
||
};
|
||
var syncedBooleanAttribute = (name) => {
|
||
return {
|
||
added(node) {
|
||
node[name] = true;
|
||
},
|
||
removed(node) {
|
||
node[name] = false;
|
||
}
|
||
};
|
||
};
|
||
var syncedAttribute = (name) => {
|
||
return {
|
||
added(node, value2) {
|
||
node[name] = value2;
|
||
}
|
||
};
|
||
};
|
||
var SYNCED_ATTRIBUTES = {
|
||
checked: syncedBooleanAttribute("checked"),
|
||
selected: syncedBooleanAttribute("selected"),
|
||
value: syncedAttribute("value"),
|
||
autofocus: {
|
||
added(node) {
|
||
queueMicrotask(() => {
|
||
node.focus?.();
|
||
});
|
||
}
|
||
},
|
||
autoplay: {
|
||
added(node) {
|
||
try {
|
||
node.play?.();
|
||
} catch (e) {
|
||
console.error(e);
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
// build/dev/javascript/lustre/lustre/element/keyed.mjs
|
||
function do_extract_keyed_children(loop$key_children_pairs, loop$keyed_children, loop$children) {
|
||
while (true) {
|
||
let key_children_pairs = loop$key_children_pairs;
|
||
let keyed_children = loop$keyed_children;
|
||
let children = loop$children;
|
||
if (key_children_pairs instanceof Empty) {
|
||
return [keyed_children, reverse(children)];
|
||
} else {
|
||
let rest = key_children_pairs.tail;
|
||
let key = key_children_pairs.head[0];
|
||
let element$1 = key_children_pairs.head[1];
|
||
let keyed_element = to_keyed(key, element$1);
|
||
let _block;
|
||
if (key === "") {
|
||
_block = keyed_children;
|
||
} else {
|
||
_block = insert2(keyed_children, key, keyed_element);
|
||
}
|
||
let keyed_children$1 = _block;
|
||
let children$1 = prepend(keyed_element, children);
|
||
loop$key_children_pairs = rest;
|
||
loop$keyed_children = keyed_children$1;
|
||
loop$children = children$1;
|
||
}
|
||
}
|
||
}
|
||
function extract_keyed_children(children) {
|
||
return do_extract_keyed_children(children, empty2(), empty_list);
|
||
}
|
||
function element3(tag, attributes, children) {
|
||
let $ = extract_keyed_children(children);
|
||
let keyed_children;
|
||
let children$1;
|
||
keyed_children = $[0];
|
||
children$1 = $[1];
|
||
return element("", "", tag, attributes, children$1, keyed_children, false, is_void_html_element(tag, ""));
|
||
}
|
||
function namespaced2(namespace, tag, attributes, children) {
|
||
let $ = extract_keyed_children(children);
|
||
let keyed_children;
|
||
let children$1;
|
||
keyed_children = $[0];
|
||
children$1 = $[1];
|
||
return element("", namespace, tag, attributes, children$1, keyed_children, false, is_void_html_element(tag, namespace));
|
||
}
|
||
function fragment2(children) {
|
||
let $ = extract_keyed_children(children);
|
||
let keyed_children;
|
||
let children$1;
|
||
keyed_children = $[0];
|
||
children$1 = $[1];
|
||
return fragment("", children$1, keyed_children);
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre/vdom/virtualise.ffi.mjs
|
||
var virtualise = (root2) => {
|
||
const rootMeta = insertMetadataChild(element_kind, null, root2, 0, null);
|
||
for (let child2 = root2.firstChild;child2; child2 = child2.nextSibling) {
|
||
const result = virtualiseChild(rootMeta, root2, child2, 0);
|
||
if (result)
|
||
return result.vnode;
|
||
}
|
||
const placeholder2 = globalThis.document.createTextNode("");
|
||
insertMetadataChild(text_kind, rootMeta, placeholder2, 0, null);
|
||
root2.insertBefore(placeholder2, root2.firstChild);
|
||
return none2();
|
||
};
|
||
var virtualiseChild = (meta2, domParent, child2, index4) => {
|
||
if (child2.nodeType === COMMENT_NODE) {
|
||
const data2 = child2.data.trim();
|
||
if (data2.startsWith("lustre:fragment")) {
|
||
return virtualiseFragment(meta2, domParent, child2, index4);
|
||
}
|
||
if (data2.startsWith("lustre:map")) {
|
||
return virtualiseMap(meta2, domParent, child2, index4);
|
||
}
|
||
if (data2.startsWith("lustre:memo")) {
|
||
return virtualiseMemo(meta2, domParent, child2, index4);
|
||
}
|
||
return null;
|
||
}
|
||
if (child2.nodeType === ELEMENT_NODE) {
|
||
return virtualiseElement(meta2, child2, index4);
|
||
}
|
||
if (child2.nodeType === TEXT_NODE) {
|
||
return virtualiseText(meta2, child2, index4);
|
||
}
|
||
return null;
|
||
};
|
||
var virtualiseElement = (metaParent, node, index4) => {
|
||
const key = node.getAttribute("data-lustre-key") ?? "";
|
||
if (key) {
|
||
node.removeAttribute("data-lustre-key");
|
||
}
|
||
const meta2 = insertMetadataChild(element_kind, metaParent, node, index4, key);
|
||
const tag = node.localName;
|
||
const namespace = node.namespaceURI;
|
||
const isHtmlElement = !namespace || namespace === NAMESPACE_HTML;
|
||
if (isHtmlElement && INPUT_ELEMENTS.includes(tag)) {
|
||
virtualiseInputEvents(tag, node);
|
||
}
|
||
const attributes = virtualiseAttributes(node);
|
||
const children = [];
|
||
for (let childNode = node.firstChild;childNode; ) {
|
||
const child2 = virtualiseChild(meta2, node, childNode, children.length);
|
||
if (child2) {
|
||
children.push([child2.key, child2.vnode]);
|
||
childNode = child2.next;
|
||
} else {
|
||
childNode = childNode.nextSibling;
|
||
}
|
||
}
|
||
const vnode = isHtmlElement ? element3(tag, attributes, toList3(children)) : namespaced2(namespace, tag, attributes, toList3(children));
|
||
return childResult(key, vnode, node.nextSibling);
|
||
};
|
||
var virtualiseText = (meta2, node, index4) => {
|
||
insertMetadataChild(text_kind, meta2, node, index4, null);
|
||
return childResult("", text2(node.data), node.nextSibling);
|
||
};
|
||
var virtualiseFragment = (metaParent, domParent, node, index4) => {
|
||
const key = parseKey(node.data);
|
||
const meta2 = insertMetadataChild(fragment_kind, metaParent, node, index4, key);
|
||
const children = [];
|
||
node = node.nextSibling;
|
||
while (node && (node.nodeType !== COMMENT_NODE || node.data.trim() !== "/lustre:fragment")) {
|
||
const child2 = virtualiseChild(meta2, domParent, node, children.length);
|
||
if (child2) {
|
||
children.push([child2.key, child2.vnode]);
|
||
node = child2.next;
|
||
} else {
|
||
node = node.nextSibling;
|
||
}
|
||
}
|
||
meta2.endNode = node;
|
||
const vnode = fragment2(toList3(children));
|
||
return childResult(key, vnode, node?.nextSibling);
|
||
};
|
||
var virtualiseMap = (metaParent, domParent, node, index4) => {
|
||
const key = parseKey(node.data);
|
||
const meta2 = insertMetadataChild(map_kind, metaParent, node, index4, key);
|
||
const child2 = virtualiseNextChild(meta2, domParent, node, 0);
|
||
if (!child2)
|
||
return null;
|
||
const vnode = map7(child2.vnode, (x) => x);
|
||
return childResult(key, vnode, child2.next);
|
||
};
|
||
var virtualiseMemo = (meta2, domParent, node, index4) => {
|
||
const key = parseKey(node.data);
|
||
const child2 = virtualiseNextChild(meta2, domParent, node, index4);
|
||
if (!child2)
|
||
return null;
|
||
domParent.removeChild(node);
|
||
const vnode = memo2(toList3([ref({})]), () => child2.vnode);
|
||
return childResult(key, vnode, child2.next);
|
||
};
|
||
var virtualiseNextChild = (meta2, domParent, node, index4) => {
|
||
while (true) {
|
||
node = node.nextSibling;
|
||
if (!node)
|
||
return null;
|
||
const child2 = virtualiseChild(meta2, domParent, node, index4);
|
||
if (child2)
|
||
return child2;
|
||
}
|
||
};
|
||
var childResult = (key, vnode, next) => {
|
||
return { key, vnode, next };
|
||
};
|
||
var virtualiseAttributes = (node) => {
|
||
const attributes = [];
|
||
for (let i = 0;i < node.attributes.length; i++) {
|
||
const attr = node.attributes[i];
|
||
if (attr.name !== "xmlns") {
|
||
attributes.push(attribute2(attr.localName, attr.value));
|
||
}
|
||
}
|
||
return toList3(attributes);
|
||
};
|
||
var INPUT_ELEMENTS = ["input", "select", "textarea"];
|
||
var virtualiseInputEvents = (tag, node) => {
|
||
const value2 = node.value;
|
||
const checked = node.checked;
|
||
if (tag === "input" && node.type === "checkbox" && !checked)
|
||
return;
|
||
if (tag === "input" && node.type === "radio" && !checked)
|
||
return;
|
||
if (node.type !== "checkbox" && node.type !== "radio" && !value2)
|
||
return;
|
||
queueMicrotask(() => {
|
||
node.value = value2;
|
||
node.checked = checked;
|
||
node.dispatchEvent(new Event("input", { bubbles: true }));
|
||
node.dispatchEvent(new Event("change", { bubbles: true }));
|
||
if (globalThis.document.activeElement !== node) {
|
||
node.dispatchEvent(new Event("blur", { bubbles: true }));
|
||
}
|
||
});
|
||
};
|
||
var parseKey = (data2) => {
|
||
const keyMatch = data2.match(/key="([^"]*)"/);
|
||
if (!keyMatch)
|
||
return "";
|
||
return unescapeKey(keyMatch[1]);
|
||
};
|
||
var unescapeKey = (key) => {
|
||
return key.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"').replace(/&/g, "&").replace(/'/g, "'");
|
||
};
|
||
var toList3 = (arr) => arr.reduceRight((xs, x) => List$NonEmpty(x, xs), empty_list);
|
||
|
||
// build/dev/javascript/lustre/lustre/runtime/client/runtime.ffi.mjs
|
||
var is_browser = () => !!globalThis.document;
|
||
class Runtime {
|
||
constructor(root2, [model, effects], view, update2, options) {
|
||
this.root = root2;
|
||
this.#model = model;
|
||
this.#view = view;
|
||
this.#update = update2;
|
||
this.root.addEventListener("context-request", (event3) => {
|
||
if (!(event3.context && event3.callback))
|
||
return;
|
||
if (!this.#contexts.has(event3.context))
|
||
return;
|
||
event3.stopImmediatePropagation();
|
||
const context = this.#contexts.get(event3.context);
|
||
if (event3.subscribe) {
|
||
const unsubscribe = () => {
|
||
context.subscribers = context.subscribers.filter((subscriber) => subscriber !== event3.callback);
|
||
};
|
||
context.subscribers.push([event3.callback, unsubscribe]);
|
||
event3.callback(context.value, unsubscribe);
|
||
} else {
|
||
event3.callback(context.value);
|
||
}
|
||
});
|
||
const decodeEvent = (event3, path, name) => decode2(this.#cache, path, name, event3);
|
||
const dispatch2 = (event3, data2) => {
|
||
const [cache, result] = dispatch(this.#cache, data2);
|
||
this.#cache = cache;
|
||
if (Result$isOk(result)) {
|
||
const handler = Result$Ok$0(result);
|
||
if (handler.stop_propagation)
|
||
event3.stopPropagation();
|
||
if (handler.prevent_default)
|
||
event3.preventDefault();
|
||
this.dispatch(handler.message, false);
|
||
}
|
||
};
|
||
this.#reconciler = new Reconciler(this.root, decodeEvent, dispatch2, options);
|
||
this.#vdom = virtualise(this.root);
|
||
this.#cache = new$4();
|
||
this.#handleEffects(effects);
|
||
this.#render();
|
||
}
|
||
root = null;
|
||
dispatch(msg, shouldFlush = false) {
|
||
if (this.#shouldQueue) {
|
||
this.#queue.push(msg);
|
||
} else {
|
||
const [model, effects] = this.#update(this.#model, msg);
|
||
this.#model = model;
|
||
this.#tick(effects, shouldFlush);
|
||
}
|
||
}
|
||
emit(event3, data2) {
|
||
const target = this.root.host ?? this.root;
|
||
target.dispatchEvent(new CustomEvent(event3, {
|
||
detail: data2,
|
||
bubbles: true,
|
||
composed: true
|
||
}));
|
||
}
|
||
provide(key, value2) {
|
||
if (!this.#contexts.has(key)) {
|
||
this.#contexts.set(key, { value: value2, subscribers: [] });
|
||
} else {
|
||
const context = this.#contexts.get(key);
|
||
if (isEqual2(context.value, value2)) {
|
||
return;
|
||
}
|
||
context.value = value2;
|
||
for (let i = context.subscribers.length - 1;i >= 0; i--) {
|
||
const [subscriber, unsubscribe] = context.subscribers[i];
|
||
if (!subscriber) {
|
||
context.subscribers.splice(i, 1);
|
||
continue;
|
||
}
|
||
subscriber(value2, unsubscribe);
|
||
}
|
||
}
|
||
}
|
||
#model;
|
||
#view;
|
||
#update;
|
||
#vdom;
|
||
#cache;
|
||
#reconciler;
|
||
#contexts = new Map;
|
||
#shouldQueue = false;
|
||
#queue = [];
|
||
#beforePaint = empty_list;
|
||
#afterPaint = empty_list;
|
||
#renderTimer = null;
|
||
#actions = {
|
||
dispatch: (msg) => this.dispatch(msg),
|
||
emit: (event3, data2) => this.emit(event3, data2),
|
||
select: () => {},
|
||
root: () => this.root,
|
||
provide: (key, value2) => this.provide(key, value2)
|
||
};
|
||
#tick(effects, shouldFlush = false) {
|
||
this.#handleEffects(effects);
|
||
if (!this.#renderTimer) {
|
||
if (shouldFlush) {
|
||
this.#renderTimer = "sync";
|
||
queueMicrotask(() => this.#render());
|
||
} else {
|
||
this.#renderTimer = window.requestAnimationFrame(() => this.#render());
|
||
}
|
||
}
|
||
}
|
||
#handleEffects(effects) {
|
||
this.#shouldQueue = true;
|
||
while (true) {
|
||
iterate(effects.synchronous, (effect) => effect(this.#actions));
|
||
this.#beforePaint = append4(this.#beforePaint, effects.before_paint);
|
||
this.#afterPaint = append4(this.#afterPaint, effects.after_paint);
|
||
if (!this.#queue.length)
|
||
break;
|
||
const msg = this.#queue.shift();
|
||
[this.#model, effects] = this.#update(this.#model, msg);
|
||
}
|
||
this.#shouldQueue = false;
|
||
}
|
||
#render() {
|
||
this.#renderTimer = null;
|
||
const next = this.#view(this.#model);
|
||
const { patch, cache } = diff(this.#cache, this.#vdom, next);
|
||
this.#cache = cache;
|
||
this.#vdom = next;
|
||
this.#reconciler.push(patch, memos(cache));
|
||
if (List$isNonEmpty(this.#beforePaint)) {
|
||
const effects = makeEffect(this.#beforePaint);
|
||
this.#beforePaint = empty_list;
|
||
queueMicrotask(() => {
|
||
this.#tick(effects, true);
|
||
});
|
||
}
|
||
if (List$isNonEmpty(this.#afterPaint)) {
|
||
const effects = makeEffect(this.#afterPaint);
|
||
this.#afterPaint = empty_list;
|
||
window.requestAnimationFrame(() => this.#tick(effects, true));
|
||
}
|
||
}
|
||
}
|
||
function makeEffect(synchronous) {
|
||
return {
|
||
synchronous,
|
||
after_paint: empty_list,
|
||
before_paint: empty_list
|
||
};
|
||
}
|
||
var copiedStyleSheets = new WeakMap;
|
||
|
||
// build/dev/javascript/lustre/lustre/runtime/client/spa.ffi.mjs
|
||
class Spa {
|
||
#runtime;
|
||
constructor(root2, [init, effects], update2, view) {
|
||
this.#runtime = new Runtime(root2, [init, effects], view, update2);
|
||
}
|
||
send(message) {
|
||
if (Message$isEffectDispatchedMessage(message)) {
|
||
this.dispatch(message.message, false);
|
||
} else if (Message$isEffectEmitEvent(message)) {
|
||
this.emit(message.name, message.data);
|
||
} else if (Message$isSystemRequestedShutdown(message)) {}
|
||
}
|
||
dispatch(msg) {
|
||
this.#runtime.dispatch(msg);
|
||
}
|
||
emit(event3, data2) {
|
||
this.#runtime.emit(event3, data2);
|
||
}
|
||
}
|
||
var start = ({ init, update: update2, view }, selector, flags) => {
|
||
if (!is_browser())
|
||
return Result$Error(Error$NotABrowser());
|
||
const root2 = selector instanceof HTMLElement ? selector : globalThis.document.querySelector(selector);
|
||
if (!root2)
|
||
return Result$Error(Error$ElementNotFound(selector));
|
||
return Result$Ok(new Spa(root2, init(flags), update2, view));
|
||
};
|
||
|
||
// build/dev/javascript/lustre/lustre/runtime/server/runtime.ffi.mjs
|
||
class Runtime2 {
|
||
#model;
|
||
#update;
|
||
#view;
|
||
#config;
|
||
#vdom;
|
||
#cache;
|
||
#providers = make();
|
||
#callbacks = /* @__PURE__ */ new Set;
|
||
constructor(_, init, update2, view, config2, start_arguments) {
|
||
const [model, effects] = init(start_arguments);
|
||
this.#model = model;
|
||
this.#update = update2;
|
||
this.#view = view;
|
||
this.#config = config2;
|
||
this.#vdom = this.#view(this.#model);
|
||
this.#cache = from_node(this.#vdom);
|
||
this.#handle_effect(effects);
|
||
}
|
||
send(msg) {
|
||
if (Message$isClientDispatchedMessage(msg)) {
|
||
const { message } = msg;
|
||
const next = this.#handle_client_message(message);
|
||
const diff2 = diff(this.#cache, this.#vdom, next);
|
||
this.#vdom = next;
|
||
this.#cache = diff2.cache;
|
||
this.broadcast(reconcile(diff2.patch, memos(diff2.cache)));
|
||
} else if (Message$isClientRegisteredCallback(msg)) {
|
||
const { callback } = msg;
|
||
this.#callbacks.add(callback);
|
||
callback(mount(this.#config.open_shadow_root, this.#config.adopt_styles, keys(this.#config.attributes), keys(this.#config.properties), keys(this.#config.contexts), this.#providers, this.#vdom, memos(this.#cache)));
|
||
if (Option$isSome(config.on_connect)) {
|
||
this.#dispatch(Option$Some$0(config.on_connect));
|
||
}
|
||
} else if (Message$isClientDeregisteredCallback(msg)) {
|
||
const { callback } = msg;
|
||
this.#callbacks.delete(callback);
|
||
if (Option$isSome(config.on_disconnect)) {
|
||
this.#dispatch(Option$Some$0(config.on_disconnect));
|
||
}
|
||
} else if (Message$isEffectDispatchedMessage(msg)) {
|
||
const { message } = msg;
|
||
const [model, effect] = this.#update(this.#model, message);
|
||
const next = this.#view(model);
|
||
const diff2 = diff(this.#cache, this.#vdom, next);
|
||
this.#handle_effect(effect);
|
||
this.#model = model;
|
||
this.#vdom = next;
|
||
this.#cache = diff2.cache;
|
||
this.broadcast(reconcile(diff2.patch, memos(diff2.cache)));
|
||
} else if (Message$isEffectEmitEvent(msg)) {
|
||
const { name, data: data2 } = msg;
|
||
this.broadcast(emit(name, data2));
|
||
} else if (Message$isEffectProvidedValue(msg)) {
|
||
const { key, value: value2 } = msg;
|
||
const existing = get(this.#providers, key);
|
||
if (Result$isOk(existing) && isEqual2(Result$Ok$0(existing), value2)) {
|
||
return;
|
||
}
|
||
this.#providers = insert(this.#providers, key, value2);
|
||
this.broadcast(provide(key, value2));
|
||
} else if (Message$isSystemRequestedShutdown(msg)) {
|
||
this.#model = null;
|
||
this.#update = null;
|
||
this.#view = null;
|
||
this.#config = null;
|
||
this.#vdom = null;
|
||
this.#cache = null;
|
||
this.#providers = null;
|
||
this.#callbacks.clear();
|
||
}
|
||
}
|
||
broadcast(msg) {
|
||
for (const callback of this.#callbacks) {
|
||
callback(msg);
|
||
}
|
||
}
|
||
#handle_client_message(msg) {
|
||
if (ServerMessage$isBatch(msg)) {
|
||
const { messages } = msg;
|
||
let model = this.#model;
|
||
let effect = none();
|
||
for (let list4 = messages;List$NonEmpty$rest(list4); list4 = List$NonEmpty$rest(list4)) {
|
||
const result = this.#handle_client_message(List$NonEmpty$first(list4));
|
||
if (Result$isOk(result)) {
|
||
model = Result$Ok$0(result)[0];
|
||
effect = batch(toList2([effect, Result$Ok$0(result)[1]]));
|
||
break;
|
||
}
|
||
}
|
||
this.#handle_effect(effect);
|
||
this.#model = model;
|
||
return this.#view(model);
|
||
} else if (ServerMessage$isAttributeChanged(msg)) {
|
||
const { name, value: value2 } = msg;
|
||
const result = this.#handle_attribute_change(name, value2);
|
||
if (!Result$isOk(result)) {
|
||
return this.#vdom;
|
||
}
|
||
return this.#dispatch(Result$Ok$0(result));
|
||
} else if (ServerMessage$isPropertyChanged(msg)) {
|
||
const { name, value: value2 } = msg;
|
||
const result = this.#handle_properties_change(name, value2);
|
||
if (!Result$isOk(result)) {
|
||
return this.#vdom;
|
||
}
|
||
return this.#dispatch(Result$Ok$0(result));
|
||
} else if (ServerMessage$isEventFired(msg)) {
|
||
const { path, name, event: event3 } = msg;
|
||
const [cache, result] = handle(this.#cache, path, name, event3);
|
||
this.#cache = cache;
|
||
if (!Result$isOk(result)) {
|
||
return this.#vdom;
|
||
}
|
||
const { message } = Result$Ok$0(result);
|
||
return this.#dispatch(message);
|
||
} else if (ServerMessage$isContextProvided(msg)) {
|
||
const { key, value: value2 } = msg;
|
||
let result = get(this.#config.contexts, key);
|
||
if (!Result$isOk(result)) {
|
||
return this.#vdom;
|
||
}
|
||
result = run(value2, Result$Ok$0(result));
|
||
if (!Result$isOk(result)) {
|
||
return this.#vdom;
|
||
}
|
||
return this.#dispatch(Result$Ok$0(result));
|
||
}
|
||
}
|
||
#dispatch(msg) {
|
||
const [model, effects] = this.#update(this.#model, msg);
|
||
this.#handle_effect(effects);
|
||
this.#model = model;
|
||
return this.#view(this.#model);
|
||
}
|
||
#handle_attribute_change(name, value2) {
|
||
const result = get(this.#config.attributes, name);
|
||
if (!Result$isOk(result)) {
|
||
return result;
|
||
}
|
||
return Result$Ok$0(result)(value2);
|
||
}
|
||
#handle_properties_change(name, value2) {
|
||
const result = get(this.#config.properties, name);
|
||
if (!Result$isOk(result)) {
|
||
return result;
|
||
}
|
||
return Result$Ok$0(result)(value2);
|
||
}
|
||
#handle_effect(effect) {
|
||
const dispatch2 = (message) => this.send(Message$EffectDispatchedMessage(message));
|
||
const emit2 = (name, data2) => this.send(Message$EffectEmitEvent(name, data2));
|
||
const select = () => {
|
||
return;
|
||
};
|
||
const internals = () => {
|
||
return;
|
||
};
|
||
const provide2 = (key, value2) => this.send(Message$EffectProvidedValue(key, value2));
|
||
globalThis.queueMicrotask(() => {
|
||
perform(effect, dispatch2, emit2, select, internals, provide2);
|
||
});
|
||
}
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre.mjs
|
||
class ElementNotFound extends CustomType {
|
||
constructor(selector) {
|
||
super();
|
||
this.selector = selector;
|
||
}
|
||
}
|
||
var Error$ElementNotFound = (selector) => new ElementNotFound(selector);
|
||
class NotABrowser extends CustomType {
|
||
}
|
||
var Error$NotABrowser = () => new NotABrowser;
|
||
function application(init, update2, view) {
|
||
return new App(new None, init, update2, view, default_config);
|
||
}
|
||
function start4(app, selector, arguments$) {
|
||
return guard(!is_browser(), new Error(new NotABrowser), () => {
|
||
return start(app, selector, arguments$);
|
||
});
|
||
}
|
||
|
||
// build/dev/javascript/lustre/lustre/event.mjs
|
||
function on(name, handler) {
|
||
return event(name, map3(handler, (msg) => {
|
||
return new Handler(false, false, msg);
|
||
}), empty_list, never, never, 0, 0);
|
||
}
|
||
function on_click(msg) {
|
||
return on("click", success(msg));
|
||
}
|
||
function on_input(msg) {
|
||
return on("input", subfield(toList(["target", "value"]), string2, (value2) => {
|
||
return success(msg(value2));
|
||
}));
|
||
}
|
||
|
||
// build/dev/javascript/gleam_stdlib/gleam/uri.mjs
|
||
class Uri extends CustomType {
|
||
constructor(scheme, userinfo, host, port, path, query, fragment3) {
|
||
super();
|
||
this.scheme = scheme;
|
||
this.userinfo = userinfo;
|
||
this.host = host;
|
||
this.port = port;
|
||
this.path = path;
|
||
this.query = query;
|
||
this.fragment = fragment3;
|
||
}
|
||
}
|
||
var empty3 = /* @__PURE__ */ new Uri(/* @__PURE__ */ new None, /* @__PURE__ */ new None, /* @__PURE__ */ new None, /* @__PURE__ */ new None, "", /* @__PURE__ */ new None, /* @__PURE__ */ new None);
|
||
function is_valid_host_within_brackets_char(char) {
|
||
return 48 >= char && char <= 57 || 65 >= char && char <= 90 || 97 >= char && char <= 122 || char === 58 || char === 46;
|
||
}
|
||
function parse_fragment(rest, pieces) {
|
||
return new Ok(new Uri(pieces.scheme, pieces.userinfo, pieces.host, pieces.port, pieces.path, pieces.query, new Some(rest)));
|
||
}
|
||
function parse_query_with_question_mark_loop(loop$original, loop$uri_string, loop$pieces, loop$size) {
|
||
while (true) {
|
||
let original = loop$original;
|
||
let uri_string = loop$uri_string;
|
||
let pieces = loop$pieces;
|
||
let size3 = loop$size;
|
||
if (uri_string.startsWith("#")) {
|
||
if (size3 === 0) {
|
||
let rest = uri_string.slice(1);
|
||
return parse_fragment(rest, pieces);
|
||
} else {
|
||
let rest = uri_string.slice(1);
|
||
let query = string_codeunit_slice(original, 0, size3);
|
||
let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, pieces.host, pieces.port, pieces.path, new Some(query), pieces.fragment);
|
||
return parse_fragment(rest, pieces$1);
|
||
}
|
||
} else if (uri_string === "") {
|
||
return new Ok(new Uri(pieces.scheme, pieces.userinfo, pieces.host, pieces.port, pieces.path, new Some(original), pieces.fragment));
|
||
} else {
|
||
let $ = pop_codeunit(uri_string);
|
||
let rest;
|
||
rest = $[1];
|
||
loop$original = original;
|
||
loop$uri_string = rest;
|
||
loop$pieces = pieces;
|
||
loop$size = size3 + 1;
|
||
}
|
||
}
|
||
}
|
||
function parse_query_with_question_mark(uri_string, pieces) {
|
||
return parse_query_with_question_mark_loop(uri_string, uri_string, pieces, 0);
|
||
}
|
||
function parse_path_loop(loop$original, loop$uri_string, loop$pieces, loop$size) {
|
||
while (true) {
|
||
let original = loop$original;
|
||
let uri_string = loop$uri_string;
|
||
let pieces = loop$pieces;
|
||
let size3 = loop$size;
|
||
if (uri_string.startsWith("?")) {
|
||
let rest = uri_string.slice(1);
|
||
let path = string_codeunit_slice(original, 0, size3);
|
||
let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, pieces.host, pieces.port, path, pieces.query, pieces.fragment);
|
||
return parse_query_with_question_mark(rest, pieces$1);
|
||
} else if (uri_string.startsWith("#")) {
|
||
let rest = uri_string.slice(1);
|
||
let path = string_codeunit_slice(original, 0, size3);
|
||
let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, pieces.host, pieces.port, path, pieces.query, pieces.fragment);
|
||
return parse_fragment(rest, pieces$1);
|
||
} else if (uri_string === "") {
|
||
return new Ok(new Uri(pieces.scheme, pieces.userinfo, pieces.host, pieces.port, original, pieces.query, pieces.fragment));
|
||
} else {
|
||
let $ = pop_codeunit(uri_string);
|
||
let rest;
|
||
rest = $[1];
|
||
loop$original = original;
|
||
loop$uri_string = rest;
|
||
loop$pieces = pieces;
|
||
loop$size = size3 + 1;
|
||
}
|
||
}
|
||
}
|
||
function parse_path(uri_string, pieces) {
|
||
return parse_path_loop(uri_string, uri_string, pieces, 0);
|
||
}
|
||
function parse_port_loop(loop$uri_string, loop$pieces, loop$port) {
|
||
while (true) {
|
||
let uri_string = loop$uri_string;
|
||
let pieces = loop$pieces;
|
||
let port = loop$port;
|
||
if (uri_string.startsWith("0")) {
|
||
let rest = uri_string.slice(1);
|
||
loop$uri_string = rest;
|
||
loop$pieces = pieces;
|
||
loop$port = port * 10;
|
||
} else if (uri_string.startsWith("1")) {
|
||
let rest = uri_string.slice(1);
|
||
loop$uri_string = rest;
|
||
loop$pieces = pieces;
|
||
loop$port = port * 10 + 1;
|
||
} else if (uri_string.startsWith("2")) {
|
||
let rest = uri_string.slice(1);
|
||
loop$uri_string = rest;
|
||
loop$pieces = pieces;
|
||
loop$port = port * 10 + 2;
|
||
} else if (uri_string.startsWith("3")) {
|
||
let rest = uri_string.slice(1);
|
||
loop$uri_string = rest;
|
||
loop$pieces = pieces;
|
||
loop$port = port * 10 + 3;
|
||
} else if (uri_string.startsWith("4")) {
|
||
let rest = uri_string.slice(1);
|
||
loop$uri_string = rest;
|
||
loop$pieces = pieces;
|
||
loop$port = port * 10 + 4;
|
||
} else if (uri_string.startsWith("5")) {
|
||
let rest = uri_string.slice(1);
|
||
loop$uri_string = rest;
|
||
loop$pieces = pieces;
|
||
loop$port = port * 10 + 5;
|
||
} else if (uri_string.startsWith("6")) {
|
||
let rest = uri_string.slice(1);
|
||
loop$uri_string = rest;
|
||
loop$pieces = pieces;
|
||
loop$port = port * 10 + 6;
|
||
} else if (uri_string.startsWith("7")) {
|
||
let rest = uri_string.slice(1);
|
||
loop$uri_string = rest;
|
||
loop$pieces = pieces;
|
||
loop$port = port * 10 + 7;
|
||
} else if (uri_string.startsWith("8")) {
|
||
let rest = uri_string.slice(1);
|
||
loop$uri_string = rest;
|
||
loop$pieces = pieces;
|
||
loop$port = port * 10 + 8;
|
||
} else if (uri_string.startsWith("9")) {
|
||
let rest = uri_string.slice(1);
|
||
loop$uri_string = rest;
|
||
loop$pieces = pieces;
|
||
loop$port = port * 10 + 9;
|
||
} else if (uri_string.startsWith("?")) {
|
||
let rest = uri_string.slice(1);
|
||
let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, pieces.host, new Some(port), pieces.path, pieces.query, pieces.fragment);
|
||
return parse_query_with_question_mark(rest, pieces$1);
|
||
} else if (uri_string.startsWith("#")) {
|
||
let rest = uri_string.slice(1);
|
||
let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, pieces.host, new Some(port), pieces.path, pieces.query, pieces.fragment);
|
||
return parse_fragment(rest, pieces$1);
|
||
} else if (uri_string.startsWith("/")) {
|
||
let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, pieces.host, new Some(port), pieces.path, pieces.query, pieces.fragment);
|
||
return parse_path(uri_string, pieces$1);
|
||
} else if (uri_string === "") {
|
||
return new Ok(new Uri(pieces.scheme, pieces.userinfo, pieces.host, new Some(port), pieces.path, pieces.query, pieces.fragment));
|
||
} else {
|
||
return new Error(undefined);
|
||
}
|
||
}
|
||
}
|
||
function parse_port(uri_string, pieces) {
|
||
if (uri_string.startsWith(":0")) {
|
||
let rest = uri_string.slice(2);
|
||
return parse_port_loop(rest, pieces, 0);
|
||
} else if (uri_string.startsWith(":1")) {
|
||
let rest = uri_string.slice(2);
|
||
return parse_port_loop(rest, pieces, 1);
|
||
} else if (uri_string.startsWith(":2")) {
|
||
let rest = uri_string.slice(2);
|
||
return parse_port_loop(rest, pieces, 2);
|
||
} else if (uri_string.startsWith(":3")) {
|
||
let rest = uri_string.slice(2);
|
||
return parse_port_loop(rest, pieces, 3);
|
||
} else if (uri_string.startsWith(":4")) {
|
||
let rest = uri_string.slice(2);
|
||
return parse_port_loop(rest, pieces, 4);
|
||
} else if (uri_string.startsWith(":5")) {
|
||
let rest = uri_string.slice(2);
|
||
return parse_port_loop(rest, pieces, 5);
|
||
} else if (uri_string.startsWith(":6")) {
|
||
let rest = uri_string.slice(2);
|
||
return parse_port_loop(rest, pieces, 6);
|
||
} else if (uri_string.startsWith(":7")) {
|
||
let rest = uri_string.slice(2);
|
||
return parse_port_loop(rest, pieces, 7);
|
||
} else if (uri_string.startsWith(":8")) {
|
||
let rest = uri_string.slice(2);
|
||
return parse_port_loop(rest, pieces, 8);
|
||
} else if (uri_string.startsWith(":9")) {
|
||
let rest = uri_string.slice(2);
|
||
return parse_port_loop(rest, pieces, 9);
|
||
} else if (uri_string === ":") {
|
||
return new Ok(pieces);
|
||
} else if (uri_string === "") {
|
||
return new Ok(pieces);
|
||
} else if (uri_string.startsWith("?")) {
|
||
let rest = uri_string.slice(1);
|
||
return parse_query_with_question_mark(rest, pieces);
|
||
} else if (uri_string.startsWith(":?")) {
|
||
let rest = uri_string.slice(2);
|
||
return parse_query_with_question_mark(rest, pieces);
|
||
} else if (uri_string.startsWith("#")) {
|
||
let rest = uri_string.slice(1);
|
||
return parse_fragment(rest, pieces);
|
||
} else if (uri_string.startsWith(":#")) {
|
||
let rest = uri_string.slice(2);
|
||
return parse_fragment(rest, pieces);
|
||
} else if (uri_string.startsWith("/")) {
|
||
return parse_path(uri_string, pieces);
|
||
} else if (uri_string.startsWith(":")) {
|
||
let rest = uri_string.slice(1);
|
||
if (rest.startsWith("/")) {
|
||
return parse_path(rest, pieces);
|
||
} else {
|
||
return new Error(undefined);
|
||
}
|
||
} else {
|
||
return new Error(undefined);
|
||
}
|
||
}
|
||
function parse_host_outside_of_brackets_loop(loop$original, loop$uri_string, loop$pieces, loop$size) {
|
||
while (true) {
|
||
let original = loop$original;
|
||
let uri_string = loop$uri_string;
|
||
let pieces = loop$pieces;
|
||
let size3 = loop$size;
|
||
if (uri_string === "") {
|
||
return new Ok(new Uri(pieces.scheme, pieces.userinfo, new Some(original), pieces.port, pieces.path, pieces.query, pieces.fragment));
|
||
} else if (uri_string.startsWith(":")) {
|
||
let host = string_codeunit_slice(original, 0, size3);
|
||
let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, new Some(host), pieces.port, pieces.path, pieces.query, pieces.fragment);
|
||
return parse_port(uri_string, pieces$1);
|
||
} else if (uri_string.startsWith("/")) {
|
||
let host = string_codeunit_slice(original, 0, size3);
|
||
let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, new Some(host), pieces.port, pieces.path, pieces.query, pieces.fragment);
|
||
return parse_path(uri_string, pieces$1);
|
||
} else if (uri_string.startsWith("?")) {
|
||
let rest = uri_string.slice(1);
|
||
let host = string_codeunit_slice(original, 0, size3);
|
||
let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, new Some(host), pieces.port, pieces.path, pieces.query, pieces.fragment);
|
||
return parse_query_with_question_mark(rest, pieces$1);
|
||
} else if (uri_string.startsWith("#")) {
|
||
let rest = uri_string.slice(1);
|
||
let host = string_codeunit_slice(original, 0, size3);
|
||
let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, new Some(host), pieces.port, pieces.path, pieces.query, pieces.fragment);
|
||
return parse_fragment(rest, pieces$1);
|
||
} else {
|
||
let $ = pop_codeunit(uri_string);
|
||
let rest;
|
||
rest = $[1];
|
||
loop$original = original;
|
||
loop$uri_string = rest;
|
||
loop$pieces = pieces;
|
||
loop$size = size3 + 1;
|
||
}
|
||
}
|
||
}
|
||
function parse_host_within_brackets_loop(loop$original, loop$uri_string, loop$pieces, loop$size) {
|
||
while (true) {
|
||
let original = loop$original;
|
||
let uri_string = loop$uri_string;
|
||
let pieces = loop$pieces;
|
||
let size3 = loop$size;
|
||
if (uri_string === "") {
|
||
return new Ok(new Uri(pieces.scheme, pieces.userinfo, new Some(uri_string), pieces.port, pieces.path, pieces.query, pieces.fragment));
|
||
} else if (uri_string.startsWith("]")) {
|
||
if (size3 === 0) {
|
||
let rest = uri_string.slice(1);
|
||
return parse_port(rest, pieces);
|
||
} else {
|
||
let rest = uri_string.slice(1);
|
||
let host = string_codeunit_slice(original, 0, size3 + 1);
|
||
let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, new Some(host), pieces.port, pieces.path, pieces.query, pieces.fragment);
|
||
return parse_port(rest, pieces$1);
|
||
}
|
||
} else if (uri_string.startsWith("/")) {
|
||
if (size3 === 0) {
|
||
return parse_path(uri_string, pieces);
|
||
} else {
|
||
let host = string_codeunit_slice(original, 0, size3);
|
||
let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, new Some(host), pieces.port, pieces.path, pieces.query, pieces.fragment);
|
||
return parse_path(uri_string, pieces$1);
|
||
}
|
||
} else if (uri_string.startsWith("?")) {
|
||
if (size3 === 0) {
|
||
let rest = uri_string.slice(1);
|
||
return parse_query_with_question_mark(rest, pieces);
|
||
} else {
|
||
let rest = uri_string.slice(1);
|
||
let host = string_codeunit_slice(original, 0, size3);
|
||
let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, new Some(host), pieces.port, pieces.path, pieces.query, pieces.fragment);
|
||
return parse_query_with_question_mark(rest, pieces$1);
|
||
}
|
||
} else if (uri_string.startsWith("#")) {
|
||
if (size3 === 0) {
|
||
let rest = uri_string.slice(1);
|
||
return parse_fragment(rest, pieces);
|
||
} else {
|
||
let rest = uri_string.slice(1);
|
||
let host = string_codeunit_slice(original, 0, size3);
|
||
let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, new Some(host), pieces.port, pieces.path, pieces.query, pieces.fragment);
|
||
return parse_fragment(rest, pieces$1);
|
||
}
|
||
} else {
|
||
let $ = pop_codeunit(uri_string);
|
||
let char;
|
||
let rest;
|
||
char = $[0];
|
||
rest = $[1];
|
||
let $1 = is_valid_host_within_brackets_char(char);
|
||
if ($1) {
|
||
loop$original = original;
|
||
loop$uri_string = rest;
|
||
loop$pieces = pieces;
|
||
loop$size = size3 + 1;
|
||
} else {
|
||
return parse_host_outside_of_brackets_loop(original, original, pieces, 0);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
function parse_host_within_brackets(uri_string, pieces) {
|
||
return parse_host_within_brackets_loop(uri_string, uri_string, pieces, 0);
|
||
}
|
||
function parse_host_outside_of_brackets(uri_string, pieces) {
|
||
return parse_host_outside_of_brackets_loop(uri_string, uri_string, pieces, 0);
|
||
}
|
||
function parse_host(uri_string, pieces) {
|
||
if (uri_string.startsWith("[")) {
|
||
return parse_host_within_brackets(uri_string, pieces);
|
||
} else if (uri_string.startsWith(":")) {
|
||
let pieces$1 = new Uri(pieces.scheme, pieces.userinfo, new Some(""), pieces.port, pieces.path, pieces.query, pieces.fragment);
|
||
return parse_port(uri_string, pieces$1);
|
||
} else if (uri_string === "") {
|
||
return new Ok(new Uri(pieces.scheme, pieces.userinfo, new Some(""), pieces.port, pieces.path, pieces.query, pieces.fragment));
|
||
} else {
|
||
return parse_host_outside_of_brackets(uri_string, pieces);
|
||
}
|
||
}
|
||
function parse_userinfo_loop(loop$original, loop$uri_string, loop$pieces, loop$size) {
|
||
while (true) {
|
||
let original = loop$original;
|
||
let uri_string = loop$uri_string;
|
||
let pieces = loop$pieces;
|
||
let size3 = loop$size;
|
||
if (uri_string.startsWith("@")) {
|
||
if (size3 === 0) {
|
||
let rest = uri_string.slice(1);
|
||
return parse_host(rest, pieces);
|
||
} else {
|
||
let rest = uri_string.slice(1);
|
||
let userinfo = string_codeunit_slice(original, 0, size3);
|
||
let pieces$1 = new Uri(pieces.scheme, new Some(userinfo), pieces.host, pieces.port, pieces.path, pieces.query, pieces.fragment);
|
||
return parse_host(rest, pieces$1);
|
||
}
|
||
} else if (uri_string === "") {
|
||
return parse_host(original, pieces);
|
||
} else if (uri_string.startsWith("/")) {
|
||
return parse_host(original, pieces);
|
||
} else if (uri_string.startsWith("?")) {
|
||
return parse_host(original, pieces);
|
||
} else if (uri_string.startsWith("#")) {
|
||
return parse_host(original, pieces);
|
||
} else {
|
||
let $ = pop_codeunit(uri_string);
|
||
let rest;
|
||
rest = $[1];
|
||
loop$original = original;
|
||
loop$uri_string = rest;
|
||
loop$pieces = pieces;
|
||
loop$size = size3 + 1;
|
||
}
|
||
}
|
||
}
|
||
function parse_authority_pieces(string5, pieces) {
|
||
return parse_userinfo_loop(string5, string5, pieces, 0);
|
||
}
|
||
function parse_authority_with_slashes(uri_string, pieces) {
|
||
if (uri_string === "//") {
|
||
return new Ok(new Uri(pieces.scheme, pieces.userinfo, new Some(""), pieces.port, pieces.path, pieces.query, pieces.fragment));
|
||
} else if (uri_string.startsWith("//")) {
|
||
let rest = uri_string.slice(2);
|
||
return parse_authority_pieces(rest, pieces);
|
||
} else {
|
||
return parse_path(uri_string, pieces);
|
||
}
|
||
}
|
||
function parse_scheme_loop(loop$original, loop$uri_string, loop$pieces, loop$size) {
|
||
while (true) {
|
||
let original = loop$original;
|
||
let uri_string = loop$uri_string;
|
||
let pieces = loop$pieces;
|
||
let size3 = loop$size;
|
||
if (uri_string.startsWith("/")) {
|
||
if (size3 === 0) {
|
||
return parse_authority_with_slashes(uri_string, pieces);
|
||
} else {
|
||
let scheme = string_codeunit_slice(original, 0, size3);
|
||
let pieces$1 = new Uri(new Some(lowercase(scheme)), pieces.userinfo, pieces.host, pieces.port, pieces.path, pieces.query, pieces.fragment);
|
||
return parse_authority_with_slashes(uri_string, pieces$1);
|
||
}
|
||
} else if (uri_string.startsWith("?")) {
|
||
if (size3 === 0) {
|
||
let rest = uri_string.slice(1);
|
||
return parse_query_with_question_mark(rest, pieces);
|
||
} else {
|
||
let rest = uri_string.slice(1);
|
||
let scheme = string_codeunit_slice(original, 0, size3);
|
||
let pieces$1 = new Uri(new Some(lowercase(scheme)), pieces.userinfo, pieces.host, pieces.port, pieces.path, pieces.query, pieces.fragment);
|
||
return parse_query_with_question_mark(rest, pieces$1);
|
||
}
|
||
} else if (uri_string.startsWith("#")) {
|
||
if (size3 === 0) {
|
||
let rest = uri_string.slice(1);
|
||
return parse_fragment(rest, pieces);
|
||
} else {
|
||
let rest = uri_string.slice(1);
|
||
let scheme = string_codeunit_slice(original, 0, size3);
|
||
let pieces$1 = new Uri(new Some(lowercase(scheme)), pieces.userinfo, pieces.host, pieces.port, pieces.path, pieces.query, pieces.fragment);
|
||
return parse_fragment(rest, pieces$1);
|
||
}
|
||
} else if (uri_string.startsWith(":")) {
|
||
if (size3 === 0) {
|
||
return new Error(undefined);
|
||
} else {
|
||
let rest = uri_string.slice(1);
|
||
let scheme = string_codeunit_slice(original, 0, size3);
|
||
let pieces$1 = new Uri(new Some(lowercase(scheme)), pieces.userinfo, pieces.host, pieces.port, pieces.path, pieces.query, pieces.fragment);
|
||
return parse_authority_with_slashes(rest, pieces$1);
|
||
}
|
||
} else if (uri_string === "") {
|
||
return new Ok(new Uri(pieces.scheme, pieces.userinfo, pieces.host, pieces.port, original, pieces.query, pieces.fragment));
|
||
} else {
|
||
let $ = pop_codeunit(uri_string);
|
||
let rest;
|
||
rest = $[1];
|
||
loop$original = original;
|
||
loop$uri_string = rest;
|
||
loop$pieces = pieces;
|
||
loop$size = size3 + 1;
|
||
}
|
||
}
|
||
}
|
||
function to_string5(uri) {
|
||
let _block;
|
||
let $ = uri.fragment;
|
||
if ($ instanceof Some) {
|
||
let fragment3 = $[0];
|
||
_block = toList(["#", fragment3]);
|
||
} else {
|
||
_block = toList([]);
|
||
}
|
||
let parts = _block;
|
||
let _block$1;
|
||
let $1 = uri.query;
|
||
if ($1 instanceof Some) {
|
||
let query = $1[0];
|
||
_block$1 = prepend("?", prepend(query, parts));
|
||
} else {
|
||
_block$1 = parts;
|
||
}
|
||
let parts$1 = _block$1;
|
||
let parts$2 = prepend(uri.path, parts$1);
|
||
let _block$2;
|
||
let $2 = uri.host;
|
||
let $3 = starts_with(uri.path, "/");
|
||
if ($2 instanceof Some && !$3) {
|
||
let host = $2[0];
|
||
if (host !== "") {
|
||
_block$2 = prepend("/", parts$2);
|
||
} else {
|
||
_block$2 = parts$2;
|
||
}
|
||
} else {
|
||
_block$2 = parts$2;
|
||
}
|
||
let parts$3 = _block$2;
|
||
let _block$3;
|
||
let $4 = uri.host;
|
||
let $5 = uri.port;
|
||
if ($4 instanceof Some && $5 instanceof Some) {
|
||
let port = $5[0];
|
||
_block$3 = prepend(":", prepend(to_string(port), parts$3));
|
||
} else {
|
||
_block$3 = parts$3;
|
||
}
|
||
let parts$4 = _block$3;
|
||
let _block$4;
|
||
let $6 = uri.scheme;
|
||
let $7 = uri.userinfo;
|
||
let $8 = uri.host;
|
||
if ($6 instanceof Some) {
|
||
if ($7 instanceof Some) {
|
||
if ($8 instanceof Some) {
|
||
let s = $6[0];
|
||
let u = $7[0];
|
||
let h = $8[0];
|
||
_block$4 = prepend(s, prepend("://", prepend(u, prepend("@", prepend(h, parts$4)))));
|
||
} else {
|
||
let s = $6[0];
|
||
_block$4 = prepend(s, prepend(":", parts$4));
|
||
}
|
||
} else if ($8 instanceof Some) {
|
||
let s = $6[0];
|
||
let h = $8[0];
|
||
_block$4 = prepend(s, prepend("://", prepend(h, parts$4)));
|
||
} else {
|
||
let s = $6[0];
|
||
_block$4 = prepend(s, prepend(":", parts$4));
|
||
}
|
||
} else if ($7 instanceof None && $8 instanceof Some) {
|
||
let h = $8[0];
|
||
_block$4 = prepend("//", prepend(h, parts$4));
|
||
} else {
|
||
_block$4 = parts$4;
|
||
}
|
||
let parts$5 = _block$4;
|
||
return concat2(parts$5);
|
||
}
|
||
function parse2(uri_string) {
|
||
return parse_scheme_loop(uri_string, uri_string, empty3, 0);
|
||
}
|
||
|
||
// build/dev/javascript/gleam_http/gleam/http/request.mjs
|
||
class Request extends CustomType {
|
||
constructor(method, headers, body, scheme, host, port, path, query) {
|
||
super();
|
||
this.method = method;
|
||
this.headers = headers;
|
||
this.body = body;
|
||
this.scheme = scheme;
|
||
this.host = host;
|
||
this.port = port;
|
||
this.path = path;
|
||
this.query = query;
|
||
}
|
||
}
|
||
function to_uri(request) {
|
||
return new Uri(new Some(scheme_to_string(request.scheme)), new None, new Some(request.host), request.port, request.path, request.query, new None);
|
||
}
|
||
function from_uri(uri) {
|
||
return try$((() => {
|
||
let _pipe = uri.scheme;
|
||
let _pipe$1 = unwrap(_pipe, "");
|
||
return scheme_from_string(_pipe$1);
|
||
})(), (scheme) => {
|
||
return try$((() => {
|
||
let _pipe = uri.host;
|
||
return to_result(_pipe, undefined);
|
||
})(), (host) => {
|
||
let req = new Request(new Get, toList([]), "", scheme, host, uri.port, uri.path, uri.query);
|
||
return new Ok(req);
|
||
});
|
||
});
|
||
}
|
||
function set_header2(request, key, value2) {
|
||
let headers = key_set(request.headers, lowercase(key), value2);
|
||
return new Request(request.method, headers, request.body, request.scheme, request.host, request.port, request.path, request.query);
|
||
}
|
||
function set_body(req, body) {
|
||
return new Request(req.method, req.headers, body, req.scheme, req.host, req.port, req.path, req.query);
|
||
}
|
||
function set_method(req, method) {
|
||
return new Request(method, req.headers, req.body, req.scheme, req.host, req.port, req.path, req.query);
|
||
}
|
||
// build/dev/javascript/gleam_javascript/gleam_javascript_ffi.mjs
|
||
class PromiseLayer {
|
||
constructor(promise) {
|
||
this.promise = promise;
|
||
}
|
||
static wrap(value2) {
|
||
return value2 instanceof Promise ? new PromiseLayer(value2) : value2;
|
||
}
|
||
static unwrap(value2) {
|
||
return value2 instanceof PromiseLayer ? value2.promise : value2;
|
||
}
|
||
}
|
||
function resolve(value2) {
|
||
return Promise.resolve(PromiseLayer.wrap(value2));
|
||
}
|
||
function then_await(promise, fn) {
|
||
return promise.then((value2) => fn(PromiseLayer.unwrap(value2)));
|
||
}
|
||
function map_promise(promise, fn) {
|
||
return promise.then((value2) => PromiseLayer.wrap(fn(PromiseLayer.unwrap(value2))));
|
||
}
|
||
|
||
// build/dev/javascript/gleam_javascript/gleam/javascript/promise.mjs
|
||
function tap(promise, callback) {
|
||
let _pipe = promise;
|
||
return map_promise(_pipe, (a) => {
|
||
callback(a);
|
||
return a;
|
||
});
|
||
}
|
||
function try_await(promise, callback) {
|
||
let _pipe = promise;
|
||
return then_await(_pipe, (result) => {
|
||
if (result instanceof Ok) {
|
||
let a = result[0];
|
||
return callback(a);
|
||
} else {
|
||
let e = result[0];
|
||
return resolve(new Error(e));
|
||
}
|
||
});
|
||
}
|
||
// build/dev/javascript/gleam_fetch/gleam_fetch_ffi.mjs
|
||
async function raw_send(request) {
|
||
try {
|
||
return new Ok(await fetch(request));
|
||
} catch (error) {
|
||
return new Error(new NetworkError(error.toString()));
|
||
}
|
||
}
|
||
function from_fetch_response(response) {
|
||
return new Response(response.status, List.fromArray([...response.headers]), response);
|
||
}
|
||
function request_common(request) {
|
||
let url = to_string5(to_uri(request));
|
||
let method = method_to_string(request.method).toUpperCase();
|
||
let options = {
|
||
headers: make_headers(request.headers),
|
||
method
|
||
};
|
||
return [url, options];
|
||
}
|
||
function to_fetch_request(request) {
|
||
let [url, options] = request_common(request);
|
||
if (options.method !== "GET" && options.method !== "HEAD")
|
||
options.body = request.body;
|
||
return new globalThis.Request(url, options);
|
||
}
|
||
function make_headers(headersList) {
|
||
let headers = new globalThis.Headers;
|
||
for (let [k, v] of headersList)
|
||
headers.append(k.toLowerCase(), v);
|
||
return headers;
|
||
}
|
||
async function read_text_body(response) {
|
||
let body;
|
||
try {
|
||
body = await response.body.text();
|
||
} catch (error) {
|
||
return new Error(new UnableToReadBody);
|
||
}
|
||
return new Ok(response.withFields({ body }));
|
||
}
|
||
|
||
// build/dev/javascript/gleam_fetch/gleam/fetch.mjs
|
||
class NetworkError extends CustomType {
|
||
constructor($0) {
|
||
super();
|
||
this[0] = $0;
|
||
}
|
||
}
|
||
class UnableToReadBody extends CustomType {
|
||
}
|
||
function send2(request) {
|
||
let _pipe = request;
|
||
let _pipe$1 = to_fetch_request(_pipe);
|
||
let _pipe$2 = raw_send(_pipe$1);
|
||
return try_await(_pipe$2, (resp) => {
|
||
return resolve(new Ok(from_fetch_response(resp)));
|
||
});
|
||
}
|
||
// build/dev/javascript/rsvp/rsvp.ffi.mjs
|
||
var from_relative_url = (url_string) => {
|
||
if (!globalThis.location)
|
||
return new Error(undefined);
|
||
const url = new URL(url_string, globalThis.location.href);
|
||
const uri = uri_from_url(url);
|
||
return new Ok(uri);
|
||
};
|
||
var uri_from_url = (url) => {
|
||
const optional = (value2) => value2 ? new Some(value2) : new None;
|
||
return new Uri(optional(url.protocol?.slice(0, -1)), new None, optional(url.hostname), optional(url.port && Number(url.port)), url.pathname, optional(url.search?.slice(1)), optional(url.hash?.slice(1)));
|
||
};
|
||
|
||
// build/dev/javascript/rsvp/rsvp.mjs
|
||
class BadBody extends CustomType {
|
||
}
|
||
class BadUrl extends CustomType {
|
||
constructor($0) {
|
||
super();
|
||
this[0] = $0;
|
||
}
|
||
}
|
||
class HttpError extends CustomType {
|
||
constructor($0) {
|
||
super();
|
||
this[0] = $0;
|
||
}
|
||
}
|
||
class NetworkError2 extends CustomType {
|
||
}
|
||
class UnhandledResponse extends CustomType {
|
||
constructor($0) {
|
||
super();
|
||
this[0] = $0;
|
||
}
|
||
}
|
||
class Handler2 extends CustomType {
|
||
constructor(run2) {
|
||
super();
|
||
this.run = run2;
|
||
}
|
||
}
|
||
function expect_ok_response(handler) {
|
||
return new Handler2((result) => {
|
||
return handler(try$(result, (response) => {
|
||
let $ = response.status;
|
||
let code = $;
|
||
if (code >= 200 && code < 300) {
|
||
return new Ok(response);
|
||
} else {
|
||
let code2 = $;
|
||
if (code2 >= 400 && code2 < 600) {
|
||
return new Error(new HttpError(response));
|
||
} else {
|
||
return new Error(new UnhandledResponse(response));
|
||
}
|
||
}
|
||
}));
|
||
});
|
||
}
|
||
function do_send(request, handler) {
|
||
return from2((dispatch2) => {
|
||
let _pipe = send2(request);
|
||
let _pipe$1 = try_await(_pipe, read_text_body);
|
||
let _pipe$2 = map_promise(_pipe$1, (_capture) => {
|
||
return map_error(_capture, (error) => {
|
||
if (error instanceof NetworkError) {
|
||
return new NetworkError2;
|
||
} else if (error instanceof UnableToReadBody) {
|
||
return new BadBody;
|
||
} else {
|
||
return new BadBody;
|
||
}
|
||
});
|
||
});
|
||
let _pipe$3 = map_promise(_pipe$2, handler.run);
|
||
tap(_pipe$3, dispatch2);
|
||
return;
|
||
});
|
||
}
|
||
function send3(request, handler) {
|
||
return do_send(request, handler);
|
||
}
|
||
function reject(err, handler) {
|
||
return from2((dispatch2) => {
|
||
let _pipe = new Error(err);
|
||
let _pipe$1 = handler.run(_pipe);
|
||
return dispatch2(_pipe$1);
|
||
});
|
||
}
|
||
function to_uri2(uri_string) {
|
||
let _block;
|
||
if (uri_string.startsWith("./")) {
|
||
_block = from_relative_url(uri_string);
|
||
} else if (uri_string.startsWith("/")) {
|
||
_block = from_relative_url(uri_string);
|
||
} else {
|
||
_block = parse2(uri_string);
|
||
}
|
||
let _pipe = _block;
|
||
return replace_error(_pipe, new BadUrl(uri_string));
|
||
}
|
||
function post(url, body, handler) {
|
||
let $ = to_uri2(url);
|
||
if ($ instanceof Ok) {
|
||
let uri = $[0];
|
||
let $1 = from_uri(uri);
|
||
if ($1 instanceof Ok) {
|
||
let request = $1[0];
|
||
let _pipe = request;
|
||
let _pipe$1 = set_method(_pipe, new Post);
|
||
let _pipe$2 = set_header2(_pipe$1, "content-type", "application/json");
|
||
let _pipe$3 = set_body(_pipe$2, to_string2(body));
|
||
return send3(_pipe$3, handler);
|
||
} else {
|
||
return reject(new BadUrl(url), handler);
|
||
}
|
||
} else {
|
||
let err = $[0];
|
||
return reject(err, handler);
|
||
}
|
||
}
|
||
// build/dev/javascript/client/shared.mjs
|
||
class GroceryItem extends CustomType {
|
||
constructor(name, quantity) {
|
||
super();
|
||
this.name = name;
|
||
this.quantity = quantity;
|
||
}
|
||
}
|
||
function grocery_item_to_json(grocery_item) {
|
||
let name;
|
||
let quantity;
|
||
name = grocery_item.name;
|
||
quantity = grocery_item.quantity;
|
||
return object2(toList([["name", string3(name)], ["quantity", int3(quantity)]]));
|
||
}
|
||
function grocery_list_to_json(items) {
|
||
return array2(items, grocery_item_to_json);
|
||
}
|
||
|
||
// build/dev/javascript/client/client.mjs
|
||
var FILEPATH = "src/client.gleam";
|
||
|
||
class Model extends CustomType {
|
||
constructor(items, new_item, saving, error) {
|
||
super();
|
||
this.items = items;
|
||
this.new_item = new_item;
|
||
this.saving = saving;
|
||
this.error = error;
|
||
}
|
||
}
|
||
|
||
class ServerSavedList extends CustomType {
|
||
constructor($0) {
|
||
super();
|
||
this[0] = $0;
|
||
}
|
||
}
|
||
|
||
class UserAddedItem extends CustomType {
|
||
}
|
||
|
||
class UserTypedNewItem extends CustomType {
|
||
constructor($0) {
|
||
super();
|
||
this[0] = $0;
|
||
}
|
||
}
|
||
|
||
class UserSavedList extends CustomType {
|
||
}
|
||
|
||
class UserUpdatedQuantity extends CustomType {
|
||
constructor(index5, quantity) {
|
||
super();
|
||
this.index = index5;
|
||
this.quantity = quantity;
|
||
}
|
||
}
|
||
function init(items) {
|
||
let model = new Model(items, "", false, new None);
|
||
return [model, none()];
|
||
}
|
||
function save_list(items) {
|
||
let body = grocery_list_to_json(items);
|
||
let url = "/api/groceries";
|
||
return post(url, body, expect_ok_response((var0) => {
|
||
return new ServerSavedList(var0);
|
||
}));
|
||
}
|
||
function update2(model, msg) {
|
||
if (msg instanceof ServerSavedList) {
|
||
let $ = msg[0];
|
||
if ($ instanceof Ok) {
|
||
return [
|
||
new Model(model.items, model.new_item, false, new None),
|
||
none()
|
||
];
|
||
} else {
|
||
return [
|
||
new Model(model.items, model.new_item, false, new Some("Failed to save list")),
|
||
none()
|
||
];
|
||
}
|
||
} else if (msg instanceof UserAddedItem) {
|
||
let $ = model.new_item;
|
||
if ($ === "") {
|
||
return [model, none()];
|
||
} else {
|
||
let name = $;
|
||
let item = new GroceryItem(name, 1);
|
||
let updated_items = append2(model.items, toList([item]));
|
||
return [
|
||
new Model(updated_items, "", model.saving, model.error),
|
||
none()
|
||
];
|
||
}
|
||
} else if (msg instanceof UserTypedNewItem) {
|
||
let text4 = msg[0];
|
||
return [
|
||
new Model(model.items, text4, model.saving, model.error),
|
||
none()
|
||
];
|
||
} else if (msg instanceof UserSavedList) {
|
||
return [
|
||
new Model(model.items, model.new_item, true, model.error),
|
||
save_list(model.items)
|
||
];
|
||
} else {
|
||
let index5 = msg.index;
|
||
let quantity = msg.quantity;
|
||
let updated_items = index_map(model.items, (item, item_index) => {
|
||
let $ = item_index === index5;
|
||
if ($) {
|
||
return new GroceryItem(item.name, quantity);
|
||
} else {
|
||
return item;
|
||
}
|
||
});
|
||
return [
|
||
new Model(updated_items, model.new_item, model.saving, model.error),
|
||
none()
|
||
];
|
||
}
|
||
}
|
||
function view_new_item(new_item) {
|
||
return div(toList([]), toList([
|
||
input(toList([
|
||
placeholder("Enter item name"),
|
||
value(new_item),
|
||
on_input((var0) => {
|
||
return new UserTypedNewItem(var0);
|
||
})
|
||
])),
|
||
button(toList([on_click(new UserAddedItem)]), toList([text3("Add")]))
|
||
]));
|
||
}
|
||
function view_grocery_item(item, index5) {
|
||
return div(toList([styles(toList([["display", "flex"], ["gap", "1em"]]))]), toList([
|
||
span(toList([style("flex", "1")]), toList([text3(item.name)])),
|
||
input(toList([
|
||
style("width", "4em"),
|
||
type_("number"),
|
||
value(to_string(item.quantity)),
|
||
min2("0"),
|
||
on_input((value2) => {
|
||
let _pipe = unwrap2(parse_int(value2), 0);
|
||
return ((_capture) => {
|
||
return new UserUpdatedQuantity(index5, _capture);
|
||
})(_pipe);
|
||
})
|
||
]))
|
||
]));
|
||
}
|
||
function view_grocery_list(items) {
|
||
if (items instanceof Empty) {
|
||
return p(toList([]), toList([text3("No items in your list yet.")]));
|
||
} else {
|
||
return ul(toList([]), index_map(items, (item, index5) => {
|
||
return li(toList([]), toList([view_grocery_item(item, index5)]));
|
||
}));
|
||
}
|
||
}
|
||
function view(model) {
|
||
let styles2 = toList([
|
||
["max-width", "30ch"],
|
||
["margin", "0 auto"],
|
||
["display", "flex"],
|
||
["flex-direction", "column"],
|
||
["gap", "1em"]
|
||
]);
|
||
return div(toList([styles(styles2)]), toList([
|
||
h1(toList([]), toList([text3("Grocery List")])),
|
||
view_grocery_list(model.items),
|
||
view_new_item(model.new_item),
|
||
div(toList([]), toList([
|
||
button(toList([
|
||
on_click(new UserSavedList),
|
||
disabled(model.saving)
|
||
]), toList([
|
||
text3((() => {
|
||
let $ = model.saving;
|
||
if ($) {
|
||
return "Saving...";
|
||
} else {
|
||
return "Save List";
|
||
}
|
||
})())
|
||
]))
|
||
])),
|
||
(() => {
|
||
let $ = model.error;
|
||
if ($ instanceof Some) {
|
||
let error = $[0];
|
||
return div(toList([style("color", "red")]), toList([text3(error)]));
|
||
} else {
|
||
return none2();
|
||
}
|
||
})()
|
||
]));
|
||
}
|
||
function main() {
|
||
let app = application(init, update2, view);
|
||
let $ = start4(app, "#app", toList([]));
|
||
if (!($ instanceof Ok)) {
|
||
throw makeError("let_assert", FILEPATH, "client", 17, "main", "Pattern match failed, no pattern matched the value.", { value: $, start: 417, end: 465, pattern_start: 428, pattern_end: 433 });
|
||
}
|
||
return;
|
||
}
|
||
|
||
// .lustre/build/client.mjs
|
||
main();
|