19
19
import java .util .NoSuchElementException ;
20
20
import java .util .concurrent .ArrayBlockingQueue ;
21
21
import java .util .concurrent .BlockingQueue ;
22
+ import java .util .concurrent .atomic .AtomicBoolean ;
22
23
import java .util .concurrent .atomic .AtomicIntegerFieldUpdater ;
23
24
24
25
import rx .Notification ;
@@ -46,11 +47,7 @@ public static <T> Iterable<T> next(final Observable<? extends T> items) {
46
47
@ Override
47
48
public Iterator <T > iterator () {
48
49
NextObserver <T > nextObserver = new NextObserver <T >();
49
- final NextIterator <T > nextIterator = new NextIterator <T >(nextObserver );
50
-
51
- items .materialize ().subscribe (nextObserver );
52
-
53
- return nextIterator ;
50
+ return new NextIterator <T >(items , nextObserver );
54
51
}
55
52
};
56
53
@@ -59,28 +56,19 @@ public Iterator<T> iterator() {
59
56
// test needs to access the observer.waiting flag non-blockingly.
60
57
/* private */ static final class NextIterator <T > implements Iterator <T > {
61
58
62
- private final NextObserver <? extends T > observer ;
59
+ private final NextObserver <T > observer ;
60
+ private final Observable <? extends T > items ;
63
61
private T next ;
64
62
private boolean hasNext = true ;
65
63
private boolean isNextConsumed = true ;
66
64
private Throwable error = null ;
65
+ private boolean started = false ;
67
66
68
- private NextIterator (NextObserver <? extends T > observer ) {
67
+ private NextIterator (Observable <? extends T > items , NextObserver <T > observer ) {
68
+ this .items = items ;
69
69
this .observer = observer ;
70
70
}
71
71
72
-
73
- // in tests, set the waiting flag without blocking for the next value to
74
- // allow lockstepping instead of multi-threading
75
- /**
76
- * In tests, set the waiting flag without blocking for the next value to
77
- * allow lockstepping instead of multi-threading
78
- * @param value use 1 to enter into the waiting state
79
- */
80
- void setWaiting (int value ) {
81
- observer .setWaiting (value );
82
- }
83
-
84
72
@ Override
85
73
public boolean hasNext () {
86
74
if (error != null ) {
@@ -102,6 +90,13 @@ public boolean hasNext() {
102
90
103
91
private boolean moveToNext () {
104
92
try {
93
+ if (!started ) {
94
+ started = true ;
95
+ // if not started, start now
96
+ observer .setWaiting (1 );
97
+ items .materialize ().subscribe (observer );
98
+ }
99
+
105
100
Notification <? extends T > nextNotification = observer .takeNext ();
106
101
if (nextNotification .isOnNext ()) {
107
102
isNextConsumed = false ;
0 commit comments