package Ġcom . in ari . fire fly . misc Ċ Ċ import Ġcom . in ari . fire fly . FF Context Ċ import Ġcom . in ari . fire fly . Test App Ċ import Ġcom . in ari . fire fly . measure Time Ċ import Ġcom . in ari . util . Int Function Ċ import Ġcom . in ari . util . event . Event Ċ import Ġcom . in ari . util . geom . Vector 2 i Ċ Ċ type alias ĠTest Listener Type Ġ= Ġ( Int , ĠInt , ĠInt ) Ġ-> ĠUnit Ċ Ċ interface ĠTest Listener Interface Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġinvoke ( i 1 : ĠInt , Ġi 2 : ĠInt , Ġi 3 : ĠInt ) Ċ } Ċ Ċ type alias ĠTest Listener Type Obj Ġ= Ġ( Vector 2 i , ĠVector 2 i , ĠVector 2 i ) Ġ-> ĠUnit Ċ Ċ interface ĠTest Listener Interface Obj Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġinvoke ( i 1 : ĠVector 2 i , Ġi 2 : ĠVector 2 i , Ġi 3 : ĠVector 2 i ) Ċ } Ċ Ċ class ĠTest Event 1 ( override Ġval ĠeventType : ĠEventType ) Ġ: ĠEvent < Test Listener Type >() Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġi 1 : ĠInt Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġi 2 : ĠInt Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġi 3 : ĠInt Ġ= Ġ- 1 ĊĊĠĠĠ Ġoverride Ġfun Ġnotify ( listener : ĠTest Listener Type ) Ġ= ĊĠĠĠĠĠĠĠ Ġlistener ( i 1 , Ġi 2 , Ġi 3 ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠEventType (" Test Event 1 ") Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġevent Ġ= ĠTest Event 1 ( this ) ĊĠĠĠĠĠĠĠ Ġfun Ġsend ( i 1 : ĠInt , Ġi 2 : ĠInt , Ġi 3 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . i 1 Ġ= Ġi 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . i 2 Ġ= Ġi 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . i 3 Ġ= Ġi 3 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFF Context . notify ( event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠTest Event 2 ( override Ġval ĠeventType : ĠEventType ) Ġ: ĠEvent < Test Listener Interface >() Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġi 1 : ĠInt Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġi 2 : ĠInt Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġi 3 : ĠInt Ġ= Ġ- 1 ĊĊĠĠĠ Ġoverride Ġfun Ġnotify ( listener : ĠTest Listener Interface ) Ġ= ĊĠĠĠĠĠĠĠ Ġlistener ( i 1 , Ġi 2 , Ġi 3 ) ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠEventType (" Test Event 2 ") Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġevent Ġ= ĠTest Event 2 ( this ) ĊĠĠĠĠĠĠĠ Ġfun Ġsend ( i 1 : ĠInt , Ġi 2 : ĠInt , Ġi 3 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . i 1 Ġ= Ġi 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . i 2 Ġ= Ġi 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . i 3 Ġ= Ġi 3 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFF Context . notify ( event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠTest Event 3 ( override Ġval ĠeventType : ĠEventType ) Ġ: ĠEvent < Test Listener Type Obj >() Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġi 1 : ĠVector 2 i Ġ= ĠVector 2 i () ĊĠĠĠ Ġprivate Ġvar Ġi 2 : ĠVector 2 i Ġ= ĠVector 2 i () ĊĠĠĠ Ġprivate Ġvar Ġi 3 : ĠVector 2 i Ġ= ĠVector 2 i () ĊĊĠĠĠ Ġoverride Ġfun Ġnotify ( listener : ĠTest Listener Type Obj ) Ġ= ĊĠĠĠĠĠĠĠ Ġlistener ( i 1 , Ġi 2 , Ġi 3 ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠEventType (" Test Event 3 ") Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġevent Ġ= ĠTest Event 3 ( this ) ĊĠĠĠĠĠĠĠ Ġfun Ġsend ( i 1 : ĠVector 2 i , Ġi 2 : ĠVector 2 i , Ġi 3 : ĠVector 2 i ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . i 1 Ġ= Ġi 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . i 2 Ġ= Ġi 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . i 3 Ġ= Ġi 3 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFF Context . notify ( event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠTest Event 4 ( override Ġval ĠeventType : ĠEventType ) Ġ: ĠEvent < Test Listener Interface Obj >() Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġi 1 : ĠVector 2 i Ġ= ĠVector 2 i () ĊĠĠĠ Ġprivate Ġvar Ġi 2 : ĠVector 2 i Ġ= ĠVector 2 i () ĊĠĠĠ Ġprivate Ġvar Ġi 3 : ĠVector 2 i Ġ= ĠVector 2 i () ĊĊĠĠĠ Ġoverride Ġfun Ġnotify ( listener : ĠTest Listener Interface Obj ) Ġ= ĊĠĠĠĠĠĠĠ Ġlistener ( i 1 , Ġi 2 , Ġi 3 ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠEventType (" Test Event 4 ") Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġevent Ġ= ĠTest Event 4 ( this ) ĊĠĠĠĠĠĠĠ Ġfun Ġsend ( i 1 : ĠVector 2 i , Ġi 2 : ĠVector 2 i , Ġi 3 : ĠVector 2 i ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . i 1 Ġ= Ġi 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . i 2 Ġ= Ġi 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . i 3 Ġ= Ġi 3 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFF Context . notify ( event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠEvent Performance Test Ġ{ ĊĊĠĠĠ Ġ//@ Before Test ĊĠĠĠ Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ ĠTest App ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ//@ Test ĊĠĠĠ Ġfun Ġtest 0 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġint Function Lambda : ĠInt Function Ġ= Ġ{ Ġi Ġ-> Ġi Ġ+ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġint Function Interface : ĠInt Function Ġ= Ġ Ġ{ Ġp 1 Ġ-> Ġp 1 Ġ+ Ġ 1 Ġ} ĊĊĠĠĠĠĠĠĠ Ġmeasure Time (" primitive Ġinterface Ġimpl ", Ġ 1 0 0 _ 0 0 0 _ 0 0 0 _ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint Function Interface ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmeasure Time (" primitive Ġlambda Ġfunction ", Ġ 1 0 0 _ 0 0 0 _ 0 0 0 _ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint Function Lambda ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ//@ Test ĊĠĠĠ Ġfun Ġtest 1 () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Listener Type : ĠTest Listener Type Ġ= Ġ{ Ġi 1 , Ġi 2 , Ġi 3 Ġ-> Ġi 1 Ġ+ Ġi 2 Ġ+ Ġi 3 } ĊĠĠĠĠĠĠĠ Ġval Ġtest Listener Interface : ĠTest Listener Interface Ġ= Ġobject Ġ: ĠTest Listener Interface Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( i 1 : ĠInt , Ġi 2 : ĠInt , Ġi 3 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi 1 Ġ+ Ġi 2 Ġ+ Ġi 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠFF Context . register Listener ( Test Event 1 , Ġtest Listener Type ) ĊĠĠĠĠĠĠĠ ĠFF Context . register Listener ( Test Event 2 , Ġtest Listener Interface ) ĊĊĠĠĠĠĠĠĠ Ġmeasure Time (" primitive Ġinterface Ġlistener ", Ġ 1 0 0 _ 0 0 0 _ 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest Event 2 . send ( 1 , Ġ 2 , Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmeasure Time (" primitive Ġsub Type Ġlistener ", Ġ 1 0 0 _ 0 0 0 _ 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest Event 1 . send ( 1 , Ġ 2 , Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ//@ Test ĊĠĠĠ Ġfun Ġtest 2 () Ġ{ ĊĊĠĠĠĠĠĠĠ ĠFF Context . register Listener ( Test Event 1 ) Ġ{ Ġi 1 : ĠInt , Ġi 2 : ĠInt , Ġi 3 : ĠInt Ġ-> Ġi 1 Ġ+ Ġi 2 Ġ+ Ġi 3 Ġ} ĊĠĠĠĠĠĠĠ ĠFF Context . register Listener ( Test Event 2 , Ġobject Ġ: ĠTest Listener Interface Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( i 1 : ĠInt , Ġi 2 : ĠInt , Ġi 3 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi 1 Ġ+ Ġi 2 Ġ+ Ġi 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġmeasure Time (" primitive Ġsub Type Ġlistener Ġwith Ġlambda ", Ġ 1 0 0 _ 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest Event 1 . send ( 1 , Ġ 2 , Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmeasure Time (" primitive Ġinterface Ġlistener Ġwith Ġlambda ", Ġ 1 0 0 _ 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest Event 2 . send ( 1 , Ġ 2 , Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ//@ Test ĊĠĠĠ Ġfun Ġtest 3 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpos 1 Ġ= ĠVector 2 i ( 1 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġtest Listener Type : ĠTest Listener Type Obj Ġ= Ġ{ Ġi 1 , Ġi 2 , Ġi 3 Ġ-> Ġi 1 . x Ġ+ Ġi 2 . x Ġ+ Ġi 3 . x } ĊĠĠĠĠĠĠĠ Ġval Ġtest Listener Interface : ĠTest Listener Interface Obj Ġ= Ġobject Ġ: ĠTest Listener Interface Obj Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( i 1 : ĠVector 2 i , Ġi 2 : ĠVector 2 i , Ġi 3 : ĠVector 2 i ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi 1 . x Ġ+ Ġi 2 . x Ġ+ Ġi 3 . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠFF Context . register Listener ( Test Event 3 , Ġtest Listener Type ) ĊĠĠĠĠĠĠĠ ĠFF Context . register Listener ( Test Event 4 , Ġtest Listener Interface ) ĊĊĠĠĠĠĠĠĠ Ġmeasure Time (" Obj Ġsub Type Ġlistener ", Ġ 1 0 0 _ 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest Event 3 . send ( pos 1 , Ġpos 1 , Ġpos 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmeasure Time (" Obj Ġinterface Ġlistener ", Ġ 1 0 0 _ 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest Event 4 . send ( pos 1 , Ġpos 1 , Ġpos 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ//@ Test ĊĠĠĠ Ġfun Ġtest 4 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpos 1 Ġ= ĠVector 2 i ( 1 , Ġ 2 ) ĊĠĠĠĠĠĠĠ ĠFF Context . register Listener ( Test Event 3 ) Ġ{ Ġi 1 : ĠVector 2 i , Ġi 2 : ĠVector 2 i , Ġi 3 : ĠVector 2 i Ġ-> Ġi 1 . x Ġ+ Ġi 2 . x Ġ+ Ġi 3 . x Ġ} ĊĠĠĠĠĠĠĠ ĠFF Context . register Listener ( Test Event 4 , Ġobject Ġ: ĠTest Listener Interface Obj Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( i 1 : ĠVector 2 i , Ġi 2 : ĠVector 2 i , Ġi 3 : ĠVector 2 i ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi 1 . x Ġ+ Ġi 2 . x Ġ+ Ġi 3 . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġmeasure Time (" Obj Ġsub Type Ġlistener Ġwith Ġlambda ", Ġ 1 0 0 _ 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest Event 3 . send ( pos 1 , Ġpos 1 , Ġpos 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmeasure Time (" Obj Ġinterface Ġlistener Ġwith Ġlambda ", Ġ 1 0 0 _ 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest Event 4 . send ( pos 1 , Ġpos 1 , Ġpos 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }