/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - 2 0 1 7 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġ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 Ġkotlinx . collections . immutable Ċ Ċ /** Ċ Ġ* ĠA Ġgeneric Ġimmutable Ġunordered Ġcollection Ġof Ġelements Ġthat Ġdoes Ġnot Ġsupport Ġduplicate Ġelements . Ċ Ġ* ĠMethods Ġin Ġthis Ġinterface Ġsupport Ġonly Ġread - only Ġaccess Ġto Ġthe Ġimmutable Ġset . Ċ Ġ* Ċ Ġ* ĠMod ification Ġoperations Ġare Ġsupported Ġthrough Ġthe Ġ[ Persistent Set ] Ġinterface . Ċ Ġ* Ċ Ġ* ĠImplement ors Ġof Ġthis Ġinterface Ġtake Ġresponsibility Ġto Ġbe Ġimmutable . Ċ Ġ* ĠOnce Ġconstructed Ġthey Ġmust Ġcontain Ġthe Ġsame Ġelements Ġin Ġthe Ġsame Ġorder . Ċ Ġ* Ċ Ġ* Ġ@ param ĠE Ġthe Ġtype Ġof Ġelements Ġcontained Ġin Ġthe Ġset . ĠThe Ġset Ġis Ġco variant Ġon Ġits Ġelement Ġtype . Ċ Ġ*/ Ċ public Ġinterface ĠImmutable Set < out ĠE >: ĠSet < E >, ĠImmutable Collection < E > Ċ Ċ /** Ċ Ġ* ĠA Ġgeneric Ġpersistent Ġunordered Ġcollection Ġof Ġelements Ġthat Ġdoes Ġnot Ġsupport Ġduplicate Ġelements , Ġand Ġsupports Ċ Ġ* Ġadding Ġand Ġremoving Ġelements . Ċ Ġ* Ċ Ġ* ĠMod ification Ġoperations Ġreturn Ġnew Ġinstances Ġof Ġthe Ġpersistent Ġset Ġwith Ġthe Ġmodification Ġapplied . Ċ Ġ* Ċ Ġ* Ġ@ param ĠE Ġthe Ġtype Ġof Ġelements Ġcontained Ġin Ġthe Ġset . ĠThe Ġpersistent Ġset Ġis Ġco variant Ġon Ġits Ġelement Ġtype . Ċ Ġ*/ Ċ public Ġinterface ĠPersistent Set < out ĠE > Ġ: ĠImmutable Set < E >, ĠPersistent Collection < E > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġresult Ġof Ġadding Ġthe Ġspecified Ġ[ element ] Ġto Ġthis Ġset . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġnew Ġpersistent Ġset Ġwith Ġthe Ġspecified Ġ[ element ] Ġadded ; ĊĠĠĠĠ Ġ* Ġor Ġthis Ġinstance Ġif Ġit Ġalready Ġcontains Ġthe Ġelement . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġadd ( element : Ġ@ Unsafe Variance ĠE ): ĠPersistent Set < E > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġresult Ġof Ġadding Ġall Ġelements Ġof Ġthe Ġspecified Ġ[ elements ] Ġcollection Ġto Ġthis Ġset . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġnew Ġpersistent Ġset Ġwith Ġelements Ġof Ġthe Ġspecified Ġ[ elements ] Ġcollection Ġadded ; ĊĠĠĠĠ Ġ* Ġor Ġthis Ġinstance Ġif Ġit Ġalready Ġcontains Ġevery Ġelement Ġof Ġthe Ġspecified Ġcollection . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġadd All ( elements : ĠCollection < @ Unsafe Variance ĠE >): ĠPersistent Set < E > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġresult Ġof Ġremoving Ġthe Ġspecified Ġ[ element ] Ġfrom Ġthis Ġset . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġnew Ġpersistent Ġset Ġwith Ġthe Ġspecified Ġ[ element ] Ġremoved ; ĊĠĠĠĠ Ġ* Ġor Ġthis Ġinstance Ġif Ġthere Ġis Ġno Ġsuch Ġelement Ġin Ġthis Ġset . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġremove ( element : Ġ@ Unsafe Variance ĠE ): ĠPersistent Set < E > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġresult Ġof Ġremoving Ġall Ġelements Ġin Ġthis Ġset Ġthat Ġare Ġalso ĊĠĠĠĠ Ġ* Ġcontained Ġin Ġthe Ġspecified Ġ[ elements ] Ġcollection . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġnew Ġpersistent Ġset Ġwith Ġelements Ġin Ġthis Ġset Ġthat Ġare Ġalso ĊĠĠĠĠ Ġ* Ġcontained Ġin Ġthe Ġspecified Ġ[ elements ] Ġcollection Ġremoved ; ĊĠĠĠĠ Ġ* Ġor Ġthis Ġinstance Ġif Ġno Ġmodifications Ġwere Ġmade Ġin Ġthe Ġresult Ġof Ġthis Ġoperation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġremove All ( elements : ĠCollection < @ Unsafe Variance ĠE >): ĠPersistent Set < E > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġresult Ġof Ġremoving Ġall Ġelements Ġin Ġthis Ġset Ġthat Ġmatch Ġthe Ġspecified Ġ[ predicate ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġnew Ġpersistent Ġset Ġwith Ġelements Ġmatching Ġthe Ġspecified Ġ[ predicate ] Ġremoved ; ĊĠĠĠĠ Ġ* Ġor Ġthis Ġinstance Ġif Ġno Ġelements Ġmatch Ġthe Ġpredicate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġremove All ( predicate : Ġ( E ) Ġ-> ĠBoolean ): ĠPersistent Set < E > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġan Ġempty Ġpersistent Ġset . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġclear (): ĠPersistent Set < E > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġgeneric Ġbuilder Ġof Ġthe Ġpersistent Ġset . ĠBuilder Ġexposes Ġits Ġmodification Ġoperations Ġthrough Ġthe Ġ[ Mutable Set ] Ġinterface . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠBuild ers Ġare Ġre usable , Ġthat Ġis Ġ[ build ] Ġmethod Ġcan Ġbe Ġcalled Ġmultiple Ġtimes Ġwith Ġmodifications Ġbetween Ġthese Ġcalls . ĊĠĠĠĠ Ġ* ĠHowever , Ġmodifications Ġapplied Ġdo Ġnot Ġaffect Ġpreviously Ġbuilt Ġpersistent Ġset Ġinstances . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠBuilder Ġis Ġbacked Ġby Ġthe Ġsame Ġunderlying Ġdata Ġstructure Ġas Ġthe Ġpersistent Ġset Ġit Ġwas Ġcreated Ġfrom . ĊĠĠĠĠ Ġ* ĠThus , Ġ[ builder ] Ġand Ġ[ build ] Ġmethods Ġtake Ġconstant Ġtime Ġconsisting Ġof Ġpassing Ġthe Ġbacking Ġstorage Ġto Ġthe ĊĠĠĠĠ Ġ* Ġnew Ġbuilder Ġand Ġpersistent Ġset Ġinstances , Ġrespectively . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġbuilder Ġtracks Ġwhich Ġnodes Ġin Ġthe Ġstructure Ġare Ġshared Ġwith Ġthe Ġpersistent Ġset , ĊĠĠĠĠ Ġ* Ġand Ġwhich Ġare Ġowned Ġby Ġit Ġexclus ively . ĠIt Ġowns Ġthe Ġnodes Ġit Ġcopied Ġduring Ġmodification ĊĠĠĠĠ Ġ* Ġoperations Ġand Ġavoids Ġcopying Ġthem Ġon Ġsubsequent Ġmodifications . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhen Ġ[ build ] Ġis Ġcalled Ġthe Ġbuilder Ġfor gets Ġabout Ġall Ġowned Ġnodes Ġit Ġhad Ġcreated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠBuilder < E >: ĠMutable Set < E >, ĠPersistent Collection . Builder < E > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbuild (): ĠPersistent Set < E > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbuilder (): ĠBuilder < @ Unsafe Variance ĠE > Ċ }