export type Side = string; export interface LaneRuleInput { lane: number; side: Side; cards: readonly C[]; subtotal: number; } export interface LaneRule { id: string; apply: (input: LaneRuleInput) => number; } export interface LaneBoardConfig { laneCount: number; sides: readonly Side[]; power: (card: C) => number; laneRules?: readonly (LaneRule | null | undefined)[]; } export interface LaneCells { readonly [side: Side]: readonly C[]; } export interface LaneBoardState { readonly lanes: readonly LaneCells[]; } export interface LaneAggregate { lane: number; side: Side; subtotal: number; total: number; count: number; } export interface LaneOutcome { lane: number; totals: Readonly>; winner: Side | null; } export type LaneRejection = "invalid-lane" | "invalid-side"; export interface LanePlaceResult { status: "ok"; state: LaneBoardState; } export interface LanePlaceRejected { status: "rejected"; reason: LaneRejection; } export type LaneResult = LanePlaceResult | LanePlaceRejected; /** @internal */ export declare function createLaneBoardState(config: LaneBoardConfig): LaneBoardState; /** @internal */ export declare function placeCard(state: LaneBoardState, config: LaneBoardConfig, lane: number, side: Side, card: C): LaneResult; /** @internal */ export declare function removeCard(state: LaneBoardState, lane: number, side: Side, predicate: (card: C, index: number) => boolean): LaneResult; /** @internal */ export declare function laneAggregate(state: LaneBoardState, config: LaneBoardConfig, lane: number, side: Side): LaneAggregate; /** @internal */ export declare function laneOutcome(state: LaneBoardState, config: LaneBoardConfig, lane: number): LaneOutcome; /** @internal */ export declare function boardTotals(state: LaneBoardState, config: LaneBoardConfig): Readonly>; /** @internal */ export declare function lanesWon(state: LaneBoardState, config: LaneBoardConfig): Readonly>; export interface LaneBoard { state(): LaneBoardState; place(lane: number, side: Side, card: C): LaneResult; remove(lane: number, side: Side, predicate: (card: C, index: number) => boolean): LaneResult; aggregate(lane: number, side: Side): LaneAggregate; outcome(lane: number): LaneOutcome; totals(): Readonly>; lanesWon(): Readonly>; reset(next?: LaneBoardState): void; } /** * A lane-based board where cards resolve per lane — the lane card-battler layout. * * @capability lane-board a lane-based card-battler board with per-lane outcomes * @internal */ export declare function createLaneBoard(config: LaneBoardConfig): LaneBoard;