import {Part} from "./part"; export type PartTemplate = Omit>, 'id'> & TMeta; export type PartPool = { parts: Record>; template: PartTemplate; draw(): Part | undefined; return(part: Part): void; remaining(): number; }; export function createPart( template: PartTemplate, id: string ): Part { return { regionId: '', position: [], ...template, id, } as Part; } export function createParts( template: PartTemplate, count: number, idPrefix: string ): Part[] { const parts: Part[] = []; for (let i = 0; i < count; i++) { parts.push(createPart(template, `${idPrefix}-${i + 1}`)); } return parts; } export function createPartPool( template: PartTemplate, count: number, idPrefix: string ): PartPool { const partsArray = createParts(template, count, idPrefix); const parts: Record> = {}; for (const part of partsArray) { parts[part.id] = part; } const available = [...partsArray]; return { parts, template, draw() { return available.pop(); }, return(part: Part) { part.regionId = ''; part.position = []; available.push(part); }, remaining() { return available.length; }, }; } export function mergePartPools( ...pools: PartPool[] ): PartPool { if (pools.length === 0) { return createPartPool({} as PartTemplate, 0, 'merged'); } const allPartsArray = pools.flatMap(p => Object.values(p.parts)); const allParts: Record> = {}; for (const part of allPartsArray) { allParts[part.id] = part; } const template = pools[0].template; const available = allPartsArray.filter(p => p.regionId === ''); return { parts: allParts, template, draw() { return available.pop(); }, return(part: Part) { part.regionId = ''; part.position = []; available.push(part); }, remaining() { return available.length; }, }; }