1
0
mirror of https://github.com/IBM/fp-go.git synced 2025-11-23 22:14:53 +02:00
Files
fp-go/v2/state/bind.go
Dr. Carsten Leue 909d626019 fix: serveral performance improvements
Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com>
2025-11-18 10:58:24 +01:00

108 lines
1.8 KiB
Go

package state
import (
"github.com/IBM/fp-go/v2/function"
A "github.com/IBM/fp-go/v2/internal/apply"
C "github.com/IBM/fp-go/v2/internal/chain"
F "github.com/IBM/fp-go/v2/internal/functor"
)
//go:inline
func Do[ST, A any](
empty A,
) State[ST, A] {
return Of[ST](empty)
}
//go:inline
func Bind[ST, S1, S2, T any](
setter func(T) func(S1) S2,
f Kleisli[ST, S1, T],
) Operator[ST, S1, S2] {
return C.Bind(
Chain[ST, Kleisli[ST, S1, S2], S1, S2],
Map[ST, func(T) S2, T, S2],
setter,
f,
)
}
//go:inline
func Let[ST, S1, S2, T any](
key func(T) func(S1) S2,
f func(S1) T,
) Operator[ST, S1, S2] {
return F.Let(
Map[ST, func(S1) S2, S1, S2],
key,
f,
)
}
//go:inline
func LetTo[ST, S1, S2, T any](
key func(T) func(S1) S2,
b T,
) Operator[ST, S1, S2] {
return F.LetTo(
Map[ST, func(S1) S2, S1, S2],
key,
b,
)
}
//go:inline
func BindTo[ST, S1, T any](
setter func(T) S1,
) Operator[ST, T, S1] {
return C.BindTo(
Map[ST, func(T) S1, T, S1],
setter,
)
}
//go:inline
func ApS[ST, S1, S2, T any](
setter func(T) func(S1) S2,
fa State[ST, T],
) Operator[ST, S1, S2] {
return A.ApS(
Ap[S2, ST, T],
Map[ST, func(S1) func(T) S2, S1, func(T) S2],
setter,
fa,
)
}
//go:inline
func ApSL[ST, S, T any](
lens Lens[S, T],
fa State[ST, T],
) Endomorphism[State[ST, S]] {
return ApS(lens.Set, fa)
}
//go:inline
func BindL[ST, S, T any](
lens Lens[S, T],
f Kleisli[ST, T, T],
) Endomorphism[State[ST, S]] {
return Bind(lens.Set, function.Flow2(lens.Get, f))
}
//go:inline
func LetL[ST, S, T any](
lens Lens[S, T],
f Endomorphism[T],
) Endomorphism[State[ST, S]] {
return Let[ST](lens.Set, function.Flow2(lens.Get, f))
}
//go:inline
func LetToL[ST, S, T any](
lens Lens[S, T],
b T,
) Endomorphism[State[ST, S]] {
return LetTo[ST](lens.Set, b)
}