use std::num::NonZeroUsize;
use crate::Reductor;
#[repr(transparent)]
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Count(pub usize);
impl<A> Reductor<A> for Count {
type State = usize;
fn new(_: A) -> Self::State {
1
}
fn reduce(state: Self::State, _: A) -> Self::State {
state + 1
}
fn into_result(state: Self::State) -> Self {
Self(state)
}
}
#[repr(transparent)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct CountNonZero(pub NonZeroUsize);
impl<A> Reductor<A> for CountNonZero {
type State = NonZeroUsize;
fn new(_: A) -> Self::State {
NonZeroUsize::new(1).unwrap()
}
fn reduce(state: Self::State, _: A) -> Self::State {
(state.get() + 1).try_into().unwrap()
}
fn into_result(state: Self::State) -> Self {
Self(state)
}
}