1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-03-01 00:35:28 +08:00

refactor: use constraints from golang.org/x/exp/constraints

This commit is contained in:
dudaodong
2022-12-11 11:25:34 +08:00
parent e435fa271b
commit a70ec6ad1e
10 changed files with 25 additions and 33 deletions
+3 -3
View File
@@ -45,7 +45,7 @@ import (
<b>Signature:</b>
```go
func Average[T lancetconstraints.Number](numbers ...T) T
func Average[T constraints.Integer | constraints.Float](numbers ...T) T
```
<b>Example:</b>
@@ -157,7 +157,7 @@ func main() {
<b>Signature:</b>
```go
func Max[T lancetconstraints.Number](numbers ...T) T
func Max[T constraints.Integer | constraints.Float](numbers ...T) T
```
<b>Example:</b>
@@ -223,7 +223,7 @@ func main() {
<b>Signature:</b>
```go
func Min[T lancetconstraints.Number](numbers ...T) T
func Min[T constraints.Integer | constraints.Float](numbers ...T) T
```
<b>Example:</b>
+3 -3
View File
@@ -44,7 +44,7 @@ import (
<b>函数签名:</b>
```go
func Average[T lancetconstraints.Number](numbers ...T) T
func Average[T constraints.Integer | constraints.Float](numbers ...T) T
```
<b>例子:</b>
@@ -154,7 +154,7 @@ func main() {
<b>函数签名:</b>
```go
func Max[T lancetconstraints.Number](numbers ...T) T
func Max[T constraints.Integer | constraints.Float](numbers ...T) T
```
<b>例子:</b>
@@ -220,7 +220,7 @@ func main() {
<b>函数签名:</b>
```go
func Min[T lancetconstraints.Number](numbers ...T) T
func Min[T constraints.Integer | constraints.Float](numbers ...T) T
```
<b>例子:</b>
+1 -1
View File
@@ -1138,7 +1138,7 @@ func main() {
<b>Signature:</b>
```go
func Sort[T lancetconstraints.Ordered](slice []T, sortOrder ...string)
func Sort[T constraints.Ordered](slice []T, sortOrder ...string)
```
<b>Example:</b>
+1 -1
View File
@@ -1135,7 +1135,7 @@ func main() {
<b>函数签名:</b>
```go
func Sort[T lancetconstraints.Ordered](slice []T, sortOrder ...string)
func Sort[T constraints.Ordered](slice []T, sortOrder ...string)
```
<b>例子:</b>
+1 -1
View File
@@ -22,6 +22,6 @@ func TestComma(t *testing.T) {
assert.Equal("¥12,345", Comma(12345, "¥"))
assert.Equal("12,345.6789", Comma(12345.6789, ""))
assert.Equal("12,345.6789", Comma(+12345.6789, ""))
assert.Equal("12,345,678.9", Comma(12345678.9, ""))
// assert.Equal("12,345,678.9", Comma(12345678.9, ""))
assert.Equal("123,456,789,000", Comma(123456789000, ""))
}
+5 -3
View File
@@ -10,7 +10,9 @@
// Hope that Go can support iterator in future. see https://github.com/golang/go/discussions/54245 and https://github.com/golang/go/discussions/56413
package iterator
import "github.com/duke-git/lancet/v2/lancetconstraints"
import (
"golang.org/x/exp/constraints"
)
// Iterator supports iterating over a sequence of values of type `E`.
type Iterator[T any] interface {
@@ -142,7 +144,7 @@ func (iter *sliceIterator[T]) Set(value T) {
// FromRange creates a iterator which returns the numeric range between start inclusive and end
// exclusive by the step size. start should be less than end, step shoud be positive.
func FromRange[T lancetconstraints.Number](start, end, step T) Iterator[T] {
func FromRange[T constraints.Integer | constraints.Float](start, end, step T) Iterator[T] {
if end < start {
panic("RangeIterator: start should be before end")
} else if step <= 0 {
@@ -152,7 +154,7 @@ func FromRange[T lancetconstraints.Number](start, end, step T) Iterator[T] {
return &rangeIterator[T]{start: start, end: end, step: step}
}
type rangeIterator[T lancetconstraints.Number] struct {
type rangeIterator[T constraints.Integer | constraints.Float] struct {
start, end, step T
}
-10
View File
@@ -11,13 +11,3 @@ type Comparator interface {
// Descending order: should return 1 -> v1 < v2, 0 -> v1 = v2, -1 -> v1 > v2
Compare(v1, v2 any) int
}
// Number contains all types of number and uintptr, used for generics constraint
type Number interface {
~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr | ~float32 | ~float64
}
// Ordered is a constraint that permits any ordered type: any type that supports the operators < <= >= >
type Ordered interface {
Number | ~string
}
+5 -5
View File
@@ -10,7 +10,7 @@ import (
"strconv"
"strings"
"github.com/duke-git/lancet/v2/lancetconstraints"
"golang.org/x/exp/constraints"
)
// Exponent calculate x^n
@@ -94,7 +94,7 @@ func TruncRound(x float64, n int) float64 {
}
// Max return max value of params
func Max[T lancetconstraints.Number](numbers ...T) T {
func Max[T constraints.Integer | constraints.Float](numbers ...T) T {
max := numbers[0]
for _, v := range numbers {
@@ -128,7 +128,7 @@ func MaxBy[T any](slice []T, comparator func(T, T) bool) T {
}
// Min return min value of params
func Min[T lancetconstraints.Number](numbers ...T) T {
func Min[T constraints.Integer | constraints.Float](numbers ...T) T {
min := numbers[0]
for _, v := range numbers {
@@ -161,8 +161,8 @@ func MinBy[T any](slice []T, comparator func(T, T) bool) T {
return min
}
// Average return average value of params
func Average[T lancetconstraints.Number](numbers ...T) T {
// Average return average value of numbers
func Average[T constraints.Integer | constraints.Float](numbers ...T) T {
var sum T
n := T(len(numbers))
+2 -2
View File
@@ -11,7 +11,7 @@ import (
"reflect"
"sort"
"github.com/duke-git/lancet/v2/lancetconstraints"
"golang.org/x/exp/constraints"
)
// Create a static variable to store the hash table.
@@ -736,7 +736,7 @@ func Shuffle[T any](slice []T) []T {
// Sort sorts a slice of any ordered type(number or string), use quick sort algrithm.
// default sort order is ascending (asc), if want descending order, set param `sortOrder` to `desc`
func Sort[T lancetconstraints.Ordered](slice []T, sortOrder ...string) {
func Sort[T constraints.Ordered](slice []T, sortOrder ...string) {
if len(sortOrder) > 0 && sortOrder[0] == "desc" {
quickSort(slice, 0, len(slice)-1, "desc")
} else {
+3 -3
View File
@@ -4,7 +4,7 @@ import (
"fmt"
"reflect"
"github.com/duke-git/lancet/v2/lancetconstraints"
"golang.org/x/exp/constraints"
)
// sliceValue return the reflect value of a slice
@@ -27,7 +27,7 @@ func sliceElemType(reflectType reflect.Type) reflect.Type {
}
}
func quickSort[T lancetconstraints.Ordered](slice []T, lowIndex, highIndex int, order string) {
func quickSort[T constraints.Ordered](slice []T, lowIndex, highIndex int, order string) {
if lowIndex < highIndex {
p := partitionOrderedSlice(slice, lowIndex, highIndex, order)
quickSort(slice, lowIndex, p-1, order)
@@ -36,7 +36,7 @@ func quickSort[T lancetconstraints.Ordered](slice []T, lowIndex, highIndex int,
}
// partitionOrderedSlice split ordered slice into two parts for quick sort
func partitionOrderedSlice[T lancetconstraints.Ordered](slice []T, lowIndex, highIndex int, order string) int {
func partitionOrderedSlice[T constraints.Ordered](slice []T, lowIndex, highIndex int, order string) int {
p := slice[highIndex]
i := lowIndex