From 144b27233bd2882a33f188739429aac397d120cc Mon Sep 17 00:00:00 2001 From: "Dr. Carsten Leue" Date: Thu, 1 Feb 2024 17:26:51 +0100 Subject: [PATCH] fix: some internal refactorings Signed-off-by: Dr. Carsten Leue --- either/either.go | 2 +- internal/eithert/either.go | 22 ++++++++++++++++++++-- internal/fromeither/either.go | 7 +++++++ internal/functor/functor.go | 6 +----- internal/optiont/option.go | 20 ++++++++++++-------- ioeither/generic/ioeither.go | 16 ++++++++++------ iooption/generic/iooption.go | 17 +++++++++++++---- readereither/generic/reader.go | 2 +- readerioeither/generic/reader.go | 2 +- 9 files changed, 66 insertions(+), 28 deletions(-) diff --git a/either/either.go b/either/either.go index 3fc32e3..f3f88aa 100644 --- a/either/either.go +++ b/either/either.go @@ -77,7 +77,7 @@ func Map[E, A, B any](f func(a A) B) func(fa Either[E, A]) Either[E, B] { // MapLeft applies a mapping function to the error channel func MapLeft[A, E1, E2 any](f func(E1) E2) func(fa Either[E1, A]) Either[E2, A] { - return F.Bind2nd(MonadMapLeft[E1, A, E2], f) + return Fold(F.Flow2(f, Left[A, E2]), Right[E2, A]) } func MonadChain[E, A, B any](fa Either[E, A], f func(a A) Either[E, B]) Either[E, B] { diff --git a/internal/eithert/either.go b/internal/eithert/either.go index 8c613bf..cf2309c 100644 --- a/internal/eithert/either.go +++ b/internal/eithert/either.go @@ -51,6 +51,14 @@ func MonadMap[E, A, B, HKTFA, HKTFB any](fmap func(HKTFA, func(ET.Either[E, A]) return FC.MonadMap(fmap, ET.MonadMap[E, A, B], fa, f) } +func Map[E, A, B, HKTFA, HKTFB any]( + fmap func(func(ET.Either[E, A]) ET.Either[E, B]) func(HKTFA) HKTFB, + f func(A) B) func(HKTFA) HKTFB { + // HKTGA = Either[E, A] + // HKTGB = Either[E, B] + return FC.Map(fmap, ET.Map[E, A, B], f) +} + // HKTFA = HKT> // HKTFB = HKT> func MonadBiMap[E1, E2, A, B, HKTFA, HKTFB any](fmap func(HKTFA, func(ET.Either[E1, A]) ET.Either[E2, B]) HKTFB, fa HKTFA, f func(E1) E2, g func(A) B) HKTFB { @@ -61,10 +69,12 @@ func MonadBiMap[E1, E2, A, B, HKTFA, HKTFB any](fmap func(HKTFA, func(ET.Either[ // HKTFA = HKT> // HKTFB = HKT> -func BiMap[E1, E2, A, B, HKTFA, HKTFB any](fmap func(HKTFA, func(ET.Either[E1, A]) ET.Either[E2, B]) HKTFB, f func(E1) E2, g func(A) B) func(HKTFA) HKTFB { +func BiMap[E1, E2, A, B, HKTFA, HKTFB any]( + fmap func(func(ET.Either[E1, A]) ET.Either[E2, B]) func(HKTFA) HKTFB, + f func(E1) E2, g func(A) B) func(HKTFA) HKTFB { // HKTGA = Either[E, A] // HKTGB = Either[E, B] - return F.Bind2nd(fmap, ET.BiMap(f, g)) + return fmap(ET.BiMap(f, g)) } // HKTFA = HKT> @@ -78,6 +88,14 @@ func MonadChain[E, A, B, HKTFA, HKTFB any]( return fchain(ma, ET.Fold(F.Flow2(ET.Left[B, E], fof), f)) } +func Chain[E, A, B, HKTFA, HKTFB any]( + fchain func(func(ET.Either[E, A]) HKTFB) func(HKTFA) HKTFB, + fof func(ET.Either[E, B]) HKTFB, + f func(A) HKTFB) func(HKTFA) HKTFB { + // dispatch to the even more generic implementation + return fchain(ET.Fold(F.Flow2(ET.Left[B, E], fof), f)) +} + func MonadAp[E, A, B, HKTFAB, HKTFGAB, HKTFA, HKTFB any]( fap func(HKTFGAB, HKTFA) HKTFB, fmap func(HKTFAB, func(ET.Either[E, func(A) B]) func(ET.Either[E, A]) ET.Either[E, B]) HKTFGAB, diff --git a/internal/fromeither/either.go b/internal/fromeither/either.go index 124386c..c71f721 100644 --- a/internal/fromeither/either.go +++ b/internal/fromeither/either.go @@ -60,6 +60,13 @@ func MonadChainEitherK[A, E, B, HKTEA, HKTEB any]( return mchain(ma, F.Flow2(f, fromEither)) } +func ChainEitherK[A, E, B, HKTEA, HKTEB any]( + mchain func(func(A) HKTEB) func(HKTEA) HKTEB, + fromEither func(ET.Either[E, B]) HKTEB, + f func(A) ET.Either[E, B]) func(HKTEA) HKTEB { + return mchain(F.Flow2(f, fromEither)) +} + func ChainOptionK[A, E, B, HKTEA, HKTEB any]( mchain func(HKTEA, func(A) HKTEB) HKTEB, fromEither func(ET.Either[E, B]) HKTEB, diff --git a/internal/functor/functor.go b/internal/functor/functor.go index 61b1de8..27ad4c0 100644 --- a/internal/functor/functor.go +++ b/internal/functor/functor.go @@ -62,9 +62,5 @@ func LetTo[S1, S2, B, HKTS1, HKTS2 any]( key func(B) func(S1) S2, b B, ) func(HKTS1) HKTS2 { - return F.Pipe2( - b, - key, - mmap, - ) + return mmap(key(b)) } diff --git a/internal/optiont/option.go b/internal/optiont/option.go index 8ee14b6..165fcce 100644 --- a/internal/optiont/option.go +++ b/internal/optiont/option.go @@ -50,13 +50,11 @@ func MonadChain[A, B, HKTFA, HKTFB any]( } func Chain[A, B, HKTFA, HKTFB any]( - fchain func(HKTFA, func(O.Option[A]) HKTFB) HKTFB, + fchain func(func(O.Option[A]) HKTFB) func(HKTFA) HKTFB, fof func(O.Option[B]) HKTFB, f func(A) HKTFB) func(ma HKTFA) HKTFB { // dispatch to the even more generic implementation - return func(ma HKTFA) HKTFB { - return MonadChain(fchain, fof, ma, f) - } + return fchain(O.Fold(F.Nullary2(O.None[B], fof), f)) } func MonadAp[A, B, HKTFAB, HKTFGAB, HKTFA, HKTFB any]( @@ -93,6 +91,14 @@ func MonadChainOptionK[A, B, HKTA, HKTB any]( return MonadChain(fchain, fof, ma, FromOptionK(fof, f)) } +func ChainOptionK[A, B, HKTA, HKTB any]( + fchain func(func(O.Option[A]) HKTB) func(HKTA) HKTB, + fof func(O.Option[B]) HKTB, + f func(A) O.Option[B], +) func(HKTA) HKTB { + return Chain(fchain, fof, FromOptionK(fof, f)) +} + func MonadAlt[LAZY ~func() HKTFA, A, HKTFA any]( fof func(O.Option[A]) HKTFA, fchain func(HKTFA, func(O.Option[A]) HKTFA) HKTFA, @@ -105,11 +111,9 @@ func MonadAlt[LAZY ~func() HKTFA, A, HKTFA any]( func Alt[LAZY ~func() HKTFA, A, HKTFA any]( fof func(O.Option[A]) HKTFA, - fchain func(HKTFA, func(O.Option[A]) HKTFA) HKTFA, + fchain func(func(O.Option[A]) HKTFA) func(HKTFA) HKTFA, second LAZY) func(HKTFA) HKTFA { - return func(fa HKTFA) HKTFA { - return MonadAlt(fof, fchain, fa, second) - } + return fchain(O.Fold(second, F.Flow2(O.Of[A], fof))) } diff --git a/ioeither/generic/ioeither.go b/ioeither/generic/ioeither.go index 97b3495..2aabead 100644 --- a/ioeither/generic/ioeither.go +++ b/ioeither/generic/ioeither.go @@ -87,7 +87,7 @@ func MonadMap[GA ~func() ET.Either[E, A], GB ~func() ET.Either[E, B], E, A, B an } func Map[GA ~func() ET.Either[E, A], GB ~func() ET.Either[E, B], E, A, B any](f func(A) B) func(GA) GB { - return F.Bind2nd(MonadMap[GA, GB, E, A, B], f) + return eithert.Map(IO.Map[GA, GB, ET.Either[E, A], ET.Either[E, B]], f) } func MonadMapTo[GA ~func() ET.Either[E, A], GB ~func() ET.Either[E, B], E, A, B any](fa GA, b B) GB { @@ -95,7 +95,7 @@ func MonadMapTo[GA ~func() ET.Either[E, A], GB ~func() ET.Either[E, B], E, A, B } func MapTo[GA ~func() ET.Either[E, A], GB ~func() ET.Either[E, B], E, A, B any](b B) func(GA) GB { - return F.Bind2nd(MonadMapTo[GA, GB, E, A, B], b) + return Map[GA, GB](F.Constant1[A](b)) } func MonadChain[GA ~func() ET.Either[E, A], GB ~func() ET.Either[E, B], E, A, B any](fa GA, f func(A) GB) GB { @@ -103,7 +103,7 @@ func MonadChain[GA ~func() ET.Either[E, A], GB ~func() ET.Either[E, B], E, A, B } func Chain[GA ~func() ET.Either[E, A], GB ~func() ET.Either[E, B], E, A, B any](f func(A) GB) func(GA) GB { - return F.Bind2nd(MonadChain[GA, GB, E, A, B], f) + return eithert.Chain(IO.Chain[GA, GB, ET.Either[E, A], ET.Either[E, B]], IO.Of[GB, ET.Either[E, B]], f) } func MonadChainTo[GA ~func() ET.Either[E, A], GB ~func() ET.Either[E, B], E, A, B any](fa GA, fb GB) GB { @@ -111,7 +111,7 @@ func MonadChainTo[GA ~func() ET.Either[E, A], GB ~func() ET.Either[E, B], E, A, } func ChainTo[GA ~func() ET.Either[E, A], GB ~func() ET.Either[E, B], E, A, B any](fb GB) func(GA) GB { - return F.Bind2nd(MonadChainTo[GA, GB, E, A, B], fb) + return Chain[GA, GB, E, A, B](F.Constant1[A](fb)) } func MonadChainEitherK[GA ~func() ET.Either[E, A], GB ~func() ET.Either[E, B], E, A, B any](ma GA, f func(A) ET.Either[E, B]) GB { @@ -141,7 +141,11 @@ func ChainIOK[GA ~func() ET.Either[E, A], GB ~func() ET.Either[E, B], GR ~func() } func ChainEitherK[GA ~func() ET.Either[E, A], GB ~func() ET.Either[E, B], E, A, B any](f func(A) ET.Either[E, B]) func(GA) GB { - return F.Bind2nd(MonadChainEitherK[GA, GB, E, A, B], f) + return FE.ChainEitherK( + Chain[GA, GB, E, A, B], + FromEither[GB, E, B], + f, + ) } func MonadAp[GB ~func() ET.Either[E, B], GAB ~func() ET.Either[E, func(A) B], GA ~func() ET.Either[E, A], E, A, B any](mab GAB, ma GA) GB { @@ -223,7 +227,7 @@ func MonadBiMap[GA ~func() ET.Either[E1, A], GB ~func() ET.Either[E2, B], E1, E2 // BiMap maps a pair of functions over the two type arguments of the bifunctor. func BiMap[GA ~func() ET.Either[E1, A], GB ~func() ET.Either[E2, B], E1, E2, A, B any](f func(E1) E2, g func(A) B) func(GA) GB { - return eithert.BiMap(IO.MonadMap[GA, GB, ET.Either[E1, A], ET.Either[E2, B]], f, g) + return eithert.BiMap(IO.Map[GA, GB, ET.Either[E1, A], ET.Either[E2, B]], f, g) } // Fold convers an IOEither into an IO diff --git a/iooption/generic/iooption.go b/iooption/generic/iooption.go index b2e414c..e24f1dc 100644 --- a/iooption/generic/iooption.go +++ b/iooption/generic/iooption.go @@ -118,7 +118,7 @@ func ChainFirstIOK[GA ~func() O.Option[A], GIOB ~func() B, A, B any](f func(A) G } func Chain[GA ~func() O.Option[A], GB ~func() O.Option[B], A, B any](f func(A) GB) func(GA) GB { - return optiont.Chain(IO.MonadChain[GA, GB, O.Option[A], O.Option[B]], IO.MonadOf[GB, O.Option[B]], f) + return optiont.Chain(IO.Chain[GA, GB, O.Option[A], O.Option[B]], IO.Of[GB, O.Option[B]], f) } func MonadChainOptionK[GA ~func() O.Option[A], GB ~func() O.Option[B], A, B any](ma GA, f func(A) O.Option[B]) GB { @@ -131,7 +131,11 @@ func MonadChainOptionK[GA ~func() O.Option[A], GB ~func() O.Option[B], A, B any] } func ChainOptionK[GA ~func() O.Option[A], GB ~func() O.Option[B], A, B any](f func(A) O.Option[B]) func(GA) GB { - return F.Bind2nd(MonadChainOptionK[GA, GB, A, B], f) + return optiont.ChainOptionK( + IO.Chain[GA, GB, O.Option[A], O.Option[B]], + FromOption[GB, B], + f, + ) } func MonadChainIOK[GA ~func() O.Option[A], GB ~func() O.Option[B], GR ~func() B, A, B any](ma GA, f func(A) GR) GB { @@ -239,7 +243,7 @@ func Defer[GA ~func() O.Option[A], A any](gen func() GA) GA { func MonadAlt[LAZY ~func() GIOA, GIOA ~func() O.Option[A], A any](first GIOA, second LAZY) GIOA { return optiont.MonadAlt( - IO.Of[GIOA], + IO.MonadOf[GIOA], IO.MonadChain[GIOA, GIOA], first, @@ -248,5 +252,10 @@ func MonadAlt[LAZY ~func() GIOA, GIOA ~func() O.Option[A], A any](first GIOA, se } func Alt[LAZY ~func() GIOA, GIOA ~func() O.Option[A], A any](second LAZY) func(GIOA) GIOA { - return F.Bind2nd(MonadAlt[LAZY], second) + return optiont.Alt( + IO.Of[GIOA], + IO.Chain[GIOA, GIOA], + + second, + ) } diff --git a/readereither/generic/reader.go b/readereither/generic/reader.go index 5a92e27..ce9f938 100644 --- a/readereither/generic/reader.go +++ b/readereither/generic/reader.go @@ -143,7 +143,7 @@ func MonadBiMap[GA ~func(E) ET.Either[E1, A], GB ~func(E) ET.Either[E2, B], E, E // BiMap maps a pair of functions over the two type arguments of the bifunctor. func BiMap[GA ~func(E) ET.Either[E1, A], GB ~func(E) ET.Either[E2, B], E, E1, E2, A, B any](f func(E1) E2, g func(A) B) func(GA) GB { - return eithert.BiMap(R.MonadMap[GA, GB, E, ET.Either[E1, A], ET.Either[E2, B]], f, g) + return eithert.BiMap(R.Map[GA, GB, E, ET.Either[E1, A], ET.Either[E2, B]], f, g) } // Local changes the value of the local context during the execution of the action `ma` (similar to `Contravariant`'s diff --git a/readerioeither/generic/reader.go b/readerioeither/generic/reader.go index 0719d3b..1bedda9 100644 --- a/readerioeither/generic/reader.go +++ b/readerioeither/generic/reader.go @@ -405,7 +405,7 @@ func MonadBiMap[GA ~func(R) GE1A, GB ~func(R) GE2B, GE1A ~func() ET.Either[E1, A // BiMap maps a pair of functions over the two type arguments of the bifunctor. func BiMap[GA ~func(R) GE1A, GB ~func(R) GE2B, GE1A ~func() ET.Either[E1, A], GE2B ~func() ET.Either[E2, B], R, E1, E2, A, B any](f func(E1) E2, g func(A) B) func(GA) GB { - return eithert.BiMap(G.MonadMap[GA, GB, GE1A, GE2B, R, ET.Either[E1, A], ET.Either[E2, B]], f, g) + return eithert.BiMap(G.Map[GA, GB, GE1A, GE2B, R, ET.Either[E1, A], ET.Either[E2, B]], f, g) } // Swap changes the order of type parameters