lighthouse_protocol/utils/
rot3.rs

1use serde::{Deserialize, Serialize};
2
3use super::Zero;
4
5/// A 3D rotation.
6#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
7pub struct Rot3<T> {
8    pub alpha: T,
9    pub beta: T,
10    pub gamma: T,
11}
12
13impl<T> Rot3<T> {
14    /// Creates a mew position.
15    pub const fn new(alpha: T, beta: T, gamma: T) -> Self {
16        Self { alpha, beta, gamma }
17    }
18
19    /// Maps a function over the vector.
20    pub fn map<U>(self, mut f: impl FnMut(T) -> U) -> Rot3<U> {
21        Rot3 {
22            alpha: f(self.alpha),
23            beta: f(self.beta),
24            gamma: f(self.gamma),
25        }
26    }
27}
28
29impl<T> Zero for Rot3<T> where T: Zero {
30    /// The origin.
31    const ZERO: Self = Self::new(T::ZERO, T::ZERO, T::ZERO);
32}