package Ġarrow . opt ics Ċ Ċ import Ġarrow . core . For List K Ċ import Ġarrow . core . List K Ċ import Ġarrow . core . extensions . list k . traverse . traverse Ċ import Ġarrow . core . fix Ċ import Ġarrow . core . test . Unit Spec Ċ import Ġarrow . core . test . generators . function A To B Ċ import Ġarrow . core . test . generators . list K Ċ import Ġarrow . core . to T Ċ import Ġarrow . mt l . State Ċ import Ġarrow . mt l . map Ċ import Ġarrow . mt l . run Ċ import Ġarrow . opt ics . mt l . assign Ċ import Ġarrow . opt ics . mt l . assign Old Ċ import Ġarrow . opt ics . mt l . assign _ Ċ import Ġarrow . opt ics . mt l . extract Ċ import Ġarrow . opt ics . mt l . extract Map Ċ import Ġarrow . opt ics . mt l . to State Ċ import Ġarrow . opt ics . mt l . update Ċ import Ġarrow . opt ics . mt l . update Old Ċ import Ġarrow . opt ics . mt l . update _ Ċ import Ġio . kot lint est . properties . Gen Ċ import Ġio . kot lint est . properties . for All Ċ Ċ class ĠTra versal Test Ġ: ĠUnit Spec () Ġ{ ĊĊĠ Ġinit Ġ{ ĊĊĠĠĠ Ġval Ġlist K Tra verse Ġ= ĠTra versal . from Tra versable < For List K , ĠInt , ĠInt >( List K . traverse ()) ĊĊĠĠĠ Ġwith ( list K Tra verse ) Ġ{ ĊĠĠĠĠĠ Ġ" Extract Ġshould Ġextract Ġthe Ġfocus Ġfrom Ġthe Ġstate " Ġ{ ĊĠĠĠĠĠĠĠ Ġfor All ( Gen . list K ( Gen . int ())) Ġ{ Ġints Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġextract (). run ( ints ) Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState Ġ{ Ġi is : ĠList K < Int > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi is Ġto T ĠgetAll ( i is ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. run ( ints ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" to State Ġshould Ġbe Ġan Ġalias Ġto Ġextract " Ġ{ ĊĠĠĠĠĠĠĠ Ġfor All ( Gen . list K ( Gen . int ())) Ġ{ Ġints Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġto State (). run ( ints ) Ġ== Ġextract (). run ( ints ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" Extract s Ġwith Ġf Ġshould Ġbe Ġsame Ġas Ġextract Ġand Ġmap " Ġ{ ĊĠĠĠĠĠĠĠ Ġfor All ( Gen . list K ( Gen . int ()), ĠGen . function A To B < Int , ĠString >( Gen . string ())) Ġ{ Ġints , Ġf Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġextract Map ( f ). run ( ints ) Ġ== Ġextract (). map Ġ{ Ġit . map ( f ) Ġ}. run ( ints ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" update Ġf Ġshould Ġbe Ġsame Ġmodify Ġf Ġwithin ĠState Ġand Ġreturning Ġnew Ġstate " Ġ{ ĊĠĠĠĠĠĠĠ Ġfor All ( Gen . list K ( Gen . int ()), ĠGen . function A To B < Int , ĠInt >( Gen . int ())) Ġ{ Ġints , Ġf Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġupdate ( f ). run ( ints ) Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState < List K < Int >, ĠList K < Int >> Ġ{ Ġi is : ĠList K < Int > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodify ( i is , Ġf ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . fix () Ġto T ĠgetAll ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. run ( ints ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" update Old Ġf Ġshould Ġbe Ġsame Ġas Ġmodify Ġf Ġwithin ĠState Ġand Ġreturning Ġold Ġstate " Ġ{ ĊĠĠĠĠĠĠĠ Ġfor All ( Gen . list K ( Gen . int ()), ĠGen . function A To B < Int , ĠInt >( Gen . int ())) Ġ{ Ġints , Ġf Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġupdate Old ( f ). run ( ints ) Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState Ġ{ Ġi is : ĠList K < Int > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodify ( i is , Ġf ). fix () Ġto T ĠgetAll ( i is ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. run ( ints ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" update _ Ġf Ġshould Ġbe Ġas Ġmodify Ġf Ġwithin ĠState Ġand Ġreturning ĠUnit " Ġ{ ĊĠĠĠĠĠĠĠ Ġfor All ( Gen . list K ( Gen . int ()), ĠGen . function A To B < Int , ĠInt >( Gen . int ())) Ġ{ Ġints , Ġf Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġupdate _( f ). run ( ints ) Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState Ġ{ Ġi is : ĠList K < Int > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodify ( i is , Ġf ). fix () Ġto T ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. run ( ints ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" assign Ġa Ġshould Ġbe Ġsame Ġset Ġa Ġwithin ĠState Ġand Ġreturning Ġnew Ġvalue " Ġ{ ĊĠĠĠĠĠĠĠ Ġfor All ( Gen . list K ( Gen . int ()), ĠGen . int ()) Ġ{ Ġints , Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġassign ( i ). run ( ints ) Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState Ġ{ Ġi is : ĠList K < Int > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( i is , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . fix () Ġto T ĠgetAll ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. run ( ints ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" assign Old Ġf Ġshould Ġbe Ġsame Ġas Ġmodify Ġf Ġwithin ĠState Ġand Ġreturning Ġold Ġstate " Ġ{ ĊĠĠĠĠĠĠĠ Ġfor All ( Gen . list K ( Gen . int ()), ĠGen . int ()) Ġ{ Ġints , Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġassign Old ( i ). run ( ints ) Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState Ġ{ Ġi is : ĠList K < Int > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( i is , Ġi ). fix () Ġto T ĠgetAll ( i is ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. run ( ints ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" assign _ Ġf Ġshould Ġbe Ġas Ġmodify Ġf Ġwithin ĠState Ġand Ġreturning ĠUnit " Ġ{ ĊĠĠĠĠĠĠĠ Ġfor All ( Gen . list K ( Gen . int ()), ĠGen . int ()) Ġ{ Ġints , Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġassign _( i ). run ( ints ) Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState Ġ{ Ġi is : ĠList K < Int > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( i is , Ġi ). fix () Ġto T ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. run ( ints ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ