Advertisement
Guest User

Untitled

a guest
Mar 15th, 2019
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 3.65 KB | None | 0 0
  1. package esoft.com.moblin
  2.  
  3. import android.os.Bundle
  4. import android.os.Parcel
  5. import android.os.Parcelable
  6. import androidx.appcompat.app.AppCompatActivity
  7. import com.jakewharton.rxbinding3.view.clicks
  8. import com.spotify.mobius.First
  9. import com.spotify.mobius.MobiusLoop
  10. import com.spotify.mobius.Next
  11. import com.spotify.mobius.Next.next
  12. import com.spotify.mobius.android.AndroidLogger
  13. import com.spotify.mobius.android.MobiusAndroid
  14. import com.spotify.mobius.rx2.RxConnectables
  15. import com.spotify.mobius.rx2.RxMobius
  16. import io.reactivex.Observable
  17. import kotlinx.android.synthetic.main.activity_main.*
  18.  
  19. sealed class Event {
  20.     object IncreaseClicked : Event()
  21.     object DecreaseClicked : Event()
  22. }
  23.  
  24. sealed class Effect {
  25.     object ErrorCalclating : Effect()
  26. }
  27.  
  28. data class StateModel(
  29.     val counter: Int = 0
  30. ) : Parcelable {
  31.     constructor(parcel: Parcel) : this(parcel.readInt())
  32.  
  33.     override fun writeToParcel(parcel: Parcel, flags: Int) {
  34.         parcel.writeInt(counter)
  35.     }
  36.  
  37.     override fun describeContents(): Int {
  38.         return 0
  39.     }
  40.  
  41.     companion object CREATOR : Parcelable.Creator<StateModel> {
  42.         override fun createFromParcel(parcel: Parcel): StateModel {
  43.             return StateModel(parcel)
  44.         }
  45.  
  46.         override fun newArray(size: Int): Array<StateModel?> {
  47.             return arrayOfNulls(size)
  48.         }
  49.     }
  50. }
  51.  
  52. abstract class Updater<MOD, EVT, EFT> : ((MOD, EVT) -> Next<MOD, EFT>)
  53.  
  54. inline fun <reified MOD, EVT, EFT> createController(
  55.     defaultModel: MOD?,
  56.     updater: Updater<MOD, EVT, EFT>
  57. ): MobiusLoop.Controller<MOD, EVT> {
  58.     val loop = RxMobius.loop<MOD, EVT, EFT>(updater, { Observable.empty() })
  59.         .init { initial ->
  60.             defaultModel?.let { First.first<MOD, EFT>(it) } ?: First.first<MOD, EFT>(initial)
  61.         }
  62.  
  63.     return MobiusAndroid.controller<MOD, EVT, EFT>(loop, MOD::class.java.newInstance())
  64. }
  65.  
  66. class MainActivity : AppCompatActivity() {
  67.  
  68.     private val mobiusLoop = RxMobius.loop<StateModel, Event, Effect>(UpdaterImpl) { effect ->
  69.         Observable.empty()
  70.     }.logger(AndroidLogger.tag("MoBlin")).init {
  71.         First.first(it)
  72.     }
  73.  
  74.     private object UpdaterImpl : Updater<StateModel, Event, Effect>() {
  75.         override fun invoke(model: StateModel, event: Event): Next<StateModel, Effect> = when (event) {
  76.             Event.DecreaseClicked -> next(model.copy(counter = model.counter - 1))
  77.             Event.IncreaseClicked -> next(model.copy(counter = model.counter + 1))
  78.         }
  79.     }
  80.  
  81.     private val controller = createController(
  82.         null,
  83.         UpdaterImpl
  84.     )
  85.  
  86.     override fun onCreate(savedInstanceState: Bundle?) {
  87.         super.onCreate(savedInstanceState)
  88.         setContentView(R.layout.activity_main)
  89.         controller.connect(RxConnectables.fromTransformer { models ->
  90.             val modelsDisposable = models.subscribe {
  91.                 counter.text = it.counter.toString()
  92.             }
  93.             Observable.merge(
  94.                 increase.clicks().map { Event.IncreaseClicked },
  95.                 decrease.clicks().map { Event.DecreaseClicked }
  96.             ).doOnDispose(modelsDisposable::dispose)
  97.         })
  98.  
  99.         savedInstanceState?.get("COUNT")?.let {
  100.             controller.replaceModel(it as StateModel)
  101.         }
  102.     }
  103.  
  104.     override fun onSaveInstanceState(outState: Bundle?) {
  105.         super.onSaveInstanceState(outState?.apply {
  106.             putParcelable("COUNT", controller.model)
  107.         })
  108.     }
  109.  
  110.     public override fun onResume() {
  111.         super.onResume()
  112.         controller.start()
  113.     }
  114.  
  115.     public override fun onPause() {
  116.         super.onPause()
  117.         controller.stop()
  118.     }
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement