/* Ċ Ġ* Ġ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 Ġ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 . Ċ Ġ*/ Ċ package Ġio . un iflow . android x . flow Ċ Ċ import Ġandroidx . annotation . Call Super Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġio . un iflow . core . dispatcher . Uni Flow Dispatcher Ċ import Ġio . un iflow . core . flow .* Ċ import Ġio . un iflow . core . flow . data . Event Ċ import Ġio . un iflow . core . flow . data . UI Event Ċ import Ġio . un iflow . core . flow . data . UIState Ċ import Ġio . un iflow . core . threading . on Main Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . channels . Channel Ċ Ċ /** Ċ Ġ* ĠAndroid Ġimplementation Ġof Ġ[ Data Flow ]. Ċ Ġ* ĠThis Ġis Ġalso Ġa Ġ[ ViewModel ]. Ċ Ġ* ĠIts Ġ[ coroutine Scope ] Ġequals Ġ[ viewModel Scope ]. Ċ Ġ* Ċ Ġ* Ġ@ param Ġdefault Capacity Ċ Ġ* ĠThe Ġdefault Ġcapacity Ġof Ġthis Ġ` Data Flow `. Ċ Ġ* ĠAny Ġstate Ġactions Ġdis patched Ġusing Ġ[ setState ] Ġwill Ġbe Ġadded Ġto Ġthe Ġbuffer Ġunless Ġit 's Ġfull . Ċ Ġ* ĠDefaults Ġto Ġ[ Channel . BUFFER ED ]. Ċ Ġ* Ċ Ġ* Ġ@ param Ġdefault Dispatcher ĠThe Ġdefault Ġ[ Coroutine Dispatcher ] Ġon Ġwhich Ġstate Ġactions Ġare Ġdis patched . Ċ Ġ* ĠDefaults Ġto Ġ[ Dispatch ers . IO ]. Ċ Ġ*/ Ċ abstract Ġclass ĠAndroid Data Flow ( ĊĠĠĠ Ġdefault State : ĠUI State Ġ= ĠUI State . Empty , ĊĠĠĠ Ġdefault Capacity : ĠInt Ġ= ĠChannel . BUFFER ED , ĊĠĠĠ Ġdefault Dispatcher : ĠCor outine Dispatcher Ġ= ĠUni Flow Dispatcher . dispatcher . io () Ċ ) Ġ: ĠViewModel (), ĊĠĠĠ ĠData Flow , ĊĠĠĠ ĠUI Data Publisher Ġ{ ĊĊĠĠĠ Ġfinal Ġoverride Ġval Ġcoroutine Scope Ġ= ĠviewModel Scope ĊĊĠĠĠ Ġprivate Ġval Ġui DataManager Ġby Ġlazy Ġ{ ĠUI DataManager ( this , Ġdefault State ) Ġ} ĊĠĠĠ Ġfinal Ġoverride Ġval Ġscheduler Ġ= ĊĠĠĠĠĠĠĠ ĠAction Flow Scheduler ( ui DataManager , Ġcoroutine Scope , Ġdefault Dispatcher , Ġdefault Capacity ) ĊĊĠĠĠ Ġprivate Ġval Ġ_ states Ġ= ĠMutable LiveData < UIState >() ĊĠĠĠ Ġval Ġstates : ĠLive Data < UIState > Ġ= Ġ_ states ĊĊĠĠĠ Ġprivate Ġval Ġ_ events Ġ= ĠMutable LiveData < Event < UI Event >>() ĊĠĠĠ Ġval Ġevents : ĠLive Data < Event < UI Event >> Ġ= Ġ_ events ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġaction Ġ{ ĠsetState Ġ{ Ġdefault State Ġ} Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun ĠgetCurrent State () Ġ= Ġui DataManager . currentState ĊĊĠĠĠ Ġfinal Ġoverride Ġsuspend Ġfun Ġpublish State ( state : ĠUI State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Main ( immediate Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ states . value Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġsuspend Ġfun Ġsend Event ( event : ĠUI Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Main ( immediate Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ events . value Ġ= ĠEvent ( event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġscheduler . close () ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠ Ġ} Ċ } Ċ