import init, { make_interp } from './pkg/automathon.js'; function wordlistElts(wordlist) { return wordlist.map((bc, i) => { const bcElt = document.createElement('x-bytecode'); bcElt.setAttribute('x-index', i); for (let i = 0; i < bc.len(); i++) { const opElt = document.createElement('x-op'); opElt.setAttribute('x-index', i); opElt.textContent = bc.at(i); bcElt.appendChild(opElt); } return bcElt; }) } function selectorForIP(word, offset) { const sel = `#wordlist x-bytecode[x-index='${word}'] x-op[x-index='${offset}']`; console.debug('using sel', sel); return sel; } async function loaded() { console.debug('running init'); const mod = await init(); console.debug('init done', mod); const interp = make_interp(); document.querySelector('#compile').onclick = e => { console.debug('compile clicked', e); let wordlistContainer = document.querySelector('#wordlist'); while (wordlistContainer.lastChild) { console.debug('removing child', wordlistContainer.lastChild) wordlistContainer.removeChild(wordlistContainer.lastChild); } console.debug('container has firstchild', wordlistContainer.firstChild) // always add a newline until i decide what to do with the parser. const text = document.querySelector('textarea').value + '\n'; const start = performance.now(); const res = interp.compile(text); const end = performance.now(); console.info(`compile took ${end-start} ms`); if (res) { const wordlist = wordlistElts(interp.wordlist()); wordlist.forEach(elt => wordlistContainer.appendChild(elt)); const sel = selectorForIP(0, 0); document.querySelectorAll(sel).forEach(e => { e.classList.add('ip') }); } }; document.querySelector('#tick').onclick = e => { console.debug('tick clicked', e); interp.tick(); console.info('callstack', interp.callstack()); console.info('stack', interp.stack()); const { word, offset } = interp.ip(); console.info('ip', word, offset); document.querySelectorAll('#wordlist .ip').forEach(e => e.classList.remove('ip')); const sel = selectorForIP(word, offset); document.querySelectorAll(sel).forEach(e => { e.classList.add('ip') }); }; document.querySelector('#run').onclick = e => { console.debug('run clicked', e); const start = performance.now(); let tickCount = 0; for (let i = 0; i < 1_000_000; i++) { tickCount += interp.run(); } const end = performance.now(); console.info(`run took ${end-start} ms for ${tickCount} ticks (${(end-start)/tickCount * 1000000} µs/tick).`); console.info('result', interp.stack()); }; window.interp = interp; } document.addEventListener('DOMContentLoaded', loaded);