package Ġio . sell ma ir . k omp ass . core Ċ Ċ import Ġio . sell ma ir . k omp ass . core . Routing Stack . Element Ċ import Ġio . sell ma ir . k omp ass . core . internal . Element Impl Ċ import Ġio . sell ma ir . k omp ass . core . internal . Routing Stack Impl Ċ import Ġkotlin . jvm . Jvm Name Ċ Ċ /** Ċ Ġ* Ġ# ĠRouting Stack Ċ Ġ* ĠRepresents Ġa Ġ" routing Ġstate " Ġwhere Ġthe Ġmost Ġtop Ġ( last ) Ġ[ Element ] Ġis Ġrepresenting Ġthe Ġcurrently Ġ" active " Ġ( display ed ) Ċ Ġ* Ġroute Ġand Ġthe Ġmost Ġbottom Ġ( first ) Ġ[ Element ] Ġthe Ġ" root ". ĠThe Ġtwo Ġmost Ġcommon Ġoperations Ġof Ġa Ġ[ Routing Stack ] Ċ Ġ* Ġare Ġ" push " Ġand Ġ" pop " Ċ Ġ* Ġ- Ġpush : ĠAdds Ġa Ġroute Ġto Ġthe Ġtop Ġof Ġthe Ġstack . Ċ Ġ* Ġe . g . Ġnavig ating Ġfrom Ġthe Ġ" Home Route " Ġto Ġthe Ġ" Settings Route " Ċ Ġ* Ġ- Ġpop : ĠRemoves Ġthe Ġcurrently Ġ" active " Ġroute Ġfrom Ġthe Ġtop Ġof Ġthis Ġstack Ċ Ġ* Ġe . g . Ġpressing Ġa Ġback Ġbutton Ġin Ġthe Ġ" Settings Route " Ġwill Ġlead Ġto Ġthe Ġ" Home Route " Ġgetting Ġactive Ġagain Ċ Ġ* Ċ Ġ* Ġ## ĠNote Ċ Ġ* Ġ- ĠImplement ations Ġof Ġ[ Routing Stack ] Ġshould Ġimplement Ġa Ġ[ equals ] Ġand Ġ[ hashCode ] Ġfunction Ġthat Ġmakes Ċ Ġ* Ġ[ Routing Stack ]' s Ġcomp arable Ċ Ġ* Ċ Ġ* Ġ- ĠImplement ations Ġof Ġ[ Routing Stack ] Ġshould Ġalways Ġbe Ġimplemented Ġ* immutable * Ċ Ġ*/ Ċ interface ĠRouting Stack < T Ġ: ĠRoute > Ġ: ĠPlain Stack Instruction Syntax < T , ĠRouting Stack < T >>, ĠIterable < Element < T >> Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAll Ġroutes Ġthat Ġrepresent Ġthis Ġrouting Ġstack . ĊĠĠĠĠ Ġ* ĠThis Ġroutes Ġare Ġstored Ġas Ġ[ Element ] Ġwhich Ġmakes Ġroutes Ġident ifiable Ġby Ġassoci ating Ġeach Ġentry Ġin Ġan ĊĠĠĠĠ Ġ* Ġstack Ġwith Ġa Ġ[ Key ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠRouting Stack ĊĠĠĠĠ Ġ* Ġ@ see ĠElement ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġelements : ĠList < Element < T >> ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ* Ġ- ĠA Ġnew Ġ[ Routing Stack ] Ġthat Ġcontains Ġthe Ġspecified Ġ[ elements ] ĊĠĠĠĠ Ġ* Ġ- ĠThis Ġ[ Routing Stack ] Ġif Ġthe Ġ[ elements ] Ġdid Ġnot Ġchange . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠNote ĊĠĠĠĠ Ġ* Ġ[ Routing Stack ] Ġimplementations Ġare Ġrequired Ġto Ġbe Ġimmutable ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwith ( elements : ĠIterable < Element < T >> Ġ= Ġthis . elements ): ĠRouting Stack < T > ĊĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠIterator < Element < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġelements . iterator () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġnew Ġ[ Routing Stack ] Ġbased Ġon Ġthe Ġspecified Ġ[ instruction ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġinstruction ĠA Ġsimple Ġfunction Ġthat Ġdescribes Ġhow Ġa Ġnew Ġstack Ġcan Ġbe Ġcreated Ġfrom Ġcurrent Ġstack ĊĠĠĠĠ Ġ* Ġ@ see Ġwith ĊĠĠĠĠ Ġ* Ġ@ see ĠRouting Stack ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġplain Stack Instruction ( instruction : ĠPlain Stack Instruction < T >): ĠRouting Stack < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith ( elements . instruction ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ# ĠRouting Stack . Element ĊĠĠĠĠ Ġ* ĠRepresents Ġone Ġentry Ġof Ġthe Ġ[ Routing Stack ] Ġthat Ġis Ġable Ġto Ġidentify Ġeach Ġgiven Ġroute Ġby Ġa Ġunique Ġ[ Key ], Ġso ĊĠĠĠĠ Ġ* Ġthat Ġeven Ġif Ġthe Ġroutes Ġin Ġthe Ġstack Ġare Ġnot Ġdistinct , Ġthe Ġelements Ġare ! ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠNote ĊĠĠĠĠ Ġ* Ġ- ĠElements Ġare Ġcompared Ġby Ġroute Ġand Ġkey , Ġthus Ġthe Ġbehaviour Ġof Ġthe Ġ[ equals ] Ġand Ġ[ hashCode ] Ġfunctions Ġare ĊĠĠĠĠ Ġ* Ġguaranteed Ġto Ġbehave Ġconsistently Ġfor Ġall Ġimplementations ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠKey ĊĠĠĠĠ Ġ* Ġ@ see ĠRoute ĊĠĠĠĠ Ġ* Ġ@ see ĠRouting Stack ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġclass ĠElement < out ĠT Ġ: ĠRoute > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠUnique Ġ[ Key ] Ġthat Ġcan Ġbe Ġused Ġto Ġidentify Ġthe Ġ[ Element ] Ġinside Ġa Ġ[ Routing Stack ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ see ĠElement ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġkey : ĠKey ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġroute Ġassociated Ġwith Ġthe Ġelement . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ# ĠNote ĊĠĠĠĠĠĠĠĠ Ġ* ĠRoutes Ġare Ġnot Ġrequired Ġto Ġbe Ġdistinct Ġin Ġa Ġ[ Routing Stack ]. ĠUse Ġ[ key ] Ġto Ġproperly ĊĠĠĠĠĠĠĠĠ Ġ* Ġidentify Ġelements Ġin Ġthe Ġ[ Routing Stack ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġroute : ĠT ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Element ( key =${ key . value }, Ġroute =$ route )" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfinal Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠElement <* >) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . key Ġ!= Ġother . key ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . route Ġ!= Ġother . route ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfinal Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠhashCode Ġ= Ġ 3 1 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠhashCode Ġ+= Ġ 3 1 Ġ* Ġthis . key . hashCode () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠhashCode Ġ+= Ġ 3 1 Ġ* Ġthis . route . hashCode () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠhashCode ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject ĠFactory Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠA Ġdefault Ġimplementation Ġof Ġ[ Element ] Ġfor Ġthe Ġgiven Ġ[ route ] Ġand Ġ[ key ] ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperator Ġfun Ġ< T Ġ: ĠRoute > Ġinvoke ( route : ĠT , Ġkey : ĠKey Ġ= ĠKey ()): ĠElement < T > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠElement Impl ( route , Ġkey ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġcompanion Ġobject ĠFactory Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠRoute > Ġempty (): ĠRouting Stack < T > Ġ= ĠRouting Stack Impl ( emptyList ()) ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠRoute > Ġjust ( element : ĠT ): ĠRouting Stack < T > Ġ= ĠRouting Stack Impl ( listOf ( element ). to Elements ()) ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Name (" from ") ĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠRoute > Ġfrom ( var arg Ġelements : ĠT ): ĠRouting Stack < T > Ġ= ĠRouting Stack Impl ( elements . toList (). to Elements ()) ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Name (" from Iterable ") ĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠRoute > Ġfrom ( elements : ĠIterable < T >): ĠRouting Stack < T > Ġ= ĠRouting Stack Impl ( elements . toList (). to Elements ()) ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Name (" from Array ") ĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠRoute > Ġfrom ( elements : ĠArray < T >): ĠRouting Stack < T > Ġ= ĠRouting Stack Impl ( elements . toList (). to Elements ()) ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Name (" from Sequence ") ĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠRoute > Ġfrom ( elements : ĠSequence < T >): ĠRouting Stack < T > Ġ= ĠRouting Stack Impl ( elements . toList (). to Elements ()) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ private Ġfun Ġ< T Ġ: ĠRoute > ĠIterable < T >. to Elements () Ġ= ĊĠĠĠ Ġthis . map Ġ{ Ġelement Ġ-> ĠElement Impl ( element ) Ġ}