split_from: use generics

This commit is contained in:
Simon Gardling 2025-01-28 11:31:33 -05:00
parent eb224adec3
commit d807b1bb34
Signed by: titaniumtown
GPG Key ID: 9AB28AC10ECE533D
2 changed files with 26 additions and 17 deletions

View File

@ -1,20 +1,30 @@
pub fn split_from(min: usize, max: usize, x: usize) -> Vec<Vec<usize>> {
use std::{iter::Rev, ops::RangeInclusive};
pub fn split_from<T>(min: T, max: T, x: T) -> Vec<Vec<T>>
where
T: std::cmp::PartialOrd
+ std::ops::Add<usize, Output = T>
+ std::ops::Sub<usize, Output = T>
+ Copy
+ Ord,
RangeInclusive<T>: Iterator<Item = T> + DoubleEndedIterator,
Rev<RangeInclusive<T>>: Iterator<Item = T>,
{
if min > x || x > max {
return Vec::new();
}
let x_lower = x.checked_sub(1).unwrap_or(min);
let x_upper = (x + 1).min(max);
let lower_range = if x_lower != min {
(min..=x_lower).rev().collect()
} else {
Vec::new()
};
let upper_range = if x_upper != max {
(x_upper..=max).collect()
} else {
Vec::new()
};
vec![lower_range, upper_range]
let mut output: Vec<Vec<T>> = Vec::new();
if x > min + 1 {
let x_lower = x - 1;
output.push((min..=x_lower).rev().collect());
}
if x_upper < max {
output.push((x_upper..=max).collect());
}
output
}
#[cfg(test)]
@ -25,8 +35,8 @@ mod test {
fn split_test() {
assert_eq!(split_from(0, 6, 2), vec![vec![1, 0], vec![3, 4, 5, 6]]);
assert_eq!(split_from(0, 6, 0), vec![vec![], vec![1, 2, 3, 4, 5, 6]]);
assert_eq!(split_from(0, 6, 0), vec![vec![1, 2, 3, 4, 5, 6]]);
assert_eq!(split_from(0, 6, 6), vec![vec![5, 4, 3, 2, 1, 0], vec![]]);
assert_eq!(split_from(0, 6, 6), vec![vec![5, 4, 3, 2, 1, 0]]);
}
}

View File

@ -1,6 +1,5 @@
use std::fmt;
use crate::misc::split_from;
use std::fmt;
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum Piece {