@@ -1802,6 +1802,79 @@ public void onError(Throwable error) {
1802
1802
});
1803
1803
}
1804
1804
1805
+ /**
1806
+ * Returns a Single that emits the item emitted by the source Single until a Completable terminates. Upon
1807
+ * termination of {@code other}, this will emit a {@link CancellationException} rather than go to
1808
+ * {@link SingleSubscriber#onSuccess(Object)}.
1809
+ * <p>
1810
+ * <img width="640" height="380" src="https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/takeUntil.png" alt="">
1811
+ * <dl>
1812
+ * <dt><b>Scheduler:</b></dt>
1813
+ * <dd>{@code takeUntil} does not operate by default on a particular {@link Scheduler}.</dd>
1814
+ * </dl>
1815
+ *
1816
+ * @param other
1817
+ * the Completable whose termination will cause {@code takeUntil} to emit the item from the source
1818
+ * Single
1819
+ * @return a Single that emits the item emitted by the source Single until such time as {@code other} terminates.
1820
+ * @see <a href="http://reactivex.io/documentation/operators/takeuntil.html">ReactiveX operators documentation: TakeUntil</a>
1821
+ */
1822
+ public final Single <T > takeUntil (final Completable other ) {
1823
+ return lift (new Operator <T , T >() {
1824
+ @ Override
1825
+ public Subscriber <? super T > call (Subscriber <? super T > child ) {
1826
+ final Subscriber <T > serial = new SerializedSubscriber <T >(child , false );
1827
+
1828
+ final Subscriber <T > main = new Subscriber <T >(serial , false ) {
1829
+ @ Override
1830
+ public void onNext (T t ) {
1831
+ serial .onNext (t );
1832
+ }
1833
+ @ Override
1834
+ public void onError (Throwable e ) {
1835
+ try {
1836
+ serial .onError (e );
1837
+ } finally {
1838
+ serial .unsubscribe ();
1839
+ }
1840
+ }
1841
+ @ Override
1842
+ public void onCompleted () {
1843
+ try {
1844
+ serial .onCompleted ();
1845
+ } finally {
1846
+ serial .unsubscribe ();
1847
+ }
1848
+ }
1849
+ };
1850
+
1851
+ final Completable .CompletableSubscriber so = new Completable .CompletableSubscriber () {
1852
+ @ Override
1853
+ public void onCompleted () {
1854
+ onError (new CancellationException ("Stream was canceled before emitting a terminal event." ));
1855
+ }
1856
+
1857
+ @ Override
1858
+ public void onError (Throwable e ) {
1859
+ main .onError (e );
1860
+ }
1861
+
1862
+ @ Override
1863
+ public void onSubscribe (Subscription d ) {
1864
+ serial .add (d );
1865
+ }
1866
+ };
1867
+
1868
+ serial .add (main );
1869
+ child .add (serial );
1870
+
1871
+ other .subscribe (so );
1872
+
1873
+ return main ;
1874
+ }
1875
+ });
1876
+ }
1877
+
1805
1878
/**
1806
1879
* Returns a Single that emits the item emitted by the source Single until an Observable emits an item. Upon
1807
1880
* emission of an item from {@code other}, this will emit a {@link CancellationException} rather than go to
0 commit comments