diff --git a/endomorphism/endo.go b/endomorphism/endo.go index 9976c93..90d9e4b 100644 --- a/endomorphism/endo.go +++ b/endomorphism/endo.go @@ -27,34 +27,10 @@ func Ap[A any](fa A) func(Endomorphism[A]) A { return G.Ap[Endomorphism[A]](fa) } -func MonadFlap[A any](fab Endomorphism[A], a A) A { - return G.MonadFlap[Endomorphism[A]](fab, a) -} - -func Flap[A any](a A) func(Endomorphism[A]) A { - return G.Flap[Endomorphism[A]](a) -} - -func MonadMap[A any](fa A, f Endomorphism[A]) A { - return G.MonadMap[Endomorphism[A]](fa, f) -} - -func Map[A any](f Endomorphism[A]) Endomorphism[A] { - return G.Map[Endomorphism[A]](f) -} - -func MonadChain[A any](ma A, f Endomorphism[A]) A { +func MonadChain[A any](ma Endomorphism[A], f Endomorphism[A]) Endomorphism[A] { return G.MonadChain[Endomorphism[A]](ma, f) } -func Chain[A any](f Endomorphism[A]) Endomorphism[A] { - return G.Chain[Endomorphism[A], A](f) -} - -func MonadChainFirst[A any](fa A, f Endomorphism[A]) A { - return G.MonadChainFirst[Endomorphism[A]](fa, f) -} - -func ChainFirst[A any](f Endomorphism[A]) Endomorphism[A] { - return G.ChainFirst[Endomorphism[A]](f) +func Chain[A any](f Endomorphism[A]) Endomorphism[Endomorphism[A]] { + return G.Chain[Endomorphism[Endomorphism[A]], Endomorphism[A], A](f) } diff --git a/endomorphism/generic/endo.go b/endomorphism/generic/endo.go index 3a81337..2fd529e 100644 --- a/endomorphism/generic/endo.go +++ b/endomorphism/generic/endo.go @@ -16,6 +16,7 @@ package generic import ( + F "github.com/IBM/fp-go/function" I "github.com/IBM/fp-go/identity/generic" ) @@ -27,34 +28,10 @@ func Ap[GA ~func(A) A, A any](fa A) func(GA) A { return I.Ap[GA, A, A](fa) } -func MonadFlap[GA ~func(A) A, A any](fab GA, a A) A { - return I.MonadFlap[GA, A, A](fab, a) +func MonadChain[GA ~func(A) A, A any](ma GA, f GA) GA { + return Compose(ma, f) } -func Flap[GA ~func(A) A, A any](a A) func(GA) A { - return I.Flap[GA, A, A](a) -} - -func MonadMap[GA ~func(A) A, A any](fa A, f GA) A { - return I.MonadMap[GA, A, A](fa, f) -} - -func Map[GA ~func(A) A, A any](f GA) GA { - return I.Map[GA, A, A](f) -} - -func MonadChain[GA ~func(A) A, A any](ma A, f GA) A { - return I.MonadChain[GA, A, A](ma, f) -} - -func Chain[GA ~func(A) A, A any](f GA) GA { - return I.Chain[GA, A](f) -} - -func MonadChainFirst[GA ~func(A) A, A any](fa A, f GA) A { - return I.MonadChainFirst[GA, A, A](fa, f) -} - -func ChainFirst[GA ~func(A) A, A any](f GA) GA { - return I.ChainFirst[GA, A, A](f) +func Chain[ENDO ~func(GA) GA, GA ~func(A) A, A any](f GA) ENDO { + return Of[ENDO](F.Bind2nd(Compose[GA], f)) }