From 7eb21ab1b7fec1b3090fc44ea007859cb6b26192 Mon Sep 17 00:00:00 2001 From: akarnokd Date: Mon, 28 Apr 2014 10:19:58 +0200 Subject: [PATCH] OperatorSequenceEqual --- rxjava-core/src/main/java/rx/Observable.java | 4 +- ...eEqual.java => OperatorSequenceEqual.java} | 50 +++++++++---------- ...ts.java => OperatorSequenceEqualTest.java} | 2 +- 3 files changed, 27 insertions(+), 29 deletions(-) rename rxjava-core/src/main/java/rx/operators/{OperationSequenceEqual.java => OperatorSequenceEqual.java} (58%) rename rxjava-core/src/test/java/rx/operators/{OperationSequenceEqualTests.java => OperatorSequenceEqualTest.java} (99%) diff --git a/rxjava-core/src/main/java/rx/Observable.java b/rxjava-core/src/main/java/rx/Observable.java index 746362ca78..7d6cc41c91 100644 --- a/rxjava-core/src/main/java/rx/Observable.java +++ b/rxjava-core/src/main/java/rx/Observable.java @@ -63,7 +63,6 @@ import rx.operators.OperationParallelMerge; import rx.operators.OperationReplay; import rx.operators.OperationSample; -import rx.operators.OperationSequenceEqual; import rx.operators.OperationSkip; import rx.operators.OperationSkipUntil; import rx.operators.OperationSwitch; @@ -113,6 +112,7 @@ import rx.operators.OperatorRepeat; import rx.operators.OperatorRetry; import rx.operators.OperatorScan; +import rx.operators.OperatorSequenceEqual; import rx.operators.OperatorSerialize; import rx.operators.OperatorSingle; import rx.operators.OperatorSkip; @@ -2476,7 +2476,7 @@ public final Boolean call(T first, T second) { * @see RxJava Wiki: sequenceEqual() */ public final static Observable sequenceEqual(Observable first, Observable second, Func2 equality) { - return OperationSequenceEqual.sequenceEqual(first, second, equality); + return OperatorSequenceEqual.sequenceEqual(first, second, equality); } /** diff --git a/rxjava-core/src/main/java/rx/operators/OperationSequenceEqual.java b/rxjava-core/src/main/java/rx/operators/OperatorSequenceEqual.java similarity index 58% rename from rxjava-core/src/main/java/rx/operators/OperationSequenceEqual.java rename to rxjava-core/src/main/java/rx/operators/OperatorSequenceEqual.java index 9d9792edfb..600a8843f6 100644 --- a/rxjava-core/src/main/java/rx/operators/OperationSequenceEqual.java +++ b/rxjava-core/src/main/java/rx/operators/OperatorSequenceEqual.java @@ -18,7 +18,6 @@ import static rx.Observable.concat; import static rx.Observable.from; import static rx.Observable.zip; -import rx.Notification; import rx.Observable; import rx.functions.Func1; import rx.functions.Func2; @@ -28,44 +27,43 @@ * Returns an Observable that emits a Boolean value that indicate whether two * sequences are equal by comparing the elements pairwise. */ -public class OperationSequenceEqual { - - public static Observable sequenceEqual( - Observable first, Observable second, - final Func2 equality) { - Observable> firstObservable = concat( - first.map(new Func1>() { +public final class OperatorSequenceEqual { + private OperatorSequenceEqual() { throw new IllegalStateException("No instances!"); } + /** NotificationLite doesn't work as zip uses it. */ + private static final Object LOCAL_ONCOMPLETED = new Object(); + static Observable materializeLite(Observable source) { + return concat( + source.map(new Func1() { @Override - public Notification call(T t1) { - return Notification.createOnNext(t1); + public Object call(T t1) { + return t1; } - }), from(Notification.createOnCompleted())); - - Observable> secondObservable = concat( - second.map(new Func1>() { - - @Override - public Notification call(T t1) { - return Notification.createOnNext(t1); - } - - }), from(Notification.createOnCompleted())); + }), from(LOCAL_ONCOMPLETED)); + } + public static Observable sequenceEqual( + Observable first, Observable second, + final Func2 equality) { + Observable firstObservable = materializeLite(first); + Observable secondObservable = materializeLite(second); return zip(firstObservable, secondObservable, - new Func2, Notification, Boolean>() { + new Func2() { @Override - public Boolean call(Notification t1, Notification t2) { - if (t1.isOnCompleted() && t2.isOnCompleted()) { + @SuppressWarnings("unchecked") + public Boolean call(Object t1, Object t2) { + boolean c1 = t1 == LOCAL_ONCOMPLETED; + boolean c2 = t2 == LOCAL_ONCOMPLETED; + if (c1 && c2) { return true; } - if (t1.isOnCompleted() || t2.isOnCompleted()) { + if (c1 || c2) { return false; } // Now t1 and t2 must be 'onNext'. - return equality.call(t1.getValue(), t2.getValue()); + return equality.call((T)t1, (T)t2); } }).all(Functions. identity()); diff --git a/rxjava-core/src/test/java/rx/operators/OperationSequenceEqualTests.java b/rxjava-core/src/test/java/rx/operators/OperatorSequenceEqualTest.java similarity index 99% rename from rxjava-core/src/test/java/rx/operators/OperationSequenceEqualTests.java rename to rxjava-core/src/test/java/rx/operators/OperatorSequenceEqualTest.java index 94619c028f..1fe95d7f7d 100644 --- a/rxjava-core/src/test/java/rx/operators/OperationSequenceEqualTests.java +++ b/rxjava-core/src/test/java/rx/operators/OperatorSequenceEqualTest.java @@ -27,7 +27,7 @@ import rx.Observer; import rx.functions.Func2; -public class OperationSequenceEqualTests { +public class OperatorSequenceEqualTest { @Test public void test1() {