From d678ab2d3b8525f83a40927fea43502d83b497a3 Mon Sep 17 00:00:00 2001 From: Laimonas Turauskas Date: Mon, 13 Sep 2021 12:59:28 -0700 Subject: [PATCH] Removing some of the Stream references. --- docs/async_events.md | 10 +++++----- docs/events.md | 6 +++--- docs/faq.md | 4 ++-- .../formula/android/internal/CompositeBinding.kt | 6 +++--- .../formula/android/internal/FeatureBinding.kt | 4 ++-- .../instacart/formula/rxjava3/ObservableFormula.kt | 6 +++--- ...amObserver.kt => TestDisposableActionObserver.kt} | 8 ++++---- .../java/com/instacart/formula/test/TestFormula.kt | 4 ++-- .../instacart/formula/test/TestRuntimeExtensions.kt | 5 ++--- ...TestStreamTest.kt => TestDisposableActionTest.kt} | 12 ++++++------ .../main/java/com/instacart/formula/BoundAction.kt | 4 ++-- .../main/java/com/instacart/formula/Cancelable.kt | 2 +- .../java/com/instacart/formula/FormulaContext.kt | 2 +- .../com/instacart/formula/streams/EmptyStream.kt | 3 ++- .../formula/subjects/DynamicStreamSubject.kt | 5 +++-- .../formula/subjects/ExtremelyNestedFormula.kt | 3 ++- .../samples/networkstate/NetworkStateStream.kt | 4 ++-- 17 files changed, 45 insertions(+), 43 deletions(-) rename formula-test/src/main/java/com/instacart/formula/test/{TestStreamObserver.kt => TestDisposableActionObserver.kt} (72%) rename formula-test/src/test/java/com/instacart/formula/test/{TestStreamTest.kt => TestDisposableActionTest.kt} (73%) diff --git a/docs/async_events.md b/docs/async_events.md index 1f2528df0..b33102e7d 100644 --- a/docs/async_events.md +++ b/docs/async_events.md @@ -15,8 +15,8 @@ override fun evaluate(input: Input, state: State, context: FormulaContext): ... output = createRenderModel(state.taskList), // All async events need to be declared within "context.updates" block. updates = context.updates { - // Convert RxJava observable to a Formula Stream. - val taskStream = RxStream.fromObservable(taskRepo::tasks) + // Convert RxJava observable to a Formula disposable action. + val taskStream = RxDisposableAction.fromObservable(taskRepo::tasks) // Tell Formula that you want to listen to these events events(taskStream) { newTaskList -> // update our state @@ -35,7 +35,7 @@ interface Stream { } ``` -In this example we used an `RxStream.fromObservable` to convert from an `Observable` to a `Stream` instance. +In this example we used an `RxDisposableAction.fromObservable` to convert from an `Observable` to a `DisposableAction` instance. Instead of us subscribing to the observable/stream directly, the runtime manages the subscriptions for us. It will subscribe the first time `events` is called and unsubscribe when our Formula is removed or @@ -43,7 +43,7 @@ if we don't return it anymore. For example, it is okay to have conditional logic ```kotlin context.updates { if (state.locationTrackingEnabled) { - val locationStream = RxStream.fromObservable { locationManager.updates() } + val locationStream = RxDisposableAction.fromObservable { locationManager.updates() } events(locationStream) { event -> transition(state.copy(location = event.location)) } @@ -81,7 +81,7 @@ class TaskFormula(val taskRepo: TaskRepo): Formula { ): Evaluation { return Evaluation( updates = context.updates { - val fetchTask = RxStream.fromObservable(key = input.taskId) { taskRepo.fetchTask(input.taskId) } + val fetchTask = RxDisposableAction.fromObservable(key = input.taskId) { taskRepo.fetchTask(input.taskId) } events(fetchTask) { taskResponse -> transition(state.copy(task = taskResponse)) } diff --git a/docs/events.md b/docs/events.md index dc6b7249e..59a27b7c7 100644 --- a/docs/events.md +++ b/docs/events.md @@ -111,17 +111,17 @@ Evaluation( output = ..., updates = context.updates { // Performs a side effect when formula is initialized - events(Stream.onInit()) { + events(DisposableAction.onInit()) { transition { analytics.trackScreenOpen() } } // Performs a side effect when formula is terminated - events(Stream.onTerminate()) { + events(DisposableAction.onTerminate()) { transition { analytics.trackClose() } } // Performs a side-effect when data changes - events(Stream.onData(), state.itemId) { + events(DisposableAction.onData(), state.itemId) { // This will call api.fetchItem for each unique itemId transition { api.fetchItem(state.itemId) } } diff --git a/docs/faq.md b/docs/faq.md index 583213648..366c8a66e 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -50,7 +50,7 @@ class TaskDetailFormula @Inject constructor( return Evaluation( output = state.task, updates = context.updates { - RxStream.fromObservable { repo.fetchTask(input.taskId) }.onEvent { task -> + RxDisposableAction.fromObservable { repo.fetchTask(input.taskId) }.onEvent { task -> val renderModel = TaskDetailRenderModel( title = task.title, // Don't do: calling context.onEvent within "onEvent" will cause a crash described above @@ -100,7 +100,7 @@ class TaskDetailFormula @Inject constructor( return Evaluation( output = renderModel, updates = context.updates { - RxStream.fromObservable { repo.fetchTask(input.taskId) }.onEvent { task -> + RxDisposableAction.fromObservable { repo.fetchTask(input.taskId) }.onEvent { task -> transition(state.copy(task = renderModel)) } } diff --git a/formula-android/src/main/java/com/instacart/formula/android/internal/CompositeBinding.kt b/formula-android/src/main/java/com/instacart/formula/android/internal/CompositeBinding.kt index 35771cfd7..1c26f6f9d 100644 --- a/formula-android/src/main/java/com/instacart/formula/android/internal/CompositeBinding.kt +++ b/formula-android/src/main/java/com/instacart/formula/android/internal/CompositeBinding.kt @@ -1,9 +1,9 @@ package com.instacart.formula.android.internal +import com.instacart.formula.DisposableAction import com.instacart.formula.Evaluation import com.instacart.formula.Formula import com.instacart.formula.FormulaContext -import com.instacart.formula.Stream import com.instacart.formula.android.DisposableScope /** @@ -64,7 +64,7 @@ internal class CompositeBinding( output = Unit, updates = context.updates { val isInScope = input.activeFragments.any { binds(it.key) } - events(Stream.onData(isInScope)) { + events(DisposableAction.onData(isInScope)) { if (isInScope && component == null) { transition(State(component = scopeFactory.invoke(input.component))) } else if (!isInScope && component != null) { @@ -76,7 +76,7 @@ internal class CompositeBinding( } } - events(Stream.onTerminate()) { + events(DisposableAction.onTerminate()) { transition { component?.dispose() } } } diff --git a/formula-android/src/main/java/com/instacart/formula/android/internal/FeatureBinding.kt b/formula-android/src/main/java/com/instacart/formula/android/internal/FeatureBinding.kt index 024378fca..2f5cb531f 100644 --- a/formula-android/src/main/java/com/instacart/formula/android/internal/FeatureBinding.kt +++ b/formula-android/src/main/java/com/instacart/formula/android/internal/FeatureBinding.kt @@ -1,9 +1,9 @@ package com.instacart.formula.android.internal +import com.instacart.formula.DisposableAction import com.instacart.formula.Evaluation import com.instacart.formula.Formula import com.instacart.formula.FormulaContext -import com.instacart.formula.Stream import com.instacart.formula.android.FeatureFactory import com.instacart.formula.android.FragmentKey import com.instacart.formula.android.FeatureEvent @@ -44,7 +44,7 @@ internal class FeatureBinding val key = fragmentId.key if (binds(key)) { - Stream.onData(fragmentId).onEvent { + DisposableAction.onData(fragmentId).onEvent { transition { try { val dependencies = toDependencies(input.component) diff --git a/formula-rxjava3/src/main/java/com/instacart/formula/rxjava3/ObservableFormula.kt b/formula-rxjava3/src/main/java/com/instacart/formula/rxjava3/ObservableFormula.kt index 59d409977..528a432af 100644 --- a/formula-rxjava3/src/main/java/com/instacart/formula/rxjava3/ObservableFormula.kt +++ b/formula-rxjava3/src/main/java/com/instacart/formula/rxjava3/ObservableFormula.kt @@ -1,6 +1,6 @@ package com.instacart.formula.rxjava3 -import com.instacart.formula.Stream +import com.instacart.formula.DisposableAction import com.instacart.formula.StreamFormula import io.reactivex.rxjava3.core.Observable @@ -13,8 +13,8 @@ abstract class ObservableFormula : StreamFormula - final override fun stream(input: Input): Stream { - return RxStream.fromObservable { + final override fun stream(input: Input): DisposableAction { + return RxDisposableAction.fromObservable { observable(input) } } diff --git a/formula-test/src/main/java/com/instacart/formula/test/TestStreamObserver.kt b/formula-test/src/main/java/com/instacart/formula/test/TestDisposableActionObserver.kt similarity index 72% rename from formula-test/src/main/java/com/instacart/formula/test/TestStreamObserver.kt rename to formula-test/src/main/java/com/instacart/formula/test/TestDisposableActionObserver.kt index a20c54279..bccb8f6ed 100644 --- a/formula-test/src/main/java/com/instacart/formula/test/TestStreamObserver.kt +++ b/formula-test/src/main/java/com/instacart/formula/test/TestDisposableActionObserver.kt @@ -1,12 +1,12 @@ package com.instacart.formula.test import com.instacart.formula.Cancelable -import com.instacart.formula.Stream +import com.instacart.formula.DisposableAction import java.lang.AssertionError -class TestStreamObserver(private val stream: Stream) { +class TestDisposableActionObserver(private val action: DisposableAction) { private val values = mutableListOf() - private val cancelation = stream.start { values.add(it) } + private val cancelation = action.start { values.add(it) } fun values(): List = values @@ -23,7 +23,7 @@ class TestStreamObserver(private val stream: Stream) { } /** - * Attempts to cancel the [stream]. Will throw an exception if [stream] did not + * Attempts to cancel the [action]. Will throw an exception if [action] did not * provide a [Cancelable]. */ fun cancel() { diff --git a/formula-test/src/main/java/com/instacart/formula/test/TestFormula.kt b/formula-test/src/main/java/com/instacart/formula/test/TestFormula.kt index e7900cf62..315b0670b 100644 --- a/formula-test/src/main/java/com/instacart/formula/test/TestFormula.kt +++ b/formula-test/src/main/java/com/instacart/formula/test/TestFormula.kt @@ -1,9 +1,9 @@ package com.instacart.formula.test +import com.instacart.formula.DisposableAction import com.instacart.formula.Evaluation import com.instacart.formula.Formula import com.instacart.formula.FormulaContext -import com.instacart.formula.Stream import java.lang.IllegalStateException /** @@ -74,7 +74,7 @@ abstract class TestFormula : return Evaluation( output = state.output, updates = context.updates { - Stream.onTerminate().onEvent { + DisposableAction.onTerminate().onEvent { transition { stateMap.remove(state.initialInput) } diff --git a/formula-test/src/main/java/com/instacart/formula/test/TestRuntimeExtensions.kt b/formula-test/src/main/java/com/instacart/formula/test/TestRuntimeExtensions.kt index 6b2bd80d0..6390eed22 100644 --- a/formula-test/src/main/java/com/instacart/formula/test/TestRuntimeExtensions.kt +++ b/formula-test/src/main/java/com/instacart/formula/test/TestRuntimeExtensions.kt @@ -1,7 +1,7 @@ package com.instacart.formula.test +import com.instacart.formula.DisposableAction import com.instacart.formula.IFormula -import com.instacart.formula.Stream /** * An extension function to create a [TestFormulaObserver] for a [IFormula] instance. @@ -25,5 +25,4 @@ fun > F.test( } } -fun Stream.test() = TestStreamObserver(this) - +fun DisposableAction.test() = TestDisposableActionObserver(this) diff --git a/formula-test/src/test/java/com/instacart/formula/test/TestStreamTest.kt b/formula-test/src/test/java/com/instacart/formula/test/TestDisposableActionTest.kt similarity index 73% rename from formula-test/src/test/java/com/instacart/formula/test/TestStreamTest.kt rename to formula-test/src/test/java/com/instacart/formula/test/TestDisposableActionTest.kt index a8017fe20..9ede8ab60 100644 --- a/formula-test/src/test/java/com/instacart/formula/test/TestStreamTest.kt +++ b/formula-test/src/test/java/com/instacart/formula/test/TestDisposableActionTest.kt @@ -2,23 +2,23 @@ package com.instacart.formula.test import com.google.common.truth.Truth.assertThat import com.instacart.formula.Cancelable -import com.instacart.formula.Stream +import com.instacart.formula.DisposableAction import org.junit.Test import java.lang.IllegalStateException -class TestStreamTest { +class TestDisposableActionTest { @Test fun `assert values success`() { - multipleValueStream().test().assertValues(1, 2) + multipleEventAction().test().assertValues(1, 2) } @Test fun `assert value fails due to different size`() { - val exception = fails { multipleValueStream().test().assertValues(1) } + val exception = fails { multipleEventAction().test().assertValues(1) } assertThat(exception).isInstanceOf(AssertionError::class.java) } @Test fun `assert value fails due to different value`() { - val exception = fails { multipleValueStream().test().assertValues(1, 5) } + val exception = fails { multipleEventAction().test().assertValues(1, 5) } assertThat(exception).isInstanceOf(AssertionError::class.java) } @@ -32,7 +32,7 @@ class TestStreamTest { throw IllegalStateException("Action succeeded.") } - fun multipleValueStream() = object : Stream { + private fun multipleEventAction() = object : DisposableAction { override fun start(send: (Int) -> Unit): Cancelable? { send(1) send(2) diff --git a/formula/src/main/java/com/instacart/formula/BoundAction.kt b/formula/src/main/java/com/instacart/formula/BoundAction.kt index 87dc8cec8..7b7743a95 100644 --- a/formula/src/main/java/com/instacart/formula/BoundAction.kt +++ b/formula/src/main/java/com/instacart/formula/BoundAction.kt @@ -5,14 +5,14 @@ package com.instacart.formula */ class BoundAction( val key: Any, - val stream: Stream, + val action: DisposableAction, internal var listener: (Message) -> Unit ) { internal var cancelable: Cancelable? = null internal fun start() { - cancelable = stream.start() { message -> + cancelable = action.start() { message -> listener.invoke(message) } } diff --git a/formula/src/main/java/com/instacart/formula/Cancelable.kt b/formula/src/main/java/com/instacart/formula/Cancelable.kt index 61cf14d36..7284cd2a9 100644 --- a/formula/src/main/java/com/instacart/formula/Cancelable.kt +++ b/formula/src/main/java/com/instacart/formula/Cancelable.kt @@ -1,7 +1,7 @@ package com.instacart.formula /** - * Used within [Stream] to receive a cancel event. Use this to perform clean up. + * Used within [DisposableAction] to receive a cancel event. Use this to perform clean up. */ interface Cancelable { companion object { diff --git a/formula/src/main/java/com/instacart/formula/FormulaContext.kt b/formula/src/main/java/com/instacart/formula/FormulaContext.kt index ba2356d30..49717433b 100644 --- a/formula/src/main/java/com/instacart/formula/FormulaContext.kt +++ b/formula/src/main/java/com/instacart/formula/FormulaContext.kt @@ -240,7 +240,7 @@ abstract class FormulaContext internal constructor( return BoundAction( key = JoinedKey(action.key(), callback::class), - stream = action, + action = action, listener = callback ) } diff --git a/formula/src/test/java/com/instacart/formula/streams/EmptyStream.kt b/formula/src/test/java/com/instacart/formula/streams/EmptyStream.kt index a5384165f..fb0038469 100644 --- a/formula/src/test/java/com/instacart/formula/streams/EmptyStream.kt +++ b/formula/src/test/java/com/instacart/formula/streams/EmptyStream.kt @@ -1,8 +1,9 @@ package com.instacart.formula.streams +import com.instacart.formula.rxjava3.RxDisposableAction import com.instacart.formula.rxjava3.RxStream import io.reactivex.rxjava3.core.Observable object EmptyStream { - fun init(key: Any = Unit) = RxStream.fromObservable(key) { Observable.empty() } + fun init(key: Any = Unit) = RxDisposableAction.fromObservable(key) { Observable.empty() } } diff --git a/formula/src/test/java/com/instacart/formula/subjects/DynamicStreamSubject.kt b/formula/src/test/java/com/instacart/formula/subjects/DynamicStreamSubject.kt index bfae34656..196064785 100644 --- a/formula/src/test/java/com/instacart/formula/subjects/DynamicStreamSubject.kt +++ b/formula/src/test/java/com/instacart/formula/subjects/DynamicStreamSubject.kt @@ -2,6 +2,7 @@ package com.instacart.formula.subjects import com.google.common.truth.Truth.assertThat import com.instacart.formula.Cancelable +import com.instacart.formula.DisposableAction import com.instacart.formula.Evaluation import com.instacart.formula.FormulaContext import com.instacart.formula.StatelessFormula @@ -44,8 +45,8 @@ class DynamicStreamSubject(runtime: TestableRuntime) { ) } - private fun stream(key: String): Stream { - return object : Stream { + private fun stream(key: String): DisposableAction { + return object : DisposableAction { override fun start(send: (Unit) -> Unit): Cancelable? { running.add(key) return Cancelable { diff --git a/formula/src/test/java/com/instacart/formula/subjects/ExtremelyNestedFormula.kt b/formula/src/test/java/com/instacart/formula/subjects/ExtremelyNestedFormula.kt index cf027a8d7..c01d9ab3a 100644 --- a/formula/src/test/java/com/instacart/formula/subjects/ExtremelyNestedFormula.kt +++ b/formula/src/test/java/com/instacart/formula/subjects/ExtremelyNestedFormula.kt @@ -1,5 +1,6 @@ package com.instacart.formula.subjects +import com.instacart.formula.DisposableAction import com.instacart.formula.Evaluation import com.instacart.formula.Formula import com.instacart.formula.FormulaContext @@ -23,7 +24,7 @@ object ExtremelyNestedFormula { return Evaluation( output = state + childValue, updates = context.updates { - events(Stream.onInit()) { + events(DisposableAction.onInit()) { transition(state + 1) } } diff --git a/samples/custom-network-state-stream/src/main/java/com/instacart/formula/samples/networkstate/NetworkStateStream.kt b/samples/custom-network-state-stream/src/main/java/com/instacart/formula/samples/networkstate/NetworkStateStream.kt index 1711a2499..e1c038afe 100644 --- a/samples/custom-network-state-stream/src/main/java/com/instacart/formula/samples/networkstate/NetworkStateStream.kt +++ b/samples/custom-network-state-stream/src/main/java/com/instacart/formula/samples/networkstate/NetworkStateStream.kt @@ -1,10 +1,10 @@ package com.instacart.formula.samples.networkstate -import com.instacart.formula.Stream +import com.instacart.formula.DisposableAction data class NetworkState(val isOnline: Boolean) -interface NetworkStateStream : Stream { +interface NetworkStateStream : DisposableAction { /** * Using type as a key. There should not be more * than one subscription to this stream