package syncx import ( "context" "sync" ) // OnceValues executes a function at most once and returns the cached result. // This function behaves like sync.OnceValues, including caching both return // values from the first call, but with a context argument to the function. // // Can be used to do lazy database lookups that may be needed by multiple callbacks but should execute at most once. func OnceValues[T1, T2 any](fn func(context.Context) (T1, T2)) func(context.Context) (T1, T2) { var ( once sync.Once v1 T1 v2 T2 ) return func(ctx context.Context) (T1, T2) { once.Do(func() { v1, v2 = fn(ctx) }) return v1, v2 } }