more_itertools/
sequence.rs1use 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}