package Ġdev . te ap ot . program Ċ Ċ import Ġio . reactivex . Scheduler Ċ import Ġjava . lang . IllegalArgumentException Ċ import Ġdev . te ap ot . contract .* Ċ import Ġdev . te ap ot . effect . coroutine . Cor outines Command Executor Ċ import Ġdev . te ap ot . effect . rx . Rx Command Executor Ċ import Ġdev . te ap ot . log . Te ap ot Logger Ċ import Ġdev . te ap ot . middleware . Middleware Ċ import Ġdev . te ap ot . sub . Flow Sub Ċ import Ġdev . te ap ot . sub . Rx Sub Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ Ċ class ĠProgram Builder Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġoutput Scheduler : ĠScheduler ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġoutput Dispatcher : ĠCor outine Dispatcher ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġlogger : ĠTe ap ot Logger ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġhandle Cmd Errors : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġmiddle wares : ĠMutable List < Middleware > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġscheduler Ġmust Ġbe Ġsingle Ġth readed , Ġlike ĠS chedulers . single () Ġor ĠAndroid Schedulers . main Thread (), ĊĠĠĠĠ Ġ* Ġsince ĠProgram 's Ġimplementation Ġis Ġnot Ġthread Ġsafe ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġoutput Scheduler ( scheduler : ĠScheduler ): ĠProgram Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . output Scheduler Ġ= Ġscheduler ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġdispatcher Ġmust Ġbe Ġsingle Ġth readed , Ġlike ĠDispatch ers . Main , ĊĠĠĠĠ Ġ* Ġsince ĠProgram 's Ġimplementation Ġis Ġnot Ġthread Ġsafe ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġoutput Dispatcher ( d : ĠCor outine Dispatcher ): ĠProgram Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . output Dispatcher Ġ= Ġd ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlogger ( logger : ĠTe ap ot Logger ): ĠProgram Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . logger Ġ= Ġlogger ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Middleware ( m Ġ: ĠMiddleware ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmiddle wares . add ( m ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBy Ġdefault Ġhandle Cmd Errors Ġis Ġset Ġto Ġtrue Ġand ĠRx Elm Ġhandles Ġerrors Ġfrom Ġside Ġeffect Ġand Ġsends Ġthem Ġin Ġ[ ErrorMsg ] ĊĠĠĠĠ Ġ* ĠIf Ġpass Ġhandle = false , Ġthen Ġall Ġunhandled Ġerrors Ġfrom Ġ[ Feature . call ] Ġwill Ġlead Ġto Ġcrash ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhandle Cmd Errors ( handle : ĠBoolean ): ĠProgram Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . handle Cmd Errors Ġ= Ġhandle ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S Ġ: ĠState > Ġbuild Rx Sub () Ġ: ĠRx Sub < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscheduler Ġ= Ġoutput Scheduler Ġ?: Ġthrow ĠIllegalArgumentException (" Output ĠScheduler Ġmust Ġbe Ġprovided !") ĊĠĠĠĠĠĠĠ Ġreturn ĠRx Sub ( scheduler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S Ġ: ĠState > Ġbuild FL ow Sub () Ġ: ĠFlow Sub < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdispatcher Ġ= Ġoutput Dispatcher Ġ?: Ġthrow ĠIllegalArgumentException (" Output ĠDispatcher Ġmust Ġbe Ġprovided !") ĊĠĠĠĠĠĠĠ Ġreturn ĠFlow Sub ( dispatcher ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S Ġ: ĠState > Ġbuild ( feature : ĠRx Feature < S >): ĠProgram < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild ( feature , Ġfeature ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S Ġ: ĠState > Ġbuild ( update : ĠUp d < S >, Ġeffect Handler : ĠRx Effect Handler ): ĠProgram < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscheduler Ġ= Ġoutput Scheduler Ġ?: Ġthrow ĠIllegalArgumentException (" Output ĠScheduler Ġmust Ġbe Ġprovided !") ĊĠĠĠĠĠĠĠ Ġval Ġcommand Executor Ġ= ĠRx Command Executor ( effect Handler , Ġ"", Ġhandle Cmd Errors , Ġscheduler , Ġlogger ) ĊĠĠĠĠĠĠĠ Ġval Ġprogram Ġ= ĠProgram ( update , Ġlogger , Ġmiddle wares ) ĊĠĠĠĠĠĠĠ Ġprogram . add Command Executor ( command Executor ) ĊĠĠĠĠĠĠĠ Ġreturn Ġprogram ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S Ġ: ĠState > Ġbuild ( feature : ĠCor outine Feature < S >): ĠProgram < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild ( feature , Ġfeature ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S Ġ: ĠState > Ġbuild ( upd : ĠUp d < S >, Ġeffect Handler : ĠCor outines Effect Handler ): ĠProgram < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdispatcher Ġ= Ġoutput Dispatcher Ġ?: Ġthrow ĠIllegalArgumentException (" Output ĠDispatcher Ġmust Ġbe Ġprovided !") ĊĠĠĠĠĠĠĠ Ġval Ġcommand Executor Ġ= ĠCor outines Command Executor ( effect Handler , Ġdispatcher , Ġ"", Ġhandle Cmd Errors , Ġlogger ) ĊĠĠĠĠĠĠĠ Ġval Ġprogram Ġ= ĠProgram ( upd , Ġlogger , Ġmiddle wares ) ĊĠĠĠĠĠĠĠ Ġprogram . add Command Executor ( command Executor ) ĊĠĠĠĠĠĠĠ Ġreturn Ġprogram ĊĠĠĠ Ġ} Ċ }