import type { Index, Indices, ParsedGame, ParsedMove, Piece } from './base'; import type { _ApplyMoveUnsafe, _CurrentMoves } from './game'; import { FormatSan } from './notation'; import type { IsGreater, Sum } from './utils'; /** * Get the next move */ export type NextMove = Game['turn'] extends 'w' ? _Max<_Layer> extends infer Node extends _Node ? FormatSan : never : _Min<_Layer> extends infer Node extends _Node ? FormatSan : never; type _Node = { move: ParsedMove; score: number; }; type _Layer, Acc extends _Node[] = []> = Moves extends [infer Head extends ParsedMove, ...infer Tail extends ParsedMove[]] ? _Layer>; } ]> : Acc; type _Max = Nodes extends [infer Head extends _Node, ...infer Tail extends _Node[]] ? Best extends infer B extends _Node ? IsGreater extends true ? _Max : _Max : _Max : Best; type _Min = Nodes extends [infer Head extends _Node, ...infer Tail extends _Node[]] ? Best extends infer B extends _Node ? IsGreater extends true ? _Min : _Min : _Min : Best; /** * Evaluate game state */ export type Evaluate = Remaining extends [infer Head extends Index, ...infer Tail extends Index[]] ? Game['board'][Head] extends infer P extends Piece ? Evaluate, Tail> : Evaluate : Value; type _PieceValue = { 'k': -90; 'q': -9; 'r': -5; 'b': -3; 'n': -3; 'p': -1; 'P': 1; 'N': 3; 'B': 3; 'R': 5; 'Q': 9; 'K': 90; }; export {};