Frontend uudelleenrakennettu: Astro-komponentit, Wasm pääsäikeessä, ei Workeria

Vanha frontend siirretty temp/. Uusi rakenne:
- StatusBar.astro, Terminal.astro, Editor.astro, Guide.astro
- global.css erillinen
- Wasm pääsäikeessä (ei Worker — yksinkertainen, debugattava)
- Tab-completion, dropdown, projektikortti, Monaco, GUIDE.md
- Ei tokenisointia eikä koodilaboratoriota

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jaakko Vanhala
2026-04-09 20:17:39 +03:00
parent e3fdb91ac5
commit a8c4af0975
9617 changed files with 996171 additions and 5349 deletions

View File

@@ -0,0 +1,51 @@
const own = {}.hasOwnProperty
/**
* Perform the specified action for each element in an array.
* When `callbackFn` returns a `number`, moves to the element at that index
* next.
*
* @param {unknown[]} values
* Values to iterate over.
* @param {(this: unknown, value: unknown, index: number, array: unknown[]) => number | void} callbackFn
* Function called for each element.
* Can return the `index` to move to next.
* @param {unknown} [thisArg]
* Optional object assigned as `this` in `callbackFn`.
* @returns {void}
*/
export function arrayIterate(values, callbackFn, thisArg) {
let index = -1
if (!values) {
throw new Error('Iterate requires that |this| not be ' + values)
}
if (!own.call(values, 'length')) {
throw new Error('Iterate requires that |this| has a `length`')
}
if (typeof callbackFn !== 'function') {
throw new TypeError('`callback` must be a function')
}
// The length might change, so we do not cache it.
while (++index < values.length) {
// Skip missing values.
if (!(index in values)) {
continue
}
const result = callbackFn.call(thisArg, values[index], index, values)
// If `callback` returns a `number`, move `index` over to `number`.
if (typeof result === 'number') {
// Make sure that negative numbers do not break the loop.
if (result < 0) {
index = 0
}
index = result - 1
}
}
}