package Ġcom . d inar ap aran id . pri ma . core Ċ Ċ import Ġjava . io . Serializable Ċ Ċ /** Ċ Ġ* ĠCollection Ġof ĠUNIQUE Ġtracks Ċ Ġ*/ Ċ Ċ abstract Ġclass ĠPlaylist ( open Ġval Ġtitle : ĠString ) Ġ: ĠMutable Collection < Track >, ĠSerializable Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtracks : ĠMutable List < Track > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt Ġget () Ġ= Ġtracks . size ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġtitle ĊĠĠĠ Ġoverride Ġfun Ġcontains ( element : ĠTrack ): ĠBoolean Ġ= Ġelement Ġin Ġtracks ĊĠĠĠ Ġoverride Ġfun Ġcontains All ( elements : ĠCollection < Track >): ĠBoolean Ġ= Ġtracks . contains All ( elements ) ĊĠĠĠ Ġoverride Ġfun ĠisEmpty (): ĠBoolean Ġ= Ġtracks . isEmpty () ĊĠĠĠ Ġoverride Ġfun Ġclear (): ĠUnit Ġ= Ġtracks . clear () ĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠMutable Iterator < Track > Ġ= Ġtracks . iterator () ĊĠĠĠ Ġoverride Ġfun Ġretain All ( elements : ĠCollection < Track >): ĠBoolean Ġ= Ġtracks . retain All ( elements ) ĊĊĠĠĠ Ġconstructor ( title : ĠString , Ġts : ĠMutable List < Track >) Ġ: Ġthis ( title ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtracks . addAll ( ts ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġtrack Ġif Ġit 's Ġnot Ġin Ġthe Ġplaylist ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġtrack 's Ġadded ; ĊĠĠĠĠ Ġ* Ġfalse Ġif Ġsuch Ġtrack Ġis Ġalready Ġin Ġplaylist ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun Ġadd ( element : ĠTrack ): ĠBoolean Ġ= Ġtracks ĊĠĠĠĠĠĠĠ Ġ. indexOf First Ġ{ Ġit . path Ġ== Ġelement . path Ġ} ĊĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġit Ġ== Ġ- 1 Ġ} ĊĠĠĠĠĠĠĠ Ġ? . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracks . add ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġtrack Ġfrom Ġgiven Ġcollection ĊĠĠĠĠ Ġ* Ġif Ġit 's Ġnot Ġin Ġthe Ġplaylist ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġany Ġof Ġtracks Ġare Ġadded ; ĊĠĠĠĠ Ġ* Ġfalse Ġif Ġall Ġtracks Ġare Ġalready Ġin Ġplaylist ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun Ġadd All ( elements : ĠCollection < Track >): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġelements . fold ( false ) Ġ{ Ġchanged , Ġtrack Ġ-> Ġadd ( track ). let Ġ{ Ġif Ġ(! changed ) Ġit Ġelse Ġtrue Ġ} Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġlast Ġtrack ĊĠĠĠĠ Ġ* Ġwhich Ġis Ġmatching Ġpattern . ĊĠĠĠĠ Ġ* ĠAlso Ġchanges Ġcurrent Ġindex . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġelement Ġhas Ġbeen Ġsuccessfully Ġremoved ; ĊĠĠĠĠ Ġ* Ġfalse Ġif Ġit Ġwas Ġnot Ġpresented Ġin Ġthe Ġcollection . ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun Ġremove ( element : ĠTrack ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ ĠindexOf ( element ). take If Ġ{ Ġit Ġ!= Ġ- 1 Ġ} ?. let Ġ{ Ġind Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcur Index Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . path Ġ!= Ġcurrent Track . path Ġ-> Ġif Ġ( ind Ġ< Ġcur Index ) Ġcur Index Ġ- Ġ 1 Ġelse Ġcur Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġif Ġ( cur Index Ġ== Ġsize ) Ġ 0 Ġelse Ġcur Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracks . remove ( element ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġlast Ġtrack ĊĠĠĠĠ Ġ* Ġwhich Ġis Ġmatching Ġpatterns Ġfrom Ġgiven Ġcollection . ĊĠĠĠĠ Ġ* ĠAlso Ġchanges Ġcurrent Ġindex . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġany Ġof Ġelements Ġhave Ġbeen Ġsuccessfully Ġremoved ; ĊĠĠĠĠ Ġ* Ġfalse Ġif Ġall Ġof Ġtracks Ġwere Ġnot Ġpresented Ġin Ġthe Ġcollection . ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun Ġremove All ( elements : ĠCollection < Track >): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġelements . fold ( false ) Ġ{ Ġchanged , Ġtrack Ġ-> Ġremove ( track ). let Ġ{ Ġif Ġ(! changed ) Ġit Ġelse Ġtrue Ġ} Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠPlaylist ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( title Ġ!= Ġother . title ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġtitle . hashCode () ĊĊĠĠĠ Ġprivate Ġvar Ġcur Index : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġoperator Ġfun Ġget ( ind : ĠInt ): ĠTrack Ġ= Ġtracks [ ind ] ĊĊĠĠĠ Ġfun Ġgo To Prev Track () Ġ{ ĊĠĠĠĠĠĠĠ Ġcur Index Ġ= Ġif Ġ( cur Index Ġ== Ġ 0 ) Ġtracks . size Ġ- Ġ 1 Ġelse Ġcur Index Ġ- Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgo To Next Track () Ġ{ ĊĠĠĠĠĠĠĠ Ġcur Index Ġ= Ġif Ġ( cur Index Ġ== Ġtracks . size Ġ- Ġ 1 ) Ġ 0 Ġelse Ġcur Index Ġ+ Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto List (): ĠList < Track > Ġ= Ġtracks . toList () ĊĊĠĠĠ Ġval Ġcurrent Track : ĠTrack Ġget () Ġ= Ġtracks [ cur Index ] ĊĊĠĠĠ Ġinline Ġval Ġprev Track : ĠTrack ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgo To Prev Track () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Track ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġval Ġnext Track : ĠTrack ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgo To Next Track () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Track ĊĠĠĠĠĠĠĠ Ġ} Ċ }