package Ġarrow . fx . stm Ċ Ċ import Ġarrow . fx . stm . internal . H amt Ċ import Ġarrow . fx . stm . internal . new H amt Ċ Ċ public Ġfun Ġ< A > ĠSTM . new T Set ( fn : Ġ( A ) Ġ-> ĠInt ): ĠT Set < A > Ġ= ĠT Set ( new H amt (), Ġfn ) Ċ public Ġfun Ġ< A > ĠSTM . new T Set (): ĠT Set < A > Ġ= Ġnew T Set Ġ{ Ġit . hashCode () Ġ} Ċ Ċ /** Ċ Ġ* Ċ Ġ* ĠA Ġ[ T Set ] Ġis Ġa Ġconcurrent Ġtransaction al Ġimplementation Ġof Ġa Ġhash set . Ċ Ġ* Ċ Ġ* ĠBased Ġon Ġa ĠHash - Array - Mapped - T rie Ġimplementation . ĠWhile Ġthis Ġdoes Ġmean Ġthat Ġa Ġread Ġmay Ġtake Ġup Ġto Ġ 5 Ġsteps Ġto Ġbe Ġresolved Ġ( depend ing Ġon Ġhow Ċ Ġ* Ġ Ġwell Ġdistributed Ġthe Ġhash Ġfunction Ġis ), Ġit Ġalso Ġmeans Ġthat Ġstructural Ġchanges Ġcan Ġbe Ġisolated Ġand Ġthus Ġdo Ġnot Ġincrease Ġcontent ion Ġwith Ċ Ġ* Ġ Ġother Ġtransactions . ĠThis Ġeffectively Ġmeans Ġconcurrent Ġaccess Ġto Ġdifferent Ġvalues Ġis Ġunlikely Ġto Ġinterf ere Ġwith Ġeach Ġother . Ċ Ġ* Ċ Ġ* Ġ> ĠHash Ġconflicts Ġare Ġresolved Ġby Ġchaining . Ċ Ġ* Ċ Ġ* Ġ## ĠCreating Ġa Ġ[ T Set ] Ċ Ġ* Ċ Ġ* ĠDep ending Ġon Ġwhether Ġor Ġnot Ġyou Ġare Ġin Ġa Ġtransaction Ġyou Ġcan Ġuse Ġeither Ġ[ STM . new T Set ] Ġor Ġ[ T Set . new ] Ġto Ġcreate Ġa Ġnew Ġ[ T Set ]. Ċ Ġ* Ċ Ġ* ĠThere Ġare Ġa Ġfew Ġalternatives Ġbecause Ġ[ T Set ] Ġcan Ġbe Ġsupplied Ġa Ġcustom Ġhash Ġstrategy . ĠIf Ġno Ġargument Ġis Ġgiven Ġit Ġdefaults Ġto Ġ[ Any . hashCode ]. Ċ Ġ* Ċ Ġ* Ġ## ĠAdding Ġelements Ġto Ġthe Ġset Ċ Ġ* Ċ Ġ* ĠAdding Ġan Ġelement Ġcan Ġbe Ġachieved Ġby Ġusing Ġeither Ġ[ STM . insert ] Ġor Ġits Ġalias Ġ[ STM . plus Assign ]: Ċ Ġ* Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġimport Ġarrow . fx . stm . T Set Ċ Ġ* Ġimport Ġarrow . fx . stm . atomic ally Ċ Ġ* Ċ Ġ* Ġsuspend Ġfun Ġmain () Ġ{ Ċ Ġ* ĠĠ Ġ// sample Start Ċ Ġ* ĠĠ Ġval Ġt set Ġ= ĠT Set . new < String >() Ċ Ġ* ĠĠ Ġatom ically Ġ{ Ċ Ġ* ĠĠĠĠ Ġt set . insert (" Hello ") Ċ Ġ* ĠĠĠĠ Ġt set Ġ+= Ġ" World " Ċ Ġ* ĠĠ Ġ} Ċ Ġ* ĠĠ Ġ// sample End Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ġ<! --- ĠK N IT Ġexample - t set - 0 1 . kt Ġ--> Ċ Ġ* Ċ Ġ* Ġ## ĠRemoving Ġan Ġelement Ġfrom Ġthe Ġset Ċ Ġ* Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġimport Ġarrow . fx . stm . T Set Ċ Ġ* Ġimport Ġarrow . fx . stm . atomic ally Ċ Ġ* Ċ Ġ* Ġsuspend Ġfun Ġmain () Ġ{ Ċ Ġ* ĠĠ Ġ// sample Start Ċ Ġ* ĠĠ Ġval Ġt set Ġ= ĠT Set . new < String >() Ċ Ġ* ĠĠ Ġatom ically Ġ{ Ċ Ġ* ĠĠĠĠ Ġt set . insert (" Hello ") Ċ Ġ* ĠĠĠĠ Ġt set . remove (" Hello ") Ċ Ġ* ĠĠ Ġ} Ċ Ġ* ĠĠ Ġ// sample End Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ġ<! --- ĠK N IT Ġexample - t set - 0 2 . kt Ġ--> Ċ Ġ* Ċ Ġ* Ġ## ĠChecking Ġfor Ġmembership Ċ Ġ* Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġimport Ġarrow . fx . stm . T Set Ċ Ġ* Ġimport Ġarrow . fx . stm . atomic ally Ċ Ġ* Ċ Ġ* Ġsuspend Ġfun Ġmain () Ġ{ Ċ Ġ* ĠĠ Ġ// sample Start Ċ Ġ* ĠĠ Ġval Ġt set Ġ= ĠT Set . new < String >() Ċ Ġ* ĠĠ Ġval Ġresult Ġ= Ġatom ically Ġ{ Ċ Ġ* ĠĠĠĠ Ġt set . insert (" Hello ") Ċ Ġ* ĠĠĠĠ Ġt set . member (" Hello ") Ċ Ġ* ĠĠ Ġ} Ċ Ġ* ĠĠ Ġ// sample End Ċ Ġ* ĠĠ Ġprintln (" Result Ġ$ result ") Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ġ<! --- ĠK N IT Ġexample - t set - 0 3 . kt Ġ--> Ċ Ġ* Ċ Ġ* Ġ## ĠWhere Ġare Ġoperations Ġlike Ġ` isEmpty ` Ġor Ġ` size `? Ċ Ġ* Ċ Ġ* ĠThis Ġis Ġa Ġdesign Ġtrade off . ĠIt Ġis Ġentirely Ġpossible Ġto Ġtrack Ġsize Ġhowever Ġthis Ġusually Ġrequires Ġone Ġadditional Ġ[ T Var ] Ġfor Ġsize Ġand Ċ Ġ* Ġ Ġalmost Ġevery Ġoperation Ġwould Ġmodify Ġthat . ĠThat Ġwill Ġlead Ġto Ġcontent ion Ġand Ġthus Ġdecrease Ġperformance . Ċ Ġ* Ċ Ġ* ĠShould Ġthis Ġfeature Ġinterest Ġyou Ġand Ġperformance Ġis Ġnot Ġas Ġimportant Ġplease Ġopen Ġan Ġissue . ĠIt Ġis Ġmost Ġcertainly Ġpossible Ġto Ġadd Ġanother Ġversion Ċ Ġ* Ġ Ġof Ġ[ T Set ] Ġthat Ġkeeps Ġtrack Ġof Ġits Ġsize . Ċ Ġ* Ċ Ġ*/ Ċ public Ġdata Ġclass ĠT Set < A > internal Ġconstructor ( internal Ġval Ġh amt : ĠH amt < A >, Ġinternal Ġval Ġhash Fn : Ġ( A ) Ġ-> ĠInt ) Ġ{ ĊĠ Ġpublic Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġpublic Ġsuspend Ġfun Ġ< A > Ġnew ( fn : Ġ( A ) Ġ-> ĠInt ): ĠT Set < A > Ġ= ĠT Set ( H amt . new (), Ġfn ) ĊĠĠĠ Ġpublic Ġsuspend Ġfun Ġ< A > Ġnew (): ĠT Set < A > Ġ= Ġnew Ġ{ Ġit . hashCode () Ġ} ĊĠ Ġ} Ċ } Ċ