more_itertools/
sequence.rs

1use crate::error::{self, Error};
2
3pub trait Sequence<T>
4{
5    fn get<'a>(&'a self, index: usize) -> Option<&'a T>;
6    fn len(&self) -> usize;
7    fn slice(&self, begin: usize, end: usize) -> &[T];
8    fn as_slice(&self) -> &[T];
9}
10
11pub struct SequenceVector<T> {
12    v: Vec<T>
13}
14
15impl<T> SequenceVector<T> 
16where T: 'static
17{
18    pub(crate) fn new(v: Vec<T>) -> Box<dyn Sequence<T>> {
19        Box::new(SequenceVector {
20            v
21        })
22    }
23}
24
25impl<T> Sequence<T> for SequenceVector<T>
26{
27    fn get<'a>(&'a self, index: usize) -> Option<&'a T> {
28        return self.v.get(index);
29    }
30
31    fn len(&self) -> usize {
32        return self.v.len();
33    }
34
35    fn slice(&self, begin: usize, end: usize) -> &[T] {
36        return &self.v[begin..end];
37    }
38
39    fn as_slice(&self) -> &[T] {
40        return self.v.as_slice();
41    }
42}
43
44pub fn are_seqs_equals<T>(seq1: &dyn Sequence<T>, seq2: &dyn Sequence<T>) -> bool
45where T: PartialEq
46{
47    return seq1.len() == seq2.len() && seq1.as_slice().starts_with(seq2.as_slice());
48}
49
50pub fn create_seq_from_vec<T>(v: Vec<T>) -> Box<dyn Sequence<T>> 
51where T: 'static
52{
53    return SequenceVector::new(v);
54}
55
56pub fn create_seq_from_iterator<T>(mut iter: Box<dyn Iterator<Item=T>>) -> Box<dyn Sequence<T>>
57where T: 'static
58{
59    let mut v = Vec::new();
60    loop {
61        let _next = iter.next();
62        match _next {
63            None => { break; }
64            Some(_v) => {
65                v.push(_v);
66            }
67        }
68    }
69
70    return SequenceVector::new(v);
71}
72
73pub fn create_seq_from_iterator_result<T>(mut iter: Box<dyn Iterator<Item=Result<T, Error>>>) -> Result<Box<dyn Sequence<T>>, Error>
74where T: 'static
75{
76    let mut v = Vec::new();
77    loop {
78        let _next = iter.next();
79        if let Some(_v) = _next {
80            match _v {
81                Ok(_v2) => {
82                    v.push(_v2)
83                },
84                Err(err) => {
85                    return Err(error::any_error(err.kind(), err.message().unwrap().clone()))
86                }
87            }
88            
89        } else {
90            break;
91        }
92    }
93
94    return Ok(SequenceVector::new(v));
95}
96
97#[cfg(test)]
98mod tests {
99    use crate::{itertools::iter::iter_from_vec, utils::{generate_okok_iterator, generate_okokerr_iterator}};
100
101    use super::*;
102
103    #[test]
104    fn test1() {
105        let v = vec![1,2,3];
106        let v = create_seq_from_vec(v);
107        assert_eq!(3, v.len());
108        assert_eq!(1, *v.get(0).unwrap());
109        assert_eq!(2, *v.get(1).unwrap());
110        assert_eq!(3, *v.get(2).unwrap());
111    }
112
113    #[test]
114    fn test2() {
115        let v = iter_from_vec(vec![1,2,3]);
116        let v = create_seq_from_iterator(v);
117        assert_eq!(3, v.len());
118        assert_eq!(1, *v.get(0).unwrap());
119        assert_eq!(2, *v.get(1).unwrap());
120        assert_eq!(3, *v.get(2).unwrap());
121    }
122
123    #[test]
124    fn test_create_seq_from_iterator_result() {
125        let v = generate_okok_iterator(vec![1,2,3]);
126        let ret = create_seq_from_iterator_result(v);
127
128        if let Ok(v) = ret {
129            assert_eq!(3, v.len());
130            assert_eq!(1, *v.get(0).unwrap());
131            assert_eq!(2, *v.get(1).unwrap());
132            assert_eq!(3, *v.get(2).unwrap());
133        }
134
135        let v = generate_okokerr_iterator(vec![1,2,3], error::overflow_error("overflow".to_string()));
136        let ret = create_seq_from_iterator_result(v);
137
138        if let Err(err) = ret {
139            assert_eq!(error::Kind::OverflowError, err.kind());
140        }
141    }
142}