mirror of
https://github.com/IBM/fp-go.git
synced 2025-11-23 22:14:53 +02:00
62 lines
2.2 KiB
Go
62 lines
2.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 function
|
||
|
|
|
||
|
|
// Ternary creates a conditional function that applies different transformations based on a predicate.
|
||
|
|
//
|
||
|
|
// This function implements a ternary operator (condition ? trueCase : falseCase) in a functional style.
|
||
|
|
// It takes a predicate and two transformation functions, returning a new function that applies
|
||
|
|
// the appropriate transformation based on whether the predicate is satisfied.
|
||
|
|
//
|
||
|
|
// Type Parameters:
|
||
|
|
// - A: The input type
|
||
|
|
// - B: The output type
|
||
|
|
//
|
||
|
|
// Parameters:
|
||
|
|
// - pred: A predicate function that determines which branch to take
|
||
|
|
// - onTrue: The transformation to apply when the predicate returns true
|
||
|
|
// - onFalse: The transformation to apply when the predicate returns false
|
||
|
|
//
|
||
|
|
// Returns:
|
||
|
|
// - A function that conditionally applies onTrue or onFalse based on pred
|
||
|
|
//
|
||
|
|
// Example:
|
||
|
|
//
|
||
|
|
// isPositive := func(n int) bool { return n > 0 }
|
||
|
|
// double := func(n int) int { return n * 2 }
|
||
|
|
// negate := func(n int) int { return -n }
|
||
|
|
//
|
||
|
|
// transform := Ternary(isPositive, double, negate)
|
||
|
|
// result1 := transform(5) // 10 (positive, so doubled)
|
||
|
|
// result2 := transform(-3) // 3 (negative, so negated)
|
||
|
|
//
|
||
|
|
// // Classify numbers
|
||
|
|
// classify := Ternary(
|
||
|
|
// func(n int) bool { return n > 0 },
|
||
|
|
// Constant1[int, string]("positive"),
|
||
|
|
// Constant1[int, string]("non-positive"),
|
||
|
|
// )
|
||
|
|
// result := classify(5) // "positive"
|
||
|
|
// result2 := classify(-3) // "non-positive"
|
||
|
|
func Ternary[A, B any](pred func(A) bool, onTrue func(A) B, onFalse func(A) B) func(A) B {
|
||
|
|
return func(a A) B {
|
||
|
|
if pred(a) {
|
||
|
|
return onTrue(a)
|
||
|
|
}
|
||
|
|
return onFalse(a)
|
||
|
|
}
|
||
|
|
}
|