1use std::fmt::Debug;
4use std::ops::RangeBounds;
5
6pub trait Count<I> {
8 fn count(&self, range: impl RangeBounds<usize>, value: I) -> usize;
9}
10
11pub trait Count3way<I> {
13 fn count_3way(
14 &self,
15 range: impl RangeBounds<usize>,
16 value: I,
17 ) -> Count3wayResult;
18}
19
20#[derive(Clone, Copy, Debug, Eq, PartialEq)]
21pub struct Count3wayResult {
22 lt: usize,
23 eq: usize,
24 gt: usize,
25}
26
27impl Count3wayResult {
28 pub fn new(lt: usize, eq: usize, gt: usize) -> Self { Self { lt, eq, gt } }
29 pub fn lt(&self) -> usize { self.lt }
30 pub fn eq(&self) -> usize { self.eq }
31 pub fn gt(&self) -> usize { self.gt }
32 pub fn le(&self) -> usize { self.lt + self.eq }
33 pub fn ge(&self) -> usize { self.gt + self.eq }
34 pub fn ne(&self) -> usize { self.lt + self.gt }
35}