domino_lib/utils/
types.rs1use std::{collections::vec_deque::{Iter}, ops::{Index, IndexMut}};
2use std::vec::IntoIter;
3
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Copy, Hash, Eq)]
7pub struct Tile(pub i32, pub i32);
8
9impl std::fmt::Display for Tile {
10 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11 write!(f, "[{},{}]", self.0, self.1)
12 }
13}
14
15impl std::str::FromStr for Tile {
16 type Err = std::num::ParseIntError;
17 fn from_str(s: &str) -> Result<Self, Self::Err> {
18 let v: Vec<i32> = s
19 .trim_matches(|c| c == '[' || c == ']')
20 .split(',')
21 .map(|s| s.parse().unwrap())
22 .collect();
23 Ok(Tile(v[0], v[1]))
24 }
25}
26
27impl Serialize for Tile {
28 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
29 where
30 S: serde::Serializer,
31 {
32 serializer.serialize_str(&format!("[{},{}]", self.0, self.1))
33 }
34}
35
36impl<'de> Deserialize<'de> for Tile {
37 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
38 where
39 D: serde::Deserializer<'de>,
40 {
41 let s = String::deserialize(deserializer)?;
42 let v: Vec<i32> = s
43 .trim_matches(|c| c == '[' || c == ']')
44 .split(',')
45 .map(|s| s.parse().unwrap())
46 .collect();
47 Ok(Tile(v[0], v[1]))
48 }
49}
50
51impl PartialEq for Tile {
52 fn eq(&self, other: &Self) -> bool {
53 self.0 == other.0 && self.1 == other.1 || self.0 == other.1 && self.1 == other.0
54 }
55}
56
57impl From<(i32, i32)> for Tile {
58 fn from(value: (i32, i32)) -> Self {
59 Tile(value.0, value.1)
60 }
61}
62
63impl Tile {
64 pub fn flip(self) -> Self {
65 Tile(self.1, self.0)
66 }
67}
68
69pub type Solution = Vec<Tile>;
70
71#[derive(Debug, Clone, Eq, PartialEq, Hash)]
72pub struct Puzzle(pub Vec<Option<Tile>>);
73
74impl Puzzle {
75
76 pub fn len(&self) -> usize {
77 self.0.len()
78 }
79
80 pub fn into_iter(self) -> std::vec::IntoIter<Option<Tile>> {
81 self.0.into_iter()
82 }
83}
84
85impl Index<usize> for Puzzle {
86 type Output = Option<Tile>;
87 fn index(&self, index: usize) -> &Self::Output {
88 &self.0[index]
89 }
90}
91
92impl IndexMut<usize> for Puzzle {
93 fn index_mut(&mut self, index: usize) -> &mut Self::Output {
94 &mut self.0[index]
95 }
96}
97
98impl std::fmt::Display for Puzzle {
99 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
100 write!(f, "{:?}", self.0)
101 }
102}
103
104impl Serialize for Puzzle {
105 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
106 where
107 S: serde::Serializer,
108 {
109 let mut s = vec![];
110 self.0.iter().for_each(|t| {
111 if let Some(t) = t {
112 s.push(t.to_string());
113 } else {
114 s.push("null".to_string());
115 }
116 });
117 let result = "[".to_string() + &s.join(",") + "]";
118 serializer.serialize_str(&result)
119 }
120}
121
122impl<'de> Deserialize<'de> for Puzzle {
123 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
124 where
125 D: serde::Deserializer<'de>,
126 {
127 let s = String::deserialize(deserializer)?;
128 let mut v: Vec<Option<Tile>> = vec![];
129 s
130 .trim_matches(|c| c == '[' || c == ']')
131 .split(',')
132 .for_each(|tile| {
133 if tile == "null" {
134 v.push(None);
135 } else {
136 let parsed_tile: Tile = tile.parse().unwrap();
137 v.push(Some(parsed_tile));
138 }
139 });
140
141 Ok(Puzzle(v))
142 }
143}
144
145impl From<Vec<Option<Tile>>> for Puzzle {
146 fn from(value: Vec<Option<Tile>>) -> Self {
147 Puzzle(value)
148 }
149}