1
0
mirror of https://github.com/IBM/fp-go.git synced 2025-08-10 22:31:32 +02:00

fix: some internal refactorings

Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com>
This commit is contained in:
Dr. Carsten Leue
2024-02-01 17:26:51 +01:00
parent 668eb85aea
commit 144b27233b
9 changed files with 66 additions and 28 deletions

View File

@@ -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 // 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] { 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] { func MonadChain[E, A, B any](fa Either[E, A], f func(a A) Either[E, B]) Either[E, B] {

View File

@@ -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) 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<F, Either<E, A>> // HKTFA = HKT<F, Either<E, A>>
// HKTFB = HKT<F, Either<E, B>> // HKTFB = HKT<F, Either<E, B>>
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 { 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<F, Either<E, A>> // HKTFA = HKT<F, Either<E, A>>
// HKTFB = HKT<F, Either<E, B>> // HKTFB = HKT<F, Either<E, B>>
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] // HKTGA = Either[E, A]
// HKTGB = Either[E, B] // HKTGB = Either[E, B]
return F.Bind2nd(fmap, ET.BiMap(f, g)) return fmap(ET.BiMap(f, g))
} }
// HKTFA = HKT<F, Either<E, A>> // HKTFA = HKT<F, Either<E, A>>
@@ -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)) 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]( func MonadAp[E, A, B, HKTFAB, HKTFGAB, HKTFA, HKTFB any](
fap func(HKTFGAB, HKTFA) HKTFB, 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, fmap func(HKTFAB, func(ET.Either[E, func(A) B]) func(ET.Either[E, A]) ET.Either[E, B]) HKTFGAB,

View File

@@ -60,6 +60,13 @@ func MonadChainEitherK[A, E, B, HKTEA, HKTEB any](
return mchain(ma, F.Flow2(f, fromEither)) 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]( func ChainOptionK[A, E, B, HKTEA, HKTEB any](
mchain func(HKTEA, func(A) HKTEB) HKTEB, mchain func(HKTEA, func(A) HKTEB) HKTEB,
fromEither func(ET.Either[E, B]) HKTEB, fromEither func(ET.Either[E, B]) HKTEB,

View File

@@ -62,9 +62,5 @@ func LetTo[S1, S2, B, HKTS1, HKTS2 any](
key func(B) func(S1) S2, key func(B) func(S1) S2,
b B, b B,
) func(HKTS1) HKTS2 { ) func(HKTS1) HKTS2 {
return F.Pipe2( return mmap(key(b))
b,
key,
mmap,
)
} }

View File

@@ -50,13 +50,11 @@ func MonadChain[A, B, HKTFA, HKTFB any](
} }
func Chain[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, fof func(O.Option[B]) HKTFB,
f func(A) HKTFB) func(ma HKTFA) HKTFB { f func(A) HKTFB) func(ma HKTFA) HKTFB {
// dispatch to the even more generic implementation // dispatch to the even more generic implementation
return func(ma HKTFA) HKTFB { return fchain(O.Fold(F.Nullary2(O.None[B], fof), f))
return MonadChain(fchain, fof, ma, f)
}
} }
func MonadAp[A, B, HKTFAB, HKTFGAB, HKTFA, HKTFB any]( 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)) 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]( func MonadAlt[LAZY ~func() HKTFA, A, HKTFA any](
fof func(O.Option[A]) HKTFA, fof func(O.Option[A]) HKTFA,
fchain func(HKTFA, func(O.Option[A]) HKTFA) 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]( func Alt[LAZY ~func() HKTFA, A, HKTFA any](
fof func(O.Option[A]) HKTFA, 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 { second LAZY) func(HKTFA) HKTFA {
return func(fa HKTFA) HKTFA { return fchain(O.Fold(second, F.Flow2(O.Of[A], fof)))
return MonadAlt(fof, fchain, fa, second)
}
} }

View File

@@ -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 { 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 { 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 { 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 { 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 { 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 { 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 { 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 { 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 { 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 { 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. // 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 { 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 // Fold convers an IOEither into an IO

View File

@@ -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 { 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 { 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 { 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 { 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 { func MonadAlt[LAZY ~func() GIOA, GIOA ~func() O.Option[A], A any](first GIOA, second LAZY) GIOA {
return optiont.MonadAlt( return optiont.MonadAlt(
IO.Of[GIOA], IO.MonadOf[GIOA],
IO.MonadChain[GIOA, GIOA], IO.MonadChain[GIOA, GIOA],
first, 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 { 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,
)
} }

View File

@@ -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. // 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 { 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 // Local changes the value of the local context during the execution of the action `ma` (similar to `Contravariant`'s

View File

@@ -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. // 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 { 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 // Swap changes the order of type parameters