Skip to content

Commit

Permalink
Add 121 compat funcs
Browse files Browse the repository at this point in the history
  • Loading branch information
nekohasekai committed Oct 19, 2024
1 parent c635464 commit d727ae1
Show file tree
Hide file tree
Showing 4 changed files with 156 additions and 0 deletions.
15 changes: 15 additions & 0 deletions common/minmax.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
//go:build go1.21

package common

import (
"cmp"
)

func Min[T cmp.Ordered](x, y T) T {

Check failure on line 9 in common/minmax.go

View workflow job for this annotation

GitHub Actions / Build

other declaration of Min

Check failure on line 9 in common/minmax.go

View workflow job for this annotation

GitHub Actions / Build

other declaration of Min

Check failure on line 9 in common/minmax.go

View workflow job for this annotation

GitHub Actions / Linux

other declaration of Min

Check failure on line 9 in common/minmax.go

View workflow job for this annotation

GitHub Actions / macOS

other declaration of Min

Check failure on line 9 in common/minmax.go

View workflow job for this annotation

GitHub Actions / Linux (Go 1.21)

other declaration of Min

Check failure on line 9 in common/minmax.go

View workflow job for this annotation

GitHub Actions / Linux (Go 1.22)

other declaration of Min

Check failure on line 9 in common/minmax.go

View workflow job for this annotation

GitHub Actions / Windows

other declaration of Min
return min(x, y)
}

func Max[T cmp.Ordered](x, y T) T {

Check failure on line 13 in common/minmax.go

View workflow job for this annotation

GitHub Actions / Build

other declaration of Max (typecheck)

Check failure on line 13 in common/minmax.go

View workflow job for this annotation

GitHub Actions / Build

other declaration of Max) (typecheck)

Check failure on line 13 in common/minmax.go

View workflow job for this annotation

GitHub Actions / Linux

other declaration of Max

Check failure on line 13 in common/minmax.go

View workflow job for this annotation

GitHub Actions / macOS

other declaration of Max

Check failure on line 13 in common/minmax.go

View workflow job for this annotation

GitHub Actions / Linux (Go 1.21)

other declaration of Max

Check failure on line 13 in common/minmax.go

View workflow job for this annotation

GitHub Actions / Linux (Go 1.22)

other declaration of Max

Check failure on line 13 in common/minmax.go

View workflow job for this annotation

GitHub Actions / Windows

other declaration of Max
return max(x, y)
}
17 changes: 17 additions & 0 deletions common/minmax_compat.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package common

import "github.com/sagernet/sing/common/x/constraints"

func Min[T constraints.Ordered](x, y T) T {

Check failure on line 5 in common/minmax_compat.go

View workflow job for this annotation

GitHub Actions / Build

Min redeclared in this block

Check failure on line 5 in common/minmax_compat.go

View workflow job for this annotation

GitHub Actions / Build

Min redeclared in this block

Check failure on line 5 in common/minmax_compat.go

View workflow job for this annotation

GitHub Actions / Linux

Min redeclared in this block

Check failure on line 5 in common/minmax_compat.go

View workflow job for this annotation

GitHub Actions / macOS

Min redeclared in this block

Check failure on line 5 in common/minmax_compat.go

View workflow job for this annotation

GitHub Actions / Linux (Go 1.21)

Min redeclared in this block

Check failure on line 5 in common/minmax_compat.go

View workflow job for this annotation

GitHub Actions / Linux (Go 1.22)

Min redeclared in this block

Check failure on line 5 in common/minmax_compat.go

View workflow job for this annotation

GitHub Actions / Windows

Min redeclared in this block
if x < y {
return x
}
return y
}

func Max[T constraints.Ordered](x, y T) T {

Check failure on line 12 in common/minmax_compat.go

View workflow job for this annotation

GitHub Actions / Build

Max redeclared in this block

Check failure on line 12 in common/minmax_compat.go

View workflow job for this annotation

GitHub Actions / Build

Max redeclared in this block

Check failure on line 12 in common/minmax_compat.go

View workflow job for this annotation

GitHub Actions / Linux

Max redeclared in this block

Check failure on line 12 in common/minmax_compat.go

View workflow job for this annotation

GitHub Actions / macOS

Max redeclared in this block

Check failure on line 12 in common/minmax_compat.go

View workflow job for this annotation

GitHub Actions / Linux (Go 1.21)

Max redeclared in this block

Check failure on line 12 in common/minmax_compat.go

View workflow job for this annotation

GitHub Actions / Linux (Go 1.22)

Max redeclared in this block

Check failure on line 12 in common/minmax_compat.go

View workflow job for this annotation

GitHub Actions / Windows

Max redeclared in this block
if x < y {
return y
}
return x
}
20 changes: 20 additions & 0 deletions common/oncefunc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//go:build go1.21

package common

import "sync"

// OnceFunc is a wrapper around sync.OnceFunc.
func OnceFunc(f func()) func() {
return sync.OnceFunc(f)
}

// OnceValue is a wrapper around sync.OnceValue.
func OnceValue[T any](f func() T) func() T {
return sync.OnceValue(f)
}

// OnceValues is a wrapper around sync.OnceValues.
func OnceValues[T1, T2 any](f func() (T1, T2)) func() (T1, T2) {
return sync.OnceValues(f)
}
104 changes: 104 additions & 0 deletions common/oncefunc_compat.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
// Copyright 2022 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build go1.20 && !go1.21

package common

import "sync"

// OnceFunc returns a function that invokes f only once. The returned function
// may be called concurrently.
//
// If f panics, the returned function will panic with the same value on every call.
func OnceFunc(f func()) func() {
var (
once sync.Once
valid bool
p any
)
// Construct the inner closure just once to reduce costs on the fast path.
g := func() {
defer func() {
p = recover()
if !valid {
// Re-panic immediately so on the first call the user gets a
// complete stack trace into f.
panic(p)
}
}()
f()
f = nil // Do not keep f alive after invoking it.
valid = true // Set only if f does not panic.
}
return func() {
once.Do(g)
if !valid {
panic(p)
}
}
}

// OnceValue returns a function that invokes f only once and returns the value
// returned by f. The returned function may be called concurrently.
//
// If f panics, the returned function will panic with the same value on every call.
func OnceValue[T any](f func() T) func() T {
var (
once sync.Once
valid bool
p any
result T
)
g := func() {
defer func() {
p = recover()
if !valid {
panic(p)
}
}()
result = f()
f = nil
valid = true
}
return func() T {
once.Do(g)
if !valid {
panic(p)
}
return result
}
}

// OnceValues returns a function that invokes f only once and returns the values
// returned by f. The returned function may be called concurrently.
//
// If f panics, the returned function will panic with the same value on every call.
func OnceValues[T1, T2 any](f func() (T1, T2)) func() (T1, T2) {
var (
once sync.Once
valid bool
p any
r1 T1
r2 T2
)
g := func() {
defer func() {
p = recover()
if !valid {
panic(p)
}
}()
r1, r2 = f()
f = nil
valid = true
}
return func() (T1, T2) {
once.Do(g)
if !valid {
panic(p)
}
return r1, r2
}
}

0 comments on commit d727ae1

Please sign in to comment.