package Ġarrow . opt ics . mt l Ċ Ċ import Ġarrow . core . Tuple 2 Ċ import Ġarrow . mt l . Reader Ċ import Ġarrow . mt l . State Ċ import Ġarrow . mt l . map Ċ import Ġarrow . opt ics . Lens Ċ Ċ /** Ċ Ġ* ĠExtract s Ġthe Ġvalue Ġviewed Ġthrough Ġthe Ġ[ get ] Ġfunction Ġinto Ġ[ Reader ]. Ċ Ġ* Ċ Ġ* Ġ``` kotlin : ank : playground Ċ Ġ* Ġimport Ġarrow . mt l . Reader Ċ Ġ* Ġimport Ġarrow . opt ics . Lens Ċ Ġ* Ġimport Ġarrow . opt ics . mt l . ask Ċ Ġ* Ċ Ġ* Ġdata Ġclass ĠEnemy ( val Ġhealth : ĠInt ) Ġ{ Ċ Ġ* ĠĠ Ġcompanion Ġobject Ġ{ Ċ Ġ* ĠĠĠĠ Ġval Ġhealth : ĠLens < Enemy , ĠInt > Ġ= ĠLens ( Enemy :: health ) Ġ{ Ġenemy , Ġhealth Ġ-> Ġenemy . copy ( health Ġ= Ġhealth ) Ġ} Ċ Ġ* ĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġval Ġenemy Ġ= ĠEnemy ( 7 0 ) Ċ Ġ* Ċ Ġ* Ġfun Ġmain () Ġ{ Ċ Ġ* ĠĠ Ġ// sample Start Ċ Ġ* ĠĠ Ġval Ġinspect Health : ĠReader < Enemy , ĠInt > Ġ= ĠEnemy . health . ask () Ċ Ġ* ĠĠ Ġval Ġresult Ġ= Ġinspect Health . run ( enemy ) Ċ Ġ* ĠĠ Ġ// end Sample Ċ Ġ* ĠĠ Ġprintln ( result ) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ fun Ġ< S , ĠA > ĠLens < S , ĠA >. ask (): ĠReader < S , ĠA > Ġ= ĠReader (:: get ) Ċ Ċ /** Ġ@ see Ġask Ġ*/ Ċ fun Ġ< S , ĠA > ĠLens < S , ĠA >. to Reader (): ĠReader < S , ĠA > Ġ= Ġask () Ċ Ċ /** Ċ Ġ* ĠExtract s Ġthe Ġvalue Ġviewed Ġthrough Ġthe Ġ[ get ] Ġand Ġapplies Ġ[ f ] Ġto Ġit . Ċ Ġ* Ċ Ġ* Ġ``` kotlin : ank : playground Ċ Ġ* Ġimport Ġarrow . mt l . Reader Ċ Ġ* Ġimport Ġarrow . opt ics . Lens Ċ Ġ* Ġimport Ġarrow . opt ics . mt l . ask s Ċ Ġ* Ċ Ġ* Ġdata Ġclass ĠEnemy ( val Ġhealth : ĠInt ) Ġ{ Ċ Ġ* ĠĠ Ġcompanion Ġobject Ġ{ Ċ Ġ* ĠĠĠĠ Ġval Ġhealth : ĠLens < Enemy , ĠInt > Ġ= ĠLens ( Enemy :: health ) Ġ{ Ġenemy , Ġhealth Ġ-> Ġenemy . copy ( health Ġ= Ġhealth ) Ġ} Ċ Ġ* ĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġval Ġenemy Ġ= ĠEnemy ( 7 0 ) Ċ Ġ* Ċ Ġ* Ġfun Ġmain () Ġ{ Ċ Ġ* ĠĠ Ġ// sample Start Ċ Ġ* ĠĠ Ġval Ġinspect Health : ĠReader < Enemy , ĠString > Ġ= ĠEnemy . health . ask s Ġ{ Ġhealth Ġ-> Ċ Ġ* ĠĠĠĠ Ġ" Enemy Ġhas Ġ${ health } hp " Ċ Ġ* ĠĠ Ġ} Ċ Ġ* ĠĠ Ġval Ġresult Ġ= Ġinspect Health . run ( enemy ) Ċ Ġ* ĠĠ Ġ// end Sample Ċ Ġ* ĠĠ Ġprintln ( result ) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġ@ param Ġf Ġfunction Ġto Ġapply Ġto Ġthe Ġfocus . Ċ Ġ*/ Ċ fun Ġ< S , ĠA , ĠC > ĠLens < S , ĠA >. ask s ( f : Ġ( A ) Ġ-> ĠC ): ĠReader < S , ĠC > Ġ= Ġask (). map ( f ) Ċ Ċ /** Ċ Ġ* ĠExtract s Ġthe Ġfocus Ġ[ A ] Ġviewed Ġthrough Ġthe Ġ[ PL ens ] Ġinto Ġ[ State ]. Ċ Ġ* Ċ Ġ* Ġ``` kotlin : ank : playground Ċ Ġ* Ġimport Ġarrow . mt l . run Ċ Ġ* Ġimport Ġarrow . mt l . State Ċ Ġ* Ġimport Ġarrow . opt ics . Lens Ċ Ġ* Ġimport Ġarrow . opt ics . mt l . extract Ċ Ġ* Ċ Ġ* Ġdata Ġclass ĠEnemy ( val Ġhealth : ĠInt ) Ġ{ Ċ Ġ* ĠĠ Ġcompanion Ġobject Ġ{ Ċ Ġ* ĠĠĠĠ Ġval Ġhealth : ĠLens < Enemy , ĠInt > Ġ= ĠLens ( Enemy :: health ) Ġ{ Ġenemy , Ġhealth Ġ-> Ġenemy . copy ( health Ġ= Ġhealth ) Ġ} Ċ Ġ* ĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġval Ġenemy Ġ= ĠEnemy ( 7 0 ) Ċ Ġ* Ċ Ġ* Ġfun Ġmain () Ġ{ Ċ Ġ* ĠĠ Ġ// sample Start Ċ Ġ* ĠĠ Ġval Ġinspect Health : ĠState < Enemy , ĠInt > Ġ= ĠEnemy . health . extract () Ċ Ġ* ĠĠ Ġval Ġresult Ġ= Ġinspect Health . run ( enemy ) Ċ Ġ* ĠĠ Ġ// end Sample Ċ Ġ* ĠĠ Ġprintln ( result ) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ fun Ġ< S , ĠA > ĠLens < S , ĠA >. extract (): ĠState < S , ĠA > Ġ= ĠState Ġ{ Ġs Ġ-> ĠTuple 2 ( s , Ġget ( s )) Ġ} Ċ Ċ /** Ġ@ see Ġextract Ġ*/ Ċ fun Ġ< S , ĠA > ĠLens < S , ĠA >. to State (): ĠState < S , ĠA > Ġ= Ġextract () Ċ Ċ /** Ċ Ġ* ĠExtract s Ġand Ġmaps Ġthe Ġfocus Ġ[ A ] Ġviewed Ġthrough Ġthe Ġ[ PL ens ] Ġand Ġapplies Ġ[ f ] Ġto Ġit . Ċ Ġ* Ċ Ġ* Ġ``` kotlin : ank : playground Ċ Ġ* Ġimport Ġarrow . mt l . run Ċ Ġ* Ġimport Ġarrow . mt l . State Ċ Ġ* Ġimport Ġarrow . opt ics . Lens Ċ Ġ* Ġimport Ġarrow . opt ics . mt l . extract Map Ċ Ġ* Ċ Ġ* Ġdata Ġclass ĠEnemy ( val Ġhealth : ĠInt ) Ġ{ Ċ Ġ* ĠĠ Ġcompanion Ġobject Ġ{ Ċ Ġ* ĠĠĠĠ Ġval Ġhealth : ĠLens < Enemy , ĠInt > Ġ= ĠLens ( Enemy :: health ) Ġ{ Ġenemy , Ġhealth Ġ-> Ġenemy . copy ( health Ġ= Ġhealth ) Ġ} Ċ Ġ* ĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġval Ġenemy Ġ= ĠEnemy ( 7 0 ) Ċ Ġ* Ċ Ġ* Ġfun Ġmain () Ġ{ Ċ Ġ* ĠĠ Ġ// sample Start Ċ Ġ* ĠĠ Ġval Ġinspect Health : ĠState < Enemy , ĠString > Ġ= ĠEnemy . health . extract Map Ġ{ Ġhealth Ġ-> Ċ Ġ* ĠĠĠĠ Ġ" Enemy Ġhas Ġ${ health } hp " Ċ Ġ* ĠĠ Ġ} Ċ Ġ* ĠĠ Ġval Ġresult Ġ= Ġinspect Health . run ( enemy ) Ċ Ġ* ĠĠ Ġ// end Sample Ċ Ġ* ĠĠ Ġprintln ( result ) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ fun Ġ< S , ĠA , ĠC > ĠLens < S , ĠA >. extract Map ( f : Ġ( A ) Ġ-> ĠC ): ĠState < S , ĠC > Ġ= Ġextract (). map ( f ) Ċ Ċ /** Ċ Ġ* ĠUpdate Ġthe Ġfocus Ġ[ A ] Ġviewed Ġthrough Ġthe Ġ[ Lens ] Ġand Ġreturns Ġits Ġ* new * Ġvalue . Ċ Ġ* Ċ Ġ* Ġ``` kotlin : ank : playground Ċ Ġ* Ġimport Ġarrow . mt l . run Ċ Ġ* Ġimport Ġarrow . mt l . State Ċ Ġ* Ġimport Ġarrow . opt ics . Lens Ċ Ġ* Ġimport Ġarrow . opt ics . mt l . update Ċ Ġ* Ċ Ġ* Ġdata Ġclass ĠEnemy ( val Ġhealth : ĠInt ) Ġ{ Ċ Ġ* ĠĠ Ġcompanion Ġobject Ġ{ Ċ Ġ* ĠĠĠĠ Ġval Ġhealth : ĠLens < Enemy , ĠInt > Ġ= ĠLens ( Enemy :: health ) Ġ{ Ġenemy , Ġhealth Ġ-> Ġenemy . copy ( health Ġ= Ġhealth ) Ġ} Ċ Ġ* ĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġval Ġenemy Ġ= ĠEnemy ( 7 0 ) Ċ Ġ* Ċ Ġ* Ġfun Ġmain () Ġ{ Ċ Ġ* ĠĠ Ġ// sample Start Ċ Ġ* ĠĠ Ġval Ġhit Enemy : ĠState < Enemy , ĠInt > Ġ= ĠEnemy . health . update Ġ{ Ġit Ġ- Ġ 1 5 Ġ} Ċ Ġ* ĠĠ Ġval Ġresult Ġ= Ġhit Enemy . run ( enemy ) Ċ Ġ* ĠĠ Ġ// end Sample Ċ Ġ* ĠĠ Ġprintln ( result ) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ fun Ġ< S , ĠA > ĠLens < S , ĠA >. update ( f : Ġ( A ) Ġ-> ĠA ): ĠState < S , ĠA > Ġ= ĠState Ġ{ Ġs Ġ-> ĊĠ Ġval Ġb Ġ= Ġf ( get ( s )) ĊĠ ĠTuple 2 ( set ( s , Ġb ), Ġb ) Ċ } Ċ Ċ /** Ċ Ġ* ĠUpdate Ġthe Ġfocus Ġ[ A ] Ġviewed Ġthrough Ġthe Ġ[ Lens ] Ġand Ġreturns Ġits Ġ* old * Ġvalue . Ċ Ġ* Ċ Ġ* Ġ``` kotlin : ank : playground Ċ Ġ* Ġimport Ġarrow . mt l . run Ċ Ġ* Ġimport Ġarrow . mt l . State Ċ Ġ* Ġimport Ġarrow . opt ics . Lens Ċ Ġ* Ġimport Ġarrow . opt ics . mt l . update Old Ċ Ġ* Ċ Ġ* Ġdata Ġclass ĠEnemy ( val Ġhealth : ĠInt ) Ġ{ Ċ Ġ* ĠĠ Ġcompanion Ġobject Ġ{ Ċ Ġ* ĠĠĠĠ Ġval Ġhealth : ĠLens < Enemy , ĠInt > Ġ= ĠLens ( Enemy :: health ) Ġ{ Ġenemy , Ġhealth Ġ-> Ġenemy . copy ( health Ġ= Ġhealth ) Ġ} Ċ Ġ* ĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġval Ġenemy Ġ= ĠEnemy ( 7 0 ) Ċ Ġ* Ċ Ġ* Ġfun Ġmain () Ġ{ Ċ Ġ* ĠĠ Ġ// sample Start Ċ Ġ* ĠĠ Ġval Ġhit Enemy : ĠState < Enemy , ĠInt > Ġ= ĠEnemy . health . update Old Ġ{ Ġit Ġ- Ġ 1 5 Ġ} Ċ Ġ* ĠĠ Ġval Ġresult Ġ= Ġhit Enemy . run ( enemy ) Ċ Ġ* ĠĠ Ġ// end Sample Ċ Ġ* ĠĠ Ġprintln ( result ) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ fun Ġ< S , ĠA > ĠLens < S , ĠA >. update Old ( f : Ġ( A ) Ġ-> ĠA ): ĠState < S , ĠA > Ġ= ĠState Ġ{ Ġs Ġ-> ĊĠ ĠTuple 2 ( modify ( s , Ġf ), Ġget ( s )) Ċ } Ċ Ċ /** Ċ Ġ* ĠModify Ġthe Ġfocus Ġ[ A ] Ġviewed Ġthrough Ġthe Ġ[ Lens ] Ġand Ġignores Ġboth Ġvalues . Ċ Ġ* Ċ Ġ* Ġ``` kotlin : ank : playground Ċ Ġ* Ġimport Ġarrow . mt l . run Ċ Ġ* Ġimport Ġarrow . mt l . State Ċ Ġ* Ġimport Ġarrow . opt ics . Lens Ċ Ġ* Ġimport Ġarrow . opt ics . mt l . update _ Ċ Ġ* Ċ Ġ* Ġdata Ġclass ĠEnemy ( val Ġhealth : ĠInt ) Ġ{ Ċ Ġ* ĠĠ Ġcompanion Ġobject Ġ{ Ċ Ġ* ĠĠĠĠ Ġval Ġhealth : ĠLens < Enemy , ĠInt > Ġ= ĠLens ( Enemy :: health ) Ġ{ Ġenemy , Ġhealth Ġ-> Ġenemy . copy ( health Ġ= Ġhealth ) Ġ} Ċ Ġ* ĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġval Ġenemy Ġ= ĠEnemy ( 7 0 ) Ċ Ġ* Ċ Ġ* Ġfun Ġmain () Ġ{ Ċ Ġ* ĠĠ Ġ// sample Start Ċ Ġ* ĠĠ Ġval Ġhit Enemy : ĠState < Enemy , ĠUnit > Ġ= ĠEnemy . health . update _ Ġ{ Ġit Ġ- Ġ 1 5 Ġ} Ċ Ġ* ĠĠ Ġval Ġresult Ġ= Ġhit Enemy . run ( enemy ) Ċ Ġ* ĠĠ Ġ// end Sample Ċ Ġ* ĠĠ Ġprintln ( result ) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ fun Ġ< S , ĠA > ĠLens < S , ĠA >. update _( f : Ġ( A ) Ġ-> ĠA ): ĠState < S , ĠUnit > Ġ= ĊĠ ĠState Ġ{ Ġs Ġ-> ĠTuple 2 ( modify ( s , Ġf ), ĠUnit ) Ġ} Ċ Ċ /** Ċ Ġ* ĠAssign Ġthe Ġfocus Ġ[ A ] Ġviewed Ġthrough Ġthe Ġ[ Lens ] Ġand Ġreturns Ġits Ġ* new * Ġvalue . Ċ Ġ* Ċ Ġ* Ġ``` kotlin : ank : playground Ċ Ġ* Ġimport Ġarrow . mt l . run Ċ Ġ* Ġimport Ġarrow . mt l . State Ċ Ġ* Ġimport Ġarrow . opt ics . Lens Ċ Ġ* Ġimport Ġarrow . opt ics . mt l . assign Ċ Ġ* Ċ Ġ* Ġdata Ġclass ĠEnemy ( val Ġhealth : ĠInt ) Ġ{ Ċ Ġ* ĠĠ Ġcompanion Ġobject Ġ{ Ċ Ġ* ĠĠĠĠ Ġval Ġhealth : ĠLens < Enemy , ĠInt > Ġ= ĠLens ( Enemy :: health ) Ġ{ Ġenemy , Ġhealth Ġ-> Ġenemy . copy ( health Ġ= Ġhealth ) Ġ} Ċ Ġ* ĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġval Ġenemy Ġ= ĠEnemy ( 7 0 ) Ċ Ġ* Ċ Ġ* Ġfun Ġmain () Ġ{ Ċ Ġ* ĠĠ Ġ// sample Start Ċ Ġ* ĠĠ Ġval Ġkill Enemy : ĠState < Enemy , ĠInt > Ġ= ĠEnemy . health . assign ( 0 ) Ċ Ġ* ĠĠ Ġval Ġresult Ġ= Ġkill Enemy . run ( enemy ) Ċ Ġ* ĠĠ Ġ// end Sample Ċ Ġ* ĠĠ Ġprintln ( result ) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ fun Ġ< S , ĠA > ĠLens < S , ĠA >. assign ( a : ĠA ): ĠState < S , ĠA > Ġ= ĊĠ Ġupdate Ġ{ Ġa Ġ} Ċ Ċ /** Ċ Ġ* ĠAssign Ġthe Ġvalue Ġfocus Ġ[ A ] Ġthrough Ġthe Ġ[ Lens ] Ġand Ġreturns Ġits Ġ* old * Ġvalue . Ċ Ġ* Ċ Ġ* Ġ``` kotlin : ank : playground Ċ Ġ* Ġimport Ġarrow . mt l . run Ċ Ġ* Ġimport Ġarrow . mt l . State Ċ Ġ* Ġimport Ġarrow . opt ics . Lens Ċ Ġ* Ġimport Ġarrow . opt ics . mt l . assign Old Ċ Ġ* Ċ Ġ* Ġdata Ġclass ĠEnemy ( val Ġhealth : ĠInt ) Ġ{ Ċ Ġ* ĠĠ Ġcompanion Ġobject Ġ{ Ċ Ġ* ĠĠĠĠ Ġval Ġhealth : ĠLens < Enemy , ĠInt > Ġ= ĠLens ( Enemy :: health ) Ġ{ Ġenemy , Ġhealth Ġ-> Ġenemy . copy ( health Ġ= Ġhealth ) Ġ} Ċ Ġ* ĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġval Ġenemy Ġ= ĠEnemy ( 7 0 ) Ċ Ġ* Ċ Ġ* Ġfun Ġmain () Ġ{ Ċ Ġ* ĠĠ Ġ// sample Start Ċ Ġ* ĠĠ Ġval Ġkill Enemy : ĠState < Enemy , ĠInt > Ġ= ĠEnemy . health . assign Old ( 0 ) Ċ Ġ* ĠĠ Ġval Ġresult Ġ= Ġkill Enemy . run ( enemy ) Ċ Ġ* ĠĠ Ġ// end Sample Ċ Ġ* ĠĠ Ġprintln ( result ) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ fun Ġ< S , ĠA > ĠLens < S , ĠA >. assign Old ( a : ĠA ): ĠState < S , ĠA > Ġ= ĊĠ Ġupdate Old Ġ{ Ġa Ġ} Ċ Ċ /** Ċ Ġ* ĠAssign Ġthe Ġfocus Ġ[ A ] Ġviewed Ġthrough Ġthe Ġ[ Lens ] Ġand Ġignores Ġboth Ġvalues . Ċ Ġ* Ċ Ġ* Ġ``` kotlin : ank : playground Ċ Ġ* Ġimport Ġarrow . mt l . run Ċ Ġ* Ġimport Ġarrow . mt l . State Ċ Ġ* Ġimport Ġarrow . opt ics . Lens Ċ Ġ* Ġimport Ġarrow . opt ics . mt l . assign _ Ċ Ġ* Ċ Ġ* Ġdata Ġclass ĠEnemy ( val Ġhealth : ĠInt ) Ġ{ Ċ Ġ* ĠĠ Ġcompanion Ġobject Ġ{ Ċ Ġ* ĠĠĠĠ Ġval Ġhealth : ĠLens < Enemy , ĠInt > Ġ= ĠLens ( Enemy :: health ) Ġ{ Ġenemy , Ġhealth Ġ-> Ġenemy . copy ( health Ġ= Ġhealth ) Ġ} Ċ Ġ* ĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġval Ġenemy Ġ= ĠEnemy ( 7 0 ) Ċ Ġ* Ċ Ġ* Ġfun Ġmain () Ġ{ Ċ Ġ* ĠĠ Ġ// sample Start Ċ Ġ* ĠĠ Ġval Ġkill Enemy : ĠState < Enemy , ĠUnit > Ġ= ĠEnemy . health . assign _( 0 ) Ċ Ġ* ĠĠ Ġval Ġresult Ġ= Ġkill Enemy . run ( enemy ) Ċ Ġ* ĠĠ Ġ// end Sample Ċ Ġ* ĠĠ Ġprintln ( result ) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ fun Ġ< S , ĠA > ĠLens < S , ĠA >. assign _( a : ĠA ): ĠState < S , ĠUnit > Ġ= ĊĠ Ġupdate _ Ġ{ Ġa Ġ} Ċ