11package com.willowtreeapps.common
22
3+ import com.willowtreeapps.common.ui.SearchView
4+ import com.willowtreeapps.common.ui.View
35import com.willowtreeapps.common.ui.ViewUpdater
6+ import com.willowtreeapps.common.ui.ViewUpdaterBuilder
47import org.reduxkotlin.Store
58import org.reduxkotlin.StoreSubscriber
9+ import org.reduxkotlin.compose
10+ import org.reduxkotlin.createStore
11+ import kotlin.reflect.KClass
12+ import kotlin.reflect.KProperty1
613
714class SelectorSubscriberBuilder <S : Any , View >(val store : Store ) {
15+ // available to lambda with receiver in DSL
816 val state: S
917 get() = store.getState() as S
1018
@@ -15,20 +23,13 @@ class SelectorSubscriberBuilder<S : Any, View>(val store: Store) {
1523 }
1624
1725 val selectorList = mutableMapOf<Selector <S , Any >, (Any ) -> Unit > ()
18- val updaterList = mutableMapOf<Selector <S , Any >, Any > ()
1926
2027 fun withSingleField (selector : (S ) -> Any , action : (Any ) -> Unit ) {
2128 val selBuilder = SelectorBuilder <S >()
2229 val sel = selBuilder.withSingleField(selector)
2330 selectorList[sel] = action
2431 }
2532
26- fun withSingleField2 (selector : (S ) -> Any , action : View .()-> Unit ) {
27- val selBuilder = SelectorBuilder <S >()
28- val sel = selBuilder.withSingleField(selector)
29- updaterList[sel] = action
30- }
31-
3233 infix operator fun SelectorSubscriberBuilder <S , View >.plus (selector : (S ) -> Any ): AbstractSelector <S , Any > {
3334 val selBuilder = SelectorBuilder <S >()
3435 val sel = selBuilder.withSingleField(selector)
@@ -59,6 +60,7 @@ class SelectorSubscriberBuilder<S : Any, View>(val store: Store) {
5960 * }
6061 */
6162fun <S : Any , View > SelectorSubscriberFn (store : Store , selectorSubscriberBuilderInit : SelectorSubscriberBuilder <S , View >.() -> Unit ): StoreSubscriber {
63+
6264 val subBuilder = SelectorSubscriberBuilder <S , View >(store)
6365 subBuilder.selectorSubscriberBuilderInit()
6466 return {
@@ -68,3 +70,118 @@ fun <S : Any, View> SelectorSubscriberFn(store: Store, selectorSubscriberBuilder
6870 subBuilder.withAnyChangeFun?.invoke()
6971 }
7072}
73+
74+ // Class that handles state management of selectors globally. All Subscribed selectors will share
75+ // a selector map and multiple selectors matching selectors will be updated. i.e.
76+ // val selectFoo: SelectorSubscriber = {{ select{it.loading}+{}
77+ // val selectBar: SelectorSubscriber = {{ select{it.loading}+{}
78+ // This class will notify both
79+ class SharedSelector <S : Any , View > {
80+ private val selectorList = mutableMapOf<Selector <S , Any >, (Any ) -> Unit > ()
81+
82+ fun withSingleField (selector : (S ) -> Any , action : (Any ) -> Unit ) {
83+ val selBuilder = SelectorBuilder <S >()
84+ val sel = selBuilder.withSingleField(selector)
85+ selectorList[sel] = action
86+ }
87+
88+ infix operator fun SelectorSubscriberBuilder <S , View >.plus (selector : (S ) -> Any ): AbstractSelector <S , Any > {
89+ val selBuilder = SelectorBuilder <S >()
90+ val sel = selBuilder.withSingleField(selector)
91+ return sel
92+ }
93+
94+ infix operator fun AbstractSelector <S , Any >.plus (action : (Any ) -> Unit ) {
95+ selectorList[this ] = action
96+ }
97+
98+ infix operator fun AbstractSelector <S , Any >.invoke (action : (Any ) -> Unit ) {
99+ selectorList[this ] = action
100+ }
101+ }
102+
103+ typealias SelectorSubscriber <State , View > = SelectorSubscriberBuilder <State , View >.() -> View .() -> Unit
104+
105+ typealias SelectorSubscriberB <State , View > = View .() -> (SelectorSubscriberBuilder <State , View >.() -> Unit )
106+ typealias SelectorSubscriberC <State , View > = View .() -> (Store ) -> (SelectorSubscriberBuilder <State , View >.() -> Unit )
107+ typealias SelectorSubscriberD <State , View > = View .() -> (Store ) -> StoreSubscriber
108+
109+ typealias MySelectorSubscriber <View > = SelectorSubscriber <AppState , View >
110+
111+ // experimental selector using KProps
112+ operator fun KProperty1 <AppState , Boolean >.get (pos : Int ) {
113+
114+ }
115+
116+ val searchPresenterSubscriber: MySelectorSubscriber <SearchView > =
117+ {
118+ {
119+ plus { AppState ::isLoadingItems[0 ] } + { showLoading() }
120+ plus { it.isLoadingItems } + { showLoading() }
121+ withSingleField({ it.isLoadingItems }) { showLoading() }
122+ }
123+ }
124+
125+ val searchPresenterSubscriberB: SelectorSubscriberB <AppState , SearchView > = {
126+ {
127+ plus { AppState ::isLoadingItems[0 ] } + { showLoading() }
128+ plus { it.isLoadingItems } + { showLoading() }
129+ }
130+ }
131+
132+
133+ val searchPresenterSubscriberC: SelectorSubscriberC <AppState , SearchView > = {
134+ { store ->
135+ {
136+ plus { AppState ::isLoadingItems[0 ] } + { showLoading() }
137+ plus { it.isLoadingItems } + { showLoading() }
138+ }
139+ }
140+ }
141+
142+ fun <State : Any , View > selectFun (store : Store , actions : (SelectorSubscriberBuilder <State , View >.() -> Unit )): StoreSubscriber {
143+ val sel = SelectorSubscriberFn <State , View >(store, actions)
144+ return sel
145+ }
146+
147+ fun <State : Any , View > viewUpdater (actions : ViewUpdaterBuilder <State , View >): ViewUpdater <View > {
148+ return { view: View ->
149+ { store: Store ->
150+ val actions2 = actions(view)// (store)
151+ val sel = SelectorSubscriberFn (store, actions2)
152+ sel
153+ }
154+ }
155+ }
156+
157+ val searchPresenterSubscriberD: SelectorSubscriberD <AppState , SearchView > = {
158+ { store ->
159+ SelectorSubscriberFn <AppState , SearchView >(store) {
160+ plus { AppState ::isLoadingItems[0 ] } + { showLoading() }
161+ plus { it.isLoadingItems } + { showLoading() }
162+ }// (store)
163+ }
164+ }
165+ val searchPresenterSubscriberD2: SelectorSubscriberD <AppState , SearchView > = {
166+ {
167+ selectFun<AppState , SearchView >(it) {
168+ plus { AppState ::isLoadingItems[0 ] } + { showLoading() }
169+ plus { it.isLoadingItems } + { showLoading() }
170+ }// (store)
171+ }
172+ }
173+ val searchPresenterSubscriberD3 = viewUpdater<AppState , SearchView > {
174+ {
175+ plus { it.isLoadingItems } + { showLoading() }
176+ }
177+ }
178+
179+ fun test (view : SearchView ) {
180+ val store = createStore()
181+ searchPresenterSubscriber(SelectorSubscriberBuilder (store))(view)
182+ searchPresenterSubscriberB(view)(SelectorSubscriberBuilder (store))
183+ val subscriber = searchPresenterSubscriberC(view)(store)
184+ val subscriberD = searchPresenterSubscriberD(view)(store)
185+ val subscriberD2 = searchPresenterSubscriberD2(view)(store)
186+ val subscriberD3 = searchPresenterSubscriberD3(view)(store)
187+ }
0 commit comments