1mod valid_iter;
2mod vec_map;
3
4use tea_core::prelude::*;
5pub use valid_iter::{Keep, MapValidBasic};
6pub use vec_map::MapValidVec;
7pub trait MapBasic: TrustedLen
12where
13 Self: Sized,
14{
15 #[inline]
28 fn abs(self) -> impl TrustedLen<Item = Self::Item>
29 where
30 Self::Item: Number,
31 {
32 self.map(|v| v.abs())
33 }
34
35 fn shift<'a>(self, n: i32, value: Self::Item) -> Box<dyn TrustedLen<Item = Self::Item> + 'a>
55 where
56 Self::Item: Clone + 'a,
57 Self: Sized + 'a,
58 {
59 let len = self.len();
60 let n_abs = n.unsigned_abs() as usize;
61 match n {
62 n if n > 0 => Box::new(TrustIter::new(
63 std::iter::repeat(value)
64 .take(n_abs)
65 .chain(self.take(len - n_abs)),
66 len,
67 )),
68 n if n < 0 => Box::new(TrustIter::new(
69 self.skip(n_abs).chain(std::iter::repeat(value).take(n_abs)),
70 len,
71 )),
72 _ => Box::new(self),
73 }
74 }
75}
76
77impl<I: TrustedLen> MapBasic for I {}
78
79#[cfg(test)]
80mod test {
81 use tea_core::testing::assert_vec1d_equal_numeric;
82
83 use super::*;
84 #[test]
85 fn test_abs() {
86 let v = vec![1, -2, 3, -4, 5];
87 let res: Vec<_> = v.titer().abs().vabs().collect_trusted_vec1();
88 assert_eq!(res, vec![1, 2, 3, 4, 5]);
89 let v = vec![Some(1), Some(-2), None, Some(-4), Some(5)];
90 let res: Vec<_> = v.titer().vabs().collect_trusted_vec1();
91 assert_eq!(res, vec![Some(1), Some(2), None, Some(4), Some(5)]);
92 }
93
94 #[test]
95 fn test_shift() {
96 let v: Vec<f64> = vec![];
98 let res: Vec<_> = v.titer().vshift(2, None).collect_trusted_vec1();
99 assert_eq!(res, vec![]);
100 let v = vec![1., 2., 3., 4., 5.];
101 let res: Vec<_> = v.titer().vshift(2, None).collect_trusted_vec1();
102 assert_vec1d_equal_numeric(&res, &vec![f64::NAN, f64::NAN, 1., 2., 3.], None);
103 let v = vec![1, 2, 3, 4, 5];
104 let res: Vec<_> = v
105 .titer()
106 .vshift(-2, Some(0))
107 .vshift(0, Some(0))
108 .collect_trusted_to_vec();
109 assert_eq!(res, vec![3, 4, 5, 0, 0]);
110 }
111}