From c6d6be66e01bd6c11b8c5774180b3bf8dd11c53f Mon Sep 17 00:00:00 2001 From: "Dr. Carsten Leue" Date: Fri, 6 Oct 2023 22:36:04 +0200 Subject: [PATCH] fix: add missing ChainXXIOK to Reader Signed-off-by: Dr. Carsten Leue --- context/readerio/reader.go | 17 +++++++++++++++++ readerio/generic/reader.go | 31 +++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/context/readerio/reader.go b/context/readerio/reader.go index 8f8b6eb..bba3e6b 100644 --- a/context/readerio/reader.go +++ b/context/readerio/reader.go @@ -18,6 +18,7 @@ package readerio import ( "context" + IO "github.com/IBM/fp-go/io" L "github.com/IBM/fp-go/lazy" R "github.com/IBM/fp-go/readerio/generic" ) @@ -38,6 +39,22 @@ func Chain[A, B any](f func(A) ReaderIO[B]) func(ReaderIO[A]) ReaderIO[B] { return R.Chain[ReaderIO[A]](f) } +func MonadChainIOK[A, B any](fa ReaderIO[A], f func(A) IO.IO[B]) ReaderIO[B] { + return R.MonadChainIOK[ReaderIO[A], ReaderIO[B]](fa, f) +} + +func ChainIOK[A, B any](f func(A) IO.IO[B]) func(ReaderIO[A]) ReaderIO[B] { + return R.ChainIOK[ReaderIO[A], ReaderIO[B]](f) +} + +func MonadChainFirstIOK[A, B any](fa ReaderIO[A], f func(A) IO.IO[B]) ReaderIO[A] { + return R.MonadChainFirstIOK[ReaderIO[A], ReaderIO[B]](fa, f) +} + +func ChainFirstIOK[A, B any](f func(A) IO.IO[B]) func(ReaderIO[A]) ReaderIO[A] { + return R.ChainFirstIOK[ReaderIO[A], ReaderIO[B]](f) +} + func Of[A any](a A) ReaderIO[A] { return R.Of[ReaderIO[A]](a) } diff --git a/readerio/generic/reader.go b/readerio/generic/reader.go index 2dc919f..f5f9d9b 100644 --- a/readerio/generic/reader.go +++ b/readerio/generic/reader.go @@ -19,6 +19,7 @@ import ( "sync" F "github.com/IBM/fp-go/function" + FIO "github.com/IBM/fp-go/internal/fromio" FR "github.com/IBM/fp-go/internal/fromreader" "github.com/IBM/fp-go/internal/readert" IO "github.com/IBM/fp-go/io/generic" @@ -86,11 +87,37 @@ func Asks[GA ~func(E) A, GEA ~func(E) GIOA, GIOA ~func() A, E, A any](r GA) GEA } func MonadChainIOK[GEA ~func(E) GIOA, GEB ~func(E) GIOB, GIOA ~func() A, GIOB ~func() B, E, A, B any](ma GEA, f func(A) GIOB) GEB { - return MonadChain(ma, F.Flow2(f, FromIO[GEB])) + return FIO.MonadChainIOK( + MonadChain[GEA, GEB], + FromIO[GEB], + ma, f, + ) } func ChainIOK[GEA ~func(E) GIOA, GEB ~func(E) GIOB, GIOA ~func() A, GIOB ~func() B, E, A, B any](f func(A) GIOB) func(GEA) GEB { - return F.Bind2nd(MonadChainIOK[GEA, GEB, GIOA, GIOB, E, A, B], f) + return FIO.ChainIOK( + MonadChain[GEA, GEB], + FromIO[GEB], + f, + ) +} + +func MonadChainFirstIOK[GEA ~func(E) GIOA, GEB ~func(E) GIOB, GIOA ~func() A, GIOB ~func() B, E, A, B any](ma GEA, f func(A) GIOB) GEA { + return FIO.MonadChainFirstIOK( + MonadChain[GEA, GEA], + MonadMap[GEB, GEA], + FromIO[GEB], + ma, f, + ) +} + +func ChainFirstIOK[GEA ~func(E) GIOA, GEB ~func(E) GIOB, GIOA ~func() A, GIOB ~func() B, E, A, B any](f func(A) GIOB) func(GEA) GEA { + return FIO.ChainFirstIOK( + MonadChain[GEA, GEA], + MonadMap[GEB, GEA], + FromIO[GEB], + f, + ) } // Defer creates an IO by creating a brand new IO via a generator function, each time