package Ġarrow . opt ics Ċ Ċ import Ġarrow . core . Either . Left Ċ import Ġarrow . core . Either . Right Ċ import Ġarrow . core . test . Unit Spec Ċ import Ġarrow . type classes . Mon oid Ċ import Ġio . kot est . matchers . shouldBe Ċ import Ġio . kot est . property . Ar b Ċ import Ġio . kot est . property . ar bitrary . int Ċ import Ġio . kot est . property . ar bitrary . string Ċ import Ġio . kot est . property . ar bitrary . boolean Ċ Ċ class ĠGetter Test Ġ: ĠUnit Spec () Ġ{ ĊĊĠ Ġinit Ġ{ ĊĊĠĠĠ Ġ" as Fold Ġshould Ġbehave Ġas Ġvalid ĠFold : Ġsize " Ġ{ ĊĠĠĠĠĠ Ġcheck All ( Ar b . token ()) Ġ{ Ġtoken Ġ-> ĊĠĠĠĠĠĠĠ ĠGetter . token (). size ( token ) ĠshouldBe Ġ 1 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" as Fold Ġshould Ġbehave Ġas Ġvalid ĠFold : Ġnon Empty " Ġ{ ĊĠĠĠĠĠ Ġcheck All ( Ar b . token ()) Ġ{ Ġtoken Ġ-> ĊĠĠĠĠĠĠĠ ĠGetter . token (). isNotEmpty ( token ) ĠshouldBe Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" as Fold Ġshould Ġbehave Ġas Ġvalid ĠFold : ĠisEmpty " Ġ{ ĊĠĠĠĠĠ Ġcheck All ( Ar b . token ()) Ġ{ Ġtoken Ġ-> ĊĠĠĠĠĠĠĠ Ġ! Getter . token (). isEmpty ( token ) ĠshouldBe Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" as Fold Ġshould Ġbehave Ġas Ġvalid ĠFold : ĠgetAll " Ġ{ ĊĠĠĠĠĠ Ġcheck All ( Ar b . token ()) Ġ{ Ġtoken Ġ-> ĊĠĠĠĠĠĠĠ ĠGetter . token (). getAll ( token ) ĠshouldBe ĠlistOf ( token . value ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" as Fold Ġshould Ġbehave Ġas Ġvalid ĠFold : Ġcombine All " Ġ{ ĊĠĠĠĠĠ Ġcheck All ( Ar b . token ()) Ġ{ Ġtoken Ġ-> ĊĠĠĠĠĠĠĠ ĠGetter . token (). combine All ( Mon oid . string (), Ġtoken ) ĠshouldBe Ġtoken . value ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" as Fold Ġshould Ġbehave Ġas Ġvalid ĠFold : Ġfold " Ġ{ ĊĠĠĠĠĠ Ġcheck All ( Ar b . token ()) Ġ{ Ġtoken Ġ-> ĊĠĠĠĠĠĠĠ ĠGetter . token (). fold ( Mon oid . string (), Ġtoken ) ĠshouldBe Ġtoken . value ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" as Fold Ġshould Ġbehave Ġas Ġvalid ĠFold : Ġhead Option " Ġ{ ĊĠĠĠĠĠ Ġcheck All ( Ar b . token ()) Ġ{ Ġtoken Ġ-> ĊĠĠĠĠĠĠĠ ĠGetter . token (). first OrNull ( token ) ĠshouldBe Ġtoken . value ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" as Fold Ġshould Ġbehave Ġas Ġvalid ĠFold : Ġlast Option " Ġ{ ĊĠĠĠĠĠ Ġcheck All ( Ar b . token ()) Ġ{ Ġtoken Ġ-> ĊĠĠĠĠĠĠĠ ĠGetter . token (). last OrNull ( token ) ĠshouldBe Ġtoken . value ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Getting Ġthe Ġtarget Ġshould Ġalways Ġyield Ġthe Ġexact Ġresult " Ġ{ ĊĠĠĠĠĠ Ġcheck All ( Ar b . string ()) Ġ{ Ġvalue : ĠString Ġ-> ĊĠĠĠĠĠĠĠ ĠGetter . token (). get ( Token ( value )) ĠshouldBe Ġvalue ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Finding Ġa Ġtarget Ġusing Ġa Ġpredicate Ġwithin Ġa ĠGetter Ġshould Ġbe Ġwrapped Ġin Ġthe Ġcorrect Ġoption Ġresult " Ġ{ ĊĠĠĠĠĠ Ġcheck All ( Ar b . string (), ĠA rb . boolean ()) Ġ{ Ġvalue : ĠString , Ġpredicate : ĠBoolean Ġ-> ĊĠĠĠĠĠĠĠ ĠGetter . token (). find OrNull ( Token ( value )) Ġ{ Ġpredicate Ġ} ?. let Ġ{ Ġtrue Ġ} Ġ?: Ġfalse ĠshouldBe Ġpredicate ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Checking Ġexistence Ġof Ġa Ġtarget Ġshould Ġalways Ġresult Ġin Ġthe Ġsame Ġresult Ġas Ġpredicate " Ġ{ ĊĠĠĠĠĠ Ġcheck All ( Ar b . string (), ĠA rb . boolean ()) Ġ{ Ġvalue : ĠString , Ġpredicate : ĠBoolean Ġ-> ĊĠĠĠĠĠĠĠ ĠGetter . token (). any ( Token ( value )) Ġ{ Ġpredicate Ġ} ĠshouldBe Ġpredicate ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Z ipping Ġtwo Ġl enses Ġshould Ġyield Ġa Ġtuple Ġof Ġthe Ġtargets " Ġ{ ĊĠĠĠĠĠ Ġcheck All ( Ar b . string ()) Ġ{ Ġvalue : ĠString Ġ-> ĊĠĠĠĠĠĠĠ ĠGetter < String , ĠInt > Ġ{ Ġit . length Ġ}. zip Ġ{ Ġit . uppercase () Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. get ( value ) ĠshouldBe Ġ( value . length Ġto Ġvalue . toUpperCase ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Join ing Ġtwo Ġgetters Ġtogether Ġwith Ġsame Ġtarget Ġshould Ġyield Ġsame Ġresult " Ġ{ ĊĠĠĠĠĠ Ġcheck All ( Ar b . string ()) Ġ{ Ġtoken Value : ĠString Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġuser Token String Getter Ġ= ĠI so . user () Ġcompose ĠGetter . token () ĊĠĠĠĠĠĠĠ Ġval Ġjoined Getter Ġ= ĠGetter . token (). choice ( user Token String Getter ) ĊĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= ĠToken ( token Value ) ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠUser ( token ) ĊĠĠĠĠĠĠĠ Ġjoined Getter . get ( Left ( token )) ĠshouldBe Ġjoined Getter . get ( Right ( user )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Pair ing Ġtwo Ġdis joint Ġgetters Ġshould Ġyield Ġa Ġpair Ġof Ġtheir Ġresults " Ġ{ ĊĠĠĠĠĠ Ġval Ġsplit Getter : ĠGetter < Pair < Token , ĠUser >, ĠPair < String , ĠToken >> Ġ= ĠGetter . token (). split ( Iso . user ()) ĊĠĠĠĠĠ Ġcheck All ( Ar b . token (), ĠA rb . user ()) Ġ{ Ġtoken : ĠToken , Ġuser : ĠUser Ġ-> ĊĠĠĠĠĠĠĠ Ġsplit Getter . get ( token Ġto Ġuser ) ĠshouldBe Ġ( token . value Ġto Ġuser . token ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Creating Ġa Ġfirst Ġpair Ġwith Ġa Ġtype Ġshould Ġresult Ġin Ġthe Ġtarget Ġto Ġvalue " Ġ{ ĊĠĠĠĠĠ Ġval Ġfirst Ġ= ĠGetter . token (). first < Int >() ĊĠĠĠĠĠ Ġcheck All ( Ar b . token (), ĠA rb . int ()) Ġ{ Ġtoken : ĠToken , Ġint : ĠInt Ġ-> ĊĠĠĠĠĠĠĠ Ġfirst . get ( token Ġto Ġint ) ĠshouldBe Ġ( token . value Ġto Ġint ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Creating Ġa Ġsecond Ġpair Ġwith Ġa Ġtype Ġshould Ġresult Ġin Ġthe Ġvalue Ġtarget " Ġ{ ĊĠĠĠĠĠ Ġcheck All ( Ar b . int (), ĠA rb . token ()) Ġ{ Ġint : ĠInt , Ġtoken : ĠToken Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= ĠGetter . token (). second < Int >() ĊĠĠĠĠĠĠĠ Ġfirst . get ( int Ġto Ġtoken ) ĠshouldBe Ġ( int Ġto Ġtoken . value ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ