package Ġcom . m ire go . tri kot . streams . c ancellable Ċ Ċ import Ġcom . m ire go . tri kot . foundation . concurrent . Atomic List Reference Ċ import Ġcom . m ire go . tri kot . foundation . concurrent . Atomic Reference Ċ import Ġcom . m ire go . tri kot . foundation . concurrent . dispatch Queue . S ynchronous Serial Queue Ċ Ċ class ĠC ancellable Manager Ġ: ĠC ancellable Ġ{ ĊĠĠĠ Ġprivate Ġval Ġserial Queue Ġ= ĠS ynchronous Serial Queue () ĊĠĠĠ Ġprivate Ġval Ġqueue List Ġ= ĠAtomic List Reference < C ancellable >() ĊĠĠĠ Ġprivate Ġval Ġis Cancelled Ġ= ĠAtomic Reference ( false ) ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠC ancellable > Ġadd ( c ancellable : ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġqueue List . add ( c ancellable ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Cancelled . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Cancel All () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcancell able ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd ( c ancellable Block : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠC ancellable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcancel () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancell able Block () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcancel () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Cancelled . compare AndSet ( is Cancelled . value , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Cancel All () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Cancel All () Ġ{ ĊĠĠĠĠĠĠĠ Ġserial Queue . dispatch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġqueue List . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueue List . removeAll ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( c ancellable Ġin Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancell able . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ