diff --git a/domains/android/compose-core/src/main/kotlin/app/dapk/st/core/page/PageReducer.kt b/domains/android/compose-core/src/main/kotlin/app/dapk/st/core/page/PageReducer.kt
index aa43a46..c4d935d 100644
--- a/domains/android/compose-core/src/main/kotlin/app/dapk/st/core/page/PageReducer.kt
+++ b/domains/android/compose-core/src/main/kotlin/app/dapk/st/core/page/PageReducer.kt
@@ -31,29 +31,28 @@ fun
createPageReducer(
initialPage: SpiderPage,
factory: PageReducerScope.() -> ReducerFactory,
): ReducerFactory, S>> = shareState {
- combineReducers(
- createPageReducer(initialPage),
- factory(object : PageReducerScope {
- override fun withPageContent(page: KClass, block: PageDispatchScope.() -> Unit) {
- val currentPage = getSharedState().state1.page.state
- if (currentPage::class == page) {
- val pageDispatchScope = object : PageDispatchScope {
- override fun ReducerScope<*>.pageDispatch(action: PageAction) {
- val currentPageGuard = getSharedState().state1.page.state
- if (currentPageGuard::class == page) {
- dispatch(action)
- }
- }
+ combineReducers(createPageReducer(initialPage), factory(pageReducerScope()))
+}
- override fun getPageState() = getSharedState().state1.page.state as? PC
+private fun SharedStateScope, S>>.pageReducerScope() = object : PageReducerScope {
+ override fun withPageContent(page: KClass, block: PageDispatchScope.() -> Unit) {
+ val currentPage = getSharedState().state1.page.state
+ if (currentPage::class == page) {
+ val pageDispatchScope = object : PageDispatchScope {
+ override fun ReducerScope<*>.pageDispatch(action: PageAction) {
+ val currentPageGuard = getSharedState().state1.page.state
+ if (currentPageGuard::class == page) {
+ dispatch(action)
}
- block(pageDispatchScope)
}
- }
- override fun rawPage() = getSharedState().state1.page
- })
- )
+ override fun getPageState() = getSharedState().state1.page.state as? PC
+ }
+ block(pageDispatchScope)
+ }
+ }
+
+ override fun rawPage() = getSharedState().state1.page
}
@Suppress("UNCHECKED_CAST")
diff --git a/domains/state/src/main/kotlin/app/dapk/state/State.kt b/domains/state/src/main/kotlin/app/dapk/state/State.kt
index 3914aaf..252043e 100644
--- a/domains/state/src/main/kotlin/app/dapk/state/State.kt
+++ b/domains/state/src/main/kotlin/app/dapk/state/State.kt
@@ -83,17 +83,8 @@ fun shareState(block: SharedStateScope.() -> ReducerFactory): ReducerF
fun combineReducers(r1: ReducerFactory, r2: ReducerFactory): ReducerFactory> {
return object : ReducerFactory> {
override fun create(scope: ReducerScope>): Reducer> {
- val r1Scope = object : ReducerScope {
- override val coroutineScope: CoroutineScope = scope.coroutineScope
- override fun dispatch(action: Action) = scope.dispatch(action)
- override fun getState() = scope.getState().state1
- }
-
- val r2Scope = object : ReducerScope {
- override val coroutineScope: CoroutineScope = scope.coroutineScope
- override fun dispatch(action: Action) = scope.dispatch(action)
- override fun getState() = scope.getState().state2
- }
+ val r1Scope = createReducerScope(scope) { scope.getState().state1 }
+ val r2Scope = createReducerScope(scope) { scope.getState().state2 }
val r1Reducer = r1.create(r1Scope)
val r2Reducer = r2.create(r2Scope)
@@ -106,6 +97,12 @@ fun combineReducers(r1: ReducerFactory, r2: ReducerFactory): Re
}
}
+private fun createReducerScope(scope: ReducerScope<*>, state: () -> S) = object : ReducerScope {
+ override val coroutineScope: CoroutineScope = scope.coroutineScope
+ override fun dispatch(action: Action) = scope.dispatch(action)
+ override fun getState() = state.invoke()
+}
+
fun createReducer(
initialState: S,
vararg reducers: (ReducerScope) -> ActionHandler,