Reference · Core Type
ReaderIO
Combine dependency injection (Reader) with lazy side effects (IO). ReaderIO[C, A] for effectful computations with dependencies.
01
Overview
type_definition.go
package readerio // ReaderIO combines Reader and IO type ReaderIO[C, A any] = Reader[C, IO[A]] // Which expands to: func(C) func() A
02
Core API
Constructors
| Function | Signature | Description |
|---|---|---|
Of | func Of[C, A any](value A) ReaderIO[C, A] | Wrap pure value |
Ask | func Ask[C any]() ReaderIO[C, C] | Access context |
Asks | func Asks[C, A any](f func(C) A) ReaderIO[C, A] | Access and transform context |
FromIO | func FromIO[C, A any](io IO[A]) ReaderIO[C, A] | Lift IO to ReaderIO |
FromReader | func FromReader[C, A any](r Reader[C, A]) ReaderIO[C, A] | Lift Reader to ReaderIO |
Transformations
| Function | Signature | Description |
|---|---|---|
Map | func Map[C, A, B any](f func(A) B) func(ReaderIO[C, A]) ReaderIO[C, B] | Transform result |
Chain | func Chain[C, A, B any](f func(A) ReaderIO[C, B]) func(ReaderIO[C, A]) ReaderIO[C, B] | Sequence operations |
03
Usage Examples
Basic Usage
basic.go
package main
import (
RIO "github.com/IBM/fp-go/v2/readerio"
IO "github.com/IBM/fp-go/v2/io"
)
type Dependencies struct {
Logger *log.Logger
}
func logMessage(msg string) RIO.ReaderIO[Dependencies, unit.Unit] {
return RIO.Ask[Dependencies, *log.Logger](func(deps Dependencies) *log.Logger {
return deps.Logger
}).Chain(func(logger *log.Logger) RIO.ReaderIO[Dependencies, unit.Unit] {
return RIO.FromIO(IO.FromImpure(func() {
logger.Println(msg)
}))
})
}
func main() {
deps := Dependencies{Logger: log.New(os.Stdout, "", 0)}
logMessage("Hello, World!")(deps)()
}