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

fix: more functions for StateReaderIOEither

Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com>
This commit is contained in:
Dr. Carsten Leue
2024-02-19 14:34:35 +01:00
parent f4f4fb306c
commit 76ae6f2bec
4 changed files with 244 additions and 3 deletions

View File

@@ -154,12 +154,14 @@ func Ap[
)
}
// Conversions
func FromReaderIOEither[
SRIOEA ~func(S) RIOEA,
RIOEA ~func(R) IOEA,
RIOEA_IN ~func(R) IOEA_IN,
RIOEA ~func(R) IOEA,
IOEA ~func() ET.Either[E, P.Pair[A, S]],
IOEA_IN ~func() ET.Either[E, A],
@@ -189,10 +191,10 @@ func FromReaderEither[
func FromIOEither[
SRIOEA ~func(S) RIOEA,
RIOEA_IN ~func(R) IOEA_IN,
IOEA_IN ~func() ET.Either[E, A],
RIOEA ~func(R) IOEA,
IOEA ~func() ET.Either[E, P.Pair[A, S]],
IOEA_IN ~func() ET.Either[E, A],
S, R, E, A any,
](fa IOEA_IN) SRIOEA {
@@ -254,3 +256,170 @@ func FromState[
](fa STATE) SRIOEA {
return ST.FromState[SRIOEA](G.Of[RIOEA], fa)
}
// Combinators
func Local[
SR1IOEA ~func(S) R1IOEA,
SR2IOEA ~func(S) R2IOEA,
R1IOEA ~func(R1) IOEA,
R2IOEA ~func(R2) IOEA,
IOEA ~func() ET.Either[E, P.Pair[A, S]],
S, R1, R2, E, A any,
](f func(R2) R1) func(SR1IOEA) SR2IOEA {
return func(ma SR1IOEA) SR2IOEA {
return F.Flow2(ma, G.Local[R1IOEA, R2IOEA](f))
}
}
func Asks[
SRIOEA ~func(S) RIOEA,
RIOEA ~func(R) IOEA,
IOEA ~func() ET.Either[E, P.Pair[A, S]],
S, R, E, A any,
](f func(R) SRIOEA) SRIOEA {
return func(s S) RIOEA {
return func(r R) IOEA {
return f(r)(s)(r)
}
}
}
func FromIOEitherK[
SRIOEB ~func(S) RIOEB,
RIOEB_IN ~func(R) IOEB_IN,
IOEB_IN ~func() ET.Either[E, B],
RIOEB ~func(R) IOEB,
IOEB ~func() ET.Either[E, P.Pair[B, S]],
S, R, E, A, B any,
](f func(A) IOEB_IN) func(A) SRIOEB {
return F.Flow2(
f,
FromIOEither[SRIOEB, RIOEB_IN],
)
}
func FromEitherK[
SRIOEB ~func(S) RIOEB,
RIOEB ~func(R) IOEB,
IOEB ~func() ET.Either[E, P.Pair[B, S]],
S, R, E, A, B any,
](f func(A) ET.Either[E, B]) func(A) SRIOEB {
return F.Flow2(
f,
FromEither[SRIOEB],
)
}
func FromIOK[
SRIOEB ~func(S) RIOEB,
RIOEB_IN ~func(R) IOEB_IN,
IOB_IN ~func() B,
RIOEB ~func(R) IOEB,
IOEB ~func() ET.Either[E, P.Pair[B, S]],
IOEB_IN ~func() ET.Either[E, B],
S, R, E, A, B any,
](f func(A) IOB_IN) func(A) SRIOEB {
return F.Flow2(
f,
FromIO[SRIOEB, RIOEB_IN, IOB_IN],
)
}
func FromReaderIOEitherK[
SRIOEB ~func(S) RIOEB,
RIOEB_IN ~func(R) IOEB_IN,
IOEB_IN ~func() ET.Either[E, B],
RIOEB ~func(R) IOEB,
IOEB ~func() ET.Either[E, P.Pair[B, S]],
S, R, E, A, B any,
](f func(A) RIOEB_IN) func(A) SRIOEB {
return F.Flow2(
f,
FromReaderIOEither[SRIOEB, RIOEB_IN],
)
}
func MonadChainReaderIOEitherK[
SRIOEA ~func(S) RIOEA,
SRIOEB ~func(S) RIOEB,
RIOEB_IN ~func(R) IOEB_IN,
RIOEA ~func(R) IOEA,
RIOEB ~func(R) IOEB,
IOEA ~func() ET.Either[E, P.Pair[A, S]],
IOEB ~func() ET.Either[E, P.Pair[B, S]],
IOEB_IN ~func() ET.Either[E, B],
S, R, E, A, B any,
](ma SRIOEA, f func(A) RIOEB_IN) SRIOEB {
return MonadChain(ma, FromReaderIOEitherK[SRIOEB, RIOEB_IN](f))
}
func ChainReaderIOEitherK[
SRIOEA ~func(S) RIOEA,
SRIOEB ~func(S) RIOEB,
RIOEB_IN ~func(R) IOEB_IN,
RIOEA ~func(R) IOEA,
RIOEB ~func(R) IOEB,
IOEA ~func() ET.Either[E, P.Pair[A, S]],
IOEB ~func() ET.Either[E, P.Pair[B, S]],
IOEB_IN ~func() ET.Either[E, B],
S, R, E, A, B any,
](f func(A) RIOEB_IN) func(SRIOEA) SRIOEB {
return Chain[SRIOEA](FromReaderIOEitherK[SRIOEB, RIOEB_IN](f))
}
func MonadChainIOEitherK[
SRIOEA ~func(S) RIOEA,
SRIOEB ~func(S) RIOEB,
RIOEB_IN ~func(R) IOEB_IN,
IOEB_IN ~func() ET.Either[E, B],
RIOEA ~func(R) IOEA,
RIOEB ~func(R) IOEB,
IOEA ~func() ET.Either[E, P.Pair[A, S]],
IOEB ~func() ET.Either[E, P.Pair[B, S]],
S, R, E, A, B any,
](ma SRIOEA, f func(A) IOEB_IN) SRIOEB {
return MonadChain(ma, FromIOEitherK[SRIOEB, RIOEB_IN](f))
}
func ChainIOEitherK[
SRIOEA ~func(S) RIOEA,
SRIOEB ~func(S) RIOEB,
RIOEB_IN ~func(R) IOEB_IN,
IOEB_IN ~func() ET.Either[E, B],
RIOEA ~func(R) IOEA,
RIOEB ~func(R) IOEB,
IOEA ~func() ET.Either[E, P.Pair[A, S]],
IOEB ~func() ET.Either[E, P.Pair[B, S]],
S, R, E, A, B any,
](f func(A) IOEB_IN) func(SRIOEA) SRIOEB {
return Chain[SRIOEA](FromIOEitherK[SRIOEB, RIOEB_IN](f))
}
func MonadChainEitherK[
SRIOEA ~func(S) RIOEA,
SRIOEB ~func(S) RIOEB,
RIOEA ~func(R) IOEA,
RIOEB ~func(R) IOEB,
IOEA ~func() ET.Either[E, P.Pair[A, S]],
IOEB ~func() ET.Either[E, P.Pair[B, S]],
S, R, E, A, B any,
](ma SRIOEA, f func(A) ET.Either[E, B]) SRIOEB {
return MonadChain(ma, FromEitherK[SRIOEB](f))
}
func ChainEitherK[
SRIOEA ~func(S) RIOEA,
SRIOEB ~func(S) RIOEB,
RIOEA ~func(R) IOEA,
RIOEB ~func(R) IOEB,
IOEA ~func() ET.Either[E, P.Pair[A, S]],
IOEB ~func() ET.Either[E, P.Pair[B, S]],
S, R, E, A, B any,
](f func(A) ET.Either[E, B]) func(SRIOEA) SRIOEB {
return Chain[SRIOEA](FromEitherK[SRIOEB](f))
}