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 {
|
if min > x || x > max {
|
||||||
return Vec::new();
|
return Vec::new();
|
||||||
}
|
}
|
||||||
let x_lower = x.checked_sub(1).unwrap_or(min);
|
|
||||||
let x_upper = (x + 1).min(max);
|
let x_upper = (x + 1).min(max);
|
||||||
let lower_range = if x_lower != min {
|
|
||||||
(min..=x_lower).rev().collect()
|
let mut output: Vec<Vec<T>> = Vec::new();
|
||||||
} else {
|
if x > min + 1 {
|
||||||
Vec::new()
|
let x_lower = x - 1;
|
||||||
};
|
output.push((min..=x_lower).rev().collect());
|
||||||
let upper_range = if x_upper != max {
|
}
|
||||||
(x_upper..=max).collect()
|
if x_upper < max {
|
||||||
} else {
|
output.push((x_upper..=max).collect());
|
||||||
Vec::new()
|
}
|
||||||
};
|
output
|
||||||
vec![lower_range, upper_range]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -25,8 +35,8 @@ mod test {
|
|||||||
fn split_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, 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 crate::misc::split_from;
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
|
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
|
||||||
pub enum Piece {
|
pub enum Piece {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user