package Ġdev . dcd ie tr ich . events Ċ Ċ import Ġjava . util . concurrent . atomic .* Ċ Ċ public Ġabstract Ġclass ĠEvent Base < TSource , ĠTValue , ĠT Args Ġ: ĠEventArgs < TSource , ĠTValue >> Ġ{ ĊĠĠĠ Ġinternal Ġval Ġhandler Count ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġhandlers . get (). size ĊĊĠĠĠ Ġprotected Ġval Ġhandlers Ġ= ĠAtomic Reference ( array Of <( T Args ) Ġ-> ĠUnit >()) ĊĊĠĠĠ Ġpublic Ġoperator Ġfun Ġplus Assign ( handler : Ġ( T Args ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Array Ġ= Ġhandlers . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Array Ġ= Ġold Array Ġ+ Ġhandler ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ(! handlers . compare AndSet ( old Array , Ġnew Array )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoperator Ġfun Ġminus Assign ( handler : Ġ( T Args ) Ġ-> Unit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Array Ġ= Ġhandlers . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex ĠĠĠ Ġ= Ġold Array . indexOf ( handler ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Array Ġ= ĠArray ( old Array . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ< Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Array [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Array [ it Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ(! handlers . compare AndSet ( old Array , Ġnew Array )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġabstract Ġfun Ġraise ( args : ĠT Args ) Ċ } Ċ Ċ public Ġclass ĠEvent < TSource , ĠTValue > Ġinternal Ġconstructor () Ġ: ĠEvent Base < TSource , ĠTValue , ĠEventArgs < TSource , ĠTValue >>() Ġ{ ĊĠĠĠ Ġinternal Ġoverride Ġfun Ġraise ( args : ĠEventArgs < TSource , ĠTValue >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Handlers Ġ= Ġhandlers . get () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( handler Ġin Ġcurrent Handlers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ( args ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ public Ġclass ĠC ancellable Event < TSource , ĠTValue > Ġinternal Ġconstructor () Ġ: ĠEvent Base < TSource , ĠTValue , ĠC ancellable EventArgs < TSource , ĠTValue >>() Ġ{ ĊĠĠĠ Ġinternal Ġoverride Ġfun Ġraise ( args : ĠC ancellable EventArgs < TSource , ĠTValue >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Handlers Ġ= Ġhandlers . get () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( handler Ġin Ġcurrent Handlers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ( args ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( args . cancelled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }