three_style_lib/facelet/
moves.rs1use super::{types::DEFAULT_STATE, Facelet, FaceletCube, FaceletState};
2use crate::moves::Move;
3use std::ops::Index;
4
5#[derive(Debug, PartialEq, Clone)]
6pub struct FaceletPermutation(FaceletState);
7
8impl Index<Facelet> for FaceletPermutation {
9 type Output = Facelet;
10
11 fn index(&self, index: Facelet) -> &Self::Output {
12 &self.0[index as usize]
13 }
14}
15
16impl Default for FaceletPermutation {
17 fn default() -> Self {
18 Self(DEFAULT_STATE)
19 }
20}
21
22impl From<Move> for FaceletPermutation {
23 fn from(value: Move) -> Self {
24 let cube = FaceletCube::from(value);
25 let default = FaceletPermutation::default();
26 let mut res = FaceletPermutation::default();
27
28 for i in 0..54 {
29 res.0[cube[i] as usize] = default.0[i];
30 }
31
32 res
33 }
34}
35
36#[cfg(test)]
37mod tests {
38 use super::FaceletPermutation;
39 use crate::{
40 facelet::Facelet as F,
41 moves::{Move, MoveCount, MoveKind},
42 };
43
44 #[test]
45 fn test_move_permutation() {
46 let m = Move::new(MoveKind::U, MoveCount::Simple);
47
48 #[rustfmt::skip]
49 let expected = FaceletPermutation([
50 F::U2, F::U5, F::U8, F::U1, F::U4, F::U7, F::U0, F::U3, F::U6,
51 F::F0, F::F1, F::F2, F::R3, F::R4, F::R5, F::R6, F::R7, F::R8,
52 F::L0, F::L1, F::L2, F::F3, F::F4, F::F5, F::F6, F::F7, F::F8,
53 F::D0, F::D1, F::D2, F::D3, F::D4, F::D5, F::D6, F::D7, F::D8,
54 F::B0, F::B1, F::B2, F::L3, F::L4, F::L5, F::L6, F::L7, F::L8,
55 F::R0, F::R1, F::R2, F::B3, F::B4, F::B5, F::B6, F::B7, F::B8,
56 ]);
57
58 assert_eq!(FaceletPermutation::from(m), expected);
59 }
60}