package Ġkim . je ong hy eon . sample . view model Ċ Ċ import Ġkim . je ong hy eon . client .* Ċ import Ġkim . je ong hy eon . sample . api . Sample Api Ċ import Ġkim . je ong hy eon . sample . di . service Locator Ċ import Ġkim . je ong hy eon . type . Status Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . flow .* ĊĊ Ċ /** Ċ Ġ* ĠIf ĠA Ġis Ġchanged Ġby ĠB , Ġthe Ġcode Ġto Ġchange ĠA Ġis Ġlocated Ġon ĠB 's Ġdefinition . Ċ Ġ* Ġit 's Ġnot Ġreactive . Ċ Ġ* Ċ Ġ* ĠMer it Ċ Ġ* Ġ- Ġit 's Ġsimple Ċ Ġ* Ġ- Ġno Ġneed Ġto Ġknow Ġcomplicated Ġflows Ġcustom Ġoperators Ċ Ġ* Ċ Ġ* ĠDem er it Ċ Ġ* Ġ- Ġdifficult Ġto Ġknow Ġwhat Ġchange Ġthe Ġdata ( but Ġas Ġit 's Ġsimple , ĠI Ġfeel Ġit 's Ġnot Ġthat Ġdifficult Ġif Ġbusiness Ġlogic Ġis Ġnot Ġtoo Ġmuch Ġcomplicated ) Ċ Ġ*/ Ċ class ĠSearch ViewModel ( private Ġval Ġapi : ĠSample Api Ġ= Ġservice Locator . sample Api ) Ġ: ĠModel ViewModel () Ġ{ ĊĊĠĠĠ Ġ// todo Ġ[ K SA - 4 8 ] Ġsupport Ġlocalization Ġon Ġkotlin Ġside ĊĠĠĠ Ġoverride Ġval Ġtitle : ĠString Ġ= Ġ" Search " ĊĊĠĠĠ Ġval Ġlist Ġ= ĠviewModel Flow < List < String >>() ĊĠĠĠ Ġval Ġnew Word Ġ= ĠviewModel Flow < String >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġemit Ġstatus Ġwhen Ġerror Ġonly . Ġso , Ġwhen Ġtype Ġkeyword , Ġloading Ġui Ġdoesn 't Ġblock Ġuser Ġtyping . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġkeyword Status Ġ= ĠviewModel Flow < Status >() ĊĊĠĠĠ Ġoverride Ġval Ġstatus : ĠViewModel Flow < Status > Ġ= ĠviewModel Flow < Status >(). with Source ( keyword Status . filter Ġ{ Ġit . isError () Ġ}) ĊĊĠĠĠ Ġval Ġkeyword Ġ= ĠviewModel Flow < String >() ĊĊĠĠĠ Ġoverride Ġfun Ġon Init () Ġ{ ĊĠĠĠĠĠĠĠ Ġlist . load ( init Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapi . get Words () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġkeyword . collect On ViewModel Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . load De bounce ( 1 0 0 0 , Ġkeyword Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . get Words Of Keyword ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠonClick () Ġ{ ĊĠĠĠĠĠĠĠ Ġlist . load In Idle ( status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapi . add Word ( new Word . value OrNull ?: Ġerror (" input Ġword ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapi . get Words Of Keyword ( keyword . value OrNull ? :" ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠTODO Ġreactive Ġway . Ċ // class ĠReactive ViewModel 2 ( private Ġval Ġapi : ĠSample Api Ġ= Ġservice Locator . sample Api ) Ġ: ĠModel ViewModel () Ġ{ Ċ // Ċ // ĠĠĠ Ġ// todo Ġ[ K SA - 4 8 ] Ġsupport Ġlocalization Ġon Ġkotlin Ġside Ċ // ĠĠĠ Ġoverride Ġval Ġtitle : ĠString Ġ= Ġ" Reactive " Ċ // Ċ // ĠĠĠ Ġval Ġkeyword Ġby Ġadd Ġ{ ĠviewModel Flow < String >() Ġ} Ċ // ĠĠĠ Ġval Ġnew Word Ġby Ġadd Ġ{ ĠviewModel Flow < String >() Ġ} Ċ // ĠĠĠ Ġval Ġclick Ġby Ġadd Ġ{ ĠviewModel Flow < Unit >() Ġ} Ċ // Ċ // ĠĠĠ Ġval Ġlist Ġby Ġadd Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġmerge ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġinit Flow Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . get Words () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Data ( init Status ), Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġkeyword Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. de bounce ( 1 0 0 0 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Cancel Running Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . get Words Of Keyword ( it ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Data ( keyword Status ), Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġclick Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map In Idle Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . add Word ( new Word . value OrNull ?: Ġerror (" input Ġword ")) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . get Words Of Keyword ( keyword . value OrNull ? :" ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Data ( status ) Ċ // ĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġval Ġkeyword Status Ġby Ġadd Ġ{ ĠviewModel Flow < Status >() Ġ} Ċ // Ċ // ĠĠĠ Ġoverride Ġval Ġstatus : ĠMutable Shared Flow < Status > Ġby Ġadd Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġ// emit Ġstatus Ġwhen Ġerror Ġonly . Ġso , Ġwhen Ġtype Ġkeyword , Ġloading Ġui Ġdoesn 't Ġblock Ġuser Ġtyping . Ċ // ĠĠĠĠĠĠĠ Ġkeyword Status . filter Ġ{ Ġit . isError () Ġ}. to Status () Ċ // ĠĠĠ Ġ} Ċ // Ċ // Ċ //} Ċ Ċ /** Ċ Ġ* ĠTODO Ġarrange Ġthe Ġcomment Ċ Ġ* ĠEverything ( event , Ġuser Ġaction , Ġdata ) Ġis Ġstream . Ċ Ġ* Ċ Ġ* Ġone Ġstream Ġmake Ġother Ġstreams . Ġand Ġmultiple Ġstreams Ġbecome Ġone Ġstream Ġas Ġwell . Ġit 's Ġlike Ġcircuit Ċ Ġ* Ċ Ġ* Ġthis Ġshows Ġreactive Ġway Ċ Ġ* Ċ Ġ* ĠMer it Ċ Ġ* Ġ- Ġit Ġshows Ġdependencies Ġbetween Ġstream Ġclearly . Ċ Ġ* ĠĠ Ġif ĠA Ġis Ġchanged Ġby ĠB , ĠB Ġdoesn 't Ġneed Ġto Ġknow Ġwhat Ġis Ġaffected Ġby ĠB . Ġonly ĠA Ġhave Ġto Ġknow ĠA Ġis Ġchanged Ġby ĠB Ċ Ġ* ĠĠ Ġso , Ġall Ġthe Ġcode , Ġwhich Ġchange ĠA , Ġshould Ġbe Ġnear Ġto ĠA 's Ġdefinition Ċ Ġ* Ċ Ġ* ĠDem er it Ċ Ġ* Ġ- Ġvarious Ġoperator Ġis Ġrequired Ġto Ġimplement Ġstream Ċ Ġ* ĠĠ Ġ( I Ġcreated Ġcustom Ġoperator , Ġit Ġmay Ġget Ġsimpler Ġin Ġthe Ġfuture . Ġbut Ġcurrently Ġit Ġlooks Ġcomplicated Ġwithout Ġknowledge ) Ċ Ġ* Ċ Ġ* ĠI Ġsuggest Ġto Ġcompare Ġthe Ġ[ No Reactive ViewModel ] Ġwhich Ġis Ġnot Ġreactive Ġbut Ġsame Ġbusiness Ġlogic Ċ Ġ* Ġalso Ġrecommend Ġto Ġcompare Ġwith Ġ[ Api Db ViewModel ] Ġwhich Ġuse ĠRepository Ċ Ġ* Ċ Ġ* ĠO pin ion Ċ Ġ* Ġ- Ġto Ġsupport Ġvarious Ġuse Ġcase Ġrequires Ġcomplicated Ġcustom Ġflow Ġoperator . Ċ Ġ* Ġ- Ġso , Ġuse ĠFlow Ġoperator Ġonly Ġon Ġthe Ġcase Ġbelow , Ġotherwise , Ġuse Ġcoroutine Ġsuspend Ġfor Ġsing e Ġcall Ġlike Ġcalling Ġapi Ċ Ġ* ĠĠĠĠĠ Ġ- Ġchange able Ġdata Ġlike Ġdatabase Ċ Ġ* ĠĠĠĠĠ Ġ- Ġtransform ing Ġdata Ġby Ġmap Ġ{} Ċ Ġ* ĠĠĠĠĠ Ġ- Ġcombine Ġmultiple Ġflow Ċ Ġ*/ Ċ Ċ /** Ċ Ġ* Ġthis Ġflow Ġobserve Ġthe Ġbelow Ċ Ġ* ĠĠ 1 . Ġinput ting Ġkeyword Ġto Ġfilter Ċ Ġ* ĠĠ 2 . Ġclicking Ġ' add ' Ġbutton Ġafter Ġinput ting Ġnew Word Ċ Ġ* ĠĠ 3 . Ġinit Ċ Ġ* Ċ Ġ* Ġ Ġ[ to Data Flow ] Ġis Ġnot Ġreactive . ĠI Ġthink Ġthat Ġstatus Ġis Ġsubs idi ary Ġso , Ġneed Ġto Ġfocus Ġon Ġdata Ċ Ġ* ĠĠ Ġif Ġyou Ġwant Ġfully Ġreactive , Ċ Ġ* ĠĠ Ġmake Ġ 3 Ġfield Ġof ĠResource Flow < List < String >> Ġfor Ġ( init , Ġkeyword , Ġclick ). Ċ Ġ* ĠĠ Ġand Ġlet Ġeach Ġstatus ( init Status , Ġfail , Ġstatus ) Ġto Ġobserve Ġeach Ġlist . Ċ Ġ* Ċ Ġ* ĠĠ Ġbefore Ġlist Ġis Ġloaded , Ġui Ġis Ġshown Ġwith Ġempty Ġdata Ċ Ġ* ĠĠ Ġbecause , Ġ[ init Status ] Ġis Ġnull Ġat Ġfirst Ġtime . Ċ Ġ* ĠĠ Ġand Ġthen Ġ[ list ] Ġget Ġactive Ġby Ġ[ collect ] Ġafter Ġthat , Ġinit Flow 's Ġapi Ġcall Ġworking . Ċ Ġ* ĠĠ Ġin Ġorder Ġnot Ġto Ġshow Ġui Ġbefore Ġlist Ġis Ġloaded , Ġinit Flow 's Ġapi Ġcall Ġshould Ġbe Ġactive Ġbefore Ġlist Ġactive . Ċ Ġ* ĠĠ Ġso , Ġthis Ġshould Ġbe Ġhandled Ġby Ġdifferent Ġapproach . Ċ Ġ* ĠĠ Ġbut , Ġthis ĠviewModel 's Ġpurpose Ġis Ġjust Ġshowing Ġreactive Ġway . Ġso Ġkeep Ġthis Ġway . Ċ Ġ* Ċ Ġ* ĠĠ Ġthis Ġsample Ġshows Ġcomplicated ĠFlow Ġuse Ġcase . Ċ Ġ* ĠĠ Ġthe Ġreason Ġnot Ġto Ġuse ĠRepository , Ġis Ġthat Ġif Ġuse Ġrepository , Ġit 's Ġvery Ġsimple , Ġso Ġcan 't Ġuse Ġmuch Ġoperators . Ċ Ġ* ĠĠ Ġyou Ġcan Ġrefer Ġ[ Api Db ViewModel ] Ġfor Ġrepository Ġuse Ġcase Ċ Ġ* Ċ Ġ*/