1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4use use_angle::Angle;
5
6#[derive(Debug, Clone, Copy, PartialEq)]
8pub struct RigidFold {
9 crease_index: usize,
10 angle: Angle,
11}
12
13impl RigidFold {
14 #[must_use]
16 pub const fn new(crease_index: usize, angle: Angle) -> Self {
17 Self {
18 crease_index,
19 angle,
20 }
21 }
22
23 #[must_use]
25 pub const fn crease_index(self) -> usize {
26 self.crease_index
27 }
28
29 #[must_use]
31 pub const fn angle(self) -> Angle {
32 self.angle
33 }
34}
35
36#[derive(Debug, Clone, PartialEq)]
38pub struct RigidFoldSequence {
39 folds: Vec<RigidFold>,
40}
41
42impl RigidFoldSequence {
43 #[must_use]
45 pub const fn new(folds: Vec<RigidFold>) -> Self {
46 Self { folds }
47 }
48
49 #[must_use]
51 pub fn folds(&self) -> &[RigidFold] {
52 &self.folds
53 }
54
55 #[must_use]
57 pub fn fold_count(&self) -> usize {
58 self.folds.len()
59 }
60}
61
62#[cfg(test)]
63mod tests {
64 use super::{RigidFold, RigidFoldSequence};
65 use use_angle::Angle;
66
67 #[test]
68 fn stores_rigid_fold_sequences() {
69 let fold = RigidFold::new(0, Angle::from_degrees(45.0));
70 let sequence = RigidFoldSequence::new(vec![fold]);
71
72 assert_eq!(fold.crease_index(), 0);
73 assert_eq!(fold.angle().degrees(), 45.0);
74 assert_eq!(sequence.fold_count(), 1);
75 assert_eq!(sequence.folds(), &[fold]);
76 }
77}