sortedlist_rs/
lib.rs

1use core::fmt;
2use std::{fmt::Debug, ops::Index, vec::IntoIter};
3
4/// A sorted list data structure
5///
6/// # Example
7///
8/// ```
9/// use sortedlist_rs::SortedList;
10///
11/// let array = vec![90, 19, 25];
12/// let mut sorted_list = SortedList::from(array);
13///
14/// println!("{:?}", sorted_list);
15/// // [19, 25, 90]
16///
17/// sorted_list.insert(100);
18/// sorted_list.insert(1);
19/// sorted_list.insert(20);
20/// println!("{:?}", sorted_list);
21/// // [1, 19, 20, 25, 90, 100]
22///
23/// let x = sorted_list.remove(3);
24/// assert_eq!(25, x);
25/// // removed the 3-rd smallest (0-indexed) element.
26///
27/// assert_eq!(&20, sorted_list.kth_smallest(2));
28///
29/// assert_eq!(20, sorted_list[2]);
30///
31/// println!("{:?}", sorted_list);
32/// // [1, 19, 20, 90, 100]
33/// ```
34pub struct SortedList<T>
35where
36    T: Ord,
37{
38    _lists: Vec<Vec<T>>,
39    _index_tree: Vec<usize>,
40    _index_tree_offset: usize,
41    _load_factor: usize,
42    _upper_load_factor: usize,
43    _lower_load_factor: usize,
44    _len: usize,
45}
46
47/// Private method implementations
48impl<T> SortedList<T>
49where
50    T: Ord,
51{
52    const DEFAULT_INDEX_TREE_OFFSET: usize = 1 << 5;
53    const DEFAULT_LOAD_FACTOR: usize = 1_024;
54    const DEFAULT_UPPER_LOAD_FACTOR: usize = 2_048;
55    const DEFAULT_LOWER_LOAD_FACTOR: usize = 512;
56
57    /// Instantiate an empty SortedList.
58    fn _default() -> Self {
59        Self {
60            _lists: vec![],
61            _index_tree: vec![0; 2 * Self::DEFAULT_INDEX_TREE_OFFSET],
62            _index_tree_offset: Self::DEFAULT_INDEX_TREE_OFFSET,
63            _load_factor: Self::DEFAULT_LOAD_FACTOR,
64            _upper_load_factor: Self::DEFAULT_UPPER_LOAD_FACTOR,
65            _lower_load_factor: Self::DEFAULT_LOWER_LOAD_FACTOR,
66            _len: 0,
67        }
68    }
69
70    /// Collapse self._lists\[i]. self._lists\[i].len() must be > 1.
71    fn _collapse(&mut self, i: usize) {
72        if self._lists.len() <= 1 {
73            panic!(
74                "Attempting to collapse while self._lists contains only {} lists.",
75                self._lists.len()
76            );
77        }
78
79        let left = match i >= 1 {
80            true => self._lists[i - 1].len(),
81            false => usize::MAX,
82        };
83
84        let right = match i + 1 < self._lists.len() {
85            true => self._lists[i + 1].len(),
86            false => usize::MAX,
87        };
88
89        assert!(left.min(right) < usize::MAX);
90        if left < right {
91            // collapse to k-1
92            let mut removed = self._lists.remove(i);
93            self._lists[i - 1].append(&mut removed);
94        } else {
95            let mut removed = self._lists.remove(i + 1);
96            self._lists[i].append(&mut removed);
97        }
98
99        self._rebuild_index_tree();
100    }
101
102    /// Expand self._lists\[i]. self._lists\[i].len() must be > self._upper_load_factor in order for worthy expansion.
103    fn _expand(&mut self, i: usize) {
104        if self._lists[i].len() < self._upper_load_factor {
105            panic!("Unnecessary expand at self._lists[{}]", i);
106        }
107
108        let size = self._lists[i].len();
109        let removed: Vec<T> = self._lists[i].drain(size / 2..).collect();
110        self._lists.insert(i + 1, removed);
111
112        // instead of rebuilding the index segment tree, we should check whether we can "shift" the suffix to the right
113        // then update tree at position k and k+1
114        // and rebuild the first half of the index tree
115        self._rebuild_index_tree();
116    }
117
118    /// Rebuild the index segment tree.
119    fn _rebuild_index_tree(&mut self) {
120        self._index_tree_offset = Self::DEFAULT_INDEX_TREE_OFFSET; // minimal size lower bound
121        while self._index_tree_offset < self._lists.len() {
122            self._index_tree_offset *= 2;
123        }
124
125        self._index_tree.fill(0);
126        self._index_tree.resize(2 * self._index_tree_offset, 0);
127
128        (0..self._lists.len()).for_each(|node| {
129            self._index_tree[node + self._index_tree_offset] = self._lists[node].len();
130        });
131
132        (1..self._index_tree_offset).rev().for_each(|node| {
133            self._index_tree[node] = self._index_tree[2 * node] + self._index_tree[2 * node + 1];
134        });
135    }
136
137    /// Query the range sum of the index tree
138    /// It computes the number of elements stored in self._lists\[ql..qr+1].
139    fn _index_tree_sum(
140        &self,
141        ql: usize,
142        qr: usize,
143        opt_node: Option<usize>,
144        opt_l: Option<usize>,
145        opt_r: Option<usize>,
146    ) -> usize {
147        let node = opt_node.unwrap_or(1);
148        let l = opt_l.unwrap_or(0);
149        let r = opt_r.unwrap_or(self._index_tree_offset - 1);
150
151        if ql <= l && r <= qr {
152            return self._index_tree[node];
153        }
154
155        if qr < l || r < ql {
156            return 0;
157        }
158
159        let m = (l + r) / 2;
160        self._index_tree_sum(ql, qr, Some(2 * node), Some(l), Some(m))
161            + self._index_tree_sum(ql, qr, Some(2 * node + 1), Some(m + 1), Some(r))
162    }
163
164    /// add val to position k of the underlying array of the segment tree
165    fn _index_tree_add(&mut self, i: usize, val: i32) {
166        let mut node = self._index_tree_offset + i;
167        if val >= 0 {
168            self._index_tree[node] += val as usize;
169        } else {
170            self._index_tree[node] -= (-val) as usize;
171        }
172        node /= 2;
173
174        while node > 0 {
175            self._index_tree[node] = self._index_tree[2 * node] + self._index_tree[2 * node + 1];
176            node /= 2;
177        }
178    }
179
180    /// Remove self._lists\[i]\[j]. It is assumed that self._lists\[i]\[j] will not go out of bound.
181    fn _lists_remove(&mut self, i: usize, j: usize) -> T {
182        if i >= self._lists.len() || j >= self._lists[i].len() {
183            panic!(
184                "List index out of range. Attempting to remove self._lists[{}][{}]",
185                i, j
186            );
187        }
188
189        let removed = self._lists[i].remove(j);
190        self._len -= 1;
191
192        if self._lists.len() > 1 && self._lists[i].len() < self._lower_load_factor {
193            self._collapse(i);
194        } else {
195            self._index_tree_add(i, -1);
196        }
197
198        removed
199    }
200
201    /// Insert `element` into self._lists\[i]. It is assumed that self._lists\[i] is the correct insert position.
202    fn _lists_insert(&mut self, i: usize, element: T) {
203        // insert ele into self._lists[i]
204        // assumptions:
205        // 1. self._lists[i] must exist
206        // 2. i is the correct position for inserting ele
207        let pos = match self._lists[i].binary_search(&element) {
208            Ok(p) => p,
209            Err(p) => p,
210        };
211
212        self._lists[i].insert(pos, element);
213        self._len += 1;
214
215        if self._lists[i].len() > self._upper_load_factor {
216            self._expand(i);
217        } else {
218            self._index_tree_add(i, 1);
219        }
220    }
221
222    /// Find the position in self._lists which element should be inserted.
223    fn _bisect_right_lists(&self, element: &T) -> usize {
224        if &self._lists[0][0] > element {
225            return 0;
226        }
227
228        let mut lo = 0;
229        let mut hi = self._lists.len() - 1;
230        if &self._lists[hi][0] <= element {
231            return hi;
232        }
233
234        // self._lists[lo][0] <= element
235        // self._lists[hi][0] > element
236        let mut mid;
237        while lo + 1 < hi {
238            mid = (lo + hi) / 2;
239            if &self._lists[mid][0] <= element {
240                lo = mid;
241            } else {
242                hi = mid;
243            }
244        }
245
246        lo
247    }
248
249    /// Returns (i,j) such that self._lists\[i]\[j] is the k-th element (0-indexed) of the SortedList.
250    fn _locate_kth_element(&self, k: usize) -> (usize, usize) {
251        // input k is 0-indexed
252        if k >= self._len {
253            panic!("SortedList: Index out of range.");
254        }
255
256        let is_leaf_node = |u| u >= self._index_tree_offset;
257        let mut cnt = k + 1;
258
259        let mut node: usize = 1;
260        while !is_leaf_node(node) {
261            if self._index_tree[2 * node] >= cnt {
262                node *= 2;
263            } else {
264                cnt -= self._index_tree[2 * node];
265                node = 2 * node + 1;
266            }
267        }
268
269        // return values are 0-indexed
270        (node - self._index_tree_offset, cnt - 1)
271    }
272
273    /// Retrieve an immutable reference of self._lists\[i]\[j].
274    fn _at(&self, i: usize, j: usize) -> &T {
275        &self._lists[i][j]
276    }
277
278    /// Returns a flattened view of the SortedList.
279    fn _flat(&self) -> Vec<&T> {
280        self._lists.iter().fold(Vec::new(), |mut cur, list| {
281            list.iter().for_each(|element| {
282                cur.push(element);
283            });
284            cur
285        })
286    }
287}
288
289/// Public method implementations
290impl<T> SortedList<T>
291where
292    T: Ord,
293{
294    /// Creates an empty SortedList.
295    ///
296    /// # Example
297    ///
298    /// ```
299    /// use sortedlist_rs::SortedList;
300    ///
301    /// let sorted_list: SortedList<i32> = SortedList::new();
302    /// ```
303    pub fn new() -> Self {
304        Self::_default()
305    }
306
307    /// Find the k-th smallest (0-indexed) element in the SortedList.
308    ///
309    /// # Example
310    ///
311    /// ```
312    /// use sortedlist_rs::SortedList;
313    ///
314    /// let sorted_list = SortedList::from([10, 2, 3]);
315    /// assert_eq!(&3, sorted_list.kth_smallest(1));
316    /// ```
317    pub fn kth_smallest(&self, k: usize) -> &T {
318        // k is 0-indexed
319        let (i, j) = self._locate_kth_element(k);
320        return self._at(i, j);
321    }
322
323    /// Clears the SortedList.
324    ///
325    /// # Example
326    ///
327    /// ```
328    /// use sortedlist_rs::SortedList;
329    ///
330    /// let mut sorted_list = SortedList::from([10, 2, 3]);
331    /// sorted_list.clear();
332    ///
333    /// assert_eq!(0, sorted_list.len());
334    /// assert_eq!(true, sorted_list.is_empty());
335    /// ```
336    pub fn clear(&mut self) {
337        self._lists.clear();
338        self._index_tree.clear();
339        self._index_tree
340            .resize(2 * Self::DEFAULT_INDEX_TREE_OFFSET, 0);
341        self._index_tree_offset = Self::DEFAULT_INDEX_TREE_OFFSET;
342        self._len = 0;
343    }
344
345    /// Insert `element` into the SortedList.
346    ///
347    /// # Example
348    ///
349    /// ```
350    /// use sortedlist_rs::SortedList;
351    ///
352    /// let mut sorted_list = SortedList::new();
353    /// sorted_list.insert(10);
354    /// sorted_list.insert(6);
355    /// sorted_list.insert(99);
356    ///
357    /// assert_eq!(3, sorted_list.len());
358    /// assert_eq!(6, sorted_list[0]);
359    /// assert_eq!(10, sorted_list[1]);
360    /// ```
361    pub fn insert(&mut self, element: T) {
362        if self._len == 0 {
363            self._lists.clear();
364            self._lists.push(vec![]);
365            self._lists_insert(0, element);
366            return;
367        }
368
369        let k = self._bisect_right_lists(&element);
370        self._lists_insert(k, element);
371    }
372
373    /// Pops the k-th smallest (0-indexed) element from the SortedList.
374    ///
375    /// # Example
376    ///
377    /// ```
378    /// use sortedlist_rs::SortedList;
379    ///
380    /// let mut sorted_list = SortedList::from([10, 2, 99, 20, 30]);
381    /// let popped = sorted_list.remove(3);
382    ///
383    /// assert_eq!(30, popped);
384    /// ```
385    pub fn remove(&mut self, k: usize) -> T {
386        let (i, j) = self._locate_kth_element(k);
387        self._lists_remove(i, j)
388    }
389
390    /// Binary searches the given element in the SortedList.
391    /// Returns Ok(i) for exact match, Err(i) otherwise.
392    ///
393    /// # Example
394    ///
395    /// ```
396    /// use sortedlist_rs::SortedList;
397    ///
398    /// let mut sorted_list = SortedList::from([10, 2, 99, 20, 30]);
399    ///
400    /// let result = sorted_list.binary_search(&30);
401    /// assert_eq!(Ok(3), result);
402    ///
403    /// let result = sorted_list.binary_search(&90);
404    /// assert_eq!(Err(4), result);
405    /// ```
406    pub fn binary_search(&self, element: &T) -> Result<usize, usize> {
407        if self._len == 0 {
408            return Err(0);
409        }
410
411        let i: usize = self._bisect_right_lists(element);
412        if i == 0 {
413            return self._lists[i].binary_search(element);
414        }
415
416        match self._lists[i].binary_search(element) {
417            Ok(pos) => Ok(pos + self._index_tree_sum(0, i - 1, None, None, None)),
418            Err(pos) => Err(pos + self._index_tree_sum(0, i - 1, None, None, None)),
419        }
420    }
421
422    /// Returns whether the SortedList contains a specific element.
423    ///
424    /// # Example
425    ///
426    /// ```
427    /// use sortedlist_rs::SortedList;
428    ///
429    /// let sorted_list = SortedList::from([10, 2, 99, 20]);
430    ///
431    /// assert_eq!(true, sorted_list.contains(&10));
432    /// assert_eq!(false, sorted_list.contains(&90));
433    /// ```
434    pub fn contains(&self, element: &T) -> bool {
435        self.binary_search(element).is_ok()
436    }
437
438    /// Returns the number of elements stored in the SortedList.
439    ///
440    /// # Example
441    ///
442    /// ```
443    /// use sortedlist_rs::SortedList;
444    ///
445    /// let sorted_list = SortedList::from([10, 2, 99, 20]);
446    ///
447    /// assert_eq!(4, sorted_list.len());
448    /// ```
449    pub fn len(&self) -> usize {
450        self._len
451    }
452
453    /// Returns whether the SortedList is empty.
454    ///
455    /// # Example
456    ///
457    /// ```
458    /// use sortedlist_rs::SortedList;
459    ///
460    /// let mut sorted_list: SortedList<i32> = SortedList::new();
461    /// assert_eq!(true, sorted_list.is_empty());
462    ///
463    /// sorted_list.insert(1);
464    /// assert_eq!(false, sorted_list.is_empty());
465    /// ```
466    pub fn is_empty(&self) -> bool {
467        self.len() == 0
468    }
469
470    /// Returns the last element of the SortedList, i.e. the largest element.
471    ///
472    /// # Example
473    ///
474    /// ```
475    /// use sortedlist_rs::SortedList;
476    ///
477    /// let sorted_list = SortedList::from([10, 2, 99, 20]);
478    ///
479    /// assert_eq!(Some(&99), sorted_list.last());
480    /// ```
481    pub fn last(&self) -> Option<&T> {
482        if self.is_empty() {
483            return None;
484        }
485        return self._lists.last().unwrap().last();
486    }
487
488    /// Returns the first element of the SortedList, i.e. the smallest element.
489    ///
490    /// # Example
491    ///
492    /// ```
493    /// use sortedlist_rs::SortedList;
494    ///
495    /// let sorted_list = SortedList::from([10, 2, 99, 20]);
496    ///
497    /// assert_eq!(Some(&2), sorted_list.first());
498    /// ```
499    pub fn first(&self) -> Option<&T> {
500        if self.is_empty() {
501            return None;
502        }
503        return self._lists.first().unwrap().first();
504    }
505
506    /// Returns the element for the given index in the SortedList.
507    ///
508    /// # Example
509    ///
510    /// ```
511    /// use sortedlist_rs::SortedList;
512    ///
513    /// let sorted_list = SortedList::from([10, 2, 99, 20]);
514    ///
515    /// assert_eq!(Some(&20), sorted_list.get(2));
516    /// ```
517    pub fn get(&self, index: usize) -> Option<&T> {
518        if self.is_empty() || self.len() <= index {
519            return None;
520        }
521        return Some(self.kth_smallest(index));
522    }
523
524    /// Returns a flattened view of the SortedList.
525    ///
526    /// # Example
527    ///
528    /// ```
529    /// use sortedlist_rs::SortedList;
530    ///
531    /// let sorted_list = SortedList::from([10, 2, 99, 20]);
532    /// let flattened = sorted_list.flatten();
533    ///
534    /// assert_eq!(vec![&2, &10, &20, &99], flattened);
535    /// ```
536    pub fn flatten(&self) -> Vec<&T> {
537        self._flat()
538    }
539
540    /// Convert `self` into a new `Vec`.
541    ///
542    /// # Example
543    ///
544    /// ```
545    /// use sortedlist_rs::SortedList;
546    ///
547    /// let sorted_list = SortedList::from([10, 2, 99, 20]);
548    /// let v = sorted_list.to_vec();
549    ///
550    /// assert_eq!(vec![2, 10, 20, 99], v);
551    /// ```
552    pub fn to_vec(&self) -> Vec<T>
553    where
554        T: Clone,
555    {
556        self._lists.iter().fold(vec![], |mut cur, list| {
557            cur.append(&mut list.to_vec());
558            cur
559        })
560    }
561
562    /// Returns an iterator over the elements of the SortedList.
563    ///
564    /// # Example
565    ///
566    /// ```
567    /// use sortedlist_rs::SortedList;
568    ///
569    /// let sorted_list = SortedList::from([10, 2, 99, 20]);
570    /// let mut iterator = sorted_list.iter();
571    /// 
572    /// assert_eq!(Some(&2), iterator.next());
573    /// assert_eq!(Some(&10), iterator.next());
574    /// assert_eq!(Some(&20), iterator.next());
575    /// assert_eq!(Some(&99), iterator.next());
576    /// assert_eq!(None, iterator.next());
577    /// 
578    pub fn iter(&self) -> impl Iterator<Item = &T> {
579        self._lists.iter().flat_map(|list| list.iter())
580    }
581}
582
583impl<T> Default for SortedList<T>
584where
585    T: Ord,
586{
587    /// Creates an empty SortedList.
588    fn default() -> Self {
589        Self::_default()
590    }
591}
592
593impl<T> Index<usize> for SortedList<T>
594where
595    T: Ord,
596{
597    type Output = T;
598
599    /// Access the SortedList for the given index.
600    ///
601    /// # Example
602    ///
603    /// ```
604    /// use sortedlist_rs::SortedList;
605    ///
606    /// let sorted_list = SortedList::from([20, 2, 10, 99, 50, 32]);
607    ///
608    /// assert_eq!(32, sorted_list[3]);
609    /// ```
610    fn index(&self, index: usize) -> &Self::Output {
611        self.kth_smallest(index)
612    }
613}
614
615impl<T> From<IntoIter<T>> for SortedList<T>
616where
617    T: Ord,
618{
619    /// Creates a SortedList from an IntoIter
620    fn from(iter: IntoIter<T>) -> Self {
621        let mut array: Vec<T> = iter.collect();
622        array.sort();
623
624        // directly construct sorted_list's internals, i.e. _lists, _len
625        // This method is way faster than inserting elements one by one
626        let sorted_iter = array.into_iter();
627        let mut sorted_list = Self::default();
628        sorted_list._len = sorted_iter.len();
629
630        sorted_list._lists.push(vec![]);
631        let mut last_list_size = 0;
632
633        for element in sorted_iter {
634            sorted_list._lists.last_mut().unwrap().push(element);
635            last_list_size += 1;
636            if last_list_size == sorted_list._load_factor {
637                last_list_size = 0;
638                sorted_list._lists.push(vec![]);
639            }
640        }
641
642        sorted_list._rebuild_index_tree();
643        sorted_list
644    }
645}
646
647impl<T> From<Vec<T>> for SortedList<T>
648where
649    T: Ord,
650{
651    /// Creates a SortedList from a Vec
652    fn from(array: Vec<T>) -> Self {
653        Self::from(array.into_iter())
654    }
655}
656
657impl<T> From<&[T]> for SortedList<T>
658where
659    T: Ord + Clone,
660{
661    /// Allocate a SortedList and fill it by cloning `array`'s items.
662    fn from(array: &[T]) -> Self {
663        Self::from(Vec::from(array))
664    }
665}
666
667impl<T> From<&mut [T]> for SortedList<T>
668where
669    T: Ord + Clone,
670{
671    /// Allocate a SortedList and fill it by cloning `array`'s items.
672    fn from(array: &mut [T]) -> Self {
673        Self::from(Vec::from(array))
674    }
675}
676
677impl<T, const N: usize> From<[T; N]> for SortedList<T>
678where
679    T: Ord,
680{
681    /// Allocate a SortedList and move `array`'s item into it.
682    fn from(array: [T; N]) -> Self {
683        Self::from(Vec::from(array))
684    }
685}
686
687impl<T> fmt::Debug for SortedList<T>
688where
689    T: Ord + Debug,
690{
691    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
692        fmt::Debug::fmt(&self._flat(), f)
693    }
694}
695
696#[cfg(test)]
697mod tests {
698    use rand::{seq::SliceRandom, thread_rng, Rng};
699
700    use crate::SortedList;
701
702    #[test]
703    fn it_works() {
704        let x = vec![1, 2, 3, 4, 9, 8, 7, 6, 5, 4];
705        let y = vec![1, 2, 3, 4, 4, 5, 6, 7, 8, 9];
706        let arr = SortedList::from(x);
707
708        for i in 0..10 {
709            assert_eq!(y[i], arr[i]);
710        }
711    }
712
713    #[test]
714    fn random_tests() {
715        // Run tests with randomized inputs
716
717        let test_size = 100_000;
718        let test_op = 5_000;
719
720        let mut rng = thread_rng();
721        let mut array = vec![];
722        for _ in 0..test_size {
723            let x = rng.gen::<i32>();
724            array.push(x);
725        }
726
727        // reference sorted list
728        let mut copy = array.clone();
729        copy.sort();
730
731        // actual sorted list
732        let mut sorted_list = SortedList::from(array);
733
734        // Data setup
735        for _ in 0..test_op {
736            let x = rng.gen::<i32>();
737
738            // insert into copy
739            let k = match copy.binary_search(&x) {
740                Ok(i) => i,
741                Err(i) => i,
742            };
743            copy.insert(k, x);
744
745            // insert into sorted list
746            sorted_list.insert(x);
747        }
748
749        // Acutal tests
750        for _ in 0..test_op + test_size {
751            // Test: remove a random index, sorted order is maintained
752            let idx = rng.gen_range(0..copy.len());
753            let expect = copy.remove(idx);
754            let actual = sorted_list.remove(idx);
755            assert_eq!(expect, actual);
756
757            // Test: first
758            let expect = copy.first();
759            let actual = sorted_list.first();
760            assert_eq!(expect, actual);
761
762            // Test: last
763            let expect = copy.last();
764            let actual = sorted_list.last();
765            assert_eq!(expect, actual);
766
767            // Test: binary_search
768            let x = rng.gen::<i32>();
769            let actual = sorted_list.binary_search(&x);
770            let expect = copy.binary_search(&x);
771            assert_eq!(expect, actual);
772
773            // Test: get
774            let index = rng.gen_range(0..copy.len() + 2000);
775            let actual = sorted_list.get(index);
776            let expect = copy.get(index);
777            assert_eq!(expect, actual);
778
779            // Test: len
780            let actual = sorted_list.len();
781            let expect = copy.len();
782            assert_eq!(expect, actual);
783
784            // Test: is_empty
785            let actual = sorted_list.is_empty();
786            let expect = copy.is_empty();
787            assert_eq!(expect, actual);
788        }
789    }
790
791    #[test]
792    fn example() {
793        let array = vec![90, 19, 25];
794        let mut sorted_list = SortedList::from(array);
795
796        sorted_list.insert(100);
797        sorted_list.insert(1);
798        sorted_list.insert(20);
799
800        let x = sorted_list.remove(3);
801        assert_eq!(25, x);
802        assert_eq!(&20, sorted_list.kth_smallest(2));
803        assert_eq!(20, sorted_list[2]);
804    }
805
806    #[test]
807    fn binary_search_test() {
808        let array = vec![20; 100_000];
809        let sorted_list = SortedList::from(array);
810        let x = 50;
811
812        let actual = sorted_list.binary_search(&x);
813        let expected: Result<usize, usize> = Err(100_000);
814
815        assert_eq!(actual, expected);
816    }
817
818    #[test]
819    fn contains_test() {
820        let mut sorted_list = SortedList::from([10; 10_000]);
821        assert!(sorted_list.contains(&10));
822        assert!(!sorted_list.contains(&9));
823
824        sorted_list.insert(9);
825        assert!(sorted_list.contains(&9));
826
827        sorted_list.insert(11);
828        assert!(sorted_list.contains(&11));
829    }
830
831    #[test]
832    fn clear_test() {
833        // arrange
834        let mut sorted_list_1 = SortedList::from([10; 10_000]);
835        let mut sorted_list_2 = SortedList::from([1, 3, 4, 2, 0]);
836
837        // act
838        sorted_list_1.clear();
839        sorted_list_2.clear();
840
841        // assert
842        for sorted_list in [sorted_list_1, sorted_list_2] {
843            assert!(sorted_list._lists.is_empty());
844            for val in &sorted_list._index_tree {
845                assert!(val == &0);
846            }
847            assert!(sorted_list._index_tree.len() == 2 * sorted_list._index_tree_offset);
848        }
849    }
850
851    #[test]
852    fn to_vec_test() {
853        // arrange
854        let mut rng = thread_rng();
855        let mut array: Vec<usize> = (0..5_000).collect();
856        array.shuffle(&mut rng);
857
858        let sorted_list = SortedList::from(array);
859
860        // act
861        let to_vec = sorted_list.to_vec();
862
863        // assert
864        assert_eq!((0..5_000).collect::<Vec<usize>>(), to_vec);
865    }
866
867    #[test]
868    fn flatten_test() {
869        // arrange
870        let mut rng = thread_rng();
871        let mut array: Vec<usize> = (0..5_000).collect();
872        array.shuffle(&mut rng);
873
874        let sorted_list = SortedList::from(array);
875
876        // act
877        let flatten = sorted_list.flatten();
878
879        // assert
880        for i in 0..5_000 {
881            assert_eq!(flatten[i], &i);
882        }
883    }
884
885    #[test]
886    fn complex_data_structure_test() {
887        // arrange
888        let mut array: Vec<Vec<i32>> = vec![];
889        for i in (0..2000).rev() {
890            array.push((0..i + 1).collect());
891        }
892
893        // act
894        let sorted_list = SortedList::from(array);
895
896        // assert
897        for i in 0..2000 {
898            let actual: &Vec<i32> = &sorted_list[i];
899            let expected = (0..i + 1).map(|x| x as i32).collect::<Vec<i32>>();
900
901            assert_eq!(i + 1, actual.len());
902            for j in 0..actual.len() {
903                assert_eq!(actual[j], expected[j]);
904            }
905        }
906    }
907    
908    #[test]
909    fn break_case_insert_after_lst_has_been_clean() {
910        let mut lst = SortedList::<usize>::new();
911        lst.insert(3);
912        lst.remove(0);
913        lst.insert(1);
914        lst.insert(5);
915    }
916}