1
- use crate :: { Character , Text , TextStream } ;
1
+ use crate :: { Character , Text } ;
2
+ use infinite_iterator:: InfiniteIterator ;
2
3
use source_files:: Source ;
3
4
use std:: collections:: VecDeque ;
4
5
5
- pub struct TextPeeker < S : TextStream > {
6
- stream : S ,
6
+ pub struct TextPeeker < I >
7
+ where
8
+ I : InfiniteIterator < Item = Character > ,
9
+ {
10
+ stream : I ,
7
11
queue : VecDeque < ( char , Source ) > ,
8
12
}
9
13
10
- impl < S : TextStream > TextPeeker < S > {
11
- pub fn new ( stream : S ) -> Self {
14
+ impl < I > TextPeeker < I >
15
+ where
16
+ I : InfiniteIterator < Item = Character > ,
17
+ {
18
+ pub fn new ( stream : I ) -> Self {
12
19
Self {
13
20
stream,
14
21
queue : VecDeque :: new ( ) ,
15
22
}
16
23
}
17
24
}
18
25
19
- impl < S : TextStream > TextStream for TextPeeker < S > {
26
+ impl < I > InfiniteIterator for TextPeeker < I >
27
+ where
28
+ I : InfiniteIterator < Item = Character > ,
29
+ {
30
+ type Item = Character ;
31
+
20
32
fn next ( & mut self ) -> Character {
21
33
self . queue
22
34
. pop_front ( )
@@ -25,7 +37,10 @@ impl<S: TextStream> TextStream for TextPeeker<S> {
25
37
}
26
38
}
27
39
28
- impl < S : TextStream > Text for TextPeeker < S > {
40
+ impl < I > Text for TextPeeker < I >
41
+ where
42
+ I : InfiniteIterator < Item = Character > ,
43
+ {
29
44
fn peek_nth ( & mut self , n : usize ) -> Character {
30
45
while self . queue . len ( ) <= n {
31
46
match self . stream . next ( ) {
0 commit comments