package Ġcom . xr pn . immutable Ċ Ċ import Ġcom . xr pn . bridge . F Stack Iterator Ċ import Ġcom . xr pn . im api .* Ċ import Ġcom . xr pn . im api . IM Stack Equal 2 Ċ import Ġcom . xr pn . immutable . F List . Companion . to IM List Ċ Ċ sealed Ġclass ĠF Stack < out ĠA : ĠAny >: ĠIM Stack < A > Ġ{ ĊĊĠĠĠ Ġval Ġsize : ĠInt Ġby Ġlazy Ġ{ Ġto F List (). size Ġ} ĊĊĠĠĠ Ġfun ĠisEmpty (): ĠBoolean Ġ= Ġto F List (). isEmpty () ĊĊĠĠĠ Ġfun Ġiterator (): ĠF Stack Iterator < A > Ġ= ĠF Stack Iterator ( this ) ĊĊĠĠĠ Ġ// Ġim collection ĊĊĠĠĠ Ġoverride Ġval Ġse al : ĠIM SC Ġ= ĠIM SC . IM STACK ĊĊĠĠĠ Ġoverride Ġfun Ġf contains ( item : Ġ@ Unsafe Variance ĠA ): ĠBoolean = ĊĠĠĠĠĠĠĠ Ġto F List (). f contains ( item ) ĊĊĊĠĠĠ Ġoverride Ġfun Ġf count ( is Match : Ġ( A ) Ġ-> ĠBoolean ): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġto F List (). f count ( is Match ) ĊĊĠĠĠ Ġoverride Ġfun Ġf drop All ( items : ĠIM Collection < @ Unsafe Variance ĠA >): ĠF Stack < A > Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( items . f empty ()) Ġthis Ġelse ĠF Stack Body . of ( to F List (). fd rop All ( items )) ĊĊĠĠĠ Ġoverride Ġfun Ġf drop Item ( item : Ġ@ Unsafe Variance ĠA ): ĠIM Stack < A > Ġ= ĊĠĠĠĠĠĠĠ ĠF Stack Body . of ( to F List (). fd rop Item ( item )) ĊĊĠĠĠ Ġoverride Ġfun Ġf filter ( is Match : Ġ( A ) Ġ-> ĠBoolean ): ĠF Stack < A > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfiltered Ġ= Ġto F List (). ff ilter ( is Match ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( filtered Ġ=== Ġto F List ()) Ġthis Ġelse ĠF Stack Body . of ( filtered ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġf filter Not ( is Match : Ġ( A ) Ġ-> ĠBoolean ): ĠF Stack < A > Ġ= ĊĠĠĠĠĠĠĠ Ġf filter Ġ{ Ġ! is Match ( it ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġf find Any ( is Match : Ġ( A ) Ġ-> ĠBoolean ): ĠA ? Ġ= ĊĠĠĠĠĠĠĠ Ġto F List (). ff ind Any ( is Match ) ĊĊĠĠĠ Ġoverride Ġfun Ġfis Strict (): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġto F List (). fis Strict () ĊĊĠĠĠ Ġoverride Ġfun Ġf pick (): ĠA ? Ġ= ĊĠĠĠĠĠĠĠ Ġto F List (). f head () ĊĊĠĠĠ Ġoverride Ġfun Ġf pop And Remain der (): ĠPair < A ?, ĠF Stack < A >> Ġ= Ġf pop () ĊĊĠĠĠ Ġoverride Ġfun Ġf size (): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġto F List (). size ĊĊĠĠĠ Ġ// Ġ============ ĠIM Ordered ĊĊĠĠĠ Ġoverride Ġfun Ġf drop ( n : ĠInt ): ĠF Stack < A > Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( 0 Ġ< Ġn ) ĠF Stack Body . of ( to F List (). fd rop ( n )) Ġelse Ġthis ĊĊĠĠĠ Ġoverride Ġfun Ġf reverse (): ĠF Stack < A > Ġ= ĊĠĠĠĠĠĠĠ ĠF Stack Body . of ( to F List (). f reverse ()) ĊĊĠĠĠ Ġoverride Ġfun Ġf rot l (): ĠIM Stack < A > Ġ= ĊĠĠĠĠĠĠĠ ĠF Stack Body . of ( to F List (). f rot l ()) ĊĊĠĠĠ Ġoverride Ġfun Ġf ro tr (): ĠIM Stack < A > Ġ= ĊĠĠĠĠĠĠĠ ĠF Stack Body . of ( to F List (). fro tr ()) ĊĊĠĠĠ Ġoverride Ġfun Ġf sw aph (): ĠIM Stack < A > Ġ= ĊĠĠĠĠĠĠĠ ĠF Stack Body . of ( to F List (). f sw aph ()) ĊĊĠĠĠ Ġ// Ġ============ Ġfiltering ĊĊĠĠĠ Ġoverride Ġfun Ġf drop If Top ( item : Ġ@ Unsafe Variance ĠA ): ĠF Stack < A > Ġ= Ġf top ()?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . equals ( item )) Ġf pop OrThrow (). second Ġelse Ġthis ĊĠĠĠ Ġ} Ġ?: Ġthis ĊĊĠĠĠ Ġoverride Ġfun Ġf drop Top When ( is Match : Ġ( A ) Ġ-> ĠBoolean ): ĠF Stack < A > Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( f top Match ( is Match )) ĠF Stack Body . of ( to F List (). ft ail ()) Ġelse Ġthis ĊĊĠĠĠ Ġoverride Ġfun Ġf drop While ( is Match : Ġ( A ) Ġ-> ĠBoolean ): ĠF Stack < A > Ġ= ĊĠĠĠĠĠĠĠ ĠF Stack Body . of ( to F List (). fd rop While ( is Match )) ĊĊĠĠĠ Ġoverride Ġfun Ġf top Match ( is Match : Ġ( A ) Ġ-> ĠBoolean ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġf top ()?. let Ġ{ Ġis Match ( it ) Ġ} Ġ?: Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġf top (): ĠA ? Ġ= Ġto F List (). f head () ĊĊĠĠĠ Ġoverride Ġfun Ġf top OrThrow (): ĠA Ġ= Ġf top () Ġ?: Ġthrow ĠIllegalStateException (" top Ġof Ġempty Ġstack ") ĊĊĠĠĠ Ġ// Ġ============ Ġgrouping Ġ- ĠN OP ĊĊĠĠĠ Ġ// Ġ============ Ġtransform ing ĊĊĠĠĠ Ġoverride Ġfun Ġ< B : ĠAny > Ġfmap ( f : Ġ( A ) Ġ-> ĠB ): ĠIM Stack < B > Ġ= ĊĠĠĠĠĠĠĠ ĠF Stack Body . of ( to F List (). f map ( f )) ĊĊĠĠĠ Ġoverride Ġfun Ġ< B Ġ: ĠAny > Ġf pop Map ( f : Ġ( A ) Ġ-> ĠB ): ĠPair < B ?, ĠIM Stack < A >> Ġ= ĊĠĠĠĠĠĠĠ Ġf pop (). let Ġ{ Ġpit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpit . first ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpit . p map 2 ({ Ġa Ġ-> Ġf ( a !! ) Ġ}, Ġ{ Ġit Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠPair ( null , Ġpit . second ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< B Ġ: ĠAny > Ġf top Map ( f : Ġ( A ) Ġ-> ĠB ): ĠB ? Ġ= ĊĠĠĠĠĠĠĠ Ġf top ()?. let { Ġf ( it ) Ġ} ĊĊĠĠĠ Ġ// Ġ============ Ġalter ing ĊĊĠĠĠ Ġoverride Ġfun Ġf pop (): ĠPair < A ?, ĠF Stack < A >> Ġ= ĊĠĠĠĠĠĠĠ Ġf top ()?. let Ġ{ Ġbuild Pair () Ġ} Ġ?: ĠPair ( null , Ġthis ) ĊĊĠĠĠ Ġoverride Ġfun Ġf pop OrThrow (): ĠPair < A , ĠF Stack < A >> Ġ= ĊĠĠĠĠĠĠĠ Ġf top ()?. let Ġ{ Ġbuild Pair () Ġ} Ġ?: Ġthrow ĠIllegalStateException (" pop Ġfrom Ġempty Ġstack ") ĊĊĠĠĠ Ġoverride Ġfun Ġf push ( top : Ġ@ Unsafe Variance ĠA ): ĠF Stack < A > Ġ= ĊĠĠĠĠĠĠĠ ĠF Stack Body . of ( FL Cons ( top , Ġto F List ())) ĊĊĠĠĠ Ġ// Ġ============ Ġutility ĊĊĠĠĠ Ġoverride Ġfun Ġequal ( rhs : ĠIM Stack < @ Unsafe Variance ĠA >): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġto F List (). equal ( rhs . to IM List ()) ĊĊĠĠĠ Ġoverride Ġfun Ġf forEach ( f : Ġ( A ) Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠĠĠ Ġto F List (). ff or Each ( f ) ĊĊĠĠĠ Ġoverride Ġfun Ġcopy (): ĠF Stack < A > Ġ= ĊĠĠĠĠĠĠĠ ĠF Stack Body . of ( to F List (). copy ()) ĊĊĠĠĠ Ġoverride Ġfun Ġcopy To Mutable List (): ĠMutable List < @ Unsafe Variance ĠA > Ġ= ĊĠĠĠĠĠĠĠ Ġto F List (). copy To Mutable List () ĊĊĠĠĠ Ġoverride Ġfun Ġto IM List (): ĠIM List < A > Ġ= ĊĠĠĠĠĠĠĠ Ġto F List () ĊĊĠĠĠ Ġ// Ġ============ Ġimplementation ĊĊĠĠĠ Ġ// Ġthe Ġhead Ġof Ġthe Ġlist Ġis Ġthe Ġfirst Ġitem Ġout Ġ( i . e . Ġthe Ġtop Ġof Ġthe Ġstack ) ĊĠĠĠ Ġinternal Ġfun Ġto F List (): ĠF List < A > Ġ= Ġ( this Ġas ĠF Stack Body ). body ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Pair (): ĠPair < A , ĠF Stack < A >> Ġ{ ĊĠĠĠĠĠĠĠ Ġthis Ġas ĠF Stack Body ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( body . f head () !! , ĠF Stack Body . of ( body . ft ail ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject : ĠIM Stack Companion Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< A : ĠAny > Ġempty IM Stack (): ĠF Stack < A > Ġ= ĠF Stack Body . empty ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< A Ġ: ĠAny > Ġof ( var arg Ġitems : ĠA ): ĠF Stack < A > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF Stack Body . of ( F List . of ( items . iterator ())) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< A Ġ: ĠAny > Ġof ( items : ĠIterator < A >): ĠF Stack < A > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF Stack Body . of ( F List . of ( items )) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< A Ġ: ĠAny > Ġof ( items : ĠList < A >): ĠF Stack < A > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF Stack Body . of ( F List . of ( items )) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< A Ġ: ĠAny > Ġof ( items : ĠIM List < A >): ĠF Stack < A > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF Stack Body . of ( items Ġas ĠF List < A >) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< B , ĠA Ġ: ĠAny > Ġof Map ( items : ĠIterator < B >, Ġf : Ġ( B ) Ġ-> ĠA ): ĠF Stack < A > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF Stack Body . of ( F List . of Map ( items , Ġf )) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< A Ġ: ĠAny , ĠB > Ġof Map ( items : ĠList < B >, Ġf : Ġ( B ) Ġ-> ĠA ): ĠF Stack < A > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF Stack Body . of ( F List . of Map ( items , Ġf )) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< A Ġ: ĠAny > ĠCollection < A >. to IM Stack (): ĠF Stack < A > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF Stack Body . of ( to IM List () Ġas ĠF List < A >) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ internal Ġclass ĠF Stack Body < out ĠA : ĠAny > Ġprivate Ġconstructor Ġ( ĊĠĠĠ Ġval Ġbody : ĠF List < A > Ċ ): ĠF Stack < A >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġthis Ġ=== Ġother Ġ-> Ġtrue ĊĠĠĠĠĠĠĠ Ġother Ġ== Ġnull Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġother Ġis ĠF Stack Body < *> Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf empty () Ġ&& Ġother . f empty () Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf empty () Ġ|| Ġother . f empty () Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf top () !!. is Strict ly ( other . f top () !! ) Ġ-> ĠIM Stack Equal 2 ( this , Ġother ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbody . hashCode () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġshow : ĠString Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( f empty ()) ĠF Stack :: class . simple Name +" (* )" ĊĠĠĠĠĠĠĠ Ġelse Ġthis :: class . simple Name +" ("+ body . ffold Left ("") Ġ{ Ġstr , Ġh Ġ-> Ġ"$ str {$ h }" Ġ} +") " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġshow ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġempty : ĠF Stack Body < Nothing > Ġ= ĠF Stack Body ( FL Nil ) ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġ< A : ĠAny > Ġof ( body : ĠF List < A >? Ġ= ĠFL Nil ): ĠF Stack < A > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( body Ġis ĠFL Nil ) Ġempty IM Stack () Ġelse Ġbody ?. let Ġ{ ĠF Stack Body ( body ) Ġ} Ġ?: Ġempty ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġ< A : ĠAny > ĠhashCode ( s : ĠF Stack Body < A >) Ġ= Ġs . hashCode () ĊĠĠĠ Ġ} Ċ Ċ }