amadeus_core/par_sink/
count.rs1use derive_new::new;
2use serde::{Deserialize, Serialize};
3
4use super::{
5 folder_par_sink, FolderSync, FolderSyncReducer, ParallelPipe, ParallelSink, SumFolder
6};
7
8#[derive(new)]
9#[must_use]
10pub struct Count<P> {
11 pipe: P,
12}
13
14impl_par_dist! {
15 impl<P: ParallelPipe<Item>, Item> ParallelSink<Item> for Count<P> {
16 folder_par_sink!(
17 CountFolder,
18 SumFolder<usize>,
19 self,
20 CountFolder::new(),
21 SumFolder::new()
22 );
23 }
24}
25
26#[derive(Clone, Serialize, Deserialize, new)]
27pub struct CountFolder;
28
29impl<Item> FolderSync<Item> for CountFolder {
30 type State = usize;
31 type Done = Self::State;
32
33 #[inline(always)]
34 fn zero(&mut self) -> Self::State {
35 0
36 }
37 #[inline(always)]
38 fn push(&mut self, state: &mut Self::State, _item: Item) {
39 *state += 1;
40 }
41 #[inline(always)]
42 fn done(&mut self, state: Self::State) -> Self::Done {
43 state
44 }
45}