From f9e1473899b81efa569e3be1cdf8bb51f35b8f28 Mon Sep 17 00:00:00 2001 From: Henning Post Date: Tue, 7 Aug 2018 16:35:14 -0700 Subject: [PATCH 1/2] Add common structure to BaseModel This includes stubs for `initialViewModel`, `eventsFrom`, `sideEffectsFrom`, and `reduce` that are set up in `attach`. --- .../kotlin/cc/femto/kommon/mvi/BaseModel.kt | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/mvi/src/main/kotlin/cc/femto/kommon/mvi/BaseModel.kt b/mvi/src/main/kotlin/cc/femto/kommon/mvi/BaseModel.kt index 2c2615d..c8c2d7a 100644 --- a/mvi/src/main/kotlin/cc/femto/kommon/mvi/BaseModel.kt +++ b/mvi/src/main/kotlin/cc/femto/kommon/mvi/BaseModel.kt @@ -16,10 +16,53 @@ abstract class BaseModel : Model = actions + override fun attach(intents: Observable) { + makeViewModel( + eventsFrom(intents), + initialViewModel(), + ::reduce + ) + disposables.add(sideEffectsFrom(intents)) + } + override fun detach() { disposables.clear() } + /** + * @return instance of [VM] representing the initial state + */ + protected abstract fun initialViewModel(): VM + + /** + * Define state mutation events that result in view model changes + * + * NB: Operations that don't cause a state mutation reside in [sideEffectsFrom] + * + * @return [Observable] of [Event] feeding into [reduce] + */ + protected abstract fun eventsFrom(intents: Observable): Observable + + /** + * Reduce state mutations to updated view models + * + * NB: Should be a pure function without side effects + */ + protected abstract fun reduce(model: VM, event: Event): VM + + /** + * Define side effects that don't result in state mutations, if any + * + * Default implementation results in no-op. + * + * NB: Returned subscriptions will be added to [disposables] and disposed in [detach] + * + * @return [CompositeDisposable] containing subscriptions that need to be managed + */ + protected open fun sideEffectsFrom(intents: Observable): CompositeDisposable { + return CompositeDisposable() + } + /** * Exposes the internal [Event] stream that passes through the reducer */ From 78f22ea872c64fa650e99868f6fdb0febbb114a2 Mon Sep 17 00:00:00 2001 From: Henning Post Date: Wed, 8 Aug 2018 11:53:13 -0700 Subject: [PATCH 2/2] Update version to 2.2.0 --- README.md | 2 +- build.gradle | 2 +- mvi/build.gradle | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index bb1ef66..1366626 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,6 @@ and: ```gradle dependencies { - implementation "cc.femto:kommon-mvi:2.1.1" + implementation "cc.femto:kommon-mvi:2.2.0" } ``` diff --git a/build.gradle b/build.gradle index 1194eb1..c031bef 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext.gradle_version = '3.0.1' - ext.kotlin_version = '1.2.41' + ext.kotlin_version = '1.2.60' ext.rxjava_version = '2.1.7' repositories { diff --git a/mvi/build.gradle b/mvi/build.gradle index c62528e..9d5d8f6 100644 --- a/mvi/build.gradle +++ b/mvi/build.gradle @@ -20,8 +20,8 @@ android { defaultConfig { minSdkVersion 16 targetSdkVersion 27 - versionCode 5 - versionName "2.1.1" + versionCode 6 + versionName "2.2.0" } buildTypes { release {