16
16
package rx ;
17
17
18
18
import java .util .ArrayList ;
19
+ import java .util .Arrays ;
20
+ import java .util .LinkedHashSet ;
21
+ import java .util .List ;
22
+ import java .util .Set ;
19
23
20
24
import org .junit .Test ;
21
25
@@ -66,7 +70,7 @@ public void testCovarianceOfCompose() {
66
70
Observable <Movie > movie2 = movie .compose (new Transformer <Movie , Movie >() {
67
71
68
72
@ Override
69
- public Observable <? extends Movie > call (Observable <? extends Movie > t1 ) {
73
+ public Observable <? extends Movie > call (Observable <Movie > t1 ) {
70
74
return Observable .just (new Movie ());
71
75
}
72
76
@@ -78,7 +82,7 @@ public void testCovarianceOfCompose2() {
78
82
Observable <Movie > movie = Observable .<Movie > just (new HorrorMovie ());
79
83
Observable <HorrorMovie > movie2 = movie .compose (new Transformer <Movie , HorrorMovie >() {
80
84
@ Override
81
- public Observable <? extends HorrorMovie > call (Observable <? extends Movie > t1 ) {
85
+ public Observable <? extends HorrorMovie > call (Observable <Movie > t1 ) {
82
86
return Observable .just (new HorrorMovie ());
83
87
}
84
88
});
@@ -89,7 +93,7 @@ public void testCovarianceOfCompose3() {
89
93
Observable <Movie > movie = Observable .<Movie >just (new HorrorMovie ());
90
94
Observable <HorrorMovie > movie2 = movie .compose (new Transformer <Movie , HorrorMovie >() {
91
95
@ Override
92
- public Observable <? extends HorrorMovie > call (Observable <? extends Movie > t1 ) {
96
+ public Observable <? extends HorrorMovie > call (Observable <Movie > t1 ) {
93
97
return Observable .just (new HorrorMovie ()).map (new Func1 <HorrorMovie , HorrorMovie >() {
94
98
95
99
@ Override
@@ -106,7 +110,7 @@ public void testCovarianceOfCompose4() {
106
110
Observable <HorrorMovie > movie = Observable .just (new HorrorMovie ());
107
111
Observable <HorrorMovie > movie2 = movie .compose (new Transformer <HorrorMovie , HorrorMovie >() {
108
112
@ Override
109
- public Observable <? extends HorrorMovie > call (Observable <? extends HorrorMovie > t1 ) {
113
+ public Observable <? extends HorrorMovie > call (Observable <HorrorMovie > t1 ) {
110
114
return t1 .map (new Func1 <HorrorMovie , HorrorMovie >() {
111
115
112
116
@ Override
@@ -118,6 +122,52 @@ public HorrorMovie call(HorrorMovie horrorMovie) {
118
122
});
119
123
}
120
124
125
+ @ Test
126
+ public void testComposeWithDeltaLogic () {
127
+ List <Movie > list1 = Arrays .asList (new Movie (), new HorrorMovie (), new ActionMovie ());
128
+ List <Movie > list2 = Arrays .asList (new ActionMovie (), new Movie (), new HorrorMovie (), new ActionMovie ());
129
+ Observable <List <Movie >> movies = Observable .just (list1 , list2 );
130
+ movies .compose (deltaTransformer );
131
+ }
132
+
133
+ static Transformer <List <Movie >, Movie > deltaTransformer = new Transformer <List <Movie >, Movie >() {
134
+ @ Override
135
+ public Observable <Movie > call (Observable <List <Movie >> movieList ) {
136
+ return movieList
137
+ .startWith (new ArrayList <Movie >())
138
+ .buffer (2 , 1 )
139
+ .skip (1 )
140
+ .flatMap (calculateDelta );
141
+ }
142
+ };
143
+
144
+ static Func1 <List <List <Movie >>, Observable <Movie >> calculateDelta = new Func1 <List <List <Movie >>, Observable <Movie >>() {
145
+ public Observable <Movie > call (List <List <Movie >> listOfLists ) {
146
+ if (listOfLists .size () == 1 ) {
147
+ return Observable .from (listOfLists .get (0 ));
148
+ } else {
149
+ // diff the two
150
+ List <Movie > newList = listOfLists .get (1 );
151
+ List <Movie > oldList = new ArrayList <Movie >(listOfLists .get (0 ));
152
+
153
+ Set <Movie > delta = new LinkedHashSet <Movie >();
154
+ delta .addAll (newList );
155
+ // remove all that match in old
156
+ delta .removeAll (oldList );
157
+
158
+ // filter oldList to those that aren't in the newList
159
+ oldList .removeAll (newList );
160
+
161
+ // for all left in the oldList we'll create DROP events
162
+ for (Movie old : oldList ) {
163
+ delta .add (new Movie ());
164
+ }
165
+
166
+ return Observable .from (delta );
167
+ }
168
+ };
169
+ };
170
+
121
171
/*
122
172
* Most tests are moved into their applicable classes such as [Operator]Tests.java
123
173
*/
0 commit comments