package Ġomn ia . data . structure . immutable Ċ Ċ import Ġomn ia . data . iterate . Array Iterator Ċ import Ġomn ia . data . iterate . Integer Range Iterator Ċ import Ġomn ia . data . iterate . Mapping Iterator Ċ import Ġomn ia . data . structure . Int Range Ċ import Ġomn ia . data . structure . List Ċ Ċ class ĠImmutableList < E Ġ: ĠAny > Ġ: ĠList < E > Ġ{ ĊĊĠ Ġprivate Ġval Ġelements : ĠArray < E > ĊĊĠ Ġfun Ġto Builder (): ĠBuilder < E > Ġ{ ĊĠĠĠ Ġreturn Ġbuilder < E >(). addAll ( this ) ĊĠ Ġ} ĊĊĠ Ġclass ĠBuilder < E Ġ: ĠAny > Ġ: ĠAbstract Builder < E , ĠBuilder < E >, ĠImmutableList < E >>() Ġ{ ĊĊĠĠĠ Ġfun Ġinsert At ( index : ĠInt , Ġitem : ĠE ): ĠBuilder < E > Ġ{ ĊĠĠĠĠĠ Ġelements . insert At ( index , Ġitem ) ĊĠĠĠĠĠ Ġreturn Ġself ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove At ( index : ĠInt ): ĠBuilder < E > Ġ{ ĊĠĠĠĠĠ Ġelements . remove At ( index ) ĊĠĠĠĠĠ Ġreturn Ġself ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreplace At ( index : ĠInt , Ġitem : ĠE ): ĠBuilder < E > Ġ{ ĊĠĠĠĠĠ Ġelements . replace At ( index , Ġitem ) ĊĠĠĠĠĠ Ġreturn Ġself ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbuild (): ĠImmutableList < E > Ġ{ ĊĠĠĠĠĠ Ġreturn Ġif Ġ( elements . is Pop ulated ) ĠImmutableList ( this ) Ġelse Ġempty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġself : ĠBuilder < E > ĊĠĠĠĠĠ Ġget () Ġ= Ġthis ĊĠ Ġ} ĊĊĠ Ġprivate Ġconstructor () Ġ{ ĊĠĠĠ Ġ// ĠThe Ġelements Ġarray Ġmust Ġnever Ġbe Ġaccessible Ġextern ally . ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġthis . elements Ġ= ĠarrayOf Null s < Any >( 0 ) Ġas ĠArray < E > ĊĠ Ġ} ĊĊĠ Ġprivate Ġconstructor ( builder : ĠBuilder < E >) Ġ{ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġthis . elements Ġ= ĊĠĠĠĠĠ ĠArray < Any >( builder . elements . count ) Ġ{ Ġbuilder . elements . item At ( it ) Ġ} Ġas ĠArray < E > ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġitem At ( index : ĠInt ): ĠE Ġ{ ĊĠĠĠ Ġif Ġ( index Ġ< Ġ 0 Ġ|| Ġindex Ġ>= Ġelements . size ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIndex OutOfBoundsException ("$ index Ġoutside Ġthe Ġrange Ġempty Ġ[ 0 , ${ elements . size }) ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġelements [ index ] ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠindexOf ( item : ĠAny ?): ĠInt ? Ġ{ ĊĠĠĠ Ġfor Ġ( i Ġin Ġelements . indices ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( item Ġ== Ġelements [ i ]) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġi ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġiterator (): ĠIterator < E > Ġ{ ĊĠĠĠ Ġreturn ĠArray Iterator ( elements ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġval Ġis Pop ulated : ĠBoolean Ġget () Ġ= Ġelements . isNotEmpty () ĊĊĠ Ġoverride Ġfun Ġcontains Unknown Typed ( item : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠ Ġfor Ġ( element 1 Ġin Ġelements ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( item Ġ== Ġelement 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĊĠ Ġoverride Ġval Ġcount Ġget () Ġ= Ġelements . size ĊĊĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( other Ġ! is ĠImmutableList <* >) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġn Ġ= Ġcount ĊĠĠĠ Ġif Ġ( n Ġ!= Ġother . count ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġn ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( item At ( i ) Ġ!= Ġother . item At ( i )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" ImmutableList (${ elements . size }) ${ elements . join ToString (",", Ġ"{ ", Ġ" }") }" ĊĊĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġelements . content HashCode () ĊĊĠ Ġfun Ġget Sub list ( int Range : ĠInt Range ): ĠImmutableList < E > Ġ{ ĊĠĠĠ Ġreturn Ġsub list Starting At ( int Range . start ). length ( int Range . count ) ĊĠ Ġ} ĊĊĠ Ġfun Ġsub list Starting At ( starting Index : ĠInt ): ĠSub list Builder Ġ{ ĊĠĠĠ Ġreturn ĠSub list Builder ( starting Index ) ĊĠ Ġ} ĊĊĠ Ġinner Ġclass ĠSub list Builder ( private Ġval Ġstarting Index : ĠInt ) Ġ{ ĊĊĠĠĠ Ġfun Ġlength ( length : ĠInt ): ĠImmutableList < E > Ġ{ ĊĠĠĠĠĠ Ġreturn Ġto ( starting Index Ġ+ Ġlength ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto ( ending Index : ĠInt ): ĠImmutableList < E > Ġ{ ĊĠĠĠĠĠ Ġrequire ( ending Index Ġ>= Ġstarting Index ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" ending Index Ġmust Ġbe Ġgreater Ġthan Ġor Ġequal Ġto Ġstarting Index . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" starting Index =$ starting Index Ġending Index =$ ending Index " ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġbuilder < E >() ĊĠĠĠĠĠĠĠ Ġ. addAll ( ĊĠĠĠĠĠĠĠĠĠ ĠIterable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMapping Iterator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInteger Range Iterator . create ( starting Index , Ġending Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġindex : ĠInt Ġ-> Ġitem At ( index ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠEMPTY _ LIST : ĠImmutableList < *> Ġ= ĠImmutableList < Any >() ĊĊĠĠĠ Ġfun Ġ< E Ġ: ĠAny > Ġempty (): ĠImmutableList < E > Ġ{ ĊĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠ Ġreturn ĠEMPTY _ LIST Ġas ĠImmutableList < E > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġnew Ġ[ ImmutableList ] Ġinstance Ġusing Ġthe Ġprovided Ġitems Ġas Ġcontents . ĠAt Ġleast ĊĠĠĠĠ Ġ* Ġitem Ġmust Ġbe Ġprovided ; Ġuse Ġ[ empty ] Ġto Ġget Ġan Ġ[ ImmutableList ] Ġwith Ġno Ġcontents . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< E Ġ: ĠAny > Ġof ( first Item : ĠE , Ġvar arg Ġitems : ĠE ): ĠImmutableList < E > Ġ{ ĊĠĠĠĠĠ Ġreturn Ġbuilder < E >(). add ( first Item ). addAll (* items ). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCop ies Ġthe Ġcontents Ġof Ġthe Ġprovided Ġiterable Ġinto Ġa Ġnew Ġ[ ImmutableList ] Ġinstance . ĠIf ĊĠĠĠĠ Ġ* Ġthe Ġprovided Ġiterable Ġis Ġalready Ġan Ġ[ ImmutableList ], Ġthis Ġfunction Ġreturns Ġthe ĊĠĠĠĠ Ġ* Ġoriginal Ġlist Ġwithout Ġcreating Ġa Ġcopy . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< E Ġ: ĠAny > Ġcopy Of ( iterable : ĠIterable < E >): ĠImmutableList < E > Ġ{ ĊĠĠĠĠĠ Ġreturn Ġif Ġ( iterable Ġis ĠImmutableList <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġiterable Ġas ĠImmutableList < E > ĊĠĠĠĠĠ Ġ} Ġelse Ġbuilder < E >(). addAll ( iterable ). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠCop ies Ġthe Ġitems Ġfrom Ġthe Ġprovided Ġarray Ġinto Ġa Ġnew Ġ[ ImmutableList ] Ġinstance . Ġ Ġ*/ ĊĠĠĠ Ġfun Ġ< E Ġ: ĠAny > Ġcopy Of ( items : ĠArray < out ĠE >): ĠImmutableList < E > Ġ{ ĊĠĠĠĠĠ Ġreturn Ġbuilder < E >(). addAll (* items ). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< E Ġ: ĠAny > ĠIterable < E >. to ImmutableList (): ĠImmutableList < E > Ġ{ ĊĠĠĠĠĠ Ġreturn Ġcopy Of ( this ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġ< E Ġ: ĠAny > Ġbuilder (): ĠBuilder < E > Ġ{ ĊĠĠĠĠĠ Ġreturn ĠBuilder () ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }