/* Ċ Ġ* Ġ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 . util Ċ Ċ import Ġorg . apache . t inker pop 4 . gre mlin . process . traversal . Step Ċ Ċ /** Ċ Ġ* Ġ@ author ĠMark o ĠA . ĠRod rig ue z Ġ( http :// mark or od rig ue z . com ) Ċ Ġ*/ Ċ object ĠTra versal Util Ġ{ ĊĠĠĠ Ġfun Ġ< S , ĠE > Ġapply ( tra verser : ĠTr aver ser . Admin < S >, Ġtraversal : ĠTra versal . Admin < S , ĠE >): ĠE Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsplit : ĠTr aver ser < S > Ġ= Ġprepare < Any , ĠAny >( tra verser , Ġtraversal ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtraversal . next () Ġ// Ġmap ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch ElementException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclazz Of Tra verser Value Ġ= Ġif Ġ( null Ġ== Ġsplit . get ()) Ġ" null " Ġelse Ġsplit . get (). getClass (). getSimpleName () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġprovided Ġtra verser Ġdoes Ġnot Ġmap Ġto Ġa Ġvalue : Ġ% s [% s ]-> % s [% s ] Ġparent [% s ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclazz Of Tra verser Value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtraversal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtraversal . getClass (). getSimpleName (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtraversal . getParent (). as Step (). get Traversal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Close Ġthe Ġtraversal Ġto Ġrelease Ġany Ġunderlying Ġresources . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClose able Iterator . close Iterator ( traversal ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S , ĠE > Ġapply ( start : ĠS , Ġtraversal : ĠTra versal . Admin < S , ĠE >): ĠE Ġ{ ĊĠĠĠĠĠĠĠ Ġtraversal . reset () ĊĠĠĠĠĠĠĠ Ġtraversal . add Start ( traversal . get Tra verser Generator (). generate ( start , Ġtraversal . getStart Step (), Ġ 1 L )) ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtraversal . next () Ġ// Ġmap ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch ElementException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" The Ġprovided Ġstart Ġdoes Ġnot Ġmap Ġto Ġa Ġvalue : Ġ$ start ->$ traversal ") ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Close Ġthe Ġtraversal Ġto Ġrelease Ġany Ġunderlying Ġresources . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClose able Iterator . close Iterator ( traversal ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S , ĠE > Ġapply Nullable ( start : ĠS , Ġtraversal : ĠTra versal . Admin < S , ĠE >? ): ĠE Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( null Ġ== Ġtraversal ) Ġstart Ġas ĠE Ġelse Ġapply ( start , Ġtraversal ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S , ĠE > Ġapply Nullable ( tra verser : ĠTr aver ser . Admin < S >, Ġtraversal : ĠTra versal . Admin < S , ĠE >? ): ĠE Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( null Ġ== Ġtraversal ) Ġtra verser . get () Ġelse Ġapply ( tra verser , Ġtraversal ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S , ĠE > Ġapply All ( tra verser : ĠTr aver ser . Admin < S >, Ġtraversal : ĠTra versal . Admin < S , ĠE >): ĠIterator < E > Ġ{ ĊĠĠĠĠĠĠĠ Ġprepare < Any , ĠAny >( tra verser , Ġtraversal ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtraversal Ġ// Ġfl atmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S , ĠE > Ġapply All ( start : ĠS , Ġtraversal : ĠTra versal . Admin < S , ĠE >): ĠIterator < E > Ġ{ ĊĠĠĠĠĠĠĠ Ġtraversal . reset () ĊĠĠĠĠĠĠĠ Ġtraversal . add Start ( traversal . get Tra verser Generator (). generate ( start , Ġtraversal . getStart Step (), Ġ 1 L )) ĊĠĠĠĠĠĠĠ Ġreturn Ġtraversal Ġ// Ġflat Map ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S , ĠE > Ġtest ( tra verser : ĠTr aver ser . Admin < S >, Ġtraversal : ĠTra versal . Admin < S , ĠE >, Ġend : ĠE ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġend ) Ġreturn Ġtest ( tra verser , Ġtraversal ) ĊĠĠĠĠĠĠĠ Ġprepare < Any , ĠAny >( tra verser , Ġtraversal ) ĊĠĠĠĠĠĠĠ Ġval Ġend Step : ĠStep < *, ĠE > Ġ= Ġtraversal . getEnd Step () ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġwhile Ġ( traversal . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Step . next (). get (). equals ( end )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġtraversal Ġmight Ġnot Ġhave Ġbeen Ġfully Ġconsumed Ġin Ġthe Ġloop Ġabove . ĠClose Ġthe Ġtraversal Ġto Ġrelease Ġany Ġunderlying ĊĠĠĠĠĠĠĠ Ġ// Ġresources . ĊĠĠĠĠĠĠĠ ĠClose able Iterator . close Iterator ( traversal ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S , ĠE > Ġproduce ( tra verser : ĠTr aver ser . Admin < S >, Ġtraversal : ĠTra versal . Admin < S , ĠE >? ): ĠTra versal Product Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( null Ġ== Ġtraversal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTra versal Product ( tra verser . get ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepare < Any , ĠAny >( tra verser , Ġtraversal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( traversal . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTra versal Product ( traversal . next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTra versal Product . UN PRODUCT IVE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClose able Iterator . close Iterator ( traversal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S , ĠE > Ġproduce ( start : ĠS , Ġtraversal : ĠTra versal . Admin < S , ĠE >? ): ĠTra versal Product Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( null Ġ== Ġtraversal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTra versal Product ( start ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtraversal . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtraversal . add Start ( traversal . get Tra verser Generator (). generate ( start , Ġtraversal . getStart Step (), Ġ 1 L )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( traversal . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTra versal Product ( traversal . next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTra versal Product . UN PRODUCT IVE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClose able Iterator . close Iterator ( traversal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S , ĠE > Ġtest ( tra verser : ĠTr aver ser . Admin < S >, Ġtraversal : ĠTra versal . Admin < S , ĠE >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġprepare < Any , ĠAny >( tra verser , Ġtraversal ) ĊĠĠĠĠĠĠĠ Ġval Ġ` val `: ĠBoolean Ġ= Ġtraversal . hasNext () Ġ// Ġfilter ĊĊĠĠĠĠĠĠĠ Ġ// Close Ġthe Ġtraversal Ġto Ġrelease Ġany Ġunderlying Ġresources . ĊĠĠĠĠĠĠĠ ĠClose able Iterator . close Iterator ( traversal ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ` val ` ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S , ĠE > Ġtest ( start : ĠS , Ġtraversal : ĠTra versal . Admin < S , ĠE >, Ġend : ĠE ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġend ) Ġreturn Ġtest < S , ĠAny >( start , Ġtraversal ) ĊĠĠĠĠĠĠĠ Ġtraversal . reset () ĊĠĠĠĠĠĠĠ Ġtraversal . add Start ( traversal . get Tra verser Generator (). generate ( start , Ġtraversal . getStart Step (), Ġ 1 L )) ĊĠĠĠĠĠĠĠ Ġval Ġend Step : ĠStep < *, ĠE > Ġ= Ġtraversal . getEnd Step () ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġwhile Ġ( traversal . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Step . next (). get (). equals ( end )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Close Ġthe Ġtraversal Ġto Ġrelease Ġany Ġunderlying Ġresources . ĊĠĠĠĠĠĠĠ ĠClose able Iterator . close Iterator ( traversal ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S , ĠE > Ġtest ( start : ĠS , Ġtraversal : ĠTra versal . Admin < S , ĠE >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtraversal . reset () ĊĠĠĠĠĠĠĠ Ġtraversal . add Start ( traversal . get Tra verser Generator (). generate ( start , Ġtraversal . getStart Step (), Ġ 1 L )) ĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠBoolean Ġ= Ġtraversal . hasNext () Ġ// Ġfilter ĊĊĠĠĠĠĠĠĠ Ġ// Close Ġthe Ġtraversal Ġto Ġrelease Ġany Ġunderlying Ġresources . ĊĠĠĠĠĠĠĠ ĠClose able Iterator . close Iterator ( traversal ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< S , ĠE > Ġprepare ( tra verser : ĠTr aver ser . Admin < S >, Ġtraversal : ĠTra versal . Admin < S , ĠE >): ĠTr aver ser < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsplit : ĠTr aver ser . Admin < S > Ġ= Ġtra verser . split () ĊĠĠĠĠĠĠĠ Ġsplit . set Side Effects ( traversal . get Side Effects ()) ĊĠĠĠĠĠĠĠ Ġsplit . set Bulk ( 1 L ) ĊĠĠĠĠĠĠĠ Ġtraversal . reset () ĊĠĠĠĠĠĠĠ Ġtraversal . add Start ( split ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsplit ĊĠĠĠ Ġ} Ċ }