split_from: use generics
This commit is contained in:
parent
eb224adec3
commit
d807b1bb34
40
src/misc.rs
40
src/misc.rs
@ -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]]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
use std::fmt;
|
||||
|
||||
use crate::misc::split_from;
|
||||
use std::fmt;
|
||||
|
||||
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
|
||||
pub enum Piece {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user