36 lines
1.5 KiB
TypeScript
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;
|
|
}
|