mirror of
https://github.com/IBM/fp-go.git
synced 2025-11-25 22:21:49 +02:00
* fix: initial checkin of v2 Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: slowly migrate IO Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: migrate MonadTraverseArray and TraverseArray Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: migrate traversal Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: complete migration of IO Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: migrate ioeither Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: refactorY Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: next step in migration Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: adjust IO generation code Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: get rid of more IO methods Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: get rid of more IO * fix: convert iooption Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: convert reader Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: convert a bit of reader Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: new build script Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: cleanup Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: reformat Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: simplify Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: some cleanup Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: adjust Pair to Haskell semantic Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: documentation and testcases Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: some performance optimizations Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: remove coverage Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> * fix: better doc Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com> --------- Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com>
83 lines
3.2 KiB
Go
83 lines
3.2 KiB
Go
// Copyright (c) 2023 - 2025 IBM Corp.
|
|
// All rights reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package readerioeither
|
|
|
|
import (
|
|
"github.com/IBM/fp-go/v2/either"
|
|
"github.com/IBM/fp-go/v2/ioeither"
|
|
"github.com/IBM/fp-go/v2/reader"
|
|
"github.com/IBM/fp-go/v2/readerio"
|
|
)
|
|
|
|
type (
|
|
// Either represents a value of one of two possible types (a disjoint union).
|
|
// An instance of Either is either Left (representing an error) or Right (representing a success).
|
|
Either[E, A any] = either.Either[E, A]
|
|
|
|
// Reader represents a computation that depends on some context/environment of type R
|
|
// and produces a value of type A. It's useful for dependency injection patterns.
|
|
Reader[R, A any] = reader.Reader[R, A]
|
|
|
|
// ReaderIO represents a computation that depends on some context R and performs
|
|
// side effects to produce a value of type A.
|
|
ReaderIO[R, A any] = readerio.ReaderIO[R, A]
|
|
|
|
// IOEither represents a computation that performs side effects and can either
|
|
// fail with an error of type E or succeed with a value of type A.
|
|
IOEither[E, A any] = ioeither.IOEither[E, A]
|
|
|
|
// ReaderIOEither represents a computation that:
|
|
// - Depends on some context/environment of type R (Reader)
|
|
// - Performs side effects (IO)
|
|
// - Can fail with an error of type E or succeed with a value of type A (Either)
|
|
//
|
|
// It combines three powerful functional programming concepts:
|
|
// 1. Reader monad for dependency injection
|
|
// 2. IO monad for side effects
|
|
// 3. Either monad for error handling
|
|
//
|
|
// Type parameters:
|
|
// - R: The type of the context/environment (e.g., configuration, dependencies)
|
|
// - E: The type of errors that can occur
|
|
// - A: The type of the success value
|
|
//
|
|
// Example:
|
|
// type Config struct { BaseURL string }
|
|
// func fetchUser(id int) ReaderIOEither[Config, error, User] {
|
|
// return func(cfg Config) IOEither[error, User] {
|
|
// return func() Either[error, User] {
|
|
// // Use cfg.BaseURL to fetch user
|
|
// // Return either.Right(user) or either.Left(err)
|
|
// }
|
|
// }
|
|
// }
|
|
ReaderIOEither[R, E, A any] = Reader[R, IOEither[E, A]]
|
|
|
|
// Operator represents a transformation from one ReaderIOEither to another.
|
|
// It's a Reader that takes a ReaderIOEither[R, E, A] and produces a ReaderIOEither[R, E, B].
|
|
// This type is commonly used for composing operations in a point-free style.
|
|
//
|
|
// Type parameters:
|
|
// - R: The context type
|
|
// - E: The error type
|
|
// - A: The input value type
|
|
// - B: The output value type
|
|
//
|
|
// Example:
|
|
// var doubleOp Operator[Config, error, int, int] = Map(func(x int) int { return x * 2 })
|
|
Operator[R, E, A, B any] = reader.Reader[ReaderIOEither[R, E, A], ReaderIOEither[R, E, B]]
|
|
)
|