package Ġnet . cord a . core . utilities Ċ Ċ import Ġcom . es ot eric software . k ry o . K ry o Ċ import Ġcom . es ot eric software . k ry o . Serializer Ċ import Ġcom . es ot eric software . k ry o . io . Input Ċ import Ġcom . es ot eric software . k ry o . io . Output Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠA Ġset Ġwhich Ġis Ġconstr ained Ġto Ġensure Ġit Ġcan Ġnever Ġbe Ġempty . ĠAn Ġinitial Ġvalue Ġmust Ġbe Ġprovided Ġat Ċ Ġ* Ġconstruction , Ġand Ġattempting Ġto Ġremove Ġthe Ġlast Ġelement Ġwill Ġcause Ġan ĠIllegalStateException . Ċ Ġ* ĠThe Ġunderlying Ġset Ġis Ġexposed Ġfor ĠK ry o Ġto Ġaccess , Ġbut Ġshould Ġnot Ġbe Ġaccessed Ġdirectly . Ċ Ġ*/ Ċ class ĠNon Empty Set < T >( initial : ĠT ) Ġ: ĠMutable Set < T > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġset : ĠMutable Set < T > Ġ= ĠHashSet () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġset . add ( initial ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġset . size ĊĊĠĠĠ Ġoverride Ġfun Ġadd ( element : ĠT ): ĠBoolean Ġ= Ġset . add ( element ) ĊĠĠĠ Ġoverride Ġfun Ġadd All ( elements : ĠCollection < T >): ĠBoolean Ġ= Ġset . addAll ( elements ) ĊĠĠĠ Ġoverride Ġfun Ġclear () Ġ= Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġoverride Ġfun Ġcontains ( element : ĠT ): ĠBoolean Ġ= Ġset . contains ( element ) ĊĠĠĠ Ġoverride Ġfun Ġcontains All ( elements : ĠCollection < T >): ĠBoolean Ġ= Ġset . contains All ( elements ) ĊĠĠĠ Ġoverride Ġfun ĠisEmpty (): ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠMutable Iterator < T > Ġ= ĠIterator ( set . iterator ()) ĊĊĠĠĠ Ġoverride Ġfun Ġremove ( element : ĠT ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTest Ġeither Ġthere 's Ġmore Ġthan Ġone Ġelement , Ġor Ġthe Ġremoval Ġis Ġa Ġno - op ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ> Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset . remove ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(! contains ( element )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException () ĊĊĠĠĠ Ġoverride Ġfun Ġremove All ( elements : ĠCollection < T >): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ> Ġelements . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset . removeAll ( elements ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(! contains All ( elements )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġthe Ġcommon Ġelements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset . removeAll ( elements ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException () ĊĊĠĠĠ Ġoverride Ġfun Ġretain All ( elements : ĠCollection < T >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġiterator () ĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġiterator Ġwill Ġthrow Ġan ĠIllegalStateException Ġif Ġwe Ġtry Ġremoving Ġthe Ġlast Ġelement ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! elements . contains ( iterator . next ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Ġis ĠSet <* >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelegate Ġdown Ġto Ġthe Ġwrapped Ġset 's Ġequals () Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Ġ== Ġother ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġset . hashCode () ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġset . toString () ĊĊĠĠĠ Ġinner Ġclass ĠIterator < out ĠT >( val Ġiterator : ĠMutable Iterator < T >) Ġ: ĠMutable Iterator < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ= Ġiterator . hasNext () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠT Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( set . size Ġ> Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T > Ġnon Empty Set Of ( initial : ĠT , Ġvar arg Ġelements : ĠT ): ĠNon Empty Set < T > Ġ{ ĊĠĠĠ Ġval Ġset Ġ= ĠNon Empty Set ( initial ) ĊĠĠĠ Ġ// ĠWe Ġadd Ġthe Ġfirst Ġelement Ġtwice , Ġbut Ġit 's Ġa Ġset , Ġso Ġwho Ġca res ĊĠĠĠ Ġset . addAll ( elements ) ĊĠĠĠ Ġreturn Ġset Ċ } Ċ Ċ /** Ċ Ġ* ĠCustom Ġserializer Ġwhich Ġunderstand s Ġit Ġhas Ġto Ġread Ġin Ġan Ġitem Ġbefore Ċ Ġ* Ġtrying Ġto Ġconstruct Ġthe Ġset . Ċ Ġ*/ Ċ object ĠNon Empty Set Serializer Ġ: ĠSerializer < Non Empty Set < Any >>() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġwrite ( k ry o : ĠK ry o , Ġoutput : ĠOutput , Ġobj : ĠNon Empty Set < Any >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWrite Ġout Ġthe Ġcontents Ġas Ġnormal ĊĠĠĠĠĠĠĠ Ġoutput . writeInt ( obj . size ) ĊĠĠĠĠĠĠĠ Ġobj . forEach Ġ{ Ġk ry o . write Class And Object ( output , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread ( k ry o : ĠK ry o , Ġinput : ĠInput , Ġtype : ĠClass < Non Empty Set < Any >> ): ĠNon Empty Set < Any > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġinput . readInt () ĊĠĠĠĠĠĠĠ Ġrequire ( size Ġ>= Ġ 1 ) Ġ{ Ġ" Size Ġis Ġpositive " Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠIs Ġthere Ġan Ġupper Ġlimit Ġwe Ġcan Ġapply Ġto Ġhow Ġbig Ġone Ġof Ġthese Ġcould Ġbe ? ĊĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġk ry o . read Class And Object ( input ) ĊĠĠĠĠĠĠĠ Ġ// ĠRead Ġthe Ġfirst Ġitem Ġand Ġuse Ġit Ġto Ġconstruct Ġthe ĠNon Empty Set ĊĠĠĠĠĠĠĠ Ġval Ġset Ġ= ĠNon Empty Set ( first ) ĊĠĠĠĠĠĠĠ Ġ// ĠRead Ġin Ġthe Ġrest Ġof Ġthe Ġset ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 2 .. size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset . add ( k ry o . read Class And Object ( input )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġset ĊĠĠĠ Ġ} Ċ } Ċ