|
13 | 13 |
|
14 | 14 | package io.reactivex.internal.operators.observable;
|
15 | 15 |
|
| 16 | +import java.util.NoSuchElementException; |
| 17 | + |
16 | 18 | import io.reactivex.*;
|
17 | 19 | import io.reactivex.disposables.Disposable;
|
18 | 20 | import io.reactivex.internal.disposables.DisposableHelper;
|
|
21 | 23 | public final class ObservableElementAt<T> extends AbstractObservableWithUpstream<T, T> {
|
22 | 24 | final long index;
|
23 | 25 | final T defaultValue;
|
24 |
| - public ObservableElementAt(ObservableSource<T> source, long index, T defaultValue) { |
| 26 | + final boolean errorOnFewer; |
| 27 | + |
| 28 | + public ObservableElementAt(ObservableSource<T> source, long index, T defaultValue, boolean errorOnFewer) { |
25 | 29 | super(source);
|
26 | 30 | this.index = index;
|
27 | 31 | this.defaultValue = defaultValue;
|
| 32 | + this.errorOnFewer = errorOnFewer; |
28 | 33 | }
|
29 | 34 | @Override
|
30 | 35 | public void subscribeActual(Observer<? super T> t) {
|
31 |
| - source.subscribe(new ElementAtObserver<T>(t, index, defaultValue)); |
| 36 | + source.subscribe(new ElementAtObserver<T>(t, index, defaultValue, errorOnFewer)); |
32 | 37 | }
|
33 | 38 |
|
34 | 39 | static final class ElementAtObserver<T> implements Observer<T>, Disposable {
|
35 | 40 | final Observer<? super T> actual;
|
36 | 41 | final long index;
|
37 | 42 | final T defaultValue;
|
| 43 | + final boolean errorOnFewer; |
38 | 44 |
|
39 | 45 | Disposable s;
|
40 | 46 |
|
41 | 47 | long count;
|
42 | 48 |
|
43 | 49 | boolean done;
|
44 | 50 |
|
45 |
| - ElementAtObserver(Observer<? super T> actual, long index, T defaultValue) { |
| 51 | + ElementAtObserver(Observer<? super T> actual, long index, T defaultValue, boolean errorOnFewer) { |
46 | 52 | this.actual = actual;
|
47 | 53 | this.index = index;
|
48 | 54 | this.defaultValue = defaultValue;
|
| 55 | + this.errorOnFewer = errorOnFewer; |
49 | 56 | }
|
50 | 57 |
|
51 | 58 | @Override
|
@@ -99,10 +106,14 @@ public void onComplete() {
|
99 | 106 | if (!done) {
|
100 | 107 | done = true;
|
101 | 108 | T v = defaultValue;
|
102 |
| - if (v != null) { |
103 |
| - actual.onNext(v); |
| 109 | + if (v == null && errorOnFewer) { |
| 110 | + actual.onError(new NoSuchElementException()); |
| 111 | + } else { |
| 112 | + if (v != null) { |
| 113 | + actual.onNext(v); |
| 114 | + } |
| 115 | + actual.onComplete(); |
104 | 116 | }
|
105 |
| - actual.onComplete(); |
106 | 117 | }
|
107 | 118 | }
|
108 | 119 | }
|
|
0 commit comments