package Ġnet . app tr onic . core . entity . conditions Ċ Ċ import Ġkotlinx . coroutines . Comp letable Deferred Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ import Ġnet . app tr onic . core . base . collections . queue Of Ċ import Ġnet . app tr onic . core . base . subject . Value Holder Ċ import Ġnet . app tr onic . core . context . child Context Ċ import Ġnet . app tr onic . core . context . terminate Ċ import Ġnet . app tr onic . core . entity . Entity Ċ Ċ fun Ġ< T > ĠEntity < T >. create Condition (): ĠCondition < T > Ġ{ ĊĠĠĠ Ġreturn ĠCondition ( this ) Ċ } Ċ Ċ class ĠCondition < T > Ġinternal Ġconstructor ( val Ġsource : ĠEntity < T >) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġawait Context Ġ= Ġsource . context . child Context () ĊĠĠĠ Ġprivate Ġval Ġqueue Ġ= Ġqueue Of < T >() ĊĠĠĠ Ġprivate Ġval ĠisSet Deferred Ġ= ĠComp letable Deferred < Unit >() ĊĠĠĠ Ġprivate Ġvar Ġcurrent : ĠValue Holder < T >? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsource . subscribe ( await Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisSet Deferred . complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= ĠValue Holder (( it )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhave Any (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġawait Any () Ġ{ ĊĠĠĠĠĠĠĠ ĠisSet Deferred . await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcurrent (): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent ?. value Ġ?: Ġthrow ĠIllegalStateException (" Nothing Ġyet Ġreceived ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġnext (): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġqueue . take Await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġawait Matching ( match Condition : Ġ( T ) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġqueue . take Await () ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ(! match Condition ( next )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġawait Matching Suspend ( match Condition : Ġsuspend ĠCor outine Scope .( T ) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġqueue . take Await () ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( coroutine Scope Ġ{ Ġ! match Condition ( next ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġnext Matching ( match Condition : Ġ( T ) Ġ-> ĠBoolean ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnext : ĠT ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ= Ġqueue . take Await () ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ(! match Condition ( next )) ĊĠĠĠĠĠĠĠ Ġreturn Ġnext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġnext Matching Suspend ( match Condition : Ġsuspend ĠCor outine Scope .( T ) Ġ-> ĠBoolean ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnext : ĠT ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ= Ġqueue . take Await () ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( coroutine Scope Ġ{ Ġ! match Condition ( next ) Ġ}) ĊĠĠĠĠĠĠĠ Ġreturn Ġnext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠĠĠ Ġawait Context . terminate () ĊĠĠĠ Ġ} Ċ Ċ }