lowdash/
drop.rs

1/// Removes the first `n` elements from a collection and returns the remaining elements.
2/// If `n` is greater than or equal to the length of the collection, returns an empty `Vec`.
3///
4/// **Time Complexity:** O(1) for slices, as it creates a slice from an existing slice.  
5/// O(m) for cloning elements, where m is the number of elements after dropping.
6///
7/// # Arguments
8///
9/// * `collection` - A slice of items from which elements will be dropped.
10/// * `n` - The number of elements to drop from the beginning of the collection.
11///
12/// # Type Parameters
13///
14/// * `T` - The type of elements in the collection. Must implement `Clone`.
15///
16/// # Returns
17///
18/// * `Vec<T>` - A vector containing the elements after dropping the first `n` elements.
19///
20/// # Examples
21///
22/// ```rust
23/// use lowdash::drop;
24///
25/// let numbers = vec![1, 2, 3, 4, 5];
26/// let result = drop(&numbers, 2);
27/// assert_eq!(result, vec![3, 4, 5]);
28/// ```
29///
30/// ```rust
31/// use lowdash::drop;
32///
33/// let letters = vec!['a', 'b', 'c', 'd'];
34/// let result = drop(&letters, 10);
35/// assert_eq!(result, vec![]);
36/// ```
37pub fn drop<T>(collection: &[T], n: usize) -> Vec<T>
38where
39    T: Clone,
40{
41    if n >= collection.len() {
42        Vec::new()
43    } else {
44        collection[n..].to_vec()
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use super::*;
51
52    #[test]
53    fn test_drop_normal_case() {
54        let numbers = vec![1, 2, 3, 4, 5];
55        let result = drop(&numbers, 2);
56        assert_eq!(result, vec![3, 4, 5]);
57    }
58
59    #[test]
60    fn test_drop_zero_elements() {
61        let numbers = vec![1, 2, 3];
62        let result = drop(&numbers, 0);
63        assert_eq!(result, vec![1, 2, 3]);
64    }
65
66    #[test]
67    fn test_drop_n_equal_length() {
68        let numbers = vec![1, 2, 3];
69        let result = drop(&numbers, 3);
70        assert_eq!(result, Vec::<i32>::new());
71    }
72
73    #[test]
74    fn test_drop_n_greater_than_length() {
75        let numbers = vec![1, 2, 3];
76        let result = drop(&numbers, 5);
77        assert_eq!(result, Vec::<i32>::new());
78    }
79
80    #[test]
81    fn test_drop_empty_collection() {
82        let empty: Vec<i32> = vec![];
83        let result = drop(&empty, 2);
84        assert_eq!(result, Vec::<i32>::new());
85    }
86
87    #[test]
88    fn test_drop_with_strings() {
89        let words = vec!["hello", "world", "rust"];
90        let result = drop(&words, 1);
91        assert_eq!(result, vec!["world", "rust"]);
92    }
93
94    #[test]
95    fn test_drop_with_structs() {
96        #[derive(Debug, PartialEq, Clone)]
97        struct Point {
98            x: i32,
99            y: i32,
100        }
101
102        let points = vec![
103            Point { x: 0, y: 0 },
104            Point { x: 1, y: 1 },
105            Point { x: 2, y: 2 },
106        ];
107        let result = drop(&points, 2);
108        let expected = vec![Point { x: 2, y: 2 }];
109        assert_eq!(result, expected);
110    }
111
112    #[test]
113    fn test_drop_n_is_zero() {
114        let letters = vec!['a', 'b', 'c'];
115        let result = drop(&letters, 0);
116        assert_eq!(result, vec!['a', 'b', 'c']);
117    }
118
119    #[test]
120    fn test_drop_full_drop() {
121        let letters = vec!['a', 'b', 'c'];
122        let result = drop(&letters, letters.len());
123        assert_eq!(result, Vec::<char>::new());
124    }
125}