rustkell/datalist/
mod.rs

1//! Operations on 'list'
2/**
3 * File: src/datalist/mod.rs
4 * Author: Anicka Burova <anicka.burova@gmail.com>
5 * Date: 04.10.2017
6 * Last Modified Date: 04.10.2017
7 * Last Modified By: Anicka Burova <anicka.burova@gmail.com>
8 */
9
10
11pub mod tails;
12
13pub use self::tails::Tails;
14use std::marker::Sized;
15
16/// Operations on 'list'
17pub trait DataList {
18
19    /// The tails function returns all final segments of the list, longest first.
20    /// # Example
21    /// ```
22    /// use rustkell::DataList;
23    /// let v = vec![1,2,3,4];
24    /// for t in v.tails() {
25    ///     println!("{:?}", t);
26    /// }
27    /// ```
28    /// > [1, 2, 3, 4]  
29    /// > [2, 3, 4]  
30    /// > [3, 4]  
31    /// > [4]  
32    /// > []  
33
34    fn tails(&self) -> Tails<Self>
35        where Self: Sized;
36}
37
38
39impl<T> DataList for Vec<T> {
40    fn tails(&self) -> Tails<Self> {
41        Tails::create(&self)
42    }
43}
44
45use std::slice::Iter;
46
47impl<'a, T> DataList for Iter<'a, T> {
48    fn tails(&self) -> Tails<Self> {
49        Tails::create(&self)
50    }
51}
52
53impl<'a, T> DataList for &'a[T] {
54    fn tails(&self) -> Tails<Self> {
55        Tails::create(&self)
56    }
57}
58
59#[test]
60fn slice_test_tails() {
61    let v = [1,2,3,4];
62    let b = vec![
63        vec![1,2,3,4],
64        vec![2,3,4],
65        vec![3,4],
66        vec![4],
67        vec![],
68    ];
69    for (a,b) in (&v[..]).tails().into_iter().zip(b) {
70        assert_eq!(a,&b[..]);
71    }
72}
73
74
75#[test]
76fn iter_test_tails() {
77    let v = [1,2,3,4];
78    let b = vec![
79        vec![1,2,3,4],
80        vec![2,3,4],
81        vec![3,4],
82        vec![4],
83        vec![],
84    ];
85    for (a,b) in v.iter().tails().into_iter().zip(b) {
86        let a = a.into_iter().map(|x| *x).collect::<Vec<_>>();
87        assert_eq!(a,b);
88    }
89}
90
91
92#[test]
93fn vector_test_tails() {
94    let v = vec![1,2,3,4];
95    let b = vec![
96        vec![1,2,3,4],
97        vec![2,3,4],
98        vec![3,4],
99        vec![4],
100        vec![],
101    ];
102    for (a,b) in v.tails().into_iter().zip(b) {
103        assert_eq!(a,&b[..]);
104    }
105}
106
107#[test]
108fn slice_test_tails_empty() {
109    let v: [i32;0] = [];
110    let b: Vec<Vec<i32>> = vec![
111        vec![],
112    ];
113    for (a,b) in (&v[..]).tails().into_iter().zip(b) {
114        assert_eq!(a,&b[..]);
115    }
116}
117
118#[test]
119fn vector_test_tails_empty() {
120    let v: Vec<i32> = vec![];
121    let b: Vec<Vec<i32>> = vec![
122        vec![],
123    ];
124    for (a,b) in v.tails().into_iter().zip(b) {
125        assert_eq!(a,&b[..]);
126    }
127}
128
129#[test]
130fn iter_test_tails_empty() {
131    let v: Vec<i32> = vec![];
132    let b: Vec<Vec<i32>> = vec![
133        vec![],
134    ];
135    for (a,b) in v.iter().tails().into_iter().zip(b) {
136        let a = a.into_iter().map(|x| *x).collect::<Vec<_>>();
137        assert_eq!(a,b);
138    }
139}