standard_card 1.4.0

A Lightweight Library for Efficient Card Representation
Documentation
/// Deal cards from the deck to each hand in a certain number
///
/// # Arguments
/// cards - A deck of cards with up to five cards
/// hands - Number of cards by hands
///
/// # Example
/// ```
/// use standard_card::card::create;
/// use standard_card::deck::deal;
///
/// let cards = vec![create(0, 0), create(1, 0), create(2, 0)];
/// let hands = vec![2, 1];
/// let actual = deal(&cards, &hands);
///
/// assert_eq!(actual, vec![vec![create(0, 0), create(1, 0)], vec![create(2, 0)]]);
/// ```
///
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() {
        // Arrange
        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]];

        // Act
        let actual = deal(&cards, &hands);

        // Assert
        assert_eq!(actual, expected);
    }

    #[test]
    fn cards_is_less_than_total_hands() {
        // Arrange
        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]];

        // Act
        let actual = deal(&cards, &hands);

        // Assert
        assert_eq!(actual, expected);
    }

    #[test]
    fn cards_is_more_than_total_hands() {
        // Arrange
        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]];

        // Act
        let actual = deal(&cards, &hands);

        // Assert
        assert_eq!(actual, expected);
    }
}