mirror of
https://github.com/IBM/fp-go.git
synced 2025-11-23 22:14:53 +02:00
108 lines
1.8 KiB
Go
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)
|
|
}
|