/* Ċ Ġ* ĠLicensed Ġto Ġthe ĠApache ĠSoftware ĠFoundation Ġ( ASF ) Ġunder Ġone Ċ Ġ* Ġor Ġmore Ġcontributor Ġlicense Ġagreements . Ġ ĠSee Ġthe ĠNOTICE Ġfile Ċ Ġ* Ġdistributed Ġwith Ġthis Ġwork Ġfor Ġadditional Ġinformation Ċ Ġ* Ġregarding Ġcopyright Ġownership . Ġ ĠThe ĠASF Ġlicenses Ġthis Ġfile Ċ Ġ* Ġto Ġyou Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ċ Ġ* Ġ" License "); Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ċ Ġ* Ġwith Ġthe ĠLicense . Ġ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ċ Ġ* Ġsoftware Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ċ Ġ* Ġ" AS ĠIS " ĠBASIS , ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY Ċ Ġ* ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ġ ĠSee Ġthe ĠLicense Ġfor Ġthe Ċ Ġ* Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ġlimitations Ċ Ġ* Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġorg . apache . t inker pop 4 . gre mlin . process . traversal Ċ Ċ import Ġorg . apache . t inker pop 4 . gre mlin . util . Number Helper Ċ import Ġjava . util . Collection Ċ import Ġjava . util . Map Ċ import Ġjava . util . function . Binary Operator Ċ Ċ /** Ċ Ġ* ĠA Ġset Ġof Ġ[ Binary Operator ] Ġinstances Ġthat Ġhandle Ġcommon Ġoperations Ġfor Ġtraversal Ġsteps . Ċ Ġ* Ċ Ġ* Ġ@ author ĠMark o ĠA . ĠRod rig ue z Ġ( http :// mark or od rig ue z . com ) Ċ Ġ*/ Ċ enum Ġclass ĠOperator Ġ: ĠBinary Operator < Object ?> Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAn Ġaddition Ġfunction . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠNumber Helper . add ĊĠĠĠĠ Ġ* Ġ@ since Ġ 3 . 0 . 0 - inc ub ating ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsum Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġapply ( a : ĠObject ?, Ġb : ĠObject ?): ĠObject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNumber Helper . add ( a Ġas ĠNumber ?, Ġb Ġas ĠNumber ?) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġsub traction Ġfunction . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠNumber Helper . sub ĊĠĠĠĠ Ġ* Ġ@ since Ġ 3 . 0 . 0 - inc ub ating ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġminus Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġapply ( a : ĠObject ?, Ġb : ĠObject ?): ĠObject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNumber Helper . sub ( a Ġas ĠNumber ?, Ġb Ġas ĠNumber ?) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġmultiplication Ġfunction . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠNumber Helper . mul ĊĠĠĠĠ Ġ* Ġ@ since Ġ 3 . 0 . 0 - inc ub ating ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġmult Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġapply ( a : ĠObject ?, Ġb : ĠObject ?): ĠObject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNumber Helper . mul ( a Ġas ĠNumber ?, Ġb Ġas ĠNumber ?) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġdivision Ġfunction . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠNumber Helper . div ĊĠĠĠĠ Ġ* Ġ@ since Ġ 3 . 0 . 0 - inc ub ating ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdiv Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġapply ( a : ĠObject ?, Ġb : ĠObject ?): ĠObject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNumber Helper . div ( a Ġas ĠNumber ?, Ġb Ġas ĠNumber ?) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSelect s Ġthe Ġsmaller Ġof Ġthe Ġvalues . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠNumber Helper . min ĊĠĠĠĠ Ġ* Ġ@ since Ġ 3 . 0 . 0 - inc ub ating ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġmin Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġapply ( a : ĠObject ?, Ġb : ĠObject ?): ĠObject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNumber Helper . min ( a Ġas ĠComparable ?, Ġb Ġas ĠComparable ?) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSelect s Ġthe Ġlarger Ġof Ġthe Ġvalues . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠNumber Helper . max ĊĠĠĠĠ Ġ* Ġ@ since Ġ 3 . 0 . 0 - inc ub ating ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġmax Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġapply ( a : ĠObject ?, Ġb : ĠObject ?): ĠObject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNumber Helper . max ( a Ġas ĠComparable ?, Ġb Ġas ĠComparable ?) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġnew Ġincoming Ġvalue Ġ( i . e . Ġthe Ġsecond Ġvalue Ġto Ġthe Ġfunction ) Ġis Ġreturned Ġunchanged Ġresult Ġin Ġthe Ġassignment ĊĠĠĠĠ Ġ* Ġof Ġthat Ġvalue Ġto Ġthe Ġobject Ġof Ġthe Ġ` Operator `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 3 . 1 . 0 - inc ub ating ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġassign Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġapply ( a : ĠObject ?, Ġb : ĠObject ): ĠObject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġb ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠApplies Ġ" and " Ġto Ġboolean Ġvalues . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ< pre > ĊĠĠĠĠ Ġ* Ġa Ġ= Ġtrue , Ġb Ġ= Ġnull Ġ-> Ġtrue ĊĠĠĠĠ Ġ* Ġa Ġ= Ġfalse , Ġb Ġ= Ġnull Ġ-> Ġfalse ĊĠĠĠĠ Ġ* Ġa Ġ= Ġnull , Ġb Ġ= Ġtrue Ġ-> Ġtrue ĊĠĠĠĠ Ġ* Ġa Ġ= Ġnull , Ġb Ġ= Ġfalse Ġ-> Ġfalse ĊĠĠĠĠ Ġ* Ġa Ġ= Ġnull , Ġb Ġ= Ġnull Ġ-> Ġnull ĊĠĠĠ Ġ</ pre > Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 3 . 2 . 0 - inc ub ating ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġand Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġapply ( a : ĠObject ?, Ġb : ĠObject ?): ĠObject ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( null Ġ== Ġa Ġ|| Ġnull Ġ== Ġb ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġa Ġ&& Ġnull Ġ== Ġb ) Ġnull Ġelse Ġif Ġ( null Ġ== Ġb ) Ġa Ġelse Ġb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġa Ġ&& Ġb ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠApplies Ġ" or " Ġto Ġboolean Ġvalues . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ< pre > ĊĠĠĠĠ Ġ* Ġa Ġ= Ġtrue , Ġb Ġ= Ġnull Ġ-> Ġtrue ĊĠĠĠĠ Ġ* Ġa Ġ= Ġfalse , Ġb Ġ= Ġnull Ġ-> Ġfalse ĊĠĠĠĠ Ġ* Ġa Ġ= Ġnull , Ġb Ġ= Ġtrue Ġ-> Ġtrue ĊĠĠĠĠ Ġ* Ġa Ġ= Ġnull , Ġb Ġ= Ġfalse Ġ-> Ġfalse ĊĠĠĠĠ Ġ* Ġa Ġ= Ġnull , Ġb Ġ= Ġnull Ġ-> Ġnull ĊĠĠĠ Ġ</ pre > Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 3 . 2 . 0 - inc ub ating ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġor Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġapply ( a : ĠObject ?, Ġb : ĠObject ?): ĠObject ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( null Ġ== Ġa Ġ|| Ġnull Ġ== Ġb ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġa Ġ&& Ġnull Ġ== Ġb ) Ġnull Ġelse Ġif Ġ( null Ġ== Ġb ) Ġa Ġelse Ġb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġa Ġ|| Ġb ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTakes Ġall Ġobjects Ġin Ġthe Ġsecond Ġ` Collection ` Ġand Ġadds Ġthem Ġto Ġthe Ġfirst . ĠIf Ġthe Ġfirst Ġis Ġ` null `, ĊĠĠĠĠ Ġ* Ġthen Ġthe Ġsecond Ġ` Collection ` Ġis Ġreturned Ġand Ġif Ġthe Ġsecond Ġis Ġ` null ` Ġthen Ġthe Ġfirst Ġis Ġreturned . ĊĠĠĠĠ Ġ* ĠIf Ġboth Ġare Ġ` null ` Ġthen Ġ` null ` Ġis Ġreturned . ĠArguments Ġmust Ġbe Ġof Ġtype Ġ` Map ` Ġor ĊĠĠĠĠ Ġ* Ġ` Collection `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġsemantics Ġdescribed Ġabove Ġfor Ġ` Collection ` Ġare Ġthe Ġsame Ġwhen Ġapplied Ġto Ġa Ġ` Map `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 3 . 2 . 0 - inc ub ating ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġadd All Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġapply ( a : ĠObject ?, Ġb : ĠObject ?): ĠObject ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġa Ġ|| Ġnull Ġ== Ġb ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( null Ġ== Ġa Ġ&& Ġnull Ġ== Ġb ) Ġnull Ġelse Ġif Ġ( null Ġ== Ġb ) Ġa Ġelse Ġb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a Ġis ĠMap Ġ&& Ġb Ġis ĠMap ) Ġ( a Ġas ĠMap < *, Ġ*> ). put All ( b Ġas ĠMap ?) Ġelse Ġif Ġ( a Ġis ĠCollection Ġ&& Ġa Ġis ĠCollection ) Ġ( a Ġas ĠCollection < *> ). addAll ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb Ġas ĠCollection ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Objects Ġmust Ġbe Ġboth Ġof ĠMap Ġor ĠCollection : Ġa =% s Ġb =% s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . getClass (). getSimpleName (), Ġb . getClass (). getSimpleName () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġa ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSum s Ġand Ġadds Ġlong Ġvalues . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ since Ġ 3 . 2 . 0 - inc ub ating ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsum Long Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġapply ( a : ĠObject , Ġb : ĠObject ): ĠObject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġa Ġas ĠLong Ġ+ Ġb Ġas ĠLong ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }