/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġlaunch On Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ @ file : Suppress (" UN CHECK ED _ CAST ") Ċ Ċ package Ġio . un iflow . core . flow Ċ Ċ import Ġio . un iflow . core . flow . data . UI Event Ċ import Ġio . un iflow . core . flow . data . UIState Ċ import Ġio . un iflow . core . logger . Uni Flow Logger Ċ import Ġio . un iflow . core . threading . launch On IO Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ Ċ /** Ċ Ġ* ĠUn id irectional ĠData ĠFlow Ċ Ġ* Ċ Ġ* Ġ@ author ĠAr na ud ĠG i ul ian i Ċ Ġ*/ Ċ interface ĠData Flow Ġ{ ĊĠĠĠ Ġval Ġcoroutine Scope : ĠCor outine Scope ĊĠĠĠ Ġval Ġscheduler : ĠAction Flow Scheduler ĊĠĠĠ Ġfun ĠgetCurrent State (): ĠUI State ĊĠĠĠ Ġsuspend Ġfun ĠonError ( error : ĠException , Ġcurrent State : ĠUI State , Ġflow : ĠAction Flow ) Ġ{ ĊĠĠĠĠĠĠĠ ĠUni Flow Logger . log Error (" Un caught Ġerror : Ġ$ error ", Ġerror ) ĊĠĠĠĠĠĠĠ Ġthrow Ġerror ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠData Flow . action ( on Action : ĠAction Function < UIState >) Ġ= ĊĠĠĠ Ġaction ( on Action ) Ġ{ Ġerror , Ġstate Ġ-> ĠonError ( error , Ġstate , Ġthis ) Ġ} Ċ Ċ fun ĠData Flow . action ( ĊĠĠĠ Ġon Action : ĠAction Function < UIState >, ĊĠĠĠ ĠonError : ĠAction Error Function Ċ ) Ġ= ĠAction Flow ( on Action , ĠonError ). also Ġ{ Ġcoroutine Scope . launch On IO Ġ{ Ġscheduler . addAction ( it ) Ġ} Ġ} Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠUI State > ĠData Flow . getCurrent State OrNull (): ĠT ? Ġ{ ĊĠĠĠ Ġval Ġcurrent State Ġ= ĠgetCurrent State () ĊĠĠĠ Ġreturn Ġif Ġ( currentState Ġis ĠT ) Ġcurrent State Ġelse Ġnull Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠUI State > ĠData Flow . action On ( no inline Ġon Action : ĠAction Function < T >): ĠAction Flow Ġ{ ĊĠĠĠ Ġreturn Ġaction On ( on Action ) Ġ{ Ġerror , Ġstate Ġ-> ĠonError ( error , Ġstate ) Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠUI State > ĠData Flow . action On ( no inline Ġon Action : ĠAction Function < T >, ĊĠĠĠ Ġno inline ĠonError : ĠAction Error Function ): ĠAction Flow Ġ{ ĊĠĠĠ Ġval Ġcurrent State Ġ= ĠgetCurrent State () ĊĠĠĠ Ġreturn Ġif Ġ( currentState Ġis ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= ĠAction Flow ( on Action Ġas ĠAction Function < UIState >, ĠonError ) ĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch On IO Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscheduler . addAction ( action ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaction ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġaction Ġ{ Ġsend Event Ġ{ ĠUI Event . Bad Or Wrong State ( currentState ) Ġ} Ġ} ĊĠĠĠ Ġ} Ċ } Ċ