Skip to content

Commit

Permalink
Unify Observable/Single implementations
Browse files Browse the repository at this point in the history
  • Loading branch information
dlew committed May 5, 2016
1 parent 2544929 commit be808eb
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 86 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.trello.rxlifecycle;

import android.support.annotation.CheckResult;
import android.support.annotation.NonNull;
import rx.Observable;
import rx.exceptions.Exceptions;
import rx.functions.Func1;
import rx.functions.Func2;

final class TakeUntilGenerator {

@NonNull
@CheckResult
static <T> Observable<T> takeUntilEvent(@NonNull final Observable<T> lifecycle, @NonNull final T event) {
return lifecycle.takeFirst(new Func1<T, Boolean>() {
@Override
public Boolean call(T lifecycleEvent) {
return lifecycleEvent.equals(event);
}
});
}

@NonNull
@CheckResult
static <T> Observable<Boolean> takeUntilCorrespondingEvent(@NonNull final Observable<T> lifecycle,
@NonNull final Func1<T, T> correspondingEvents) {
return Observable.combineLatest(
lifecycle.take(1).map(correspondingEvents),
lifecycle.skip(1),
new Func2<T, T, Boolean>() {
@Override
public Boolean call(T bindUntilEvent, T lifecycleEvent) {
return lifecycleEvent.equals(bindUntilEvent);
}
})
.onErrorReturn(RESUME_FUNCTION)
.takeFirst(SHOULD_COMPLETE);
}

private static final Func1<Throwable, Boolean> RESUME_FUNCTION = new Func1<Throwable, Boolean>() {
@Override
public Boolean call(Throwable throwable) {
if (throwable instanceof OutsideLifecycleException) {
return true;
}

Exceptions.propagate(throwable);
return false;
}
};

private static final Func1<Boolean, Boolean> SHOULD_COMPLETE = new Func1<Boolean, Boolean>() {
@Override
public Boolean call(Boolean shouldComplete) {
return shouldComplete;
}
};

private TakeUntilGenerator() {
throw new AssertionError("No instances!");
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.trello.rxlifecycle;

import rx.Observable;
import rx.exceptions.Exceptions;
import rx.functions.Func1;
import rx.functions.Func2;

import static com.trello.rxlifecycle.TakeUntilGenerator.takeUntilCorrespondingEvent;

/**
* Continues a subscription until it sees a particular lifecycle event.
Expand All @@ -23,37 +23,6 @@ public UntilCorrespondingEventObservableTransformer(Observable<R> lifecycle, Fun

@Override
public Observable<T> call(Observable<T> source) {
return source.takeUntil(
Observable.combineLatest(
this.sharedLifecycle.take(1).map(correspondingEvents),
this.sharedLifecycle.skip(1),
new Func2<R, R, Boolean>() {
@Override
public Boolean call(R bindUntilEvent, R lifecycleEvent) {
return lifecycleEvent.equals(bindUntilEvent);
}
})
.onErrorReturn(RESUME_FUNCTION)
.takeFirst(SHOULD_COMPLETE)
);
return source.takeUntil(takeUntilCorrespondingEvent(sharedLifecycle, correspondingEvents));
}

private static final Func1<Throwable, Boolean> RESUME_FUNCTION = new Func1<Throwable, Boolean>() {
@Override
public Boolean call(Throwable throwable) {
if (throwable instanceof OutsideLifecycleException) {
return true;
}

Exceptions.propagate(throwable);
return false;
}
};

private static final Func1<Boolean, Boolean> SHOULD_COMPLETE = new Func1<Boolean, Boolean>() {
@Override
public Boolean call(Boolean shouldComplete) {
return shouldComplete;
}
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import rx.Observable;
import rx.Single;
import rx.exceptions.Exceptions;
import rx.functions.Func1;
import rx.functions.Func2;

import static com.trello.rxlifecycle.TakeUntilGenerator.takeUntilCorrespondingEvent;

/**
* Continues a subscription until it sees a particular lifecycle event.
Expand All @@ -24,37 +24,6 @@ public UntilCorrespondingEventSingleTransformer(Observable<R> lifecycle, Func1<R

@Override
public Single<T> call(Single<T> source) {
return source.takeUntil(
Observable.combineLatest(
this.sharedLifecycle.take(1).map(correspondingEvents),
this.sharedLifecycle.skip(1),
new Func2<R, R, Boolean>() {
@Override
public Boolean call(R bindUntilEvent, R lifecycleEvent) {
return lifecycleEvent.equals(bindUntilEvent);
}
})
.onErrorReturn(RESUME_FUNCTION)
.takeFirst(SHOULD_COMPLETE)
);
return source.takeUntil(takeUntilCorrespondingEvent(sharedLifecycle, correspondingEvents));
}

private static final Func1<Throwable, Boolean> RESUME_FUNCTION = new Func1<Throwable, Boolean>() {
@Override
public Boolean call(Throwable throwable) {
if (throwable instanceof OutsideLifecycleException) {
return true;
}

Exceptions.propagate(throwable);
return false;
}
};

private static final Func1<Boolean, Boolean> SHOULD_COMPLETE = new Func1<Boolean, Boolean>() {
@Override
public Boolean call(Boolean shouldComplete) {
return shouldComplete;
}
};
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package com.trello.rxlifecycle;

import rx.Observable;
import rx.functions.Func1;

import static com.trello.rxlifecycle.TakeUntilGenerator.takeUntilEvent;

/**
* Continues a subscription until it sees a particular lifecycle event.
Expand All @@ -18,13 +19,6 @@ public UntilEventObservableTransformer(Observable<R> lifecycle, R event) {

@Override
public Observable<T> call(Observable<T> source) {
return source.takeUntil(
lifecycle.takeFirst(new Func1<R, Boolean>() {
@Override
public Boolean call(R lifecycleEvent) {
return lifecycleEvent.equals(event);
}
})
);
return source.takeUntil(takeUntilEvent(lifecycle, event));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

import rx.Observable;
import rx.Single;
import rx.functions.Func1;

import static com.trello.rxlifecycle.TakeUntilGenerator.takeUntilEvent;

/**
* Continues a subscription until it sees a particular lifecycle event.
Expand All @@ -19,13 +20,6 @@ public UntilEventSingleTransformer(Observable<R> lifecycle, R event) {

@Override
public Single<T> call(Single<T> source) {
return source.takeUntil(
lifecycle.takeFirst(new Func1<R, Boolean>() {
@Override
public Boolean call(R lifecycleEvent) {
return lifecycleEvent.equals(event);
}
})
);
return source.takeUntil(takeUntilEvent(lifecycle, event));
}
}

0 comments on commit be808eb

Please sign in to comment.