beet_utils/utils/
pipeline.rs1pub trait Pipeline<In, Out = In> {
3 fn apply(self, value: In) -> Out;
5}
6
7impl<F, In, Out> Pipeline<In, Out> for F
8where
9 F: FnOnce(In) -> Out,
10{
11 fn apply(self, value: In) -> Out { self(value) }
12}
13
14
15pub trait PipelineTarget: Sized {
18 fn xmap<O>(self, func: impl FnOnce(Self) -> O) -> O { func(self) }
20 fn xtap(mut self, func: impl FnOnce(&mut Self)) -> Self {
22 func(&mut self);
23 self
24 }
25 fn xdebug(self) -> Self
27 where
28 Self: std::fmt::Debug,
29 {
30 println!("{:?}", self);
31 self
32 }
33 fn xdisplay(self) -> Self
35 where
36 Self: std::fmt::Display,
37 {
38 println!("{}", self);
39 self
40 }
41 fn xtap_mut(&mut self, func: impl FnOnce(&mut Self)) -> &mut Self {
43 func(self);
44 self
45 }
46 fn xpipe<P: Pipeline<Self, O>, O>(self, pipeline: P) -> O {
50 pipeline.apply(self)
51 }
52
53 fn xref(&self) -> &Self { self }
55 fn xmut(&mut self) -> &mut Self { self }
57 fn xok<E>(self) -> Result<Self, E> { Ok(self) }
66 fn xsome(self) -> Option<Self> { Some(self) }
74
75 fn xinto<T: From<Self>>(self) -> T { T::from(self) }
81}
82impl<T: Sized> PipelineTarget for T {}
83
84
85pub trait PipelineTargetIter<T>: Sized + IntoIterator<Item = T> {
88 fn xmap_each<O>(self, func: impl FnMut(T) -> O) -> Vec<O> {
90 self.into_iter().map(func).collect()
91 }
92 fn xtry_filter_map<O, E>(
95 self,
96 mut func: impl FnMut(T) -> Result<Option<O>, E>,
97 ) -> Result<Vec<O>, E> {
98 let mut out = Vec::new();
99 for item in self.into_iter() {
100 match (func)(item) {
101 Ok(Some(o)) => out.push(o),
102 Ok(None) => {}
103 Err(e) => return Err(e),
104 }
105 }
106 Ok(out)
107 }
108}
109
110impl<T: Sized, I: IntoIterator<Item = T>> PipelineTargetIter<T> for I {}
111
112pub trait PipelineTargetVec<T> {
113 fn xtend<I: IntoIterator<Item = T>>(self, iter: I) -> Self;
115}
116
117impl<T, T2> PipelineTargetVec<T> for T2
118where
119 T2: AsMut<Vec<T>>,
120{
121 fn xtend<I: IntoIterator<Item = T>>(mut self, iter: I) -> Self {
122 self.as_mut().extend(iter);
123 self
124 }
125}
126
127pub trait PipelineTargetString {
128 fn xtend(self, item: impl AsRef<str>) -> Self;
130}
131
132impl PipelineTargetString for String {
133 fn xtend(mut self, item: impl AsRef<str>) -> Self {
134 self.push_str(item.as_ref());
135 self
136 }
137}