import type { BehaviorAsset } from '../model/Asset'; import type { Project } from '../model/Project'; function firstFree(taken: ReadonlySet, candidate: (i: number) => string, from: number): string { for (let i = from; ; i++) { const name = candidate(i); if (!taken.has(name)) return name; } } /** "Sprite", "Sprite 2", "Sprite 3" … – the first name not yet used by an asset. */ export function nextAssetName(project: Project, base: string): string { const taken = new Set(project.assets.map((a) => a.name)); return taken.has(base) ? firstFree(taken, (i) => `${base} ${i}`, 2) : base; } /** "var1", "var2", … – the first variable name not yet used by the behavior. */ export function nextVariableName(asset: BehaviorAsset, base = 'var'): string { return firstFree(new Set(asset.variables.map((v) => v.key)), (i) => `${base}${i}`, 1); }