package Ġcom . cr az yle g end . database . coroutines Ċ Ċ import Ġandroidx . lifecycle .* Ċ import Ġcom . cr az yle g end . coroutines .* Ċ import Ġcom . cr az yle g end . database .* Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlin . coroutines . Coroutine Context ĊĊ Ċ /** Ċ Ġ* ĠCreated Ġby Ġh rist ij an Ġon Ġ 1 0 / 2 5 / 1 9 Ġto Ġlong Ġlive Ġand Ġpro sper Ġ! Ċ Ġ*/ ĊĊ Ċ inline Ġfun Ġ< T > ĠViewModel . make DB Call LiveData ( cross inline Ġapi Call : Ġsuspend Ġ() Ġ-> ĠT ): ĠLive Data < DB Result < T >> Ġ{ ĊĠĠĠ Ġreturn Ġlive Data ( viewModel Scope . coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġemit ( DB Result . Query ing ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribe DB Call ( api Call . invoke ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( DB Result . DB Error ( t )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ inline Ġfun Ġ< T > ĠViewModel . make DB Call LiveData ( medi ator LiveData : ĠMed iator LiveData < DB Result < T >>, Ġcross inline Ġapi Call : Ġsuspend Ġ() Ġ-> ĠT ) Ġ{ ĊĠĠĠ Ġval Ġld : ĠLive Data < DB Result < T >> Ġ= Ġlive Data ( viewModel Scope . coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġemit ( DB Result . Query ing ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribe DB Call ( api Call . invoke ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( DB Result . DB Error ( t )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġmedi ator LiveData . add Source ( ld ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmedi ator LiveData . post Value ( it ) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ suspend Ġfun Ġ< T > ĠLive Data Scope < DB Result < T >> . subscribe DB Call ( res : ĠT ) Ġ{ ĊĠĠĠ Ġemit ( DB Result . Success ( res )) Ċ } ĊĊ Ċ /** Ċ Ġ* Ċ Ġ* Ġ@ receiver ĠCor outine Context Ċ Ġ* Ġ@ param Ġapi Call ĠS uspend Function 0 < T > Ċ Ġ* Ġ@ return ĠLive Data < DB Result < T >> Ċ Ġ*/ Ċ inline Ġfun Ġ< T > ĠCor outine Context . make DB Call LiveData ( cross inline Ġapi Call : Ġsuspend Ġ() Ġ-> ĠT ): ĠLive Data < DB Result < T >> Ġ{ ĊĠĠĠ Ġreturn Ġlive Data ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġemit ( DB Result . Query ing ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribe DB Call ( api Call . invoke ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( DB Result . DB Error ( t )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ċ Ġ* Ġ@ receiver ĠCor outine Context Ċ Ġ* Ġ@ param Ġmedi ator LiveData ĠMed iator LiveData < DB Result < T >> Ċ Ġ* Ġ@ param Ġapi Call ĠS uspend Function 0 < T > Ċ Ġ*/ Ċ inline Ġfun Ġ< T > ĠCor outine Context . make DB Call LiveData ( medi ator LiveData : ĠMed iator LiveData < DB Result < T >>, Ġcross inline Ġapi Call : Ġsuspend Ġ() Ġ-> ĠT ) Ġ{ ĊĠĠĠ Ġval Ġld : ĠLive Data < DB Result < T >> Ġ= Ġlive Data ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġemit ( DB Result . Query ing ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribe DB Call ( api Call . invoke ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( DB Result . DB Error ( t )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġmedi ator LiveData . add Source ( ld ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmedi ator LiveData . post Value ( it ) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ // flow Ċ Ċ inline Ġfun Ġ< T > ĠCor outine Scope . make DB Call List Flow ( ĊĠĠĠĠĠĠĠ Ġdb Result : ĠMutable LiveData < DB Result < T >>, ĊĠĠĠĠĠĠĠ Ġinclude Empty Data : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġcross inline Ġon Flow : ĠFlow < T > ?. () Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠĠĠ Ġcross inline Ġdb Call : Ġsuspend Ġ() Ġ-> ĠFlow < T >? ): ĠJob Ġ{ ĊĠĠĠ Ġdb Result . query ing Post () ĊĊĠĠĠ Ġreturn Ġlaunch ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġdb Call () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . on Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ?. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . subscribe List Post ( it , Ġinclude Empty Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . call Error Post ( t ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< T > ĠCor outine Scope . make DB Call Flow ( ĊĠĠĠĠĠĠĠ Ġquery Model : ĠFlow < T > ?, ĊĠĠĠĠĠĠĠ Ġdb Result : ĠMutable LiveData < DB Result < T >>, ĊĠĠĠĠĠĠĠ Ġinclude Empty Data : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġcross inline Ġon Flow : ĠFlow < T > ?. () Ġ-> ĠUnit Ġ= Ġ{} Ċ Ċ ): ĠJob Ġ{ ĊĠĠĠ Ġdb Result . query ing Post () ĊĠĠĠ Ġreturn Ġlaunch ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Model . on Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Model ?. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . subscribe Post ( it , Ġinclude Empty Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . call Error Post ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< T > ĠCor outine Scope . make DB Call List Flow ( ĊĠĠĠĠĠĠĠ Ġquery Model : ĠFlow < T > ?, ĊĠĠĠĠĠĠĠ Ġdb Result : ĠMutable LiveData < DB Result < T >>, ĊĠĠĠĠĠĠĠ Ġinclude Empty Data : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġcross inline Ġon Flow : ĠFlow < T > ?. () Ġ-> ĠUnit Ġ= Ġ{} Ċ ): ĠJob Ġ{ ĊĠĠĠ Ġdb Result . query ing Post () ĊĠĠĠ Ġreturn Ġlaunch ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Model . on Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Model ?. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . subscribe List Post ( it , Ġinclude Empty Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . call Error Post ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ Ċ inline Ġfun Ġ< T > ĠViewModel . make DB Call Flow ( ĊĠĠĠĠĠĠĠ Ġdb Result : ĠMutable LiveData < DB Result < T >>, ĊĠĠĠĠĠĠĠ Ġinclude Empty Data : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġcross inline Ġon Flow : ĠFlow < T > ?. () Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠĠĠ Ġcross inline Ġdb Call : Ġsuspend Ġ() Ġ-> ĠFlow < T >? ): ĠJob Ġ{ ĊĠĠĠ Ġdb Result . query ing Post () ĊĠĠĠ Ġreturn ĠviewModel IO Coroutine Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow Ġ= Ġdb Call () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow . on Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow ?. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . subscribe Post ( it , Ġinclude Empty Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . call Error Post ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ inline Ġfun Ġ< T > ĠViewModel . make DB Call List Flow ( ĊĠĠĠĠĠĠĠ Ġdb Result : ĠMutable LiveData < DB Result < T >>, ĊĠĠĠĠĠĠĠ Ġinclude Empty Data : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġcross inline Ġon Flow : ĠFlow < T > ?. () Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠĠĠ Ġcross inline Ġdb Call : Ġsuspend Ġ() Ġ-> ĠFlow < T >? ): ĠJob Ġ{ ĊĠĠĠ Ġdb Result . query ing Post () ĊĠĠĠ Ġreturn ĠviewModel IO Coroutine Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow Ġ= Ġdb Call () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow . on Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow ?. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . subscribe List Post ( it , Ġinclude Empty Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . call Error Post ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ inline Ġfun Ġ< T > ĠCor outine Scope . make DB Call Async ( ĊĠĠĠĠĠĠĠ Ġdb Result : ĠMutable LiveData < DB Result < T >>, ĊĠĠĠĠĠĠĠ Ġinclude Empty Data : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġcross inline Ġdb Call : Ġsuspend Ġ() Ġ-> ĠT ?): ĠJob Ġ{ ĊĠĠĠ Ġreturn Ġlaunch ( main Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsupervisor Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . query ing () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġasync ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Call () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . subscribe ( task . await (), Ġinclude Empty Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . call Error ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ inline Ġfun Ġ< T > ĠCor outine Scope . make DB Call List Async ( ĊĠĠĠĠĠĠĠ Ġdb Result : ĠMutable LiveData < DB Result < T >>, ĊĠĠĠĠĠĠĠ Ġinclude Empty Data : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġcross inline Ġdb Call : Ġsuspend Ġ() Ġ-> ĠT ?): ĠJob Ġ{ ĊĠĠĠ Ġreturn Ġlaunch ( main Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsupervisor Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . query ing () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġasync ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Call () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . subscribe List ( task . await (), Ġinclude Empty Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . call Error ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ inline Ġfun Ġ< T > ĠAndroid ViewModel . make DB Call List Async ( ĊĠĠĠĠĠĠĠ Ġdb Result : ĠMutable LiveData < DB Result < T >>, ĊĠĠĠĠĠĠĠ Ġinclude Empty Data : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġcross inline Ġdb Call : Ġsuspend Ġ() Ġ-> ĠT ?): ĠJob Ġ{ ĊĠĠĠ Ġreturn ĠviewModel Scope . launch ( main Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsupervisor Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . query ing () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġasync ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Call () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . subscribe List ( task . await (), Ġinclude Empty Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . call Error ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ inline Ġfun Ġ< T > ĠAndroid ViewModel . make DB Call Async ( ĊĠĠĠĠĠĠĠ Ġdb Result : ĠMutable LiveData < DB Result < T >>, ĊĠĠĠĠĠĠĠ Ġinclude Empty Data : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġcross inline Ġdb Call : Ġsuspend Ġ() Ġ-> ĠT ?): ĠJob Ġ{ ĊĠĠĠ Ġreturn ĠviewModel Scope . launch ( main Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsupervisor Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . query ing () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġasync ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Call () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . subscribe ( task . await (), Ġinclude Empty Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . call Error ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun Ġ< T > ĠCor outine Scope . make DB Call List Async ( ĊĠĠĠĠĠĠĠ Ġquery Model : ĠT ?, ĊĠĠĠĠĠĠĠ Ġdb Result : ĠMutable LiveData < DB Result < T >>, ĊĠĠĠĠĠĠĠ Ġinclude Empty Data : ĠBoolean Ġ= Ġtrue Ċ ): ĠJob Ġ{ ĊĠĠĠ Ġreturn Ġlaunch ( main Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsupervisor Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . query ing () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġasync ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Model ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . subscribe List ( task . await (), Ġinclude Empty Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . call Error ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun Ġ< T > ĠCor outine Scope . make DB Call Async ( ĊĠĠĠĠĠĠĠ Ġquery Model : ĠT ?, ĊĠĠĠĠĠĠĠ Ġdb Result : ĠMutable LiveData < DB Result < T >>, ĊĠĠĠĠĠĠĠ Ġinclude Empty Data : ĠBoolean Ġ= Ġfalse Ċ ): ĠJob Ġ{ ĊĊĠĠĠ Ġreturn Ġlaunch ( main Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsupervisor Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . query ing () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġasync ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Model ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . subscribe ( task . await (), Ġinclude Empty Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . call Error ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ suspend Ġinline Ġfun Ġ< T > Ġdb Call List ( ĊĠĠĠĠĠĠĠ Ġinclude Empty Data : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġcross inline Ġdb Call : Ġsuspend Ġ() Ġ-> ĠT ?): ĠDB Result < T > Ġ{ ĊĊĠĠĠ Ġreturn Ġwith IO Context Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Subscribe List ( db Call (), Ġinclude Empty Data ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Main Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Error ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġinline Ġfun Ġ< T > Ġdb Call ( cross inline Ġdb Call : Ġsuspend Ġ() Ġ-> ĠT ?): ĠDB Result < T > Ġ{ ĊĠĠĠ Ġreturn Ġwith IO Context Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Subscribe ( db Call ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Main Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Error ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun Ġ< T > ĠCor outine Scope . make DB Call ( ĊĠĠĠĠĠĠĠ Ġquery Model : ĠT ?, ĊĠĠĠĠĠĠĠ Ġdb Result : ĠMutable LiveData < DB Result < T >>, ĊĠĠĠĠĠĠĠ Ġinclude Empty Data : ĠBoolean Ġ= Ġfalse Ċ ): ĠJob Ġ{ ĊĠĠĠ Ġdb Result . query ing Post () ĊĠĠĠ Ġreturn Ġlaunch ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . subscribe Post ( query Model , Ġinclude Empty Data ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . call Error Post ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun Ġ< T > ĠCor outine Scope . make DB Call List ( ĊĠĠĠĠĠĠĠ Ġquery Model : ĠT ?, ĊĠĠĠĠĠĠĠ Ġdb Result : ĠMutable LiveData < DB Result < T >>, ĊĠĠĠĠĠĠĠ Ġinclude Empty Data : ĠBoolean Ġ= Ġtrue Ċ ): ĠJob Ġ{ ĊĠĠĠ Ġdb Result . query ing Post () ĊĠĠĠ Ġreturn Ġlaunch ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . subscribe List Post ( query Model , Ġinclude Empty Data ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . call Error Post ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ Ċ fun Ġ< T > ĠViewModel . make DB Call ( ĊĠĠĠĠĠĠĠ Ġdb Result : ĠMutable LiveData < DB Result < T >>, ĊĠĠĠĠĠĠĠ Ġinclude Empty Data : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġdb Call : Ġsuspend Ġ() Ġ-> ĠT ?): ĠJob Ġ{ ĊĠĠĠ Ġdb Result . query ing Post () ĊĠĠĠ Ġreturn ĠviewModel IO Coroutine Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . subscribe Post ( db Call (), Ġinclude Empty Data ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . call Error Post ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun Ġ< T > ĠViewModel . make DB Call List ( ĊĠĠĠĠĠĠĠ Ġdb Result : ĠMutable LiveData < DB Result < T >>, ĊĠĠĠĠĠĠĠ Ġinclude Empty Data : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġdb Call : Ġsuspend Ġ() Ġ-> ĠT ?): ĠJob Ġ{ ĊĠĠĠ Ġdb Result . query ing Post () ĊĠĠĠ Ġreturn ĠviewModel IO Coroutine Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . subscribe List Post ( db Call (), Ġinclude Empty Data ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . call Error Post ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun ĠViewModel . make DB Call ( ĊĠĠĠĠĠĠĠ Ġon Call Executed : Ġ() Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠĠĠ Ġdb Call : Ġsuspend Ġ() Ġ-> ĠUnit ): ĠJob Ġ{ ĊĠĠĠ Ġreturn ĠviewModel IO Coroutine Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Call () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Main Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Call Executed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠViewModel . make DB Call ( ĊĠĠĠĠĠĠĠ Ġon Call Executed : Ġ() Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠĠĠ ĠonError Action : Ġ( throwable : ĠThrowable ) Ġ-> ĠUnit Ġ= Ġ{ Ġ_ Ġ-> Ġ}, ĊĠĠĠĠĠĠĠ Ġdb Call : Ġsuspend Ġ() Ġ-> ĠUnit ): ĠJob Ġ{ ĊĠĠĠ Ġreturn ĠviewModel IO Coroutine Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Call () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError Action ( t ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Main Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Call Executed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun Ġ< T > ĠCor outine Scope . make DB Call ( ĊĠĠĠĠĠĠĠ Ġdb Result : ĠMutable LiveData < DB Result < T >>, ĊĠĠĠĠĠĠĠ Ġinclude Empty Data : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġdb Call : Ġsuspend Ġ() Ġ-> ĠT ?): ĠJob Ġ{ ĊĠĠĠ Ġdb Result . query ing Post () ĊĊĠĠĠ Ġreturn Ġlaunch ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . subscribe Post ( db Call (), Ġinclude Empty Data ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . call Error Post ( t ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun Ġ< T > ĠCor outine Scope . make DB Call List ( ĊĠĠĠĠĠĠĠ Ġdb Result : ĠMutable LiveData < DB Result < T >>, ĊĠĠĠĠĠĠĠ Ġinclude Empty Data : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġdb Call : Ġsuspend Ġ() Ġ-> ĠT ?): ĠJob Ġ{ ĊĠĠĠ Ġdb Result . query ing Post () ĊĊĠĠĠ Ġreturn Ġlaunch ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . subscribe List Post ( db Call (), Ġinclude Empty Data ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Result . call Error Post ( t ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun ĠCor outine Scope . make DB Call ( ĊĠĠĠĠĠĠĠ Ġon Call Executed : Ġ() Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠĠĠ Ġdb Call : Ġsuspend Ġ() Ġ-> ĠUnit ): ĠJob Ġ{ ĊĊĠĠĠ Ġreturn Ġlaunch ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Call () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( main Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Call Executed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠCor outine Scope . make DB Call ( ĊĠĠĠĠĠĠĠ Ġon Call Executed : Ġ() Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠĠĠ ĠonError Action : Ġ( throwable : ĠThrowable ) Ġ-> ĠUnit Ġ= Ġ{ Ġ_ Ġ-> Ġ}, ĊĠĠĠĠĠĠĠ Ġdb Call : Ġsuspend Ġ() Ġ-> ĠUnit ): ĠJob Ġ{ ĊĠĠĠ Ġreturn Ġlaunch ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Call () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( main Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Action ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( main Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Call Executed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ // Ġno Ġwrappers Ġgetting Ġthe Ġresult Ġstraight Ġup Ċ fun Ġ< T > ĠViewModel . make DB Call ( ĊĠĠĠĠĠĠĠ Ġon Call Executed : Ġ() Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠĠĠ ĠonError Action : Ġ( throwable : ĠThrowable ) Ġ-> ĠUnit Ġ= Ġ{ Ġ_ Ġ-> Ġ}, ĊĠĠĠĠĠĠĠ Ġdb Call : Ġsuspend Ġ() Ġ-> ĠT , ĊĠĠĠĠĠĠĠ Ġon Called : Ġ( model : ĠT ) Ġ-> ĠUnit ): ĠJob Ġ{ ĊĠĠĠ Ġreturn ĠviewModel IO Coroutine Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġdb Call () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Main Coroutine Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Called ( call ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError Action ( t ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Main Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Call Executed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T > ĠCor outine Scope . make DB Call ( ĊĠĠĠĠĠĠĠ Ġon Call Executed : Ġ() Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠĠĠ ĠonError Action : Ġ( throwable : ĠThrowable ) Ġ-> ĠUnit Ġ= Ġ{ Ġ_ Ġ-> Ġ}, ĊĠĠĠĠĠĠĠ Ġdb Call : Ġsuspend Ġ() Ġ-> ĠT , ĊĠĠĠĠĠĠĠ Ġon Called : Ġ( model : ĠT ) Ġ-> ĠUnit ): ĠJob Ġ{ ĊĠĠĠ Ġreturn Ġlaunch ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġdb Call () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( main Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Called ( call ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError Action ( t ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( main Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Call Executed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ // Ġno Ġwrappers Ġgetting Ġthe Ġresult Ġstraight Ġup Ġfor Ġflow Ċ Ċ fun Ġ< T > ĠViewModel . make DB Call Flow ( ĊĠĠĠĠĠĠĠ Ġon Call Executed : Ġ() Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠĠĠ ĠonError Action : Ġ( throwable : ĠThrowable ) Ġ-> ĠUnit Ġ= Ġ{ Ġ_ Ġ-> Ġ}, ĊĠĠĠĠĠĠĠ Ġdb Call : Ġsuspend Ġ() Ġ-> ĠFlow < T >, ĊĠĠĠĠĠĠĠ Ġon Called : Ġ( model : ĠT ) Ġ-> ĠUnit ): ĠJob Ġ{ ĊĠĠĠ Ġreturn ĠviewModel IO Coroutine Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġdb Call () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . collect Ġ{ Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Main Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Called ( model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError Action ( t ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Main Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Call Executed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T > ĠCor outine Scope . make DB Call Flow ( ĊĠĠĠĠĠĠĠ Ġon Call Executed : Ġ() Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠĠĠ ĠonError Action : Ġ( throwable : ĠThrowable ) Ġ-> ĠUnit Ġ= Ġ{ Ġ_ Ġ-> Ġ}, ĊĠĠĠĠĠĠĠ Ġdb Call : Ġsuspend Ġ() Ġ-> ĠFlow < T >, ĊĠĠĠĠĠĠĠ Ġon Called : Ġ( model : ĠT ) Ġ-> ĠUnit ): ĠJob Ġ{ ĊĠĠĠ Ġreturn Ġlaunch ( io Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġdb Call () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Main Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Called ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError Action ( t ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( main Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Call Executed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ