import type { PierType } from './types'; /** Pier list selection (spec §9 · plan C6): type filter, select-all over the visible piers, and checks that survive filtering. */ export type TypeFilter = 'all' | PierType; export interface Selectable { input: { type: PierType }; /** null when the pier failed to build: such a pier cannot be checked. */ model: unknown | null; checked: boolean; } export function isVisible(pier: T, filter: TypeFilter): boolean { return filter === 'all' || pier.input.type === filter; } /** Piers the 전체 선택 button acts on: visible under the filter and buildable. */ export function selectableVisible(piers: T[], filter: TypeFilter): T[] { return piers.filter((p) => isVisible(p, filter) && p.model !== null); } /** True when every selectable visible pier is checked (then the button reads 선택 해제). */ export function allVisibleChecked(piers: T[], filter: TypeFilter): boolean { const targets = selectableVisible(piers, filter); return targets.length > 0 && targets.every((p) => p.checked); } /** Sets the check of every selectable visible pier. Hidden piers keep their check. */ export function setVisibleChecked(piers: T[], filter: TypeFilter, checked: boolean): T[] { return piers.map((p) => (isVisible(p, filter) && p.model !== null ? { ...p, checked } : p)); } export function checkedCount(piers: T[]): number { return piers.filter((p) => p.checked).length; }