mirror of
https://github.com/IBM/fp-go.git
synced 2025-12-09 23:11:40 +02:00
84 lines
1.8 KiB
Go
84 lines
1.8 KiB
Go
package readerioeither
|
|
|
|
import (
|
|
"github.com/IBM/fp-go/v2/function"
|
|
RA "github.com/IBM/fp-go/v2/internal/array"
|
|
"github.com/IBM/fp-go/v2/monoid"
|
|
)
|
|
|
|
//go:inline
|
|
func MonadReduceArray[R, E, A, B any](as []ReaderIOEither[R, E, A], reduce func(B, A) B, initial B) ReaderIOEither[R, E, B] {
|
|
return RA.MonadTraverseReduce(
|
|
Of,
|
|
Map,
|
|
Ap,
|
|
|
|
as,
|
|
|
|
function.Identity[ReaderIOEither[R, E, A]],
|
|
reduce,
|
|
initial,
|
|
)
|
|
}
|
|
|
|
//go:inline
|
|
func ReduceArray[R, E, A, B any](reduce func(B, A) B, initial B) Kleisli[R, E, []ReaderIOEither[R, E, A], B] {
|
|
return RA.TraverseReduce[[]ReaderIOEither[R, E, A]](
|
|
Of,
|
|
Map,
|
|
Ap,
|
|
|
|
function.Identity[ReaderIOEither[R, E, A]],
|
|
reduce,
|
|
initial,
|
|
)
|
|
}
|
|
|
|
//go:inline
|
|
func MonadReduceArrayM[R, E, A any](as []ReaderIOEither[R, E, A], m monoid.Monoid[A]) ReaderIOEither[R, E, A] {
|
|
return MonadReduceArray(as, m.Concat, m.Empty())
|
|
}
|
|
|
|
//go:inline
|
|
func ReduceArrayM[R, E, A any](m monoid.Monoid[A]) Kleisli[R, E, []ReaderIOEither[R, E, A], A] {
|
|
return ReduceArray[R, E](m.Concat, m.Empty())
|
|
}
|
|
|
|
//go:inline
|
|
func MonadTraverseReduceArray[R, E, A, B, C any](as []A, trfrm Kleisli[R, E, A, B], reduce func(C, B) C, initial C) ReaderIOEither[R, E, C] {
|
|
return RA.MonadTraverseReduce(
|
|
Of,
|
|
Map,
|
|
Ap,
|
|
|
|
as,
|
|
|
|
trfrm,
|
|
reduce,
|
|
initial,
|
|
)
|
|
}
|
|
|
|
//go:inline
|
|
func TraverseReduceArray[R, E, A, B, C any](trfrm Kleisli[R, E, A, B], reduce func(C, B) C, initial C) Kleisli[R, E, []A, C] {
|
|
return RA.TraverseReduce[[]A](
|
|
Of,
|
|
Map,
|
|
Ap,
|
|
|
|
trfrm,
|
|
reduce,
|
|
initial,
|
|
)
|
|
}
|
|
|
|
//go:inline
|
|
func MonadTraverseReduceArrayM[R, E, A, B any](as []A, trfrm Kleisli[R, E, A, B], m monoid.Monoid[B]) ReaderIOEither[R, E, B] {
|
|
return MonadTraverseReduceArray(as, trfrm, m.Concat, m.Empty())
|
|
}
|
|
|
|
//go:inline
|
|
func TraverseReduceArrayM[R, E, A, B any](trfrm Kleisli[R, E, A, B], m monoid.Monoid[B]) Kleisli[R, E, []A, B] {
|
|
return TraverseReduceArray(trfrm, m.Concat, m.Empty())
|
|
}
|