/** * hasselink/tiling/echo-pixels.ts * ------------------------------------------------------ * Type-level constructors for Echo pixels. * * This mirrors `payload-pixels.ts` but assigns PixelRole="Echo". * Echo pixels are the intended carrier for "prev-in-prev" redundancy: * older history encoded at finer scales. */ import type { BlockAssignment, PixelAssignment, TypedTiledPixel } from "./tiling.ts"; import type { Grid4x4 } from "./grid.ts"; export type EchoPixel< B extends BlockAssignment<2>, P extends readonly [number, number] > = PixelAssignment<2> & { owner: B["owner"]; level: 2; block: B["block"]; role: B["role"]; pixel: TypedTiledPixel<2> & { block: B["block"]; index: { ix: P[0]; iy: P[1] }; role: "Echo"; channel: "Prev"; }; }; type UnionToIntersection = (U extends unknown ? (x: U) => void : never) extends (x: infer I) => void ? I : never; type UnionToTuple = [U] extends [never] ? T : UnionToIntersection void : never> extends (u: infer I) => void ? UnionToTuple, [...T, I]> : T; export type EchoPixelsForBlock< B extends BlockAssignment<2> > = UnionToTuple< Grid4x4 extends infer P ? P extends readonly [number, number] ? EchoPixel : never : never >;