package Ġarrow . generic Ċ Ċ import Ġarrow . core .* Ċ import Ġarrow . generic . co product 2 . Co product 2 Ċ import Ġarrow . generic . co product 2 . cop Ċ import Ġarrow . generic . co product 2 . co product Of Ċ import Ġarrow . generic . co product 2 . fold Ċ import Ġarrow . generic . co product 2 . select Ċ import Ġarrow . generic . co product 2 2 . Co product 2 2 Ċ import Ġarrow . generic . co product 3 .* Ċ import Ġarrow . test . Unit Spec Ċ import Ġio . kot lint est . runner . junit 4 . Kotlin TestRunner Ċ import Ġio . kot lint est . shouldBe Ċ import Ġorg . junit . runner . RunWith Ċ Ċ @ RunWith ( Kotlin TestRunner :: class ) Ċ class ĠCo product Test Ġ: ĠUnit Spec () Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ" Co products Ġshould Ġbe Ġgenerated Ġup Ġto Ġ 2 2 " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠPro of 2 ( f : ĠCo product 2 < Unit , ĠUnit >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġf ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠPro of 2 2 ( f : ĠCo product 2 2 < Unit , ĠUnit , ĠUnit , ĠUnit , ĠUnit , ĠUnit , ĠUnit , ĠUnit , ĠUnit , ĠUnit , ĠUnit , ĠUnit , ĠUnit , ĠUnit , ĠUnit , ĠUnit , ĠUnit , ĠUnit , ĠUnit , ĠUnit , ĠUnit , ĠUnit >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġf ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" select Ġshould Ġreturn ĠNone Ġif Ġvalue Ġisn 't Ġcorrect Ġtype " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġco product 2 Ġ= Ġ" String ". cop < String , ĠLong >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco product 2 . select < Long >() ĠshouldBe ĠNone ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" select Ġreturns ĠSome Ġif Ġvalue Ġis Ġcorrect Ġtype " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġco product 2 Ġ= Ġ" String ". cop < String , ĠLong >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco product 2 . select < String >() ĠshouldBe ĠSome (" String ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" co product Of ( A ) Ġshould Ġequal Ġcop < A , ĠB >() " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" String ". cop < String , ĠLong >() ĠshouldBe Ġco product Of < String , ĠLong >(" String ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" Co product 2 Ġfold " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġco product 2 Ġ= Ġ 1 0 0 L . cop < Long , ĠInt >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco product 2 . fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" Long $ it " Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" Int $ it " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĠshouldBe Ġ" Long 1 0 0 " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" Co product 3 Ġshould Ġhandle Ġmultiple Ġnullable Ġtypes " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġco product 3 Ġ= Ġvalue . cop < Long , ĠFloat ?, ĠString ?> () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco product 3 . select < Long >() ĠshouldBe ĠNone ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco product 3 . select < Float ?> () ĠshouldBe ĠNone ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco product 3 . select < String ?> () ĠshouldBe ĠNone ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco product 3 . fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" First " Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" Second " Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" Third " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĠshouldBe Ġ" Third " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" Co product 3 Ġshould Ġhandle Ġmultiple Ġtypes Ġwith Ġgener ics " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue : ĠOption < String > Ġ= Ġ" String ". some () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġco product 3 Ġ= Ġvalue . cop < Option < Long >, ĠOption < Float >, ĠOption < String >>() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco product 3 . select < Option < Long >>() ĠshouldBe ĠNone ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco product 3 . select < Option < Float >>() ĠshouldBe ĠNone ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco product 3 . select < Option < String >>() ĠshouldBe Ġvalue . some () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco product 3 . fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" First " Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" Second " Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" Third " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĠshouldBe Ġ" Third " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" cop Ġreplacement Ġfunctions Ġare Ġequivalent " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Value Ġ= Ġ" String " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecond Value Ġ= Ġ 1 0 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthird Value Ġ= Ġnone < String >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Value . cop < String , ĠLong , ĠOption < String >>() ĠshouldBe Ġfirst Value . first < String , ĠLong , ĠOption < String >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Value . cop < String , ĠLong , ĠOption < String >>() ĠshouldBe Ġsecond Value . second < String , ĠLong , ĠOption < String >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthird Value . cop < String , ĠLong , ĠOption < String >>() ĠshouldBe Ġthird Value . third < String , ĠLong , ĠOption < String >>() ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" types Ġcan Ġbe Ġinferred Ġwith Ġthe Ġextension Ġconstructors " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġtype Inference Test ( input : ĠString ?): ĠCo product 3 < String , ĠInt , ĠOption < String >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Ġ== Ġnull Ġ-> Ġnone < String >(). third () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . length Ġ> Ġ 1 0 0 Ġ-> Ġinput . length . second () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġinput . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Inference Test ( null ) ĠshouldBe ĠThird < String , ĠInt , ĠOption < String >>( none ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" types Ġcan Ġbe Ġinferred Ġwith Ġthe ĠA DT Ġconstructors " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġtype Inference Test ( input : ĠString ?): ĠCo product 3 < String , ĠInt , ĠOption < String >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Ġ== Ġnull Ġ-> ĠThird ( none ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . length Ġ> Ġ 1 0 0 Ġ-> ĠSecond ( input . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠFirst ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Inference Test ( null ) ĠshouldBe Ġnone < String >(). third < String , ĠInt , ĠOption < String >>() ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" Co product Ġdata Ġclasses Ġshould Ġbe Ġavailable " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Value Ġ= Ġ" String " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecond Value Ġ= Ġ 1 0 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthird Value Ġ= Ġnone < String >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFirst < String , ĠLong , ĠOption < String >>( first Value ) ĠshouldBe Ġfirst Value . first < String , ĠLong , ĠOption < String >>() ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSecond < String , ĠLong , ĠOption < String >>( second Value ) ĠshouldBe Ġsecond Value . second < String , ĠLong , ĠOption < String >>() ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThird < String , ĠLong , ĠOption < String >>( third Value ) ĠshouldBe Ġthird Value . third < String , ĠLong , ĠOption < String >>() ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }