1
1
package mx .kenzie .jupiter .stream .impl ;
2
2
3
+ import mx .kenzie .jupiter .iterator .LazyIterator ;
3
4
import mx .kenzie .jupiter .stream .ChunkStream ;
5
+ import org .jetbrains .annotations .NotNull ;
4
6
5
7
import java .util .ArrayList ;
6
8
import java .util .Deque ;
9
+ import java .util .Iterator ;
7
10
import java .util .List ;
8
11
import java .util .concurrent .LinkedBlockingDeque ;
12
+ import java .util .concurrent .atomic .AtomicLong ;
9
13
10
14
public class QueuedChunkStream <Element > extends ChunkStream <Element > {
11
15
12
16
protected final Deque <Element > queue ;
17
+ protected final AtomicLong counter ;
13
18
protected volatile boolean closed ;
14
19
15
20
public QueuedChunkStream () {
16
21
this .queue = new LinkedBlockingDeque <>();
22
+ this .counter = new AtomicLong ();
17
23
}
18
24
19
25
@ Override
20
26
public void feed (Element element ) {
21
27
this .queue .addLast (element );
22
28
}
23
29
24
- @ Override
25
- public Element read () {
26
- return this .queue .getFirst ();
27
- }
28
-
29
30
@ Override
30
31
public Element [] readAllRemaining (Element [] array ) {
31
32
final List <Element > list = new ArrayList <>();
@@ -34,15 +35,37 @@ public Element[] readAllRemaining(Element[] array) {
34
35
}
35
36
36
37
@ Override
37
- public synchronized boolean isClosed () {
38
- return closed ;
38
+ public @ NotNull Iterator <Element > iterator () {
39
+ return new LazyIterator <>() {
40
+ @ Override
41
+ public boolean hasNext () {
42
+ return !closed || counter .get () + 1 < queue .size ();
43
+ }
44
+
45
+ @ Override
46
+ public Element next () {
47
+ return read ();
48
+ }
49
+ };
39
50
}
40
51
41
52
@ Override
42
53
public boolean canRead () {
43
54
return !this .queue .isEmpty ();
44
55
}
45
56
57
+ @ Override
58
+ public Element read () {
59
+ final Element element = this .queue .getFirst ();
60
+ this .counter .getAndIncrement ();
61
+ return element ;
62
+ }
63
+
64
+ @ Override
65
+ public synchronized boolean isClosed () {
66
+ return closed ;
67
+ }
68
+
46
69
@ Override
47
70
public synchronized void close () {
48
71
this .closed = true ;
0 commit comments