diff --git a/go.mod b/go.mod index a5e8b7eb5..8dab033ca 100644 --- a/go.mod +++ b/go.mod @@ -10,9 +10,10 @@ require ( github.com/seancfoley/ipaddress-go v1.2.1 github.com/spf13/cobra v1.5.0 github.com/spf13/pflag v1.0.5 - golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 + golang.org/x/crypto v0.0.0-20220919173607-35f4265a4bc0 + golang.org/x/exp v0.0.0-20220921023135-46d9e7742f1e golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 - golang.org/x/sys v0.0.0-20220909162455-aba9fc2a8ff2 + golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 ) require ( diff --git a/go.sum b/go.sum index b6178f988..b12fdd30e 100644 --- a/go.sum +++ b/go.sum @@ -19,12 +19,14 @@ github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220919173607-35f4265a4bc0 h1:a5Yg6ylndHHYJqIPrdq0AhvR6KTvDTAvgBtaidhEevY= +golang.org/x/crypto v0.0.0-20220919173607-35f4265a4bc0/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20220921023135-46d9e7742f1e h1:Ctm9yurWsg7aWwIpH9Bnap/IdSVxixymIb3MhiMEQQA= +golang.org/x/exp v0.0.0-20220921023135-46d9e7742f1e/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 h1:Lj6HJGCSn5AjxRAH2+r35Mir4icalbqku+CLUtjnvXY= golang.org/x/image v0.0.0-20220902085622-e7cb96979f69/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY= -golang.org/x/sys v0.0.0-20220909162455-aba9fc2a8ff2 h1:wM1k/lXfpc5HdkJJyW9GELpd8ERGdnh8sMGL6Gzq3Ho= -golang.org/x/sys v0.0.0-20220909162455-aba9fc2a8ff2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc= +golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/tools/utils/misc.go b/tools/utils/misc.go index 15e1fce7f..dd945967e 100644 --- a/tools/utils/misc.go +++ b/tools/utils/misc.go @@ -5,6 +5,8 @@ package utils import ( "fmt" "sort" + + "golang.org/x/exp/constraints" ) var _ = fmt.Print @@ -33,3 +35,21 @@ func StableSort[T any](s []T, less func(a, b T) bool) []T { sort.SliceStable(s, func(i, j int) bool { return less(s[i], s[j]) }) return s } + +func SortWithKey[T any, C constraints.Ordered](s []T, key func(a T) C) []T { + mem := make([]C, len(s)) + for i, x := range s { + mem[i] = key(x) + } + sort.Slice(s, func(i, j int) bool { return mem[i] < mem[j] }) + return s +} + +func StableSortWithKey[T any, C constraints.Ordered](s []T, key func(a T) C) []T { + mem := make([]C, len(s)) + for i, x := range s { + mem[i] = key(x) + } + sort.SliceStable(s, func(i, j int) bool { return mem[i] < mem[j] }) + return s +}