package Ġio . github . aj oz . workshop . fp . kotlin . tools Ċ Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . LinkedList Ċ import Ġjava . util . NoSuch ElementException Ċ Ċ import Ġjava . util . Collections . emptyList Ċ Ċ // Ġreturns Ġa Ġlist Ġwith Ġelements Ġin Ġthe Ġreverse Ġorder Ċ fun Ġ< A > Ġreverse ( list : ĠList < A >): ĠList < A > Ġ{ ĊĠĠĠ Ġval Ġre ver ed Ġ= ĠArrayList < A >( list . size ) ĊĠĠĠ Ġfor Ġ( i Ġin Ġlist . indices . reversed ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġre ver ed . add ( list [ i ]) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġre ver ed Ċ } Ċ Ċ // Ġreturns Ġa Ġhead Ġof Ġa Ġlist Ġ( first Ġelement ) Ċ // Ġif Ġthere Ġis Ġno Ġelement Ġthen Ġthrows Ġa ĠNoSuch ElementException Ċ fun Ġ< A > Ġhead ( list : ĠList < A >): ĠA Ġ{ ĊĠĠĠ Ġif Ġ( list . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġthrow ĠNoSuch ElementException (" head Ġof Ġempty Ġlist ") ĊĠĠĠ Ġreturn Ġlist [ 0 ] Ċ } Ċ Ċ // Ġreturns Ġa Ġtail Ġof Ġa Ġlist Ġ( all Ġelements Ġexcept Ġthe Ġhead ) Ċ // Ġif Ġthere Ġis Ġno Ġelement Ġthen Ġthrows Ġa ĠNoSuch ElementException Ċ // Ġif Ġthere Ġis Ġonly Ġone Ġelement Ġthen Ġan Ġempty Ġlist Ġis Ġreturned Ċ fun Ġ< A > Ġtail ( list : ĠList < A >): ĠList < A > Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġlist . isEmpty () Ġ-> Ġthrow ĠUnsupportedOperationException (" tail Ġof Ġempty Ġlist ") ĊĠĠĠĠĠĠĠ Ġlist . size Ġ== Ġ 1 Ġ-> Ġempty List () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġlist . sub List ( 1 , Ġlist . size ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠPrep ends Ġthe Ġgiven Ġitem Ġat Ġthe Ġbeginning Ġof Ġthe Ġlist . Ċ fun Ġ< A > Ġprepend ( item : ĠA , Ġlist : ĠList < A >): ĠList < A > Ġ{ ĊĠĠĠ Ġval Ġnew List Ġ= ĠLinkedList < A >() Ġ// to Ġconstruct Ġa Ġnew Ġlist ĊĠĠĠ Ġnew List . add ( item ) ĊĠĠĠ Ġnew List . addAll ( list ) ĊĠĠĠ Ġreturn Ġnew List Ċ } Ċ Ċ // ĠApp ends Ġthe Ġgiven Ġitem Ġat Ġthe Ġend Ġof Ġthe Ġgiven Ġlist . Ċ fun Ġ< A > Ġappend ( list : ĠList < A >, Ġitem : ĠA ): ĠList < A > Ġ{ ĊĠĠĠ Ġval Ġnew List Ġ= ĠLinkedList ( list ) ĊĠĠĠ Ġnew List . add ( item ) ĊĠĠĠ Ġreturn Ġnew List Ċ } Ċ Ċ // ĠFold s Ġthe Ġlist Ġfrom Ġthe Ġleft Ċ fun Ġ< A , ĠB > Ġfold Left ( list : ĠList < A >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial : ĠB , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperator : Ġ( B , ĠA ) Ġ-> ĠB ): ĠB Ġ{ ĊĠĠĠ Ġvar Ġaccumulator Ġ= Ġinitial ĊĠĠĠ Ġfor Ġ( element Ġin Ġlist ) Ġ{ ĊĠĠĠĠĠĠĠ Ġaccumulator Ġ= Ġoperator ( accumulator , Ġelement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġaccumulator Ċ } Ċ Ċ // ĠFold Ġthe Ġlist Ġfrom Ġthe Ġright Ċ fun Ġ< A , ĠB > Ġfold Right ( list : ĠList < A >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial : ĠB , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperator : Ġ( A , ĠB ) Ġ-> ĠB ): ĠB Ġ{ ĊĠĠĠ Ġvar Ġaccumulator Ġ= Ġinitial ĊĠĠĠ Ġfor Ġ( i Ġin Ġlist . size Ġdown To Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġaccumulator Ġ= Ġoperator ( list [ i Ġ- Ġ 1 ], Ġaccumulator ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġaccumulator Ċ } Ċ Ċ fun Ġsum ( list : ĠList < Int >): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġfold Left ( list , Ġ 0 ) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ+ Ġb Ġ} Ċ } Ċ Ċ fun Ġproduct ( list : ĠList < Int >): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġfold Left ( list , Ġ 1 ) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ* Ġb Ġ} Ċ }