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:
@@ -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] {
|
||||
|
@@ -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<F, Either<E, A>>
|
||||
// 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 {
|
||||
@@ -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>>
|
||||
// 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]
|
||||
// HKTGB = Either[E, B]
|
||||
return F.Bind2nd(fmap, ET.BiMap(f, g))
|
||||
return fmap(ET.BiMap(f, g))
|
||||
}
|
||||
|
||||
// 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))
|
||||
}
|
||||
|
||||
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,
|
||||
|
@@ -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,
|
||||
|
@@ -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))
|
||||
}
|
||||
|
@@ -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)))
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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,
|
||||
)
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user