/* Ċ Ġ* Ġ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 . strategy . decoration Ċ Ċ import Ġorg . apache . t inker pop 4 . gre mlin . process . traversal . Traversal Ċ Ċ /** Ċ Ġ* ĠThe Ġ` S ack Strategy ` Ġis Ġused Ġinternal Ġto Ġthe Ġ` with S ack ()` Ġsteps Ġof Ġ[ Traversal Source ] Ġand Ġis Ġnot Ċ Ġ* Ġtypically Ġconstructed Ġdirectly . Ċ Ġ* Ċ Ġ* Ġ@ author ĠMark o ĠA . ĠRod rig ue z Ġ( http :// mark or od rig ue z . com ) Ċ Ġ*/ Ċ class ĠS ack Strategy Ġprivate Ġconstructor ( ĊĠĠĠ Ġinitial Value : ĠSupplier ?, ĊĠĠĠ Ġsplit Operator : ĠUnary Operator , ĊĠĠĠ Ġmerge Operator : ĠBinary Operator Ċ ) Ġ: ĠAbstract Traversal Strategy < Decoration Strategy ?> (), ĠDecor ation Strategy Ġ{ ĊĠĠĠ Ġprivate Ġval Ġinitial Value : ĠSupplier ĊĠĠĠ Ġprivate Ġval Ġsplit Operator : ĠUnary Operator ĊĠĠĠ Ġprivate Ġval Ġmerge Operator : ĠBinary Operator ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġinitial Value ) Ġthrow ĠIllegalArgumentException (" The Ġinitial Ġvalue Ġof Ġa Ġs ack Ġcan Ġnot Ġbe Ġnull ") ĊĠĠĠĠĠĠĠ Ġthis . initial Value Ġ= Ġinitial Value ĊĠĠĠĠĠĠĠ Ġthis . split Operator Ġ= Ġsplit Operator ĊĠĠĠĠĠĠĠ Ġthis . merge Operator Ġ= Ġmerge Operator ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Override ĊĠĠĠ Ġfun Ġapply ( traversal : ĠTra versal . Admin < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( traversal . is Root ()) Ġtraversal . get Side Effects (). set S ack ( initial Value , Ġsplit Operator , Ġmerge Operator ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBuilder < A > Ġprivate Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġinitial Value : ĠSupplier < A >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġsplit Operator : ĠUnary Operator < A >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġmerge Operator : ĠBinary Operator < A >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfun Ġinitial Value ( initial Value : ĠSupplier < A >): ĠBuilder < *> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . initial Value Ġ= Ġinitial Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġsplit Operator ( split Operator : ĠUnary Operator < A >): ĠBuilder < *> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . split Operator Ġ= Ġsplit Operator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġmerge Operator ( merge Operator : ĠBinary Operator < A >): ĠBuilder < *> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . merge Operator Ġ= Ġmerge Operator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate (): ĠS ack Strategy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠS ack Strategy ( initial Value , Ġsplit Operator , Ġmerge Operator ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġ< A > Ġbuild (): ĠBuilder < A > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBuilder () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }