package core

// Memoize wraps a pure function fn so that results are cached by key.
// Subsequent calls with the same key return the cached value without calling fn again.
// The returned function is safe for single-goroutine use.
func Memoize[K comparable, V any](fn func(K) V) func(K) V {
	cache := make(map[K]V)
	return func(key K) V {
		if val, ok := cache[key]; ok {
			return val
		}
		val := fn(key)
		cache[key] = val
		return val
	}
}
