View Javadoc
1   package org.davidmoten.kool.internal.operators.stream;
2   
3   import java.util.concurrent.Callable;
4   
5   import org.davidmoten.kool.Stream;
6   import org.davidmoten.kool.StreamIterator;
7   import org.davidmoten.kool.internal.util.Exceptions;
8   
9   import com.github.davidmoten.guavamini.Preconditions;
10  
11  public final class SwitchOnEmpty<T> implements Stream<T> {
12  
13      private final Stream<T> stream;
14      private Callable<? extends Stream<T>> factory;
15  
16      public SwitchOnEmpty(Stream<T> stream, Callable<? extends Stream<T>> factory) {
17          this.stream = stream;
18          this.factory = factory;
19      }
20  
21      @Override
22      public StreamIterator<T> iterator() {
23          return new StreamIterator<T>() {
24  
25              StreamIterator<T> it = stream.iterator();
26  
27              boolean checkedForEmpty;
28  
29              @Override
30              public boolean hasNext() {
31                  check();
32                  return it.hasNext();
33              }
34  
35              @Override
36              public T next() {
37                  check();
38                  return it.nextNullChecked();
39              }
40  
41              @Override
42              public void dispose() {
43                  if (it != null) {
44                      it.dispose();
45                      it = null;
46                  }
47              }
48              
49              private void check() {
50                  if (!checkedForEmpty) {
51                      checkedForEmpty = true;
52                      if (!it.hasNext()) {
53                          it.dispose();
54                          try {
55                              it = Preconditions.checkNotNull(factory.call().iterator());
56                          } catch (Exception e) {
57                              Exceptions.rethrow(e);
58                              return;
59                          }
60                      }
61                  }
62              }
63  
64          };
65      }
66  
67  }