Skip to main content
Version: v2.2.82 (latest)
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

FunctionSignatureDescription
Offunc Of[C, A any](value A) ReaderIO[C, A]Wrap pure value
Askfunc Ask[C any]() ReaderIO[C, C]Access context
Asksfunc Asks[C, A any](f func(C) A) ReaderIO[C, A]Access and transform context
FromIOfunc FromIO[C, A any](io IO[A]) ReaderIO[C, A]Lift IO to ReaderIO
FromReaderfunc FromReader[C, A any](r Reader[C, A]) ReaderIO[C, A]Lift Reader to ReaderIO

Transformations

FunctionSignatureDescription
Mapfunc Map[C, A, B any](f func(A) B) func(ReaderIO[C, A]) ReaderIO[C, B]Transform result
Chainfunc 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)()
}