import assert from 'node:assert/strict'; // Two row delays plus three horizontal shift registers: valid 3x3, one channel. export function streamWindows(pixels, width, stalls = new Set()) { const previous = Array(width).fill(0), older = Array(width).fill(0); const window = Array.from({length: 3}, () => Array(3).fill(0)); const windows = []; let accepted = 0, cycles = 0; while (accepted < pixels.length) { if (stalls.has(cycles++)) continue; const row = Math.floor(accepted / width), col = accepted % width; if (col === 0) window.forEach(r => r.fill(0)); const current = pixels[accepted]; [older[col], previous[col], current].forEach((v, r) => {window[r].shift(); window[r].push(v);}); older[col] = previous[col]; previous[col] = current; if (row >= 2 && col >= 2) windows.push({acceptedIndex: accepted, cycle: cycles - 1, values: window.flat()}); accepted++; } return {windows, accepted, cycles, storageSamples: 2 * width + 9}; } const pixels = Array.from({length: 16}, (_, i) => i + 1); const normal = streamWindows(pixels, 4); const paused = streamWindows(pixels, 4, new Set([2, 3, 12])); assert.deepEqual(normal.windows.map(w => w.acceptedIndex), [10, 11, 14, 15]); assert.deepEqual(normal.windows[0].values, [1, 2, 3, 5, 6, 7, 9, 10, 11]); assert.deepEqual(paused.windows.map(w => w.values), normal.windows.map(w => w.values)); assert.equal(paused.cycles, 19); console.log(JSON.stringify({normal, paused}));