import {Part} from "./part"; export type PartTemplate = Omit>, 'id'> & TMeta; export type PartPool = { parts: Part[]; 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 parts = createParts(template, count, idPrefix); const available = [...parts]; 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 allParts = pools.flatMap(p => p.parts); const template = pools[0].template; const available = allParts.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; }, }; }