package Ġcom . m ichael bu k ach i . real mk or outines Ċ Ċ import Ġio . realm .* Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . channels . await Close Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . callback Flow Ċ import Ġkotlinx . coroutines . suspend C ancellable Coroutine Ċ import Ġkotlin . coroutines . resume Ċ import Ġkotlin . coroutines . resume With Exception Ċ Ċ class ĠF rozen Exception Ġ: ĠException (" Only Ġnon Ġfrozen Ġrealm Ġobjects Ġcan Ġbe Ġawait ed ") Ċ Ċ private Ġsuspend Ġfun Ġ< T Ġ: ĠRealm Object , ĠS Ġ: ĠRealm Query < T >> ĠfindAll Await ( query : ĠS ): ĠRealm Results < T > Ġ= ĊĠĠĠĠĠĠĠ Ġsuspend C ancellable Coroutine Ġ{ Ġcontinuation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠRealm ChangeListener < Realm Results < T >> Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( continu ation . isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġquery . findAll Async () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( results . is Frozen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠF rozen Exception () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults . add ChangeListener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . invoke On Cancellation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults . remove ChangeListener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ private Ġsuspend Ġfun Ġ< T Ġ: ĠRealm Object , ĠS Ġ: ĠRealm Query < T >> Ġfind First Await ( query : ĠS ): ĠT ? Ġ= ĊĠĠĠĠĠĠĠ Ġsuspend C ancellable Coroutine Ġ{ Ġcontinuation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠRealm ChangeListener Ġ{ Ġt : ĠT ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( continu ation . isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġquery . findFirst Async () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . is Frozen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠF rozen Exception () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ChangeListener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . invoke On Cancellation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . remove ChangeListener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ private Ġsuspend Ġfun Ġ< T Ġ: ĠRealm Object , ĠS Ġ: ĠRealm Query < T >> ĠfindAll Await Safe ( query : ĠS ): ĠList < T > Ġ= ĊĠĠĠĠĠĠĠ Ġsuspend C ancellable Coroutine Ġ{ Ġcontinuation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrealm Ġ= Ġquery . realm ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠRealm ChangeListener < Realm Results < T >> Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( continu ation . isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t . is Managed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( realm . copyFrom Realm ( t )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġquery . findAll Async () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( results . is Frozen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠF rozen Exception () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults . add ChangeListener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . invoke On Cancellation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults . remove ChangeListener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ private Ġsuspend Ġfun Ġ< T Ġ: ĠRealm Object , ĠS Ġ: ĠRealm Query < T >> Ġfind First Await Safe ( query : ĠS ): ĠT ? Ġ= ĊĠĠĠĠĠĠĠ Ġsuspend C ancellable Coroutine Ġ{ Ġcontinuation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrealm Ġ= Ġquery . realm ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠRealm ChangeListener Ġ{ Ġt : ĠT ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( continu ation . isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Managed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( realm . copyFrom Realm ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġquery . findFirst Async () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . is Frozen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠF rozen Exception () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ChangeListener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . invoke On Cancellation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . remove ChangeListener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ private Ġfun Ġ< T Ġ: ĠRealm Object , ĠS Ġ: ĠRealm Query < T >> Ġfind First Safe ( query : ĠS ): ĠT ? Ġ{ ĊĠĠĠ Ġval Ġrealm Ġ= Ġquery . realm ĊĠĠĠ Ġval Ġt Ġ= Ġquery . findFirst () ĊĠĠĠ Ġreturn Ġt ?. let Ġ{ Ġrealm . copyFrom Realm ( it ) Ġ} Ġ?: Ġt Ċ } Ċ Ċ private Ġfun Ġ< T Ġ: ĠRealm Object , ĠS Ġ: ĠRealm Query < T >> ĠfindAll Safe ( query : ĠS ): ĠList < T > Ġ{ ĊĠĠĠ Ġval Ġrealm Ġ= Ġquery . realm ĊĠĠĠ Ġval Ġt Ġ= Ġquery . findAll () ĊĠĠĠ Ġreturn Ġrealm . copyFrom Realm ( t ) Ċ } Ċ Ċ private Ġsuspend Ġfun Ġexecute Async ( realm : ĠRealm , Ġblock : Ġ( Realm ) Ġ-> ĠUnit ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġsuspend C ancellable Coroutine Ġ{ Ġcontinuation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrealm . execute Transaction Async ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġblock ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġcontinuation . resume ( Unit ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġcontinuation . resume With Exception ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊ Ċ @ Experimental Cor outines Api Ċ fun Ġ< S Ġ: ĠRealm Object > ĠRealm Query < S >. flow All (): ĠFlow < List < S >> Ġ= Ġcallback Flow Ġ{ ĊĠĠĠ Ġval Ġlistener Ġ= ĠRealm ChangeListener < Realm Results < S >> Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠ Ġoffer ( t ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġresults Ġ= ĠfindAll Async () ĊĠĠĠ Ġif Ġ( results . is Frozen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠF rozen Exception () ĊĠĠĠ Ġ} ĊĠĠĠ Ġresults . add ChangeListener ( listener ) ĊĠĠĠ Ġawait Close Ġ{ Ġresults . remove ChangeListener ( listener ) Ġ} Ċ } Ċ Ċ @ Experimental Cor outines Api Ċ fun Ġ< S Ġ: ĠRealm Object > ĠRealm Query < S >. flow All Safe (): ĠFlow < List < S >> Ġ= Ġcallback Flow Ġ{ ĊĠĠĠ Ġval Ġlistener Ġ= ĠRealm ChangeListener < Realm Results < S >> Ġ{ Ġt Ġ-> ĊĊĠĠĠĠĠĠĠ Ġif Ġ( t . is Managed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffer ( realm . copyFrom Realm ( t )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffer ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġresults Ġ= ĠfindAll Async () ĊĠĠĠ Ġif Ġ( results . is Frozen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠF rozen Exception () ĊĠĠĠ Ġ} ĊĠĠĠ Ġresults . add ChangeListener ( listener ) ĊĠĠĠ Ġawait Close Ġ{ Ġresults . remove ChangeListener ( listener ) Ġ} Ċ } Ċ Ċ suspend Ġfun Ġ< S Ġ: ĠRealm Object > ĠRealm Query < S >. await () Ġ= ĠfindAll Await ( this ) Ċ Ċ suspend Ġfun Ġ< S Ġ: ĠRealm Object > ĠRealm Query < S >. await First () Ġ= Ġfind First Await ( this ) Ċ Ċ suspend Ġfun Ġ< S Ġ: ĠRealm Object > ĠRealm Query < S >. saf ely Await All () Ġ= ĠfindAll Await Safe ( this ) Ċ Ċ suspend Ġfun Ġ< S Ġ: ĠRealm Object > ĠRealm Query < S >. saf ley Await First () Ġ= Ġfind First Await Safe ( this ) Ċ Ċ fun Ġ< S Ġ: ĠRealm Object > ĠRealm Query < S >. all Safe () Ġ= ĠfindAll Safe ( this ) Ċ Ċ fun Ġ< S Ġ: ĠRealm Object > ĠRealm Query < S >. first Safe () Ġ= Ġfind First Safe ( this ) Ċ Ċ suspend Ġfun ĠRealm . transact Await ( block : Ġ( Realm ) Ġ-> ĠUnit ) Ġ= Ġexecute Async ( this , Ġblock )