package Ġcom . n ighth awk apps . wallet . android . feedback . util Ċ Ċ import Ġkotlinx . coroutines . Job Ċ Ċ class ĠComposite Job Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġactive Jobs Ġ= Ġmutable ListOf < Job >() ĊĠĠĠ Ġval Ġsize : ĠInt Ġget () Ġ= Ġactive Jobs . size ĊĊĠĠĠ Ġfun Ġadd ( job : ĠJob ) Ġ{ ĊĠĠĠĠĠĠĠ Ġactive Jobs . add ( job ) ĊĠĠĠĠĠĠĠ Ġjob . invoke On Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( job ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove ( job : ĠJob ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġactive Jobs . remove ( job ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠisActive (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġactive Jobs . any Ġ{ ĠisActive () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġawait () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġallow Ġfor Ġconcurrent Ġmodification Ġsince Ġthe Ġlist Ġisn 't Ġcoroutine Ġor Ġthread Ġsafe ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Ġ= Ġactive Jobs . first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( job ?. isActive Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob . join () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprevents Ġan Ġinfinite Ġloop Ġin Ġthe Ġextreme Ġedge Ġcase Ġwhere Ġthe Ġlist Ġhas Ġa Ġnull Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ Ġactive Jobs . remove ( job ) Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( size Ġ> Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcancel () Ġ{ ĊĠĠĠĠĠĠĠ Ġactive Jobs . filter Ġ{ ĠisActive () Ġ}. forEach Ġ{ Ġit . cancel () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġplus Assign ( also : ĠJob ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd ( also ) ĊĠĠĠ Ġ} Ċ }