From d807b1bb348f474666f62f115ec794943e0144da Mon Sep 17 00:00:00 2001 From: Simon Gardling Date: Tue, 28 Jan 2025 11:31:33 -0500 Subject: [PATCH] split_from: use generics --- src/misc.rs | 40 +++++++++++++++++++++++++--------------- src/repr.rs | 3 +-- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/misc.rs b/src/misc.rs index 929ac93..c7e7ea6 100644 --- a/src/misc.rs +++ b/src/misc.rs @@ -1,20 +1,30 @@ -pub fn split_from(min: usize, max: usize, x: usize) -> Vec> { +use std::{iter::Rev, ops::RangeInclusive}; + +pub fn split_from(min: T, max: T, x: T) -> Vec> +where + T: std::cmp::PartialOrd + + std::ops::Add + + std::ops::Sub + + Copy + + Ord, + RangeInclusive: Iterator + DoubleEndedIterator, + Rev>: Iterator, +{ 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::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]]); } } diff --git a/src/repr.rs b/src/repr.rs index ad02c66..4db7a30 100644 --- a/src/repr.rs +++ b/src/repr.rs @@ -1,6 +1,5 @@ -use std::fmt; - use crate::misc::split_from; +use std::fmt; #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum Piece {