-
-
Notifications
You must be signed in to change notification settings - Fork 33
/
types.ts
89 lines (65 loc) · 1.7 KB
/
types.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
export const FILE_NAMES = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] as const;
export type FileName = (typeof FILE_NAMES)[number];
export const RANK_NAMES = ['1', '2', '3', '4', '5', '6', '7', '8'] as const;
export type RankName = (typeof RANK_NAMES)[number];
export type Square = number;
export type SquareName = `${FileName}${RankName}`;
/**
* Indexable by square indices.
*/
export type BySquare<T> = T[];
export const COLORS = ['white', 'black'] as const;
export type Color = (typeof COLORS)[number];
/**
* Indexable by `white` and `black`.
*/
export type ByColor<T> = {
[color in Color]: T;
};
export const ROLES = ['pawn', 'knight', 'bishop', 'rook', 'queen', 'king'] as const;
export type Role = (typeof ROLES)[number];
/**
* Indexable by `pawn`, `knight`, `bishop`, `rook`, `queen`, and `king`.
*/
export type ByRole<T> = {
[role in Role]: T;
};
export const CASTLING_SIDES = ['a', 'h'] as const;
export type CastlingSide = (typeof CASTLING_SIDES)[number];
/**
* Indexable by `a` and `h`.
*/
export type ByCastlingSide<T> = {
[side in CastlingSide]: T;
};
export interface Piece {
role: Role;
color: Color;
promoted?: boolean;
}
export interface NormalMove {
from: Square;
to: Square;
promotion?: Role;
}
export interface DropMove {
role: Role;
to: Square;
}
export type Move = NormalMove | DropMove;
export const isDrop = (v: Move): v is DropMove => 'role' in v;
export const isNormal = (v: Move): v is NormalMove => 'from' in v;
export const RULES = [
'chess',
'antichess',
'kingofthehill',
'3check',
'atomic',
'horde',
'racingkings',
'crazyhouse',
] as const;
export type Rules = (typeof RULES)[number];
export interface Outcome {
winner: Color | undefined;
}