export function arrayOfSize(size: number) { return new Array(size).fill(null); } export function groupIntoRows(items: T[], columns: number) { return items.reduce((acc, cur, i) => { if (i % columns === 0) { return [...acc, [cur]]; } acc[acc.length - 1] = [...acc[acc.length - 1]!, cur]; return acc; }, [] as T[][]); } export function groupIntoCols(items: T[], columns: number) { const rows = groupIntoRows(items, columns); return arrayOfSize(rows[0]!.length).map((_, x) => rows.map((row) => row[x] as T), ); } // Given a row or column, return an array containing the // number of contiguous values grouped by variant. // E.g. given the block [0, 1, 1, 0, 2, 1], return [2, 1] for variant 1. export function groupByValue>(block: T, value: T[number]) { const [first, ...rest] = block; const grouped = rest .reduce( (acc, cur) => { if (acc.at(acc.length - 1)![0] === cur) { acc[acc.length - 1] = [...acc[acc.length - 1]!, cur]; return acc; } return [...acc, [cur]]; }, [[first]], ) .reduce((acc, cur) => { if (cur[0] === value) { return [...acc, cur.length]; } return acc; }, []); if (grouped.length === 0) { return [0]; } return grouped; } export function generateSeedForDay(day: Date) { return `${day.getFullYear()}${day.getMonth().toString().padStart(2, "0")}${day.getDate().toString().padStart(2, "0")}`; }