package Ġjust 4 fun . kot link it . async Ċ Ċ import Ġjust 4 fun . kot link it . async . Result Task State . CANCEL LED Ċ import Ġjust 4 fun . kot link it . async . Result Task State . RUNNING Ċ import Ġjust 4 fun . kot link it . async . Result Task State . EXECUT ED Ċ import Ġjust 4 fun . kot link it . Result Ċ import Ġjust 4 fun . kot link it . S af ely Ċ import Ġjava . util . concurrent . Cancellation Exception Ċ import Ġjava . util . concurrent . Executor Ċ import Ġkotlin . concurrent . thread ĊĊ Ċ /* ĠAsync Result Ġ*/ Ċ Ċ /** ĠProvides Ġinformation Ġabout Ġwhether Ġthe Ġtask Ġin Ġwhich Ġexecution Ġtakes Ġplace Ġis Ġcancelled . Ġ*/ Ċ interface ĠTask Context Ġ{ Ċ ĉ /** ĠProvides Ġinformation Ġabout Ġwhether Ġthe Ġtask Ġin Ġwhich Ġexecution Ġtakes Ġplace Ġis Ġcancelled . Ġ*/ Ċ ĉ val Ġis Cancelled : ĠBoolean Ċ } Ċ Ċ /** ĠThe Ġ[ Result ] Ġwhich Ġmay Ġnot Ġbe Ġcurrently Ġavailable Ġbut Ġcan Ġbe Ġobtained Ġon Ġcompletion Ġof Ġsome Ġasync Ġexecution Ġvia Ġthe Ġ[ onComplete ] Ġcallback . Ċ Ġ*/ Ċ interface ĠAsync Result < T >: ĠTask Context Ġ{ Ċ ĉ /** ĠChecks Ġif Ġthe Ġresult Ġis Ġready . Ġ*/ Ċ ĉ val Ġis Complete : ĠBoolean ĊĉĊ ĉ /** ĠRe ceiv es Ġthe Ġresult Ġas Ġsoon Ġas Ġit 's Ġready Ġand Ġhandles Ġit Ġvia Ġthe Ġ[ reaction ]. ĠThere Ġcan Ġbe Ġmore Ġthan Ġone Ġreaction Ġwhich Ġform Ġthe Ġc ue ue . Ċĉ Ġ* ĠThe Ġ[ executor ] Ġdefines Ġwhich Ġthread Ġthe Ġ[ reaction ] Ġwill Ġrun Ġin . ĠIf Ġ` null `, Ġthe Ġ[ reaction ] Ġruns Ġin Ġthe Ġtask Ġexecution Ġthread . Ċĉ Ġ* Ġ[ pre ce de ] Ġplaces Ġthe Ġ[ reaction ] Ġon Ġthe Ġtop Ġof Ġthe Ġchain Ġof Ġre actions . Ċĉ Ġ*/ Ċ ĉ fun ĠonComplete ( executor : ĠExecutor ? Ġ= Ġnull , Ġprece de : ĠBoolean Ġ= Ġfalse , Ġreaction : Ġ( Result < T >) Ġ-> ĠUnit ): ĠAsync Result < T > ĊĉĊ ĉ /** ĠCancel s Ġthe Ġcurrent Ġtask Ġwith Ġthe Ġ[ cause ] Ġ*/ Ċ ĉ fun Ġcancel ( cause : ĠThrowable Ġ= ĠC ancellation Exception (), Ġinterrupt : ĠBoolean Ġ= Ġfalse ) Ġ= ĠUnit ĊĉĊ ĉ /** ĠCancel s Ġthe Ġcurrent Ġtask Ġwith Ġthe Ġ[ value ] Ġ*/ Ċ ĉ fun Ġcancel ( value : ĠT , Ġinterrupt : ĠBoolean Ġ= Ġfalse ) Ġ= ĠUnit Ċ } ĊĊ Ċ /** ĠCreates Ġcomplete Ġ[ AsyncResult ] Ġwith Ġthe Ġ[ result ] Ġ*/ Ċ class ĠReady AsyncResult < T >( private Ġval Ġresult : ĠResult < T >): ĠAsync Result < T > Ġ{ Ċ ĉ override Ġval Ġis Cancelled Ġ= Ġfalse Ċ ĉ override Ġval Ġis Complete Ġ= Ġtrue Ċ ĉ override Ġfun ĠonComplete ( executor : ĠExecutor ?, Ġprece de : ĠBoolean , Ġreaction : Ġ( Result < T >) Ġ-> ĠUnit ) Ġ= Ġapply Ġ{ Ġreaction ( result ) Ġ} Ċ } ĊĊĊĊ Ċ /* ĠResult Task Ġ*/ Ċ Ċ type alias ĠRe action < T > Ġ= Ġ( Result < T >) Ġ-> ĠUnit Ċ Ċ enum Ġclass ĠResult Task State Ġ{ ĠCRE ATED , ĠINIT ED , ĠRUN NING , ĠCANCEL LED , ĠEXEC UT ED Ġ} ĊĊ Ċ /** Ġ[ AsyncResult ] Ġwith Ġimplemented Ġ[ onComplete ] Ġmethod Ġ*/ Ċ abstract Ġclass ĠResult Task < T >: ĠAsync Result < T > Ġ{ Ċ ĉ var Ġstate : ĠResult Task State Ġ= ĠResult Task State . CREATED Ċĉ ĉ protected Ġset ( value ) Ġ= Ġrun Ġ{ Ġfield Ġ= Ġvalue Ġ} Ċĉ ĉ get () Ġ= Ġsynchronized ( lock ) Ġ{ Ġfield Ġ} Ċ ĉ var Ġresult : ĠResult < T >? Ġ= Ġnull Ċĉ ĉ protected Ġset ( value ) Ġ= Ġrun Ġ{ Ġfield Ġ= Ġvalue Ġ} Ċĉ ĉ get () Ġ= Ġsynchronized ( lock ) Ġ{ Ġfield Ġ} Ċ ĉ final Ġoverride Ġval Ġis Complete Ġget () Ġ= Ġsynchronized ( lock ) Ġ{ Ġstate Ġ> ĠRUN NING Ġ} Ċ ĉ final Ġoverride Ġval Ġis Cancelled Ġget () Ġ= Ġsynchronized ( lock ) Ġ{ Ġstate Ġ== ĠCANCEL LED Ġ} Ċ ĉ protected Ġvar Ġreaction : ĠRe action < T >? Ġ= Ġnull Ċ ĉ @ Suppress (" Le aking This ") Ġ@ Published Api Ġinternal Ġvar Ġlock : ĠAny Ġ= Ġthis ĊĉĊ ĉ inline Ġprotected Ġfun Ġ< R > Ġsynchronize ( code : Ġ() Ġ-> ĠR ): ĠR Ġ= Ġsynchronized ( lock ) Ġ{ Ġcode () Ġ} ĊĉĊ ĉ protected Ġopen Ġfun Ġcomplete ( res : ĠResult < T >, Ġcancelled : ĠBoolean Ġ= Ġfalse , Ġinterrupt : ĠBoolean Ġ= Ġfalse ): ĠUnit Ġ{ Ċĉ ĉ synchronized ( lock ) Ġ{ Ċĉĉ ĉ state Ġ= ĠEXEC UT ED Ċĉĉ ĉ result Ġ= Ġres Ċĉ ĉ } Ċĉ ĉ reaction ?. let Ġ{ ĠS af ely Ġ{ Ġit . invoke ( res ) Ġ} Ġ} Ċ ĉ } ĊĉĊĉĊ ĉ override Ġfun ĠonComplete ( executor : ĠExecutor ?, Ġprece de : ĠBoolean , Ġreaction : ĠRe action < T >): ĠResult Task < T > Ġ{ Ċĉ ĉ synchronized ( lock ) Ġ{ Ċĉĉ ĉ if Ġ( state Ġ> ĠRUN NING ) Ġreturn @ synchronized Ċĉĉ ĉ val Ġprev Reaction Ġ= Ġthis . reaction Ċĉĉ ĉ this . reaction Ġ= Ġif Ġ( prev Reaction Ġ== Ġnull ) Ġ{ Ċĉĉĉ ĉ if Ġ( executor Ġ== Ġnull ) Ġreaction Ċĉĉĉ ĉ else Ġ{ Ġres Ġ-> Ġexecutor . execute Ġ{ Ġreaction ( res ) Ġ} Ġ} Ċĉĉ ĉ } Ġelse Ġ{ Ġres Ġ-> Ċĉĉĉ ĉ if Ġ( executor Ġ== Ġnull ) Ġ{ Ċĉĉĉĉ ĉ if Ġ( pre ce de ) Ġrun Ġ{ ĠS af ely Ġ{ Ġreaction ( res ) Ġ}; Ġprev Reaction ( res ) Ġ} Ċĉĉĉĉ ĉ else Ġrun Ġ{ ĠS af ely Ġ{ Ġprev Reaction ( res ) Ġ}; Ġreaction ( res ) Ġ} Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ if Ġ( pre ce de ) Ġrun Ġ{ ĠS af ely Ġ{ Ġexecutor . execute Ġ{ Ġreaction ( res ) Ġ} Ġ}; Ġprev Reaction ( res ) Ġ} Ċĉĉĉĉ ĉ else Ġrun Ġ{ ĠS af ely Ġ{ Ġprev Reaction ( res ) Ġ}; Ġexecutor . execute Ġ{ Ġreaction ( res ) Ġ} Ġ} Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ return Ġthis Ċĉ ĉ } Ċĉ ĉ reaction . invoke ( result !! ) Ċĉ ĉ return Ġthis Ċ ĉ } Ċ } ĊĊĊĊ Ċ /* ĠBasic ĠResult Task Ġimplementations Ġ*/ Ċ Ċ /** Ġ[ AsyncResult ] Ġof Ġthe Ġ[ code ] Ġexecution Ġthat Ġruns Ġin Ġseparate Ġthread . Ġ*/ Ċ class ĠThread Task < T >( private Ġval Ġcode : Ġ() Ġ-> ĠT ): ĠResult Task < T >() Ġ{ Ċ ĉ init Ġ{ Ċĉ ĉ thread Ġ{ Ġcomplete ( Result Ġ{ Ġcode () Ġ}) Ġ} Ċ ĉ } Ċ } ĊĊĊ Ċ /** Ġ[ AsyncResult ] Ġof Ġthe Ġ[ code ] Ġexecution Ġthat Ġruns Ġin Ġseparate Ġthread . Ġ*/ Ċ class ĠThread R Task < T >( private Ġval Ġcode : Ġ() Ġ-> ĠResult < T >): ĠResult Task < T >() Ġ{ Ċ ĉ init Ġ{ Ċĉ ĉ thread Ġ{ Ġcomplete ( code ()) Ġ} Ċ ĉ } Ċ } Ċ