where
T: CumulativeFrequency,
{
- fn get<T>(this: &[T], k: usize) -> Observation
+ fn get<T>(this: &[T], k: usize) -> Option<Observation>
where
T: CumulativeFrequency,
{
- let y = this[k].y();
- let cc = this[k].cc();
- let c = if k == 0 { cc } else { cc - this[k - 1].cc() };
- Observation { y, c, cc }
+ this.get(k).map(|obs| {
+ let y = obs.y();
+ let cc = obs.cc();
+ let c = if k == 0 { cc } else { cc - this[k - 1].cc() };
+ Observation { y, c, cc }
+ })
}
- match this
- .partition_point(|obs| obs.cc() <= cum_weight)
- .checked_sub(1)
- {
- Some(k) => {
- if k + 1 >= this.len() {
- (Some(get(this, k)), None)
- } else {
- (Some(get(this, k)), Some(get(this, k + 1)))
- }
- }
- None => {
- if this.is_empty() {
- (None, None)
- } else {
- (None, Some(get(this, 0)))
- }
- }
+ match this.partition_point(|obs| obs.cc() <= cum_weight) {
+ 0 => (None, get(this, 0)),
+ k => (get(this, k - 1), get(this, k)),
}
}