/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 ĠSquare ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ @ file : Suppress (" DE PREC ATION ") Ċ Ċ package Ġcom . squareup . workflow . legacy Ċ Ċ import Ġcom . squareup . workflow . legacy . Reactor IntegrationTest . Outer Event . Background Ċ import Ġcom . squareup . workflow . legacy . Reactor IntegrationTest . Outer Event . Cancel Ċ import Ġcom . squareup . workflow . legacy . Reactor IntegrationTest . Outer Event . Pause Ċ import Ġcom . squareup . workflow . legacy . Reactor IntegrationTest . Outer Event . Resume Ċ import Ġcom . squareup . workflow . legacy . Reactor IntegrationTest . Outer Event . Run Echo Job Ċ import Ġcom . squareup . workflow . legacy . Reactor IntegrationTest . Outer Event . Run Immediate Job Ċ import Ġcom . squareup . workflow . legacy . Reactor IntegrationTest . Outer Reactor Ċ import Ġcom . squareup . workflow . legacy . Reactor IntegrationTest . Outer State . Idle Ċ import Ġcom . squareup . workflow . legacy . Reactor IntegrationTest . Outer State . Paused Ċ import Ġcom . squareup . workflow . legacy . Reactor IntegrationTest . Outer State . Running Echo Job Ċ import Ġcom . squareup . workflow . legacy . Reactor IntegrationTest . Outer State . Running Immediate Job Ċ import Ġcom . squareup . workflow . legacy . Reactor IntegrationTest . String Echo er Ċ import Ġcom . squareup . workflow . legacy . Workflow Pool . Handle Ċ import Ġkotlinx . coroutines . channels . Receive Channel Ċ import Ġkotlinx . coroutines . select s . select Ċ import Ġorg . junit . Test Ċ import Ġkotlin . test . assertEquals Ċ Ċ /** Ċ Ġ* ĠTests Ġ[ Reactor ], Ġ[ Workflow Update ] Ġand Ġ[ Workflow Pool ], Ġwith Ġan Ġ[ Outer Reactor ] Ċ Ġ* Ġthat Ġcan Ġrun , Ġpause , Ġbackground , Ġresume Ġnamed Ġinstances Ġof Ġan Ġ[ String Echo er ]. Ċ Ġ* Ċ Ġ* ĠThis ĠIS ĠNOT Ġmeant Ġto Ġbe Ġan Ġexample Ġof Ġhow Ġto Ġwrite Ġworkflows Ġin Ġproduction . Ċ Ġ* ĠThe Ġbackground Ġworkflow Ġthing Ġis Ġvery Ġfrag ile , Ġit 's Ġjust Ġan Ġam using Ġway Ċ Ġ* Ġto Ġexercise Ġrunning Ġconcurrent Ġworkflows Ġof Ġthe Ġsame Ġtime . Ċ Ġ*/ Ċ @ Suppress (" Member Visibility Can Be Private ") Ċ class ĠRe actor IntegrationTest Ġ{ ĊĠ Ġ@ Test Ġfun Ġ` run Ġand Ġsee Ġresult Ġafter Ġstate Ġupdate `() Ġ{ ĊĠĠĠ Ġval Ġworkflow Ġ= Ġouter Reactor . launch () ĊĠĠĠ Ġworkflow . send Event ( Run Echo Job (" job ")) ĊĠĠĠ Ġsend Echo Event (" job ", Ġ" fn ord ") ĊĠĠĠ Ġsend Echo Event (" job ", ĠSTOP _ ECHO _ JOB ) ĊĠĠĠ ĠassertEquals ( listOf (" fn ord "), Ġresults ) ĊĠĠĠ ĠassertEquals ( 0 , Ġpool . peek Workflow s Count ) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` run Ġand Ġsee Ġresult Ġafter Ġno Ġstate Ġupdates `() Ġ{ ĊĠĠĠ Ġval Ġworkflow Ġ= Ġouter Reactor . launch () ĊĠĠĠ Ġworkflow . send Event ( Run Echo Job (" job ")) ĊĠĠĠ Ġsend Echo Event (" job ", ĠSTOP _ ECHO _ JOB ) ĊĠĠĠ ĠassertEquals ( listOf ( NEW _ ECHO _ JOB ), Ġresults ) ĊĠĠĠ ĠassertEquals ( 0 , Ġpool . peek Workflow s Count ) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` pause _ does Ġaband on Ġand Ġrestart Ġfrom ĠSaved State `() Ġ{ ĊĠĠĠ Ġval Ġworkflow Ġ= Ġouter Reactor . launch () ĊĠĠĠ Ġworkflow . send Event ( Run Echo Job (" job ")) ĊĠĠĠ Ġsend Echo Event (" job ", Ġ" able ") ĊĊĠĠĠ Ġworkflow . send Event ( Pause ) ĊĠĠĠ ĠassertEquals ( 0 , Ġpool . peek Workflow s Count ) ĊĊĠĠĠ Ġworkflow . send Event ( Resume ) ĊĊĠĠĠ Ġsend Echo Event (" job ", ĠSTOP _ ECHO _ JOB ) ĊĠĠĠ ĠassertEquals ( listOf (" able "), Ġresults ) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` pause Ġimmediately Ġand Ġresume Ġand Ġcomplete Ġimmediately `() Ġ{ ĊĠĠĠ Ġval Ġworkflow Ġ= Ġouter Reactor . launch () ĊĠĠĠ Ġworkflow . send Event ( Run Echo Job (" job ")) ĊĠĠĠ Ġworkflow . send Event ( Pause ) ĊĠĠĠ Ġworkflow . send Event ( Resume ) ĊĊĠĠĠ Ġsend Echo Event (" job ", ĠSTOP _ ECHO _ JOB ) ĊĠĠĠ ĠassertEquals ( listOf ( NEW _ ECHO _ JOB ), Ġresults ) ĊĠĠĠ ĠassertEquals ( 0 , Ġpool . peek Workflow s Count ) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` cancel Ġaband ons `() Ġ{ ĊĠĠĠ Ġval Ġworkflow Ġ= Ġouter Reactor . launch () ĊĠĠĠ Ġworkflow . send Event ( Run Echo Job (" job ")) ĊĠĠĠ Ġsend Echo Event (" job ", Ġ" able ") ĊĠĠĠ Ġsend Echo Event (" job ", Ġ" b aker ") ĊĊĠĠĠ Ġworkflow . send Event ( Cancel ) ĊĠĠĠ ĠassertEquals ( 0 , Ġpool . peek Workflow s Count ) ĊĊĠĠĠ Ġworkflow . send Event ( Run Echo Job (" job ")) ĊĠĠĠ Ġsend Echo Event (" job ", ĠSTOP _ ECHO _ JOB ) ĊĊĠĠĠ Ġ// ĠWe Ġused Ġthe Ġsame Ġjob Ġid , Ġbut Ġthe Ġstate Ġchanges Ġfrom Ġthe Ġprevious Ġsession Ġwere Ġdropped . ĊĠĠĠ ĠassertEquals ( listOf ( NEW _ ECHO _ JOB ), Ġresults ) ĊĠĠĠ ĠassertEquals ( 0 , Ġpool . peek Workflow s Count ) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` background Ġdemonstrates Ġconcurrent Ġworkflows Ġof Ġthe Ġsame Ġtype `() Ġ{ ĊĠĠĠ Ġval Ġworkflow Ġ= Ġouter Reactor . launch () ĊĊĠĠĠ Ġworkflow . send Event ( Run Echo Job (" job 1 ")) ĊĠĠĠ Ġworkflow . send Event ( Background ) ĊĊĠĠĠ Ġworkflow . send Event ( Run Echo Job (" job 2 ")) ĊĠĠĠ Ġworkflow . send Event ( Background ) ĊĊĠĠĠ Ġworkflow . send Event ( Run Echo Job (" job 3 ")) ĊĠĠĠ Ġworkflow . send Event ( Background ) ĊĊĠĠĠ Ġsend Echo Event (" job 1 ", Ġ" biz ") ĊĠĠĠ Ġsend Echo Event (" job 2 ", Ġ" baz ") ĊĠĠĠ Ġsend Echo Event (" job 3 ", Ġ" bang ") ĊĊĠĠĠ Ġworkflow . send Event ( Run Echo Job (" job 1 ")) ĊĠĠĠ Ġsend Echo Event (" job 1 ", ĠSTOP _ ECHO _ JOB ) ĊĊĠĠĠ Ġworkflow . send Event ( Run Echo Job (" job 2 ")) ĊĠĠĠ Ġsend Echo Event (" job 2 ", ĠSTOP _ ECHO _ JOB ) ĊĊĠĠĠ Ġworkflow . send Event ( Run Echo Job (" job 3 ")) ĊĠĠĠ Ġsend Echo Event (" job 3 ", ĠSTOP _ ECHO _ JOB ) ĊĊĠĠĠ ĠassertEquals ( listOf (" biz ", Ġ" baz ", Ġ" bang "), Ġresults ) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` sync Ġsingle Ġon Ġsuccess Ġin Ġnested Ġworkflow `() Ġ{ ĊĠĠĠ Ġval Ġworkflow Ġ= Ġouter Reactor . launch () ĊĠĠĠ Ġworkflow . send Event ( Run Immediate Job ) ĊĊĠĠĠ Ġworkflow . send Event ( Run Echo Job (" fn ord ")) ĊĠĠĠ Ġsend Echo Event (" fn ord ", ĠSTOP _ ECHO _ JOB ) ĊĊĠĠĠ ĠassertEquals ( listOf (" Finished Ġ${ Immediate On Success :: class }", ĠNEW _ ECHO _ JOB ), Ġresults ) ĊĊĠĠĠ ĠassertEquals ( 0 , Ġpool . peek Workflow s Count ) ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġconst Ġval ĠNEW _ ECHO _ JOB Ġ= Ġ"* NEW ĠE CHO ĠJOB *" ĊĠĠĠ Ġconst Ġval ĠSTOP _ ECHO _ JOB Ġ= Ġ"* STOP ĠE CHO ĠJOB *" ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠBasic ally Ġa Ġjob Ġthat Ġcan Ġemit Ġstrings Ġat Ġarbitrary Ġtimes , Ġand Ġwhose ĊĠĠ Ġ* Ġresult Ġcode Ġis Ġthe Ġlast Ġstring Ġit Ġemitted . ĊĠĠ Ġ*/ ĊĠ Ġclass ĠString Echo er Ġ: ĠRe actor < String , ĠString , ĠString > Ġ{ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġon React ( ĊĠĠĠĠĠ Ġstate : ĠString , ĊĠĠĠĠĠ Ġevents : ĠReceive Channel < String >, ĊĠĠĠĠĠ Ġworkflows : ĠWorkflow Pool ĊĠĠĠ Ġ): ĠRe action < String , ĠString > Ġ= Ġevents . receive (). let Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSTOP _ ECHO _ JOB Ġ-> ĠFinish With ( state ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠEnter State ( event ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlaunch ( ĊĠĠĠĠĠ ĠinitialState : ĠString , ĊĠĠĠĠĠ Ġworkflows : ĠWorkflow Pool ĊĠĠĠ Ġ): ĠWorkflow < String , ĠString , ĠString > Ġ= Ġdo Launch ( initialState , Ġworkflows ) ĊĠ Ġ} ĊĊĠ Ġval Ġecho Reactor Ġ= ĠString Echo er () ĊĊĠ Ġclass ĠIm mediate On Success Ġ: ĠRe actor < Unit , ĠString , ĠUnit > Ġ{ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġon React ( ĊĠĠĠĠĠ Ġstate : ĠUnit , ĊĠĠĠĠĠ Ġevents : ĠReceive Channel < String >, ĊĠĠĠĠĠ Ġworkflows : ĠWorkflow Pool ĊĠĠĠ Ġ): ĠRe action < Unit , ĠUnit > Ġ= ĠFinish With ( Unit ) ĊĊĠĠĠ Ġoverride Ġfun Ġlaunch ( ĊĠĠĠĠĠ ĠinitialState : ĠUnit , ĊĠĠĠĠĠ Ġworkflows : ĠWorkflow Pool ĊĠĠĠ Ġ): ĠWorkflow < Unit , ĠString , ĠUnit > Ġ= Ġdo Launch ( initialState , Ġworkflows ) ĊĠ Ġ} ĊĊĠ Ġval Ġimmediate Reactor Ġ= ĠIm mediate On Success () ĊĊĠ Ġsealed Ġclass ĠO uter State Ġ{ ĊĠĠĠ Ġobject ĠId le Ġ: ĠO uter State () ĊĊĠĠĠ Ġdata Ġclass ĠRunning Echo Job ( ĊĠĠĠĠĠ Ġval Ġecho er : ĠHandle < String , ĠString , ĠString > ĊĠĠĠ Ġ) Ġ: ĠO uter State () ĊĊĠĠĠ Ġdata Ġclass ĠPause d ( ĊĠĠĠĠĠ Ġval Ġecho er : ĠHandle < String , ĠString , ĠString > ĊĠĠĠ Ġ) Ġ: ĠO uter State () ĊĊĠĠĠ Ġobject ĠRunning Immediate Job Ġ: ĠO uter State () Ġ{ ĊĠĠĠĠĠ Ġval Ġjob Ġ= ĠWorkflow Pool . handle ( Immediate On Success :: class ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġsealed Ġclass ĠO uter Event Ġ{ ĊĠĠĠ Ġdata Ġclass ĠRun Echo Job ( ĊĠĠĠĠĠ Ġval Ġecho er : ĠHandle < String , ĠString , ĠString > ĊĠĠĠ Ġ) Ġ: ĠO uter Event () Ġ{ ĊĠĠĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġid : ĠString , ĊĠĠĠĠĠĠĠ Ġstate : ĠString Ġ= ĠNEW _ ECHO _ JOB ĊĠĠĠĠĠ Ġ) Ġ: Ġthis ( Workflow Pool . handle ( String Echo er :: class , Ġstate , Ġid )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠRun Immediate Job Ġ: ĠO uter Event () ĊĊĠĠĠ Ġ/** ĠCtrl - C Ġ*/ ĊĠĠĠ Ġobject ĠCancel Ġ: ĠO uter Event () ĊĊĠĠĠ Ġ/** ĠCtrl - S Ġ*/ ĊĠĠĠ Ġobject ĠPause Ġ: ĠO uter Event () ĊĊĠĠĠ Ġ/** ĠCtrl - Q Ġ*/ ĊĠĠĠ Ġobject ĠResume Ġ: ĠO uter Event () ĊĊĠĠĠ Ġ/** ĠCtrl - Z Ġ*/ ĊĠĠĠ Ġobject ĠBackground Ġ: ĠO uter Event () ĊĠ Ġ} ĊĊĠ Ġval Ġresults Ġ= Ġmutable ListOf < String >() ĊĊĠ Ġval Ġpool Ġ= ĠWorkflow Pool () ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠOne Ġrunning Ġjob , Ġwhich Ġmight Ġbe Ġpaused Ġor Ġback gro unded . ĠAny Ġnumber Ġof Ġbackground Ġjobs . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠThere Ġare Ġtwo Ġkinds Ġof Ġjobs : ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ Ġ- Ġ[ String Echo er ], Ġwhose Ġstate Ġis Ġthe Ġlast ĠString Ġevent Ġit Ġreceived ĊĠĠ Ġ* Ġ Ġ- Ġ[ Immediate On Success ], Ġwhich Ġimmediately Ġcompletes ĊĠĠ Ġ*/ ĊĠ Ġinner Ġclass ĠO uter Reactor Ġ: ĠRe actor < Outer State , ĠO uter Event , ĠUnit > Ġ{ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġon React ( ĊĠĠĠĠĠ Ġstate : ĠO uter State , ĊĠĠĠĠĠ Ġevents : ĠReceive Channel < Outer Event >, ĊĠĠĠĠĠ Ġworkflows : ĠWorkflow Pool ĊĠĠĠ Ġ): ĠRe action < Outer State , ĠUnit > Ġ= Ġwhen Ġ( state ) Ġ{ ĊĊĠĠĠĠĠ ĠId le Ġ-> Ġevents . receive (). let Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġis ĠRun Echo Job Ġ-> ĠEnter State ( Running Echo Job ( it . echo er )) ĊĠĠĠĠĠĠĠĠĠ ĠRun Immediate Job Ġ-> ĠEnter State ( Running Immediate Job ) ĊĠĠĠĠĠĠĠĠĠ ĠCancel Ġ-> ĠFinish With ( Unit ) ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" invalid Ġevent : Ġ$ it ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġis ĠRunning Echo Job Ġ-> Ġselect Ġ{ ĊĠĠĠĠĠĠĠ Ġworkflows . workflow Update ( state . echo er ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Await Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRunning Ġ-> ĠEnter State ( Running Echo Job ( it . handle )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFinished Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults Ġ+= Ġit . result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEnter State ( Idle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġevents . on Receive Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPause Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworkflows . ab and on Workflow ( state . echo er ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEnter State ( Paused ( state . echo er )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBackground Ġ-> ĠEnter State ( Idle ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCancel Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworkflows . ab and on Workflow ( state . echo er ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEnter State ( Idle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" invalid Ġevent : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġis ĠPause d Ġ-> Ġevents . receive (). let Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠResume Ġ-> ĠEnter State ( Running Echo Job ( state . echo er )) ĊĠĠĠĠĠĠĠĠĠ ĠCancel Ġ-> ĠEnter State ( Idle ) ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" invalid Ġevent : Ġ$ it ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġis ĠRunning Immediate Job Ġ-> Ġworkflows . await Workflow Update ( state . job ). let Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġis ĠRunning Ġ-> Ġthrow ĠAssertionError (" Should Ġnever Ġre - enter Ġ$ Running Immediate Job .") ĊĠĠĠĠĠĠĠĠĠ Ġis ĠFinished Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults Ġ+= Ġ" Finished Ġ${ Immediate On Success :: class }" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEnter State ( Idle ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlaunch () Ġ= Ġlaunch ( Idle , Ġpool ) ĊĊĠĠĠ Ġoverride Ġfun Ġlaunch ( ĊĠĠĠĠĠ ĠinitialState : ĠO uter State , ĊĠĠĠĠĠ Ġworkflows : ĠWorkflow Pool ĊĠĠĠ Ġ): ĠWorkflow < Outer State , ĠO uter Event , ĠUnit > Ġ{ ĊĠĠĠĠĠ Ġworkflows . register ( echo Reactor ) ĊĠĠĠĠĠ Ġworkflows . register ( immediate Reactor ) ĊĠĠĠĠĠ Ġval Ġworkflow Ġ= Ġdo Launch ( initialState , Ġworkflows ) ĊĠĠĠĠĠ Ġworkflow . invoke On Completion Ġ{ Ġworkflows . ab and on All () Ġ} ĊĠĠĠĠĠ Ġreturn Ġworkflow ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġval Ġouter Reactor Ġ= ĠO uter Reactor () ĊĊĠ Ġfun Ġsend Echo Event ( ĊĠĠĠ Ġecho JobId : ĠString , ĊĠĠĠ Ġevent : ĠString ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġpool . input ( Workflow Pool . handle ( String Echo er :: class , Ġ" ignored ", Ġecho JobId )) ĊĠĠĠĠĠĠĠ Ġ. send Event ( event ) ĊĠ Ġ} Ċ } Ċ