/* Ċ Ġ* Ġ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 . function . Constant Supplier Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Traversal ] Ġcan Ġmaintain Ġglobal Ġside Effects . Ċ Ġ* ĠUn like Ġ[ Tra verser ] Ġ" s acks " Ġwhich Ġare Ġlocal Ġside Effects , ĠTra versal Side Effects Ġare Ġaccessible Ġby Ġall Ġ[ Tra verser ] Ġinstances Ġwithin Ġthe Ġ[ Traversal ]. Ċ Ġ* Ċ Ġ* Ġ@ author ĠMark o ĠA . ĠRod rig ue z Ġ( http :// mark or od rig ue z . com ) Ċ Ġ*/ Ċ interface ĠTra versal Side Effects Ġ: ĠClone able , ĠSerializable , ĠAuto Closeable Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġtrue Ġif Ġthe Ġkey Ġis Ġa Ġregistered Ġside - effect . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkey Ġthe Ġkey Ġto Ġcheck Ġfor Ġexistence ĊĠĠĠĠ Ġ* Ġ@ return Ġwhether Ġthe Ġkey Ġexists Ġor Ġnot ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġexists ( key : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġkeys (). contains ( key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġside Effect Ġassociated Ġwith Ġthe Ġprovided Ġkey . ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġside Effect Ġcontains Ġan Ġobject Ġfor Ġthe Ġkey , Ġreturn Ġit . ĊĠĠĠĠ Ġ* ĠElse Ġif Ġthe Ġside Effect Ġhas Ġa Ġregistered Ġ` Supplier ` Ġfor Ġthat Ġkey , Ġgenerate Ġthe Ġobject , Ġstore Ġthe Ġobject Ġin Ġthe Ġside Effects , Ġand Ġreturn Ġit . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkey Ġthe Ġkey Ġto Ġget Ġthe Ġvalue Ġfor ĊĠĠĠĠ Ġ* Ġ@ param Ġ< V > Ġthe Ġtype Ġof Ġthe Ġvalue Ġto Ġretrieve ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġvalue Ġassociated Ġwith Ġkey ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġthe Ġkey Ġdoes Ġnot Ġreference Ġan Ġobject Ġor Ġa Ġregistered Ġsupplier . ĊĠĠĠ Ġ</ V > Ġ*/ ĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġoperator Ġfun Ġ< V > Ġget ( key : ĠString ?): ĠV ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġspecified Ġkey Ġto Ġthe Ġspecified Ġvalue . ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġshould Ġnot Ġbe Ġused Ġin Ġa Ġdistributed Ġenvironment . ĠInstead , Ġuse Ġ[ Traversal Side Effects . add ]. ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġis Ġonly Ġsafe Ġwhen Ġthere Ġis Ġonly Ġone Ġrepresentation Ġof Ġthe Ġside - effect Ġand Ġthus , Ġnot Ġdistributed Ġacross Ġthreads Ġor Ġmachines . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkey ĠĠ Ġthe Ġkey Ġthey Ġkey Ġof Ġthe Ġside - effect ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue Ġthe Ġvalue Ġthe Ġnew Ġvalue Ġfor Ġthe Ġside - effect ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġthe Ġkey Ġdoes Ġnot Ġreference Ġa Ġregistered Ġside - effect . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġoperator Ġfun Ġset ( key : ĠString ?, Ġvalue : ĠObject ?) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġboth Ġthe Ġvalue Ġand Ġregistered Ġ[ java . util . function . Supplier ] Ġassociated Ġwith Ġprovided Ġkey . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkey Ġthe Ġkey Ġof Ġthe Ġvalue Ġand Ġregistered Ġsupplier Ġto Ġremove ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove ( key : ĠString ?) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġkeys Ġof Ġthe Ġside Effect Ġwhich Ġincludes Ġregistered Ġ` Supplier ` Ġkeys . ĠIn Ġess ence , Ġthat Ġwhich Ġis Ġpossible ĊĠĠĠĠ Ġ* Ġto Ġ[. get ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġkeys Ġof Ġthe Ġside Effect ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġkeys (): ĠSet < String ?> ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIn validate Ġthe Ġside Ġeffect Ġcache Ġfor Ġtraversal . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetermines Ġif Ġthere Ġare Ġany Ġside - effects Ġto Ġbe Ġretrieved . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval ĠisEmpty : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġkeys (). size () Ġ=== Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegister Ġa Ġside - effect Ġwith Ġthe Ġ[ Traversal Side Effects ] Ġproviding Ġa Ġ[ Supplier ] Ġand Ġa Ġ[ Binary Operator ]. ĊĠĠĠĠ Ġ* ĠIf Ġa Ġnull Ġvalue Ġis Ġprovided Ġfor Ġthe Ġsupplier Ġor Ġreducer , Ġthen Ġit Ġno Ġsupplier Ġor Ġreducer Ġis Ġregistered . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkey ĠĠĠĠĠĠĠĠĠ Ġthe Ġkey Ġof Ġthe Ġside - effect Ġvalue ĊĠĠĠĠ Ġ* Ġ@ param Ġinitial Value Ġthe Ġinitial Ġvalue Ġsupplier ĊĠĠĠĠ Ġ* Ġ@ param Ġreducer ĠĠĠĠĠ Ġthe Ġreducer Ġto Ġuse Ġfor Ġmerging Ġa Ġdistributed Ġside - effect Ġvalue Ġinto Ġa Ġsingle Ġvalue ĊĠĠĠĠ Ġ* Ġ@ param Ġ< V > ĠĠĠĠĠĠĠĠĠ Ġthe Ġtype Ġof Ġthe Ġside - effect Ġvalue ĊĠĠĠ Ġ</ V > Ġ*/ ĊĠĠĠ Ġfun Ġ< V > Ġregister ( key : ĠString ?, Ġinitial Value : ĠSupplier < V > ?, Ġreducer : ĠBinary Operator < V > ?) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegister Ġa Ġside - effect Ġwith Ġthe Ġ[ Traversal Side Effects ] Ġproviding Ġa Ġ[ Supplier ] Ġand Ġa Ġ[ Binary Operator ]. ĊĠĠĠĠ Ġ* ĠThe Ġregistration Ġwill Ġonly Ġoverwrite Ġa Ġsupplier Ġor Ġreducer Ġif Ġno Ġsupplier Ġor Ġreducer Ġexisted Ġprior . ĊĠĠĠĠ Ġ* ĠIf Ġa Ġnull Ġvalue Ġis Ġprovided Ġfor Ġthe Ġsupplier Ġor Ġreducer , Ġthen Ġit Ġno Ġsupplier Ġor Ġreducer Ġis Ġregistered . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkey ĠĠĠĠĠĠĠĠĠ Ġthe Ġkey Ġof Ġthe Ġside - effect Ġvalue ĊĠĠĠĠ Ġ* Ġ@ param Ġinitial Value Ġthe Ġinitial Ġvalue Ġsupplier ĊĠĠĠĠ Ġ* Ġ@ param Ġreducer ĠĠĠĠĠ Ġthe Ġreducer Ġto Ġuse Ġfor Ġmerging Ġa Ġdistributed Ġside - effect Ġvalue Ġinto Ġa Ġsingle Ġvalue ĊĠĠĠĠ Ġ* Ġ@ param Ġ< V > ĠĠĠĠĠĠĠĠĠ Ġthe Ġtype Ġof Ġthe Ġside - effect Ġvalue ĊĠĠĠ Ġ</ V > Ġ*/ ĊĠĠĠ Ġfun Ġ< V > Ġregister If Absent ( key : ĠString ?, Ġinitial Value : ĠSupplier < V > ?, Ġreducer : ĠBinary Operator < V > ?) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġreducer Ġassociated Ġwith Ġthe Ġside - effect Ġkey . ĠIf Ġno Ġreducer Ġwas Ġregistered , Ġthen Ġ[ Operator . assign ] Ġis Ġprovided . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkey Ġthe Ġkey Ġof Ġthe Ġside - effect ĊĠĠĠĠ Ġ* Ġ@ param Ġ< V > Ġthe Ġtype Ġof Ġthe Ġside - effect Ġvalue ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġregistered Ġreducer ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġno Ġside - effect Ġexists Ġfor Ġthe Ġprovided Ġkey ĊĠĠĠ Ġ</ V > Ġ*/ ĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġfun Ġ< V > Ġget Reducer ( key : ĠString ?): ĠBinary Operator < V >? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġsupplier Ġassociated Ġwith Ġthe Ġside - effect Ġkey . ĠIf Ġno Ġsupplier Ġwas Ġregistered , Ġthen Ġ[ Constant Supplier ] Ġis Ġprovided . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkey Ġthe Ġkey Ġof Ġthe Ġside - effect ĊĠĠĠĠ Ġ* Ġ@ param Ġ< V > Ġthe Ġtype Ġof Ġthe Ġside - effect Ġvalue ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġregistered Ġsupplier ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġno Ġside - effect Ġexists Ġfor Ġthe Ġprovided Ġkey ĊĠĠĠ Ġ</ V > Ġ*/ ĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġfun Ġ< V > Ġget Supplier ( key : ĠString ?): ĠSupplier < V >? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġa Ġvalue Ġto Ġthe Ġglobal Ġside - effect Ġvalue . ĊĠĠĠĠ Ġ* ĠThis Ġshould Ġbe Ġused Ġby Ġsteps Ġto Ġensure Ġthat Ġside - effects Ġare Ġmerged Ġproperly Ġin Ġa Ġdistributed Ġenvironment . ĊĠĠĠĠ Ġ* Ġ[ Traversal Side Effects . set ] Ġ Ġshould Ġonly Ġbe Ġused Ġin Ġsingle - threaded Ġsystems Ġor Ġby Ġa Ġmaster Ġtraversal Ġin Ġa Ġdistributed Ġenvironment . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkey ĠĠ Ġthe Ġkey Ġof Ġthe Ġside - effect . ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue Ġthe Ġpart ital Ġvalue Ġ( to Ġbe Ġmerged ) Ġof Ġthe Ġside - effect . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġno Ġside - effect Ġexists Ġfor Ġthe Ġprovided Ġkey ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġfun Ġadd ( key : ĠString ?, Ġvalue : ĠObject ?) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġinitial Ġvalue Ġof Ġeach Ġ[ Tra verser ] Ġ" s ack " Ġalong Ġwith Ġthe Ġoperators Ġfor Ġsplitting Ġand Ġmerging Ġs acks . ĊĠĠĠĠ Ġ* ĠIf Ġno Ġsplit Ġoperator Ġis Ġprovided , Ġthen Ġa Ġdirect Ġmemory Ġcopy Ġis Ġassumed Ġ( this Ġis Ġtypically Ġgood Ġfor Ġprimitive Ġtypes Ġand Ġstrings ). ĊĠĠĠĠ Ġ* ĠIf Ġno Ġmerge Ġoperator Ġis Ġprovided , Ġthen Ġtra vers ers Ġwith Ġs acks Ġwill Ġnot Ġbe Ġmerged . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġinitial Value Ġ Ġthe Ġinitial Ġvalue Ġsupplier Ġof Ġthe Ġtra verser Ġs ack ĊĠĠĠĠ Ġ* Ġ@ param Ġsplit Operator Ġthe Ġsplit Ġoperator Ġfor Ġsplitting Ġtra verser Ġs acks ĊĠĠĠĠ Ġ* Ġ@ param Ġmerge Operator Ġthe Ġmerge Ġoperator Ġfor Ġmerging Ġtra verser Ġs acks ĊĠĠĠĠ Ġ* Ġ@ param Ġ< S > ĠĠĠĠĠĠĠĠĠĠ Ġthe Ġs ack Ġtype ĊĠĠĠ Ġ</ S > Ġ*/ ĊĠĠĠ Ġfun Ġ< S > Ġset S ack ( initial Value : ĠSupplier < S > ?, Ġsplit Operator : ĠUnary Operator < S > ?, Ġmerge Operator : ĠBinary Operator < S > ?) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġs acks Ġare Ġenabled , Ġget Ġthe Ġinitial Ġvalue Ġof Ġthe Ġ[ Tra verser ] Ġs ack . ĊĠĠĠĠ Ġ* ĠIf Ġits Ġnot Ġenabled , Ġthen Ġ` null ` Ġis Ġreturned . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ< S > Ġthe Ġs ack Ġtype ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġsupplier Ġof Ġthe Ġinitial Ġvalue Ġof Ġthe Ġtra verser Ġs ack ĊĠĠĠ Ġ</ S > Ġ*/ ĊĠĠĠ Ġfun Ġ< S > ĠgetS ack Initial Value (): ĠSupplier < S >? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġs acks Ġare Ġenabled Ġand Ġa Ġsplit Ġoperator Ġhas Ġbeen Ġspecified , Ġthen Ġget Ġit Ġ( else Ġget Ġ` null `). ĊĠĠĠĠ Ġ* ĠThe Ġsplit Ġoperator Ġis Ġused Ġto Ġsplit Ġa Ġs ack Ġwhen Ġa Ġb if ur c ation Ġin Ġa Ġ[ Tra verser ] Ġhappens . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ< S > Ġthe Ġs ack Ġtype ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġoperator Ġfor Ġsplitting Ġa Ġtra verser Ġs ack ĊĠĠĠ Ġ</ S > Ġ*/ ĊĠĠĠ Ġfun Ġ< S > ĠgetS ack Splitter (): ĠUnary Operator < S >? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġs acks Ġare Ġenabled Ġand Ġa Ġmerge Ġfunction Ġhas Ġbeen Ġspecified , Ġthen Ġget Ġit Ġ( else Ġget Ġ` null `). ĊĠĠĠĠ Ġ* ĠThe Ġmerge Ġfunction Ġis Ġused Ġto Ġmerge Ġtwo Ġs acks Ġwhen Ġtwo Ġ[ Tra verser ] s Ġconver ge . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ< S > Ġthe Ġs ack Ġtype ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġoperator Ġfor Ġmerging Ġtwo Ġtra verser Ġs acks ĊĠĠĠ Ġ</ S > Ġ*/ ĊĠĠĠ Ġfun Ġ< S > ĠgetS ack Mer ger (): ĠBinary Operator < S >? ĊĊĠĠĠ Ġ// //////// // ĊĠĠĠ Ġfun Ġ< V > ĠforEach ( bi Consumer : ĠBi Consumer < String ?, ĠV >) Ġ{ ĊĠĠĠĠĠĠĠ Ġkeys (). forEach Ġ{ Ġkey Ġ-> Ġbi Consumer . accept ( key , Ġget < V >( key )) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCl oning Ġis Ġused Ġto Ġduplicate Ġthe Ġside Effects Ġtypically Ġin Ġdistributed Ġexecution Ġenvironments . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġcloned Ġside Effects ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ SuppressWarnings (" Clone Does nt Declare Clone NotSupportedException ") ĊĠĠĠ Ġfun Ġclone (): ĠTra versal Side Effects ? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġthe Ġcurrent Ġ[ Traversal Side Effects ] Ġvalues , Ġsupp liers , Ġand Ġreduc ers Ġto Ġthe Ġprovided Ġ[ Traversal Side Effects ]. ĊĠĠĠĠ Ġ* ĠThe Ġimplementation Ġshould Ġ( under Ġthe Ġh ood ), Ġuse Ġ[ Traversal Side Effects . register If Absent ] Ġso Ġthat ĊĠĠĠĠ Ġ* Ġif Ġthe Ġargument Ġ[ Traversal Side Effects ] Ġalready Ġhas Ġa Ġregistered Ġsupplier Ġor Ġbinary Ġoperator , Ġthen Ġdon 't Ġoverwrite Ġit . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġside Effects Ġthe Ġside Effects Ġto Ġadd Ġthis Ġtraversal 's Ġside Effect Ġdata Ġto . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmerge Into ( side Effects : ĠTra versal Side Effects ?) ĊĊĠĠĠ Ġobject ĠExceptions Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġside Effect Key Can Not Be Empty (): ĠIllegalArgumentException Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIllegalArgumentException (" Side - effect Ġkey Ġcan Ġnot Ġbe Ġthe Ġempty Ġstring ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġside Effect Key Can Not BeNull (): ĠIllegalArgumentException Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIllegalArgumentException (" Side - effect Ġkey Ġcan Ġnot Ġbe Ġnull ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġside Effect Value Can Not BeNull (): ĠIllegalArgumentException Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIllegalArgumentException (" Side - effect Ġvalue Ġcan Ġnot Ġbe Ġnull ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġside Effect Key DoesNotExist ( key : ĠString ): ĠIllegalArgumentException Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIllegalArgumentException (" The Ġside - effect Ġkey Ġdoes Ġnot Ġexist Ġin Ġthe Ġside - effects : Ġ$ key ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }