three_style_lib/facelet/
moves.rs

1use 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}