export type ZoneName = string; export interface CardPileConfig { zones: readonly ZoneName[]; drawFrom?: ZoneName; discardTo?: ZoneName; handZone?: ZoneName; handLimit?: number; reshuffleFrom?: ZoneName; onChange?: () => void; } export interface CardPileState { readonly zones: Readonly>; } export interface DrawResult { state: CardPileState; drawn: readonly string[]; reshuffled: boolean; } export type PileRejection = "unknown-zone" | "card-not-in-zone" | "hand-limit" | "empty-source"; export interface PileMoveResult { status: "ok"; state: CardPileState; } export interface PileMoveRejected { status: "rejected"; reason: PileRejection; detail?: string; } export type PileResult = PileMoveResult | PileMoveRejected; export declare function pileRng(seed: string | number): () => number; export declare function shuffleWithRng(values: readonly T[], rng: () => number): T[]; export declare function createCardPileState(config: CardPileConfig, initial?: Partial>): CardPileState; export declare function zoneOf(state: CardPileState, cardId: string): ZoneName | null; export declare function countIn(state: CardPileState, zone: ZoneName): number; export declare function peek(state: CardPileState, zone: ZoneName, n?: number): readonly string[]; export declare function shuffleZone(state: CardPileState, zone: ZoneName, seed: string | number): CardPileState; export declare function moveCards(state: CardPileState, ids: readonly string[], from: ZoneName, to: ZoneName, position?: "top" | "bottom"): PileResult; export declare function draw(state: CardPileState, n: number, options: { from: ZoneName; to: ZoneName; handLimit?: number; reshuffleFrom?: ZoneName; seed?: string | number; }): DrawResult; export interface CardPile { state(): CardPileState; zones(): readonly ZoneName[]; count(zone: ZoneName): number; peek(zone: ZoneName, n?: number): readonly string[]; zoneOf(cardId: string): ZoneName | null; shuffle(zone: ZoneName | undefined, seed: string | number): void; draw(n: number, options?: { from?: ZoneName; to?: ZoneName; }): readonly string[]; discard(ids: readonly string[], options?: { from?: ZoneName; to?: ZoneName; }): PileResult; exhaust(ids: readonly string[], exhaustZone: ZoneName, from?: ZoneName): PileResult; move(ids: readonly string[], from: ZoneName, to: ZoneName, position?: "top" | "bottom"): PileResult; reset(next: CardPileState): void; } export declare function createCardPile(config: CardPileConfig, initial?: Partial>): CardPile;