mirror of
https://github.com/IBM/fp-go.git
synced 2025-11-23 22:14:53 +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>
97 lines
3.1 KiB
Go
97 lines
3.1 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
|
|
|
|
import (
|
|
G "github.com/IBM/fp-go/v2/function/generic"
|
|
)
|
|
|
|
// Switch creates a function that applies different handlers based on a key extracted from the input.
|
|
//
|
|
// This implements a switch/case-like pattern in a functional style. Given a key extraction function,
|
|
// a map of handlers for different cases, and a default handler, it returns a function that:
|
|
// 1. Extracts a key from the input using the key function
|
|
// 2. Looks up the handler for that key in the map
|
|
// 3. Applies the handler if found, or the default handler if not
|
|
//
|
|
// This is useful for implementing polymorphic behavior, routing, or state machines in a
|
|
// functional way.
|
|
//
|
|
// Type Parameters:
|
|
// - K: The type of the key (must be comparable for map lookup)
|
|
// - T: The input type
|
|
// - R: The return type
|
|
//
|
|
// Parameters:
|
|
// - kf: A function that extracts a key from the input
|
|
// - n: A map from keys to handler functions
|
|
// - d: The default handler to use when the key is not found in the map
|
|
//
|
|
// Returns:
|
|
// - A function that applies the appropriate handler based on the extracted key
|
|
//
|
|
// Example:
|
|
//
|
|
// type Animal struct {
|
|
// Type string
|
|
// Name string
|
|
// }
|
|
//
|
|
// getType := func(a Animal) string { return a.Type }
|
|
//
|
|
// handlers := map[string]func(Animal) string{
|
|
// "dog": func(a Animal) string { return a.Name + " barks" },
|
|
// "cat": func(a Animal) string { return a.Name + " meows" },
|
|
// }
|
|
//
|
|
// defaultHandler := func(a Animal) string {
|
|
// return a.Name + " makes a sound"
|
|
// }
|
|
//
|
|
// makeSound := Switch(getType, handlers, defaultHandler)
|
|
//
|
|
// dog := Animal{Type: "dog", Name: "Rex"}
|
|
// cat := Animal{Type: "cat", Name: "Whiskers"}
|
|
// bird := Animal{Type: "bird", Name: "Tweety"}
|
|
//
|
|
// result1 := makeSound(dog) // "Rex barks"
|
|
// result2 := makeSound(cat) // "Whiskers meows"
|
|
// result3 := makeSound(bird) // "Tweety makes a sound"
|
|
//
|
|
// HTTP routing example:
|
|
//
|
|
// type Request struct {
|
|
// Method string
|
|
// Path string
|
|
// }
|
|
//
|
|
// getMethod := func(r Request) string { return r.Method }
|
|
//
|
|
// routes := map[string]func(Request) string{
|
|
// "GET": func(r Request) string { return "Handling GET " + r.Path },
|
|
// "POST": func(r Request) string { return "Handling POST " + r.Path },
|
|
// "DELETE": func(r Request) string { return "Handling DELETE " + r.Path },
|
|
// }
|
|
//
|
|
// notFound := func(r Request) string {
|
|
// return "Method not allowed: " + r.Method
|
|
// }
|
|
//
|
|
// router := Switch(getMethod, routes, notFound)
|
|
func Switch[K comparable, T, R any](kf func(T) K, n map[K]func(T) R, d func(T) R) func(T) R {
|
|
return G.Switch(kf, n, d)
|
|
}
|