diff --git a/lib/build.gradle b/lib/build.gradle index 4a63f46..7f1d170 100644 --- a/lib/build.gradle +++ b/lib/build.gradle @@ -7,7 +7,7 @@ apply plugin: 'kotlin-multiplatform' archivesBaseName = 'redux-kotlin-reselect' group 'org.reduxkotlin' -version '0.2.5' +version '0.2.7' kotlin { jvm() diff --git a/lib/src/commonMain/kotlin/org/reduxkotlin/reselect.kt b/lib/src/commonMain/kotlin/org/reduxkotlin/Reselect.kt similarity index 99% rename from lib/src/commonMain/kotlin/org/reduxkotlin/reselect.kt rename to lib/src/commonMain/kotlin/org/reduxkotlin/Reselect.kt index f49c7a8..ec9a5da 100644 --- a/lib/src/commonMain/kotlin/org/reduxkotlin/reselect.kt +++ b/lib/src/commonMain/kotlin/org/reduxkotlin/Reselect.kt @@ -138,6 +138,10 @@ fun S.whenChangeOf(selector: Selector, blockfn: (O) -> Unit) { * abstract base class for all selectors */ abstract class AbstractSelector : Selector { + fun invoke(tmp: ()-> Unit): O { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + @JvmField protected var recomputationsLastChanged = 0L @JvmField protected var _recomputations = 0L override val recomputations: Long get() = _recomputations diff --git a/lib/src/commonMain/kotlin/org/reduxkotlin/SelectorSubscriberBuilder.kt b/lib/src/commonMain/kotlin/org/reduxkotlin/SelectorSubscriberBuilder.kt new file mode 100644 index 0000000..6dbedc5 --- /dev/null +++ b/lib/src/commonMain/kotlin/org/reduxkotlin/SelectorSubscriberBuilder.kt @@ -0,0 +1,52 @@ +package org.reduxkotlin + + +/** + * A Selector Subscriber - group of selectors that subscribe to store state changes. + * + * @param State is the type of the state object returned by the store. + * @property store The redux store + * @constructor creates an empty SelectorSubscriberBuilder + */ +class SelectorSubscriberBuilder(val store: Store) { + + private val selectorList = mutableMapOf, (Any) -> Unit>() + + //state is here to make available to lambda with receiver in DSL + val state: State + get() = store.getState() as State + + var withAnyChangeFun: (() -> Unit)? = null + + fun withAnyChange(f: () -> Unit) { + withAnyChangeFun = f + } + + + fun withSingleField(selector: (State) -> Any, action: (Any) -> Unit) { + val selBuilder = SelectorBuilder() + val sel = selBuilder.withSingleField(selector) + selectorList[sel] = action + } + + infix fun SelectorSubscriberBuilder.select(selector: (State) -> Any): AbstractSelector = + SelectorBuilder().withSingleField(selector) + + infix fun SelectorSubscriberBuilder.on(selector: (State) -> Any): AbstractSelector = + SelectorBuilder().withSingleField(selector) + + operator fun (() -> Any).unaryPlus(): AbstractSelector { + val that = this + return SelectorBuilder().withSingleField { that() } + } + + infix fun AbstractSelector.then(action: (Any) -> Unit) { + selectorList[this] = action + } + + infix operator fun AbstractSelector.plus(action: (Any) -> Unit) { + selectorList[this] = action + } +} + + diff --git a/lib/src/commonMain/kotlin/org/reduxkotlin/builders.kt b/lib/src/commonMain/kotlin/org/reduxkotlin/builders.kt deleted file mode 100644 index 9728ff3..0000000 --- a/lib/src/commonMain/kotlin/org/reduxkotlin/builders.kt +++ /dev/null @@ -1,44 +0,0 @@ -package org.reduxkotlin - -class SelectorSubscriberBuilder(val store: Store) { - val state: S - get() = store.getState() as S - - var withAnyChangeFun: (() -> Unit)? = null - - fun withAnyChange(f: () -> Unit) { - withAnyChangeFun = f - } - - val selectorList = mutableMapOf, (Any) -> Unit>() - fun withSingleField(selector: (S) -> Any, action: (Any) -> Unit) { - val selBuilder = SelectorBuilder() - val sel = selBuilder.withSingleField(selector) - selectorList[sel] = action - } -} - -/** - * Helper function that creates a DSL for subscribing to changes in specific state fields and actions to take. - * Inside the lambda there is access to the current state through the var `state` - * - * ex: - * SelectorSubscriberFn { - * withSingleField({it.foo}, { actionWhenFooChanges() } - * - * withAnyChange { - * //called whenever any change happens to state - * view.setMessage(state.barMsg) //state is current state - * } - * } - */ -fun SelectorSubscriberFn(store: Store, selectorSubscriberBuilderInit: SelectorSubscriberBuilder.() -> Unit): StoreSubscriber { - val subBuilder = SelectorSubscriberBuilder(store) - subBuilder.selectorSubscriberBuilderInit() - return { - subBuilder.selectorList.forEach { entry -> - entry.key.onChangeIn(store.getState() as S) { entry.value(store.getState()) } - } - subBuilder.withAnyChangeFun?.invoke() - } -} diff --git a/settings.gradle b/settings.gradle index 388f24c..9950823 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,7 +9,7 @@ pluginManagement { } include ':lib' -rootProject.name='Redux-Kotlin-thunk' +rootProject.name='Redux-Kotlin-reselect' rootProject.name = 'test'