diff --git a/context/readerio/reader.go b/context/readerio/reader.go index d57c958..8f8b6eb 100644 --- a/context/readerio/reader.go +++ b/context/readerio/reader.go @@ -65,3 +65,8 @@ func Defer[A any](gen L.Lazy[ReaderIO[A]]) ReaderIO[A] { func Memoize[A any](rdr ReaderIO[A]) ReaderIO[A] { return R.Memoize[ReaderIO[A]](rdr) } + +// Flatten converts a nested [ReaderIO] into a [ReaderIO] +func Flatten[A any](mma ReaderIO[ReaderIO[A]]) ReaderIO[A] { + return R.Flatten[ReaderIO[A]](mma) +} diff --git a/context/readerioeither/generic/reader.go b/context/readerioeither/generic/reader.go index 2d18ace..4471b67 100644 --- a/context/readerioeither/generic/reader.go +++ b/context/readerioeither/generic/reader.go @@ -583,3 +583,12 @@ func Memoize[ A any](rdr GRA) GRA { return RIE.Memoize[GRA](rdr) } + +func Flatten[ + GGRA ~func(context.Context) GGIOA, + GGIOA ~func() E.Either[error, GRA], + GRA ~func(context.Context) GIOA, + GIOA ~func() E.Either[error, A], + A any](rdr GGRA) GRA { + return RIE.Flatten[GRA](rdr) +} diff --git a/context/readerioeither/reader.go b/context/readerioeither/reader.go index 0d41094..a914c20 100644 --- a/context/readerioeither/reader.go +++ b/context/readerioeither/reader.go @@ -220,3 +220,9 @@ func Alt[A any](second L.Lazy[ReaderIOEither[A]]) func(ReaderIOEither[A]) Reader func Memoize[A any](rdr ReaderIOEither[A]) ReaderIOEither[A] { return G.Memoize[ReaderIOEither[A]](rdr) } + +// Flatten converts a nested [ReaderIOEither] into a [ReaderIOEither] +func Flatten[ + A any](rdr ReaderIOEither[ReaderIOEither[A]]) ReaderIOEither[A] { + return G.Flatten[ReaderIOEither[ReaderIOEither[A]]](rdr) +} diff --git a/readerio/generic/reader.go b/readerio/generic/reader.go index 8321dc2..2dc919f 100644 --- a/readerio/generic/reader.go +++ b/readerio/generic/reader.go @@ -124,3 +124,7 @@ func Memoize[GEA ~func(E) GA, GA ~func() A, E, A any](rdr GEA) GEA { } } } + +func Flatten[GEA ~func(R) GIOA, GGEA ~func(R) GIOEA, GIOA ~func() A, GIOEA ~func() GEA, R, A any](mma GGEA) GEA { + return MonadChain(mma, F.Identity[GEA]) +} diff --git a/readerio/reader.go b/readerio/reader.go index 10641da..9ac5e26 100644 --- a/readerio/reader.go +++ b/readerio/reader.go @@ -82,3 +82,7 @@ func Defer[E, A any](gen func() ReaderIO[E, A]) ReaderIO[E, A] { func Memoize[E, A any](rdr ReaderIO[E, A]) ReaderIO[E, A] { return G.Memoize[ReaderIO[E, A]](rdr) } + +func Flatten[E, A any](mma ReaderIO[E, ReaderIO[E, A]]) ReaderIO[E, A] { + return G.Flatten[ReaderIO[E, A], ReaderIO[E, ReaderIO[E, A]]](mma) +}