Skip to content

Commit 81e1a63

Browse files
authored
Created formula-rxjava3 module. (#165)
* Starting to move RxJava3 out of main module. * Rename all start() usages to toObservable()
1 parent 3eaecfc commit 81e1a63

File tree

52 files changed

+361
-137
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+361
-137
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ Add the library to your list of dependencies:
1717

1818
```groovy
1919
dependencies {
20-
implementation 'com.github.instacart:formula:0.6.0'
21-
implementation 'com.github.instacart:formula-android:0.6.0'
20+
implementation 'com.instacart.formula:formula-rxjava3:0.6.0'
21+
implementation 'com.instacart.formula:formula-android:0.6.0'
2222
}
2323
```
2424

docs/Integration.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ activity(MyActivity::class) {
202202
)
203203

204204
val formula: ItemDetailFormula = component.createItemDetailFormula()
205-
formula.start(input)
205+
formula.toObservable(input)
206206
}
207207
}
208208
}
@@ -234,7 +234,7 @@ activity(MyActivity::class) {
234234

235235
// Hook up the formula state management
236236
val formula: ItemListFormula = ...
237-
formula.start(input)
237+
formula.toObservable(input)
238238
}
239239
}
240240
}

docs/index.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ Formula is agnostic to other layers of abstraction. It can be used within activi
132132
convert `Formula` to an RxJava2 `Observable` by using `start` extension function.
133133
```kotlin
134134
val formula = CounterFormula()
135-
val state: Observable<CounterRenderModel> = formula.start(input = Unit)
135+
val state: Observable<CounterRenderModel> = formula.toObservable(input = Unit)
136136
```
137137

138138
Ideally, it would be placed within a surface that survives configuration changes such as Android Components ViewModel.
@@ -169,7 +169,7 @@ class MyApp : Application() {
169169
store(
170170
streams = {
171171
val formula = CounterFormula()
172-
update(formula.start(), MyActivity::render)
172+
update(formula.toObservable(), MyActivity::render)
173173
}
174174
)
175175
}
@@ -187,7 +187,7 @@ Add the library to your list of dependencies:
187187

188188
```groovy
189189
dependencies {
190-
implementation 'com.github.instacart:formula:0.6.0'
190+
implementation 'com.github.instacart:formula-rxjava3:0.6.0'
191191
implementation 'com.github.instacart:formula-android:0.6.0'
192192
}
193193
```

docs/input.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ To pass the input to `ItemDetailFormula`
3232
```kotlin
3333
val itemDetailFormula: ItemDetailFormula = ...
3434
itemDetailFormula
35-
.start(ItemDetailFormula.Input(itemId = "1"))
35+
.toObservable(ItemDetailFormula.Input(itemId = "1"))
3636
.subscribe { renderModel ->
3737

3838
}
@@ -42,7 +42,7 @@ You could also pass an `Observable<ItemDetailFormula.Input>`
4242
```kotlin
4343
val itemDetailInput: Observable<ItemDetailFormula.Input> = ...
4444
itemDetailFormula
45-
.start(itemDetailInput)
45+
.toObservable(itemDetailInput)
4646
.subscribe { renderModel ->
4747

4848
}

docs/using_android_view_model.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ class CounterViewModel() : ViewModel {
44
private val formula = CounterFormula()
55
private val disposables = CompositeDisposable()
66

7-
val renderModels = formula.start().replay(1).apply {
7+
val renderModels = formula.toObservable().replay(1).apply {
88
connect { disposables.add(it) }
99
}
1010

formula-android-tests/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
4646
}
4747

4848
dependencies {
49-
implementation project(":formula")
49+
implementation project(":formula-rxjava3")
5050
implementation project(":formula-android")
5151

5252
implementation libraries.kotlin

formula-android/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ artifacts {
5858
}
5959

6060
dependencies {
61-
implementation project(':formula')
61+
implementation project(':formula-rxjava3')
6262

6363
implementation libraries.androidx.annotation
6464
implementation libraries.androidx.appcompat

formula-android/src/main/java/com/instacart/formula/fragment/FragmentFlowStore.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package com.instacart.formula.fragment
33
import com.instacart.formula.Evaluation
44
import com.instacart.formula.Formula
55
import com.instacart.formula.FormulaContext
6-
import com.instacart.formula.RxStream
6+
import com.instacart.formula.rxjava3.RxStream
77
import com.instacart.formula.integration.Binding
88
import com.instacart.formula.integration.DisposableScope
99
import com.instacart.formula.integration.FragmentBindingBuilder

formula-android/src/main/java/com/instacart/formula/integration/Integration.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import io.reactivex.rxjava3.core.Observable
1212
* ```
1313
* class TaskListIntegration<AppComponent, TaskListKey, TaskListRenderModel>() {
1414
* override fun create(component: AppComponent, key: TaskListKey): Observable<TaskListRenderModel> {
15-
* return component.createTaskListFormula().start(Input())
15+
* return component.createTaskListFormula().toObservable(Input())
1616
* }
1717
* }
1818
* ```

formula-android/src/main/java/com/instacart/formula/integration/internal/SingleBinding.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package com.instacart.formula.integration.internal
33
import com.instacart.formula.Evaluation
44
import com.instacart.formula.Formula
55
import com.instacart.formula.FormulaContext
6-
import com.instacart.formula.RxStream
6+
import com.instacart.formula.rxjava3.RxStream
77
import com.instacart.formula.integration.Binding
88
import com.instacart.formula.integration.Integration
99
import com.instacart.formula.integration.KeyState

formula-rxjava3/.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

formula-rxjava3/build.gradle

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
apply plugin: 'kotlin'
2+
apply plugin: "com.vanniktech.maven.publish"
3+
apply plugin: 'org.jetbrains.dokka'
4+
5+
apply from: rootProject.file('.buildscript/configure-dokka.gradle')
6+
apply from: rootProject.file('.buildscript/configure-signing.gradle')
7+
8+
repositories {
9+
mavenCentral()
10+
}
11+
12+
tasks.withType(JavaCompile) {
13+
sourceCompatibility = JavaVersion.VERSION_1_8
14+
targetCompatibility = JavaVersion.VERSION_1_8
15+
}
16+
17+
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
18+
kotlinOptions {
19+
jvmTarget = "1.8"
20+
}
21+
}
22+
23+
dependencies {
24+
implementation libraries.kotlin
25+
26+
api project(":formula")
27+
api libraries.rxjava
28+
29+
testImplementation project(":formula-test")
30+
testImplementation libraries.truth
31+
testImplementation libraries.junit
32+
testImplementation libraries.rxrelays
33+
}

formula-rxjava3/gradle.properties

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
POM_ARTIFACT_ID=formula-rxjava3
2+
POM_NAME=Formula RxJava3 Runtime
3+
POM_PACKAGING=jar
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.instacart.formula
2+
3+
import com.instacart.formula.rxjava3.RxJavaRuntime
4+
import com.instacart.formula.rxjava3.toObservable
5+
import io.reactivex.rxjava3.core.Observable
6+
7+
@Deprecated("Moved to rxjava3 package", replaceWith = ReplaceWith(
8+
expression = "toObservable()",
9+
imports = arrayOf("com.instacart.formula.rxjava3.toObservable")
10+
))
11+
fun <Output : Any> IFormula<Unit, Output>.start(): Observable<Output> {
12+
return toObservable(input = Unit)
13+
}
14+
15+
@Deprecated("Moved to rxjava3 package", replaceWith = ReplaceWith(
16+
expression = "toObservable(input)",
17+
imports = arrayOf("com.instacart.formula.rxjava3.toObservable")
18+
))
19+
fun <Input : Any, Output : Any> IFormula<Input, Output>.start(
20+
input: Input
21+
): Observable<Output> {
22+
return toObservable(input = Observable.just(input))
23+
}
24+
25+
@Deprecated("Moved to rxjava3 package", replaceWith = ReplaceWith(
26+
expression = "toObservable(input)",
27+
imports = arrayOf("com.instacart.formula.rxjava3.toObservable")
28+
))
29+
fun <Input : Any, Output : Any> IFormula<Input, Output>.start(
30+
input: Observable<Input>
31+
): Observable<Output> {
32+
return RxJavaRuntime.start(input = input, formula = this)
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.instacart.formula
2+
3+
import com.instacart.formula.rxjava3.RxStream as RxStream3
4+
import io.reactivex.rxjava3.core.Observable
5+
6+
/**
7+
* Formula [Stream] adapter to enable RxJava use.
8+
*/
9+
@Deprecated("Use RxStream in rxjava3 package")
10+
object RxStream {
11+
/**
12+
* Creates a [Stream] from an [Observable] factory [create].
13+
*
14+
* ```
15+
* events(RxStream.fromObservable { locationManager.updates() }) { event ->
16+
* transition()
17+
* }
18+
* ```
19+
*/
20+
inline fun <Message> fromObservable(
21+
crossinline create: () -> Observable<Message>
22+
): Stream<Message> {
23+
return RxStream3.fromObservable(create)
24+
}
25+
26+
/**
27+
* Creates a [Stream] from an [Observable] factory [create].
28+
*
29+
* ```
30+
* events(RxStream.fromObservable(itemId) { repo.fetchItem(itemId) }) { event ->
31+
* transition()
32+
* }
33+
* ```
34+
*
35+
* @param key Used to distinguish this [Stream] from other streams.
36+
*/
37+
inline fun <Message> fromObservable(
38+
key: Any,
39+
crossinline create: () -> Observable<Message>
40+
): Stream<Message> {
41+
return RxStream3.fromObservable(key, create)
42+
}
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.instacart.formula.rxjava3
2+
3+
import com.instacart.formula.FormulaRuntime
4+
import com.instacart.formula.IFormula
5+
import com.instacart.formula.internal.ThreadChecker
6+
import io.reactivex.rxjava3.core.Observable
7+
import io.reactivex.rxjava3.disposables.CompositeDisposable
8+
import io.reactivex.rxjava3.disposables.FormulaDisposableHelper
9+
10+
object RxJavaRuntime {
11+
fun <Input : Any, Output : Any> start(
12+
input: Observable<Input>,
13+
formula: IFormula<Input, Output>
14+
): Observable<Output> {
15+
val threadChecker = ThreadChecker()
16+
return Observable.create<Output> { emitter ->
17+
threadChecker.check("Need to subscribe on main thread.")
18+
19+
var runtime = FormulaRuntime(threadChecker, formula, emitter::onNext, emitter::onError)
20+
21+
val disposables = CompositeDisposable()
22+
disposables.add(input.subscribe({ input ->
23+
threadChecker.check("Input arrived on a wrong thread.")
24+
if (!runtime.isKeyValid(input)) {
25+
runtime.terminate()
26+
runtime = FormulaRuntime(threadChecker, formula, emitter::onNext, emitter::onError)
27+
}
28+
runtime.onInput(input)
29+
}, emitter::onError))
30+
31+
val runnable = Runnable {
32+
threadChecker.check("Need to unsubscribe on the main thread.")
33+
runtime.terminate()
34+
}
35+
disposables.add(FormulaDisposableHelper.fromRunnable(runnable))
36+
37+
emitter.setDisposable(disposables)
38+
}.distinctUntilChanged()
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.instacart.formula.rxjava3
2+
3+
import com.instacart.formula.IFormula
4+
import io.reactivex.rxjava3.core.Observable
5+
6+
fun <Output : Any> IFormula<Unit, Output>.toObservable(): Observable<Output> {
7+
return toObservable(input = Unit)
8+
}
9+
10+
fun <Input : Any, Output : Any> IFormula<Input, Output>.toObservable(
11+
input: Input
12+
): Observable<Output> {
13+
return toObservable(input = Observable.just(input))
14+
}
15+
16+
fun <Input : Any, Output : Any> IFormula<Input, Output>.toObservable(
17+
input: Observable<Input>
18+
): Observable<Output> {
19+
return RxJavaRuntime.start(input = input, formula = this)
20+
}

formula/src/main/java/com/instacart/formula/RxStream.kt formula-rxjava3/src/main/java/com/instacart/formula/rxjava3/RxStream.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
package com.instacart.formula
1+
package com.instacart.formula.rxjava3
22

3+
import com.instacart.formula.Cancelable
4+
import com.instacart.formula.Stream
35
import io.reactivex.rxjava3.core.Observable
46

57
/**

formula-test/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
2020

2121
dependencies {
2222
implementation libraries.kotlin
23-
implementation project(":formula")
23+
api project(":formula-rxjava3")
2424

2525
testImplementation libraries.truth
2626
testImplementation libraries.junit

formula-test/src/main/java/com/instacart/formula/test/TestFormulaObserver.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.instacart.formula.test
22

33
import com.instacart.formula.IFormula
4-
import com.instacart.formula.start
4+
import com.instacart.formula.rxjava3.toObservable
55
import io.reactivex.rxjava3.core.Observable
66

77
class TestFormulaObserver<Input : Any, Output : Any, FormulaT : IFormula<Input, Output>>(
@@ -10,7 +10,7 @@ class TestFormulaObserver<Input : Any, Output : Any, FormulaT : IFormula<Input,
1010
) {
1111

1212
private val observer = formula
13-
.start(input)
13+
.toObservable(input)
1414
.test()
1515
.assertNoErrors()
1616

formula/src/main/java/com/instacart/formula/FormulaContext.kt

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.instacart.formula
22

33
import com.instacart.formula.internal.JoinedKey
4+
import com.instacart.formula.internal.RxStream
45
import com.instacart.formula.internal.ScopedCallbacks
56
import io.reactivex.rxjava3.core.Observable
67

0 commit comments

Comments
 (0)