Skip to content

Commit e617877

Browse files
Add type system chess code
1 parent 79dd74d commit e617877

36 files changed

+5058
-0
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[package]
2+
name = "rust"
3+
version = "0.1.0"
4+
edition = "2021"
5+
license = "MIT"
6+
7+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+
[dependencies]
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
pub mod board;
2+
pub mod color;
3+
pub mod piece;
4+
pub mod square;
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
use super::piece::ColoredPieceTy;
2+
use crate::values;
3+
use std::marker::PhantomData;
4+
5+
pub mod idx;
6+
pub mod write;
7+
8+
pub(crate) trait CellEn {
9+
fn reify() -> values::Cell;
10+
}
11+
pub(crate) struct Empty;
12+
pub(crate) struct Filled<P: ColoredPieceTy>(PhantomData<P>);
13+
14+
impl CellEn for Empty {
15+
fn reify() -> values::Cell {
16+
values::Cell::Empty
17+
}
18+
}
19+
impl<P: ColoredPieceTy> CellEn for Filled<P> {
20+
fn reify() -> values::Cell {
21+
values::Cell::Filled(P::reify())
22+
}
23+
}
24+
25+
pub(crate) trait BoardRankTy {
26+
fn reify() -> values::BoardRank;
27+
}
28+
pub(crate) struct BoardRank<
29+
A: CellEn,
30+
B: CellEn,
31+
C: CellEn,
32+
D: CellEn,
33+
E: CellEn,
34+
F: CellEn,
35+
G: CellEn,
36+
H: CellEn,
37+
>(PhantomData<(A, B, C, D, E, F, G, H)>);
38+
39+
impl<A: CellEn, B: CellEn, C: CellEn, D: CellEn, E: CellEn, F: CellEn, G: CellEn, H: CellEn>
40+
BoardRankTy for BoardRank<A, B, C, D, E, F, G, H>
41+
{
42+
fn reify() -> values::BoardRank {
43+
values::BoardRank {
44+
a: A::reify(),
45+
b: B::reify(),
46+
c: C::reify(),
47+
d: D::reify(),
48+
e: E::reify(),
49+
f: F::reify(),
50+
g: G::reify(),
51+
h: H::reify(),
52+
}
53+
}
54+
}
55+
56+
pub(crate) trait BoardTy {
57+
fn reify() -> values::Board;
58+
}
59+
pub(crate) struct Board<
60+
R1: BoardRankTy,
61+
R2: BoardRankTy,
62+
R3: BoardRankTy,
63+
R4: BoardRankTy,
64+
R5: BoardRankTy,
65+
R6: BoardRankTy,
66+
R7: BoardRankTy,
67+
R8: BoardRankTy,
68+
>(PhantomData<(R1, R2, R3, R4, R5, R6, R7, R8)>);
69+
70+
impl<
71+
R1: BoardRankTy,
72+
R2: BoardRankTy,
73+
R3: BoardRankTy,
74+
R4: BoardRankTy,
75+
R5: BoardRankTy,
76+
R6: BoardRankTy,
77+
R7: BoardRankTy,
78+
R8: BoardRankTy,
79+
> BoardTy for Board<R1, R2, R3, R4, R5, R6, R7, R8>
80+
{
81+
fn reify() -> values::Board {
82+
values::Board {
83+
r1: R1::reify(),
84+
r2: R2::reify(),
85+
r3: R3::reify(),
86+
r4: R4::reify(),
87+
r5: R5::reify(),
88+
r6: R6::reify(),
89+
r7: R7::reify(),
90+
r8: R8::reify(),
91+
}
92+
}
93+
}
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
use super::{Board, BoardRank, BoardRankTy, BoardTy, CellEn};
2+
use crate::board_rep::square::{
3+
file::{self, FileEn},
4+
rank::{self, RankEn},
5+
Square, SquareTy,
6+
};
7+
8+
pub(crate) trait RunIdxRank<With> {
9+
type Output: CellEn;
10+
}
11+
pub(crate) type IdxRank<B, F> = <B as RunIdxRank<F>>::Output;
12+
13+
impl<A: CellEn, B: CellEn, C: CellEn, D: CellEn, E: CellEn, F: CellEn, G: CellEn, H: CellEn>
14+
RunIdxRank<file::FA> for BoardRank<A, B, C, D, E, F, G, H>
15+
{
16+
type Output = A;
17+
}
18+
impl<A: CellEn, B: CellEn, C: CellEn, D: CellEn, E: CellEn, F: CellEn, G: CellEn, H: CellEn>
19+
RunIdxRank<file::FB> for BoardRank<A, B, C, D, E, F, G, H>
20+
{
21+
type Output = B;
22+
}
23+
impl<A: CellEn, B: CellEn, C: CellEn, D: CellEn, E: CellEn, F: CellEn, G: CellEn, H: CellEn>
24+
RunIdxRank<file::FC> for BoardRank<A, B, C, D, E, F, G, H>
25+
{
26+
type Output = C;
27+
}
28+
impl<A: CellEn, B: CellEn, C: CellEn, D: CellEn, E: CellEn, F: CellEn, G: CellEn, H: CellEn>
29+
RunIdxRank<file::FD> for BoardRank<A, B, C, D, E, F, G, H>
30+
{
31+
type Output = D;
32+
}
33+
impl<A: CellEn, B: CellEn, C: CellEn, D: CellEn, E: CellEn, F: CellEn, G: CellEn, H: CellEn>
34+
RunIdxRank<file::FE> for BoardRank<A, B, C, D, E, F, G, H>
35+
{
36+
type Output = E;
37+
}
38+
impl<A: CellEn, B: CellEn, C: CellEn, D: CellEn, E: CellEn, F: CellEn, G: CellEn, H: CellEn>
39+
RunIdxRank<file::FF> for BoardRank<A, B, C, D, E, F, G, H>
40+
{
41+
type Output = F;
42+
}
43+
impl<A: CellEn, B: CellEn, C: CellEn, D: CellEn, E: CellEn, F: CellEn, G: CellEn, H: CellEn>
44+
RunIdxRank<file::FG> for BoardRank<A, B, C, D, E, F, G, H>
45+
{
46+
type Output = G;
47+
}
48+
impl<A: CellEn, B: CellEn, C: CellEn, D: CellEn, E: CellEn, F: CellEn, G: CellEn, H: CellEn>
49+
RunIdxRank<file::FH> for BoardRank<A, B, C, D, E, F, G, H>
50+
{
51+
type Output = H;
52+
}
53+
54+
pub(crate) trait RunIdxBoardRank<With> {
55+
type Output: BoardRankTy;
56+
}
57+
pub(crate) type IdxBoardRank<B, R> = <B as RunIdxBoardRank<R>>::Output;
58+
59+
impl<
60+
R1: BoardRankTy,
61+
R2: BoardRankTy,
62+
R3: BoardRankTy,
63+
R4: BoardRankTy,
64+
R5: BoardRankTy,
65+
R6: BoardRankTy,
66+
R7: BoardRankTy,
67+
R8: BoardRankTy,
68+
> RunIdxBoardRank<rank::R1> for Board<R1, R2, R3, R4, R5, R6, R7, R8>
69+
{
70+
type Output = R1;
71+
}
72+
impl<
73+
R1: BoardRankTy,
74+
R2: BoardRankTy,
75+
R3: BoardRankTy,
76+
R4: BoardRankTy,
77+
R5: BoardRankTy,
78+
R6: BoardRankTy,
79+
R7: BoardRankTy,
80+
R8: BoardRankTy,
81+
> RunIdxBoardRank<rank::R2> for Board<R1, R2, R3, R4, R5, R6, R7, R8>
82+
{
83+
type Output = R2;
84+
}
85+
impl<
86+
R1: BoardRankTy,
87+
R2: BoardRankTy,
88+
R3: BoardRankTy,
89+
R4: BoardRankTy,
90+
R5: BoardRankTy,
91+
R6: BoardRankTy,
92+
R7: BoardRankTy,
93+
R8: BoardRankTy,
94+
> RunIdxBoardRank<rank::R3> for Board<R1, R2, R3, R4, R5, R6, R7, R8>
95+
{
96+
type Output = R3;
97+
}
98+
impl<
99+
R1: BoardRankTy,
100+
R2: BoardRankTy,
101+
R3: BoardRankTy,
102+
R4: BoardRankTy,
103+
R5: BoardRankTy,
104+
R6: BoardRankTy,
105+
R7: BoardRankTy,
106+
R8: BoardRankTy,
107+
> RunIdxBoardRank<rank::R4> for Board<R1, R2, R3, R4, R5, R6, R7, R8>
108+
{
109+
type Output = R4;
110+
}
111+
impl<
112+
R1: BoardRankTy,
113+
R2: BoardRankTy,
114+
R3: BoardRankTy,
115+
R4: BoardRankTy,
116+
R5: BoardRankTy,
117+
R6: BoardRankTy,
118+
R7: BoardRankTy,
119+
R8: BoardRankTy,
120+
> RunIdxBoardRank<rank::R5> for Board<R1, R2, R3, R4, R5, R6, R7, R8>
121+
{
122+
type Output = R5;
123+
}
124+
impl<
125+
R1: BoardRankTy,
126+
R2: BoardRankTy,
127+
R3: BoardRankTy,
128+
R4: BoardRankTy,
129+
R5: BoardRankTy,
130+
R6: BoardRankTy,
131+
R7: BoardRankTy,
132+
R8: BoardRankTy,
133+
> RunIdxBoardRank<rank::R6> for Board<R1, R2, R3, R4, R5, R6, R7, R8>
134+
{
135+
type Output = R6;
136+
}
137+
impl<
138+
R1: BoardRankTy,
139+
R2: BoardRankTy,
140+
R3: BoardRankTy,
141+
R4: BoardRankTy,
142+
R5: BoardRankTy,
143+
R6: BoardRankTy,
144+
R7: BoardRankTy,
145+
R8: BoardRankTy,
146+
> RunIdxBoardRank<rank::R7> for Board<R1, R2, R3, R4, R5, R6, R7, R8>
147+
{
148+
type Output = R7;
149+
}
150+
impl<
151+
R1: BoardRankTy,
152+
R2: BoardRankTy,
153+
R3: BoardRankTy,
154+
R4: BoardRankTy,
155+
R5: BoardRankTy,
156+
R6: BoardRankTy,
157+
R7: BoardRankTy,
158+
R8: BoardRankTy,
159+
> RunIdxBoardRank<rank::R8> for Board<R1, R2, R3, R4, R5, R6, R7, R8>
160+
{
161+
type Output = R8;
162+
}
163+
164+
pub(crate) trait RunIdxBoard<With: SquareTy> {
165+
type Output: CellEn;
166+
}
167+
pub(crate) type IdxBoard<B, S> = <B as RunIdxBoard<S>>::Output;
168+
169+
impl<R: RankEn, F: FileEn, B: BoardTy> RunIdxBoard<Square<R, F>> for B
170+
where
171+
B: RunIdxBoardRank<R>,
172+
IdxBoardRank<B, R>: RunIdxRank<F>,
173+
{
174+
type Output = IdxRank<IdxBoardRank<B, R>, F>;
175+
}

0 commit comments

Comments
 (0)