1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4use use_point::Point2;
5
6#[derive(Debug, Clone, Copy, PartialEq)]
8pub struct CurveParameter {
9 value: f64,
10}
11
12impl CurveParameter {
13 #[must_use]
15 pub const fn new(value: f64) -> Option<Self> {
16 if value.is_finite() && value >= 0.0 && value <= 1.0 {
17 Some(Self { value })
18 } else {
19 None
20 }
21 }
22
23 #[must_use]
25 pub const fn value(self) -> f64 {
26 self.value
27 }
28}
29
30#[derive(Debug, Clone, Copy, PartialEq)]
32pub struct CurveSample2 {
33 parameter: CurveParameter,
34 point: Point2,
35}
36
37impl CurveSample2 {
38 #[must_use]
40 pub const fn new(parameter: CurveParameter, point: Point2) -> Self {
41 Self { parameter, point }
42 }
43
44 #[must_use]
46 pub const fn parameter(self) -> CurveParameter {
47 self.parameter
48 }
49
50 #[must_use]
52 pub const fn point(self) -> Point2 {
53 self.point
54 }
55}
56
57#[cfg(test)]
58mod tests {
59 use super::{CurveParameter, CurveSample2};
60 use use_point::Point2;
61
62 #[test]
63 fn creates_curve_samples() {
64 let parameter = CurveParameter::new(0.5).expect("valid parameter");
65 let sample = CurveSample2::new(parameter, Point2::new(1.0, 2.0));
66
67 assert_eq!(sample.parameter().value(), 0.5);
68 assert_eq!(sample.point(), Point2::new(1.0, 2.0));
69 assert_eq!(CurveParameter::new(1.5), None);
70 }
71}