package Ġorg . anti _ ad . mc . ip next . item . rule Ċ Ċ import Ġorg . anti _ ad . mc . ip next . item . ItemType Ċ import Ġorg . anti _ ad . mc . ip next . item . rule . parameter . reverse Ċ import Ġorg . anti _ ad . mc . ip next . item . rule . parameter . sub _ rule Ċ Ċ interface ĠRule Ġ: ĠComparator < ItemType > Ġ{ ĊĠĠĠ Ġval Ġarguments : ĠArgument Map ĊĠĠĠ Ġoverride Ġfun Ġcompare ( item Type 1 : ĠItem Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Type 2 : ĠItem Type ): ĠInt Ċ } Ġ// Ġtodo ĠtoString () Ċ Ċ object ĠEmpty Rule Ġ: ĠRule Ġ{ ĊĠĠĠ Ġoverride Ġval Ġarguments : ĠArgument Map ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠArgument Map () ĊĊĠĠĠ Ġoverride Ġfun Ġcompare ( item Type 1 : ĠItem Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Type 2 : ĠItem Type ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠMutable Empty Rule Ġ: ĠBase Rule () Ċ Ċ abstract Ġclass ĠBase Rule Ġ: ĠRule Ġ{ ĊĠĠĠ Ġfinal Ġoverride Ġval Ġarguments Ġ= ĠArgument Map () ĊĠĠĠ Ġvar Ġcomparator : Ġ( ItemType , ĠItem Type ) Ġ-> ĠInt Ġ= Ġ{ Ġ_, Ġ_ Ġ-> Ġ 0 Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġarguments . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefine Parameter ( reverse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefine Parameter ( sub _ rule , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmpty Rule ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlazy Compare Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ Ġ// Ġcall Ġwhen Ġarguments Ġno Ġmore Ġchanges ĊĠĠĠĠĠĠĠ Ġval Ġmul Ġ= Ġif Ġ( arguments [ reverse ]) Ġ- 1 Ġelse Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġno Sub Comparator Ġ= Ġarguments . is DefaultValue ( sub _ rule ) ĊĠĠĠĠĠĠĠ Ġreturn @ lazy Ġif Ġ( no Sub Comparator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun ( item Type 1 : ĠItem Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Type 2 : ĠItem Type ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcomparator ( item Type 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Type 2 ) Ġ* Ġmul ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Comparator Ġ= Ġarguments [ sub _ rule ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun ( item Type 1 : ĠItem Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Type 2 : ĠItem Type ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcomparator ( item Type 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Type 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġ 0 ) Ġreturn Ġresult Ġ* Ġmul ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsub Comparator . compare ( item Type 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Type 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġcompare ( item Type 1 : ĠItem Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Type 2 : ĠItem Type ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlazy Compare ( item Type 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Type 2 ) ĊĠĠĠ Ġ} Ċ }