package Ġcom . example . ui . view model . st ater ed ucer Ċ Ċ import Ġandroidx . annotation . MainThread Ċ import Ġio . reactivex . rx java 3 . core . Observable Ċ import Ġio . reactivex . rx java 3 . core . Single Ċ import Ġio . reactivex . rx java 3 . subjects . Behavior Subject Ċ import Ġio . reactivex . rx java 3 . subjects . Subject Ċ Ċ abstract Ġclass ĠState Reducer < State Ġ: ĠAny >( initialState : ĠState ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġ_ state Change Subject : ĠSubject <( State ) Ġ-> ĠState > Ġ= ĠBehavior Subject . create <( State ) Ġ-> ĠState >(). to Serialized () ĊĊĠĠĠ Ġprivate Ġval Ġ_ state Subject : ĠSubject < StateChange < State >> Ġ= ĠBehavior Subject . create Default ( StateChange ( initialState , Ġnull )). to Serialized () ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġobserve StateChange (): ĠObservable < StateChange < State >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ state Subject . first Or Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Observable Ġ{ Ġlast StateChange Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ state Change Subject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. scan ( last StateChange , Ġ{ Ġstate Change , Ġchange Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold State Ġ= Ġstate Change . state ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewState Ġ= Ġchange ( old State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= Ġ( newState Ġas ? ĠState Payload < State , Ġ* >) ?. let Ġ{ ĠnewState . calculate ( old State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState Change ( newState , Ġpayload ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġstate Change Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ state Subject . onNext ( state Change ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreset Ġpayload ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( state Change . state Ġas ? ĠState Payload < State , Ġ* >) ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ state Subject . onNext ( state Change . copy ( payload Ġ= Ġit . calculate ( state Change . state ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start With Item ( StateChange ( last StateChange . state , Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetState (): ĠSingle < State > Ġ= Ġ_ state Subject . first Or Error (). map Ġ{ Ġstate Change Ġ-> Ġstate Change . state Ġ} ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġprotected Ġfun Ġcommit ( block : Ġ( State ) Ġ-> ĠState ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ state Change Subject . onNext ( block ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠState Change < T Ġ: ĠAny >( ĊĠĠĠĠĠĠĠ Ġval Ġstate : ĠT , ĊĠĠĠĠĠĠĠ Ġval Ġpayload : ĠAny ? ĊĠĠĠ Ġ) Ċ }