orx_parallel/computations/generalized_values/
values.rs1use orx_concurrent_bag::ConcurrentBag;
2use orx_concurrent_ordered_bag::ConcurrentOrderedBag;
3use orx_pinned_vec::{IntoConcurrentPinnedVec, PinnedVec};
4
5pub trait Values: Send + Sync {
6 type Item;
7
8 type Mapped<M, O>: Values<Item = O>
9 where
10 O: Send + Sync,
11 M: Fn(Self::Item) -> O + Send + Sync;
12
13 type Filtered<F>: Values<Item = Self::Item>
14 where
15 F: Fn(&Self::Item) -> bool + Send + Sync;
16
17 type FlatMapped<Fm, Vo>: Values<Item = Vo::Item>
18 where
19 Vo: IntoIterator + Send + Sync,
20 Vo::Item: Send + Sync,
21 Vo::IntoIter: Send + Sync,
22 Fm: Fn(Self::Item) -> Vo + Send + Sync;
23
24 type FilterMapped<Fm, O>: Values<Item = O>
25 where
26 O: Send + Sync,
27 Fm: Fn(Self::Item) -> Option<O> + Send + Sync;
28
29 fn values(self) -> impl IntoIterator<Item = Self::Item>;
30
31 fn push_to_pinned_vec<P>(self, vector: &mut P)
32 where
33 P: PinnedVec<Self::Item>;
34
35 fn push_to_bag<P>(self, bag: &ConcurrentBag<Self::Item, P>)
36 where
37 P: IntoConcurrentPinnedVec<Self::Item>,
38 Self::Item: Send + Sync;
39
40 fn push_to_ordered_bag<P>(self, idx: usize, o_bag: &ConcurrentOrderedBag<Self::Item, P>)
41 where
42 P: IntoConcurrentPinnedVec<Self::Item>,
43 Self::Item: Send + Sync;
44
45 fn push_to_vec_with_idx(self, idx: usize, vec: &mut Vec<(usize, Self::Item)>);
46
47 fn map<M, O>(self, map: M) -> Self::Mapped<M, O>
48 where
49 O: Send + Sync,
50 M: Fn(Self::Item) -> O + Send + Sync;
51
52 fn flat_map<Fm, Vo>(self, flat_map: Fm) -> Self::FlatMapped<Fm, Vo>
53 where
54 Vo: IntoIterator + Send + Sync,
55 Vo::Item: Send + Sync,
56 Vo::IntoIter: Send + Sync,
57 Fm: Fn(Self::Item) -> Vo + Send + Sync;
58
59 fn filter_map<Fm, O>(self, filter_map: Fm) -> Self::FilterMapped<Fm, O>
60 where
61 O: Send + Sync,
62 Fm: Fn(Self::Item) -> Option<O> + Send + Sync;
63
64 fn filter<F>(self, filter: F) -> Self::Filtered<F>
65 where
66 F: Fn(&Self::Item) -> bool + Send + Sync;
67
68 fn acc_reduce<X>(self, acc: Option<Self::Item>, reduce: X) -> Option<Self::Item>
69 where
70 X: Fn(Self::Item, Self::Item) -> Self::Item + Send + Sync;
71
72 fn fx_reduce<F, M2, Vo, X>(
73 self,
74 acc: Option<Vo::Item>,
75 filter: F,
76 map2: M2,
77 reduce: X,
78 ) -> Option<Vo::Item>
79 where
80 Self: Sized,
81 F: Fn(&Self::Item) -> bool + Send + Sync,
82 M2: Fn(Self::Item) -> Vo + Send + Sync,
83 Vo: Values,
84 Vo::Item: Send + Sync,
85 X: Fn(Vo::Item, Vo::Item) -> Vo::Item + Send + Sync;
86
87 fn first(self) -> Option<Self::Item>;
88
89 fn fx_next<F, M2, Vo>(self, filter: F, map2: M2) -> Option<Vo::Item>
90 where
91 F: Fn(&Self::Item) -> bool + Send + Sync,
92 M2: Fn(Self::Item) -> Vo + Send + Sync,
93 Vo: Values,
94 Vo::Item: Send + Sync;
95
96 fn filter_map_collect_sequential<F, M2, P, Vo>(self, filter: F, map2: M2, vector: &mut P)
97 where
98 F: Fn(&Self::Item) -> bool + Send + Sync,
99 M2: Fn(Self::Item) -> Vo + Send + Sync,
100 Vo: Values,
101 P: IntoConcurrentPinnedVec<Vo::Item>;
102
103 fn filter_map_collect_arbitrary<F, M2, P, Vo>(
104 self,
105 filter: F,
106 map2: M2,
107 bag: &ConcurrentBag<Vo::Item, P>,
108 ) where
109 F: Fn(&Self::Item) -> bool + Send + Sync,
110 M2: Fn(Self::Item) -> Vo + Send + Sync,
111 Vo: Values,
112 Vo::Item: Send + Sync,
113 P: IntoConcurrentPinnedVec<Vo::Item>;
114
115 fn xfx_collect_heap<F, M2, Vo>(
116 self,
117 input_idx: usize,
118 filter: F,
119 map2: M2,
120 vec: &mut Vec<(usize, Vo::Item)>,
121 ) where
122 F: Fn(&Self::Item) -> bool + Send + Sync,
123 M2: Fn(Self::Item) -> Vo + Send + Sync,
124 Vo: Values,
125 Vo::Item: Send + Sync;
126
127 fn filter_map_collect_in_input_order<F, M2, P, Vo>(
128 self,
129 input_idx: usize,
130 filter: F,
131 map2: M2,
132 o_bag: &ConcurrentOrderedBag<Vo::Item, P>,
133 ) where
134 F: Fn(&Self::Item) -> bool + Send + Sync,
135 M2: Fn(Self::Item) -> Vo + Send + Sync,
136 Vo: Values,
137 Vo::Item: Send + Sync,
138 P: IntoConcurrentPinnedVec<Vo::Item>;
139}