package Ġarrow . type classes Ċ Ċ import Ġarrow . core . Const Ċ import Ġarrow . core . Either Ċ import Ġarrow . core . En do Ċ import Ġarrow . core . I or Ċ import Ġarrow . core . Non Empty List Ċ import Ġarrow . core . Option Ċ import Ġarrow . core . Validated Ċ import Ġarrow . core . combine Ċ import Ġarrow . core . compose Ċ import Ġkotlin . jvm . Jvm Name Ċ import Ġkotlin . jvm . Jvm Static Ċ Ċ public Ġfun Ġinterface ĠSem ig roup < A > Ġ{ ĊĠ Ġ/** ĊĠĠ Ġ* ĠCombine Ġtwo Ġ[ A ] Ġvalues . ĊĠĠ Ġ*/ ĊĠ Ġpublic Ġfun ĠA . combine ( b : ĠA ): ĠA ĊĊĠ Ġpublic Ġoperator Ġfun ĠA . plus ( b : ĠA ): ĠA Ġ= ĊĠĠĠ Ġthis . combine ( b ) ĊĊĠ Ġpublic Ġfun ĠA . maybe Combine ( b : ĠA ?): ĠA Ġ= ĊĠĠĠ Ġb ?. let Ġ{ Ġcombine ( it ) Ġ} Ġ?: Ġthis ĊĊĠ Ġpublic Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġpublic Ġfun Ġ< A > Ġlist (): ĠSem ig roup < List < A >> Ġ= ĠMon oid . list () ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġpublic Ġfun Ġ< A > Ġsequence (): ĠSem ig roup < Sequence < A >> Ġ= ĠMon oid . sequence () ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġpublic Ġfun Ġstring (): ĠSem ig roup < String > Ġ= ĠMon oid . string () ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Jvm Name (" Boolean ") ĊĠĠĠ Ġpublic Ġfun Ġboolean (): ĠSem ig roup < Boolean > Ġ= ĠMon oid . boolean () ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Jvm Name (" Byte ") ĊĠĠĠ Ġpublic Ġfun Ġbyte (): ĠSem ig roup < Byte > Ġ= ĠMon oid . byte () ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Jvm Name (" Integer ") ĊĠĠĠ Ġpublic Ġfun Ġint (): ĠSem ig roup < Int > Ġ= ĠMon oid . int () ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Jvm Name (" Long ") ĊĠĠĠ Ġpublic Ġfun Ġlong (): ĠSem ig roup < Long > Ġ= ĠMon oid . long () ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Jvm Name (" Short ") ĊĠĠĠ Ġpublic Ġfun Ġshort (): ĠSem ig roup < Short > Ġ= ĠMon oid . short () ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġpublic Ġfun Ġ< A , ĠB > Ġeither ( SA : ĠSem ig roup < A >, ĠSB : ĠSem ig roup < B >): ĠSem ig roup < Either < A , ĠB >> Ġ= ĊĠĠĠĠĠ ĠEither Sem ig roup ( SA , ĠSB ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġpublic Ġfun Ġ< A , ĠB > Ġi or ( SA : ĠSem ig roup < A >, ĠSB : ĠSem ig roup < B >): ĠSem ig roup < I or < A , ĠB >> Ġ= ĊĠĠĠĠĠ ĠI or Sem ig roup ( SA , ĠSB ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġpublic Ġfun Ġ< A > Ġend o (): ĠSem ig roup < En do < A >> Ġ= ĊĠĠĠĠĠ Ġobject Ġ: ĠSem ig roup < En do < A >> Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠEn do < A >. combine ( g : ĠEn do < A >): ĠEn do < A > Ġ= ĠEn do ( f . compose ( g . f )) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Jvm Name (" constant ") ĊĠĠĠ Ġpublic Ġfun Ġ< A , ĠT > Ġconst ( SA : ĠSem ig roup < A >): ĠSem ig roup < Const < A , ĠT >> Ġ= ĊĠĠĠĠĠ Ġobject Ġ: ĠSem ig roup < Const < A , ĠT >> Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠConst < A , ĠT >. combine ( b : ĠConst < A , ĠT >): ĠConst < A , ĠT > Ġ= ĊĠĠĠĠĠĠĠĠĠ Ġthis . combine ( SA , Ġb ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġpublic Ġfun Ġ< K , ĠA > Ġmap ( SG : ĠSem ig roup < A >): ĠSem ig roup < Map < K , ĠA >> Ġ= ĊĠĠĠĠĠ ĠMap Sem ig roup ( SG ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġpublic Ġfun Ġ< A > Ġoption ( SG A : ĠSem ig roup < A >): ĠSem ig roup < Option < A >> Ġ= ĊĠĠĠĠĠ ĠOption Sem ig roup ( SG A ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġpublic Ġfun Ġ< E , ĠA > Ġvalidated ( SE : ĠSem ig roup < E >, ĠSA : ĠSem ig roup < A >): ĠSem ig roup < Validated < E , ĠA >> Ġ= ĊĠĠĠĠĠ ĠValid ated Sem ig roup ( SE , ĠSA ) ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġpublic Ġfun Ġ< A > Ġnon Empty List (): ĠSem ig roup < Non Empty List < A >> Ġ= ĊĠĠĠĠĠ ĠNon Empty List Sem ig roup Ġas ĠSem ig roup < Non Empty List < A >> ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġpublic Ġfun Ġ< A , ĠB > Ġpair ( SA : ĠSem ig roup < A >, ĠSB : ĠSem ig roup < B >): ĠSem ig roup < Pair < A , ĠB >> Ġ= ĊĠĠĠĠĠ ĠPair Sem ig roup ( SA , ĠSB ) ĊĊĠĠĠ Ġprivate Ġopen Ġclass ĠPair Sem ig roup < A , ĠB >( ĊĠĠĠĠĠ Ġprivate Ġval ĠSA : ĠSem ig roup < A >, ĊĠĠĠĠĠ Ġprivate Ġval ĠSB : ĠSem ig roup < B > ĊĠĠĠ Ġ) Ġ: ĠSem ig roup < Pair < A , ĠB >> Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun ĠPair < A , ĠB >. combine ( b : ĠPair < A , ĠB >): ĠPair < A , ĠB > Ġ= Ġcombine ( SA , ĠSB , Ġb ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġobject ĠNon Empty List Sem ig roup Ġ: ĠSem ig roup < Non Empty List < Any ? >> Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun ĠNon Empty List < Any ?> . combine ( b : ĠNon Empty List < Any ?> ): ĠNon Empty List < Any ?> Ġ= ĊĠĠĠĠĠĠĠ ĠNon Empty List ( this . head , Ġthis . tail . plus ( b )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġopen Ġclass ĠValid ated Sem ig roup < A , ĠB >( ĊĠĠĠĠĠ Ġprivate Ġval ĠSA : ĠSem ig roup < A >, ĊĠĠĠĠĠ Ġprivate Ġval ĠSB : ĠSem ig roup < B > ĊĠĠĠ Ġ) Ġ: ĠSem ig roup < Validated < A , ĠB >> Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun ĠValid ated < A , ĠB >. combine ( b : ĠValid ated < A , ĠB >): ĠValid ated < A , ĠB > Ġ= ĊĠĠĠĠĠĠĠ Ġcombine ( SA , ĠSB , Ġb ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠOption Sem ig roup < A >( ĊĠĠĠĠĠ Ġprivate Ġval ĠS GA : ĠSem ig roup < A > ĊĠĠĠ Ġ) Ġ: ĠSem ig roup < Option < A >> Ġ{ ĊĊĠĠĠĠĠ Ġoverride Ġfun ĠOption < A >. combine ( b : ĠOption < A >): ĠOption < A > Ġ= ĊĠĠĠĠĠĠĠ Ġcombine ( SG A , Ġb ) ĊĊĠĠĠĠĠ Ġoverride Ġfun ĠOption < A >. maybe Combine ( b : ĠOption < A >? ): ĠOption < A > Ġ= ĊĠĠĠĠĠĠĠ Ġb ?. let Ġ{ Ġcombine ( SG A , Ġit ) Ġ} Ġ?: Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠMap Sem ig roup < K , ĠA >( private Ġval ĠSG : ĠSem ig roup < A >) Ġ: ĠSem ig roup < Map < K , ĠA >> Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun ĠMap < K , ĠA >. combine ( b : ĠMap < K , ĠA >): ĠMap < K , ĠA > Ġ= ĊĠĠĠĠĠĠĠ Ġcombine ( SG , Ġb ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġopen Ġclass ĠEither Sem ig roup < L , ĠR >( ĊĠĠĠĠĠ Ġprivate Ġval ĠS GL : ĠSem ig roup < L >, ĊĠĠĠĠĠ Ġprivate Ġval ĠS GR : ĠSem ig roup < R > ĊĠĠĠ Ġ) Ġ: ĠSem ig roup < Either < L , ĠR >> Ġ{ ĊĊĠĠĠĠĠ Ġoverride Ġfun ĠEither < L , ĠR >. combine ( b : ĠEither < L , ĠR >): ĠEither < L , ĠR > Ġ= ĊĠĠĠĠĠĠĠ Ġcombine ( S GL , ĠS GR , Ġb ) ĊĊĠĠĠĠĠ Ġoverride Ġfun ĠEither < L , ĠR >. maybe Combine ( b : ĠEither < L , ĠR >? ): ĠEither < L , ĠR > Ġ= ĊĠĠĠĠĠĠĠ Ġb ?. let Ġ{ Ġcombine ( S GL , ĠS GR , Ġit ) Ġ} Ġ?: Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠI or Sem ig roup < A , ĠB >( ĊĠĠĠĠĠ Ġprivate Ġval ĠS GA : ĠSem ig roup < A >, ĊĠĠĠĠĠ Ġprivate Ġval ĠS GB : ĠSem ig roup < B > ĊĠĠĠ Ġ) Ġ: ĠSem ig roup < I or < A , ĠB >> Ġ{ ĊĊĠĠĠĠĠ Ġoverride Ġfun ĠI or < A , ĠB >. combine ( b : ĠI or < A , ĠB >): ĠI or < A , ĠB > Ġ= ĊĠĠĠĠĠĠĠ Ġcombine ( SG A , ĠS GB , Ġb ) ĊĊĠĠĠĠĠ Ġoverride Ġfun ĠI or < A , ĠB >. maybe Combine ( b : ĠI or < A , ĠB >? ): ĠI or < A , ĠB > Ġ= ĊĠĠĠĠĠĠĠ Ġb ?. let Ġ{ Ġcombine ( SG A , ĠS GB , Ġit ) Ġ} Ġ?: Ġthis ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ