use std::{iter::Rev, ops::RangeInclusive}; pub fn split_from(min: T, max: T, x: T) -> Vec> where T: num::Integer + Copy, RangeInclusive: Iterator + DoubleEndedIterator, Rev>: Iterator, { // check that x is in range if min > x || x > max { return Vec::new(); } let mut output: Vec> = Vec::with_capacity(2); if x > min + T::one() { let x_lower = x - T::one(); output.push((min..=x_lower).rev().collect()); } if x + T::one() < max { output.push(((x + T::one())..=max).collect()); } output } #[cfg(test)] mod test { use super::*; #[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![1, 2, 3, 4, 5, 6]]); assert_eq!(split_from(0, 6, 6), vec![vec![5, 4, 3, 2, 1, 0]]); // test out-of-bounds and also generics assert_eq!( split_from::(-1i16, 4i16, 10i16), Vec::>::new() ); } }