1
0
mirror of https://github.com/IBM/fp-go.git synced 2025-11-23 22:14:53 +02:00
Files
fp-go/v2/function/switch.go
Carsten Leue 3385c705dc Implement v2 using type aliases (#141)
* 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>
2025-11-06 09:27:00 +01:00

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)
}