mirror of
https://github.com/IBM/fp-go.git
synced 2025-06-19 00:17:48 +02:00
fix: some smaller optimizations
Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com>
This commit is contained in:
@ -344,7 +344,7 @@ func MonadFlap[FAB ~func(A) B, GFAB ~[]FAB, GB ~[]B, A, B any](fab GFAB, a A) GB
|
||||
}
|
||||
|
||||
func Flap[FAB ~func(A) B, GFAB ~[]FAB, GB ~[]B, A, B any](a A) func(GFAB) GB {
|
||||
return F.Bind2nd(MonadFlap[FAB, GFAB, GB, A, B], a)
|
||||
return FC.Flap(Map[GFAB, GB], a)
|
||||
}
|
||||
|
||||
func Prepend[ENDO ~func(AS) AS, AS []A, A any](head A) ENDO {
|
||||
|
@ -64,7 +64,7 @@ func MonadMapTo[E, A, B any](fa Either[E, A], b B) Either[E, B] {
|
||||
}
|
||||
|
||||
func MapTo[E, A, B any](b B) func(Either[E, A]) Either[E, B] {
|
||||
return F.Bind2nd(MonadMapTo[E, A, B], b)
|
||||
return Map[E](F.Constant1[A](b))
|
||||
}
|
||||
|
||||
func MonadMapLeft[E1, A, E2 any](fa Either[E1, A], f func(E1) E2) Either[E2, A] {
|
||||
@ -106,11 +106,11 @@ func ChainOptionK[A, B, E any](onNone func() E) func(func(A) O.Option[B]) func(E
|
||||
}
|
||||
|
||||
func ChainTo[A, E, B any](mb Either[E, B]) func(Either[E, A]) Either[E, B] {
|
||||
return F.Bind2nd(MonadChainTo[A, E, B], mb)
|
||||
return F.Constant1[Either[E, A]](mb)
|
||||
}
|
||||
|
||||
func Chain[E, A, B any](f func(a A) Either[E, B]) func(Either[E, A]) Either[E, B] {
|
||||
return F.Bind2nd(MonadChain[E, A, B], f)
|
||||
return Fold(Left[B, E], f)
|
||||
}
|
||||
|
||||
func ChainFirst[E, A, B any](f func(a A) Either[E, B]) func(Either[E, A]) Either[E, A] {
|
||||
@ -251,7 +251,7 @@ func MonadFlap[E, B, A any](fab Either[E, func(A) B], a A) Either[E, B] {
|
||||
}
|
||||
|
||||
func Flap[E, B, A any](a A) func(Either[E, func(A) B]) Either[E, B] {
|
||||
return F.Bind2nd(MonadFlap[E, B, A], a)
|
||||
return FC.Flap(Map[E, func(A) B, B], a)
|
||||
}
|
||||
|
||||
func MonadAlt[E, A any](fa Either[E, A], that L.Lazy[Either[E, A]]) Either[E, A] {
|
||||
|
@ -3,6 +3,7 @@
|
||||
// 2024-01-31 21:45:01.6437619 +0100 CET m=+0.032758901
|
||||
|
||||
package function
|
||||
|
||||
// Combinations for a total of 1 arguments
|
||||
|
||||
// Bind1of1 takes a function with 1 parameters and returns a new function with 1 parameters that will bind these parameters to the positions [1] of the original function.
|
||||
@ -21,6 +22,7 @@ func Ignore1of1[T1 any, F ~func() R, R any](f F) func(T1) R {
|
||||
return f()
|
||||
}
|
||||
}
|
||||
|
||||
// Combinations for a total of 2 arguments
|
||||
|
||||
// Bind1of2 takes a function with 2 parameters and returns a new function with 1 parameters that will bind these parameters to the positions [1] of the original function.
|
||||
@ -73,6 +75,7 @@ func Ignore12of2[T1, T2 any, F ~func() R, R any](f F) func(T1, T2) R {
|
||||
return f()
|
||||
}
|
||||
}
|
||||
|
||||
// Combinations for a total of 3 arguments
|
||||
|
||||
// Bind1of3 takes a function with 3 parameters and returns a new function with 1 parameters that will bind these parameters to the positions [1] of the original function.
|
||||
@ -193,6 +196,7 @@ func Ignore123of3[T1, T2, T3 any, F ~func() R, R any](f F) func(T1, T2, T3) R {
|
||||
return f()
|
||||
}
|
||||
}
|
||||
|
||||
// Combinations for a total of 4 arguments
|
||||
|
||||
// Bind1of4 takes a function with 4 parameters and returns a new function with 1 parameters that will bind these parameters to the positions [1] of the original function.
|
||||
|
@ -58,5 +58,5 @@ func MonadFlap[GAB ~func(A) B, A, B any](fab GAB, a A) B {
|
||||
}
|
||||
|
||||
func Flap[GAB ~func(A) B, B, A any](a A) func(GAB) B {
|
||||
return F.Bind2nd(MonadFlap[GAB, A, B], a)
|
||||
return FC.Flap(Map[func(GAB) B, GAB, B], a)
|
||||
}
|
||||
|
@ -19,13 +19,6 @@ import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
)
|
||||
|
||||
// HKTFGA = HKT<F, HKT<G, A>>
|
||||
// HKTFGB = HKT<F, HKT<G, B>>
|
||||
// HKTFGAB = HKT<F, HKT<G, (a: A) => B>>
|
||||
|
||||
// HKTGA = HKT<G, A>
|
||||
// HKTGB = HKT<G, B>
|
||||
// HKTGAB = HKT<G, (a: A) => B>
|
||||
func MonadAp[HKTGA, HKTGB, HKTGAB, HKTFGAB, HKTFGGAB, HKTFGA, HKTFGB any](
|
||||
fap func(HKTFGGAB, HKTFGA) HKTFGB,
|
||||
fmap func(HKTFGAB, func(HKTGAB) func(HKTGA) HKTGB) HKTFGGAB,
|
||||
@ -37,6 +30,19 @@ func MonadAp[HKTGA, HKTGB, HKTGAB, HKTFGAB, HKTFGGAB, HKTFGA, HKTFGB any](
|
||||
return fap(fmap(fab, F.Bind1st(F.Bind1st[HKTGAB, HKTGA, HKTGB], gap)), fa)
|
||||
}
|
||||
|
||||
func Ap[HKTGA, HKTGB, HKTGAB, HKTFGAB, HKTFGGAB, HKTFGA, HKTFGB any](
|
||||
fap func(HKTFGA) func(HKTFGGAB) HKTFGB,
|
||||
fmap func(func(HKTGAB) func(HKTGA) HKTGB) func(HKTFGAB) HKTFGGAB,
|
||||
gap func(HKTGA) func(HKTGAB) HKTGB,
|
||||
|
||||
fa HKTFGA) func(HKTFGAB) HKTFGB {
|
||||
|
||||
return F.Flow2(
|
||||
fmap(F.Flip(gap)),
|
||||
fap(fa),
|
||||
)
|
||||
}
|
||||
|
||||
// func Ap[HKTGA, HKTGB, HKTGAB, HKTFGAB, HKTFGGAB, HKTFGA, HKTFGB any](
|
||||
// fap func(HKTFGA) func(HKTFGGAB) HKTFGB,
|
||||
// fmap func(func(HKTGAB) func(HKTGA) HKTGB) func(HKTFGAB) HKTFGGAB,
|
||||
|
@ -78,22 +78,21 @@ func MonadChain[E, A, B, HKTFA, HKTFB any](
|
||||
return fchain(ma, ET.Fold(F.Flow2(ET.Left[B, E], fof), f))
|
||||
}
|
||||
|
||||
// func(fa func(R) T.Task[ET.Either[E, func(A) B]], f func(ET.Either[E, func(A) B]) func(ET.Either[E, A]) ET.Either[E, B]) GEFAB
|
||||
|
||||
// HKTFA = HKT[Either[E, A]]
|
||||
// HKTFB = HKT[Either[E, B]]
|
||||
// HKTFAB = HKT[Either[E, func(A)B]]
|
||||
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,
|
||||
fab HKTFAB,
|
||||
fa HKTFA) HKTFB {
|
||||
// HKTGA = ET.Either[E, A]
|
||||
// HKTGB = ET.Either[E, B]
|
||||
// HKTGAB = ET.Either[E, func(a A) B]
|
||||
return apply.MonadAp(fap, fmap, ET.MonadAp[B, E, A], fab, fa)
|
||||
}
|
||||
|
||||
func Ap[E, A, B, HKTFAB, HKTFGAB, HKTFA, HKTFB any](
|
||||
fap func(HKTFA) func(HKTFGAB) HKTFB,
|
||||
fmap func(func(ET.Either[E, func(A) B]) func(ET.Either[E, A]) ET.Either[E, B]) func(HKTFAB) HKTFGAB,
|
||||
fa HKTFA) func(HKTFAB) HKTFB {
|
||||
return apply.Ap(fap, fmap, ET.Ap[B, E, A], fa)
|
||||
}
|
||||
|
||||
func Right[E, A, HKTA any](fof func(ET.Either[E, A]) HKTA, a A) HKTA {
|
||||
return F.Pipe2(a, ET.Right[E, A], fof)
|
||||
}
|
||||
|
@ -15,23 +15,24 @@
|
||||
|
||||
package functor
|
||||
|
||||
func flap[FAB ~func(A) B, A, B any](a A) func(FAB) B {
|
||||
return func(f FAB) B {
|
||||
return f(a)
|
||||
}
|
||||
}
|
||||
|
||||
func MonadFlap[FAB ~func(A) B, A, B, HKTFAB, HKTB any](
|
||||
fmap func(HKTFAB, func(FAB) B) HKTB,
|
||||
|
||||
fab HKTFAB,
|
||||
a A,
|
||||
) HKTB {
|
||||
return fmap(fab, func(f FAB) B {
|
||||
return f(a)
|
||||
})
|
||||
return fmap(fab, flap[FAB, A, B](a))
|
||||
}
|
||||
|
||||
func Flap[FAB ~func(A) B, A, B, HKTFAB, HKTB any](
|
||||
fmap func(HKTFAB, func(FAB) B) HKTB,
|
||||
|
||||
fmap func(func(FAB) B) func(HKTFAB) HKTB,
|
||||
a A,
|
||||
) func(HKTFAB) HKTB {
|
||||
return func(fab HKTFAB) HKTB {
|
||||
return MonadFlap(fmap, fab, a)
|
||||
}
|
||||
return fmap(flap[FAB, A, B](a))
|
||||
}
|
||||
|
@ -33,11 +33,7 @@ func Map[A, B, HKTGA, HKTGB, HKTFGA, HKTFGB any](
|
||||
fmap func(func(HKTGA) HKTGB) func(HKTFGA) HKTFGB,
|
||||
gmap func(func(A) B) func(HKTGA) HKTGB,
|
||||
f func(A) B) func(HKTFGA) HKTFGB {
|
||||
return F.Pipe2(
|
||||
f,
|
||||
gmap,
|
||||
fmap,
|
||||
)
|
||||
return fmap(gmap(f))
|
||||
}
|
||||
|
||||
func MonadLet[S1, S2, B, HKTS1, HKTS2 any](
|
||||
|
@ -67,6 +67,13 @@ func MonadAp[A, B, HKTFAB, HKTFGAB, HKTFA, HKTFB any](
|
||||
return apply.MonadAp(fap, fmap, O.MonadAp[B, A], fab, fa)
|
||||
}
|
||||
|
||||
func Ap[A, B, HKTFAB, HKTFGAB, HKTFA, HKTFB any](
|
||||
fap func(HKTFA) func(HKTFGAB) HKTFB,
|
||||
fmap func(func(O.Option[func(A) B]) func(O.Option[A]) O.Option[B]) func(HKTFAB) HKTFGAB,
|
||||
fa HKTFA) func(HKTFAB) HKTFB {
|
||||
return apply.Ap(fap, fmap, O.Ap[B, A], fa)
|
||||
}
|
||||
|
||||
func MatchE[A, HKTEA, HKTB any](mchain func(HKTEA, func(O.Option[A]) HKTB) HKTB, onNone func() HKTB, onSome func(A) HKTB) func(HKTEA) HKTB {
|
||||
return F.Bind2nd(mchain, O.Fold(onNone, onSome))
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ func MonadOf[GA ~func() A, A any](a A) GA {
|
||||
|
||||
func MonadMap[GA ~func() A, GB ~func() B, A, B any](fa GA, f func(A) B) GB {
|
||||
return MakeIO[GB](func() B {
|
||||
return F.Pipe1(fa(), f)
|
||||
return f(fa())
|
||||
})
|
||||
}
|
||||
|
||||
@ -66,13 +66,13 @@ func MonadMapTo[GA ~func() A, GB ~func() B, A, B any](fa GA, b B) GB {
|
||||
}
|
||||
|
||||
func MapTo[GA ~func() A, GB ~func() B, A, B any](b B) func(GA) GB {
|
||||
return F.Bind2nd(MonadMapTo[GA, GB, A, B], b)
|
||||
return Map[GA, GB](F.Constant1[A](b))
|
||||
}
|
||||
|
||||
// MonadChain composes computations in sequence, using the return value of one computation to determine the next computation.
|
||||
func MonadChain[GA ~func() A, GB ~func() B, A, B any](fa GA, f func(A) GB) GB {
|
||||
return MakeIO[GB](func() B {
|
||||
return F.Pipe1(fa(), f)()
|
||||
return f(fa())()
|
||||
})
|
||||
}
|
||||
|
||||
@ -88,7 +88,7 @@ func MonadChainTo[GA ~func() A, GB ~func() B, A, B any](fa GA, fb GB) GB {
|
||||
|
||||
// ChainTo composes computations in sequence, ignoring the return value of the first computation
|
||||
func ChainTo[GA ~func() A, GB ~func() B, A, B any](fb GB) func(GA) GB {
|
||||
return F.Bind2nd(MonadChainTo[GA, GB, A, B], fb)
|
||||
return Chain[GA, GB](F.Constant1[A](fb))
|
||||
}
|
||||
|
||||
// MonadChainFirst composes computations in sequence, using the return value of one computation to determine the next computation and
|
||||
@ -174,7 +174,7 @@ func MonadFlap[FAB ~func(A) B, GFAB ~func() FAB, GB ~func() B, A, B any](fab GFA
|
||||
}
|
||||
|
||||
func Flap[FAB ~func(A) B, GFAB ~func() FAB, GB ~func() B, A, B any](a A) func(GFAB) GB {
|
||||
return F.Bind2nd(MonadFlap[FAB, GFAB, GB, A, B], a)
|
||||
return FC.Flap(Map[GFAB, GB, FAB, B], a)
|
||||
}
|
||||
|
||||
// WithTime returns an operation that measures the start and end timestamp of the operation
|
||||
|
@ -339,7 +339,7 @@ func MonadFlap[GEAB ~func() ET.Either[E, func(A) B], GEB ~func() ET.Either[E, B]
|
||||
}
|
||||
|
||||
func Flap[GEAB ~func() ET.Either[E, func(A) B], GEB ~func() ET.Either[E, B], E, B, A any](a A) func(GEAB) GEB {
|
||||
return FC.Flap(MonadMap[GEAB, GEB], a)
|
||||
return FC.Flap(Map[GEAB, GEB], a)
|
||||
}
|
||||
|
||||
func ToIOOption[GA ~func() O.Option[A], GEA ~func() ET.Either[E, A], E, A any](ioe GEA) GA {
|
||||
|
@ -159,7 +159,10 @@ func MonadAp[GB ~func() O.Option[B], GAB ~func() O.Option[func(A) B], GA ~func()
|
||||
}
|
||||
|
||||
func Ap[GB ~func() O.Option[B], GAB ~func() O.Option[func(A) B], GA ~func() O.Option[A], A, B any](ma GA) func(GAB) GB {
|
||||
return F.Bind2nd(MonadAp[GB, GAB, GA, A, B], ma)
|
||||
return optiont.Ap(
|
||||
IO.Ap[GB, func() func(O.Option[A]) O.Option[B], GA, O.Option[B], O.Option[A]],
|
||||
IO.Map[GAB, func() func(O.Option[A]) O.Option[B], O.Option[func(A) B], func(O.Option[A]) O.Option[B]],
|
||||
ma)
|
||||
}
|
||||
|
||||
func Flatten[GA ~func() O.Option[A], GAA ~func() O.Option[GA], A any](mma GAA) GA {
|
||||
|
@ -156,5 +156,5 @@ func MonadFlap[B, A any](fab Option[func(A) B], a A) Option[B] {
|
||||
}
|
||||
|
||||
func Flap[B, A any](a A) func(Option[func(A) B]) Option[B] {
|
||||
return F.Bind2nd(MonadFlap[B, A], a)
|
||||
return FC.Flap(Map[func(A) B, B], a)
|
||||
}
|
||||
|
@ -127,5 +127,5 @@ func MonadFlap[GAB ~func(R) func(A) B, GB ~func(R) B, R, A, B any](fab GAB, a A)
|
||||
}
|
||||
|
||||
func Flap[GAB ~func(R) func(A) B, GB ~func(R) B, R, A, B any](a A) func(GAB) GB {
|
||||
return FC.Flap(MonadMap[GAB, GB], a)
|
||||
return FC.Flap(Map[GAB, GB], a)
|
||||
}
|
||||
|
@ -162,7 +162,7 @@ func MonadFlap[GEFAB ~func(E) ET.Either[L, func(A) B], GEB ~func(E) ET.Either[L,
|
||||
}
|
||||
|
||||
func Flap[GEFAB ~func(E) ET.Either[L, func(A) B], GEB ~func(E) ET.Either[L, B], L, E, A, B any](a A) func(GEFAB) GEB {
|
||||
return FC.Flap(MonadMap[GEFAB, GEB], a)
|
||||
return FC.Flap(Map[GEFAB, GEB], a)
|
||||
}
|
||||
|
||||
func MonadMapLeft[GA1 ~func(C) ET.Either[E1, A], GA2 ~func(C) ET.Either[E2, A], C, E1, E2, A any](fa GA1, f func(E1) E2) GA2 {
|
||||
|
@ -162,5 +162,5 @@ func MonadFlap[GEFAB ~func(E) GIOFAB, GEB ~func(E) GIOB, GIOFAB ~func() func(A)
|
||||
}
|
||||
|
||||
func Flap[GEFAB ~func(E) GIOFAB, GEB ~func(E) GIOB, GIOFAB ~func() func(A) B, GIOB ~func() B, E, A, B any](a A) func(GEFAB) GEB {
|
||||
return FC.Flap(MonadMap[GEFAB, GEB], a)
|
||||
return FC.Flap(Map[GEFAB, GEB], a)
|
||||
}
|
||||
|
@ -438,7 +438,7 @@ func MonadFlap[GREAB ~func(R) GEAB, GREB ~func(R) GEB, GEAB ~func() ET.Either[E,
|
||||
}
|
||||
|
||||
func Flap[GREAB ~func(R) GEAB, GREB ~func(R) GEB, GEAB ~func() ET.Either[E, func(A) B], GEB ~func() ET.Either[E, B], R, E, B, A any](a A) func(GREAB) GREB {
|
||||
return FC.Flap(MonadMap[GREAB, GREB], a)
|
||||
return FC.Flap(Map[GREAB, GREB], a)
|
||||
}
|
||||
|
||||
func MonadMapLeft[GREA1 ~func(R) GEA1, GREA2 ~func(R) GEA2, GEA1 ~func() ET.Either[E1, A], GEA2 ~func() ET.Either[E2, A], R, E1, E2, A any](fa GREA1, f func(E1) E2) GREA2 {
|
||||
|
@ -598,7 +598,7 @@ func MonadFlap[GFAB ~map[K]func(A) B, GB ~map[K]B, K comparable, A, B any](fab G
|
||||
}
|
||||
|
||||
func Flap[GFAB ~map[K]func(A) B, GB ~map[K]B, K comparable, A, B any](a A) func(GFAB) GB {
|
||||
return FC.Flap(MonadMap[GFAB, GB], a)
|
||||
return FC.Flap(Map[GFAB, GB], a)
|
||||
}
|
||||
|
||||
func Copy[M ~map[K]V, K comparable, V any](m M) M {
|
||||
|
Reference in New Issue
Block a user