1717package hu .akarnokd .asyncenum ;
1818
1919import java .util .concurrent .*;
20- import java .util .concurrent .atomic .AtomicInteger ;
20+ import java .util .concurrent .atomic .* ;
2121import java .util .function .BiConsumer ;
2222
2323final class AsyncConcatArray <T > implements AsyncEnumerable <T > {
@@ -38,33 +38,36 @@ static final class ConcatArrayEnumerator<T> extends AtomicInteger
3838
3939 final AsyncEnumerable <T >[] sources ;
4040
41- AsyncEnumerator <T > currentEnumerator ;
41+ final AtomicReference < AsyncEnumerator <T > > currentEnumerator ;
4242
4343 CompletableFuture <Boolean > currentStage ;
4444
4545 int index ;
4646
4747 ConcatArrayEnumerator (AsyncEnumerable <T >[] sources ) {
4848 this .sources = sources ;
49+ this .currentEnumerator = new AtomicReference <>();
4950 }
5051
5152 @ Override
5253 public CompletionStage <Boolean > moveNext () {
53- if (currentEnumerator == null ) {
54+ if (currentEnumerator . get () == null ) {
5455 if (index == sources .length ) {
5556 return FALSE ;
5657 }
57- currentEnumerator = sources [index ++].enumerator ();
58+ if (!AsyncEnumeratorHelper .replace (currentEnumerator , sources [index ++].enumerator ())) {
59+ return CANCELLED ;
60+ }
5861 }
5962
6063 currentStage = new CompletableFuture <>();
61- currentEnumerator .moveNext ().whenComplete (this );
64+ currentEnumerator .getPlain (). moveNext ().whenComplete (this );
6265 return currentStage ;
6366 }
6467
6568 @ Override
6669 public T current () {
67- return currentEnumerator .current ();
70+ return currentEnumerator .getPlain (). current ();
6871 }
6972
7073 @ Override
@@ -82,11 +85,20 @@ public void accept(Boolean aBoolean, Throwable throwable) {
8285 currentStage .complete (false );
8386 break ;
8487 }
85- currentEnumerator = sources [index ++].enumerator ();
86- currentEnumerator .moveNext ().whenComplete (this );
88+ AsyncEnumerator <T > en = sources [index ++].enumerator ();
89+ if (AsyncEnumeratorHelper .replace (currentEnumerator , en )) {
90+ en .moveNext ().whenComplete (this );
91+ } else {
92+ break ;
93+ }
8794 } while (decrementAndGet () != 0 );
8895 }
8996 }
9097 }
98+
99+ @ Override
100+ public void cancel () {
101+ AsyncEnumeratorHelper .cancel (currentEnumerator );
102+ }
91103 }
92104}
0 commit comments