pub fn deal(cards: &Vec<i32>, hands: &Vec<usize>) -> Vec<Vec<i32>> {
let mut result: Vec<Vec<i32>> = vec![cards.clone()];
for hand in hands {
let mut tail = result.pop().unwrap_or_default();
if hands.len() <= result.len() || tail.len() <= *hand {
result.push(tail);
break;
}
let remaining = tail.split_off(*hand);
result.push(tail);
result.push(remaining);
}
result
}
#[cfg(test)]
mod deal {
use crate::deck::deal;
#[test]
fn cards_equal_to_total_hands() {
let cards = vec![1, 2, 3, 4, 5, 6, 7, 8];
let hands = vec![1, 1, 2, 4];
let expected = vec![vec![1], vec![2], vec![3, 4], vec![5, 6, 7, 8]];
let actual = deal(&cards, &hands);
assert_eq!(actual, expected);
}
#[test]
fn cards_is_less_than_total_hands() {
let cards = vec![1, 2, 3, 4, 5, 6, 7, 8];
let hands = vec![1, 1, 6, 4];
let expected = vec![vec![1], vec![2], vec![3, 4, 5, 6, 7, 8]];
let actual = deal(&cards, &hands);
assert_eq!(actual, expected);
}
#[test]
fn cards_is_more_than_total_hands() {
let cards = vec![1, 2, 3, 4, 5, 6, 7, 8];
let hands = vec![1, 1, 1, 4];
let expected = vec![vec![1], vec![2], vec![3], vec![4, 5, 6, 7], vec![8]];
let actual = deal(&cards, &hands);
assert_eq!(actual, expected);
}
}