Files
Pier_v1/src/core/selection.ts
T

36 lines
1.5 KiB
TypeScript

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<T extends Selectable>(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<T extends Selectable>(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<T extends Selectable>(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<T extends Selectable>(piers: T[], filter: TypeFilter, checked: boolean): T[] {
return piers.map((p) => (isVisible(p, filter) && p.model !== null ? { ...p, checked } : p));
}
export function checkedCount<T extends Selectable>(piers: T[]): number {
return piers.filter((p) => p.checked).length;
}