1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
use serde::{Deserialize, Serialize}; use std::marker::PhantomData; use super::{ DistributedIteratorMulti, DistributedReducer, ReduceFactory, Reducer, ReducerA, SumReducer }; #[must_use] pub struct Count<I> { i: I, } impl<I> Count<I> { pub(super) fn new(i: I) -> Self { Self { i } } } impl<I: DistributedIteratorMulti<Source>, Source> DistributedReducer<I, Source, usize> for Count<I> where I::Item: 'static, { type ReduceAFactory = CountReducerFactory<I::Item>; type ReduceA = CountReducer<I::Item>; type ReduceB = SumReducer<usize, usize>; fn reducers(self) -> (I, Self::ReduceAFactory, Self::ReduceB) { ( self.i, CountReducerFactory(PhantomData), SumReducer(0, PhantomData), ) } } pub struct CountReducerFactory<A>(PhantomData<fn(A)>); impl<A> ReduceFactory for CountReducerFactory<A> { type Reducer = CountReducer<A>; fn make(&self) -> Self::Reducer { CountReducer(0, PhantomData) } } #[derive(Serialize, Deserialize)] #[serde(bound = "")] pub struct CountReducer<A>(usize, PhantomData<fn(A)>); impl<A> Reducer for CountReducer<A> { type Item = A; type Output = usize; #[inline(always)] fn push(&mut self, _item: Self::Item) -> bool { self.0 += 1; true } fn ret(self) -> Self::Output { self.0 } } impl<A> ReducerA for CountReducer<A> where A: 'static, { type Output = usize; }