amadeus_core/par_sink/
count.rs

1use 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}