mirror of
https://github.com/duke-git/lancet.git
synced 2026-03-01 00:35:28 +08:00
Compare commits
9 Commits
23e61f1acf
...
db479ef1bc
| Author | SHA1 | Date | |
|---|---|---|---|
| db479ef1bc | |||
| df8121fbbd | |||
| 0e7297cb97 | |||
| 2e619e48a3 | |||
| 3069acba4a | |||
| fc43138a0e | |||
| 1e56e9964c | |||
| f861e18bc3 | |||
| e27df00fa8 |
+11
-8
@@ -157,10 +157,10 @@ func (c *Channel[T]) Tee(ctx context.Context, in <-chan T) (<-chan T, <-chan T)
|
|||||||
// Play: https://go.dev/play/p/qmWSy1NVF-Y
|
// Play: https://go.dev/play/p/qmWSy1NVF-Y
|
||||||
func (c *Channel[T]) Bridge(ctx context.Context, chanStream <-chan <-chan T) <-chan T {
|
func (c *Channel[T]) Bridge(ctx context.Context, chanStream <-chan <-chan T) <-chan T {
|
||||||
valStream := make(chan T)
|
valStream := make(chan T)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
defer close(valStream)
|
defer close(valStream)
|
||||||
|
wg := sync.WaitGroup{}
|
||||||
|
defer wg.Wait()
|
||||||
for {
|
for {
|
||||||
var stream <-chan T
|
var stream <-chan T
|
||||||
select {
|
select {
|
||||||
@@ -169,19 +169,22 @@ func (c *Channel[T]) Bridge(ctx context.Context, chanStream <-chan <-chan T) <-c
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
stream = maybeStream
|
stream = maybeStream
|
||||||
|
wg.Add(1)
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
for val := range c.OrDone(ctx, stream) {
|
go func() {
|
||||||
select {
|
defer wg.Done()
|
||||||
case valStream <- val:
|
for val := range c.OrDone(ctx, stream) {
|
||||||
case <-ctx.Done():
|
select {
|
||||||
|
case valStream <- val:
|
||||||
|
case <-ctx.Done():
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}()
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
return valStream
|
return valStream
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -168,7 +168,8 @@ func ExampleChannel_Tee() {
|
|||||||
func ExampleChannel_Bridge() {
|
func ExampleChannel_Bridge() {
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
m1 := make(map[int]int)
|
||||||
|
m2 := make(map[int]int)
|
||||||
c := NewChannel[int]()
|
c := NewChannel[int]()
|
||||||
genVals := func() <-chan <-chan int {
|
genVals := func() <-chan <-chan int {
|
||||||
out := make(chan (<-chan int))
|
out := make(chan (<-chan int))
|
||||||
@@ -177,6 +178,7 @@ func ExampleChannel_Bridge() {
|
|||||||
for i := 1; i <= 5; i++ {
|
for i := 1; i <= 5; i++ {
|
||||||
stream := make(chan int, 1)
|
stream := make(chan int, 1)
|
||||||
stream <- i
|
stream <- i
|
||||||
|
m1[i]++
|
||||||
close(stream)
|
close(stream)
|
||||||
out <- stream
|
out <- stream
|
||||||
}
|
}
|
||||||
@@ -185,12 +187,15 @@ func ExampleChannel_Bridge() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for v := range c.Bridge(ctx, genVals()) {
|
for v := range c.Bridge(ctx, genVals()) {
|
||||||
fmt.Println(v)
|
m2[v]++
|
||||||
|
}
|
||||||
|
for k, v := range m1 {
|
||||||
|
fmt.Println(m2[k] == v)
|
||||||
}
|
}
|
||||||
// Output:
|
// Output:
|
||||||
// 1
|
// true
|
||||||
// 2
|
// true
|
||||||
// 3
|
// true
|
||||||
// 4
|
// true
|
||||||
// 5
|
// true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -169,7 +169,8 @@ func TestTee(t *testing.T) {
|
|||||||
func TestBridge(t *testing.T) {
|
func TestBridge(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
assert := internal.NewAssert(t, "TestBridge")
|
assert := internal.NewAssert(t, "TestBridge")
|
||||||
|
m1 := make(map[int]int)
|
||||||
|
m2 := make(map[int]int)
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
@@ -181,6 +182,7 @@ func TestBridge(t *testing.T) {
|
|||||||
for i := 0; i < 10; i++ {
|
for i := 0; i < 10; i++ {
|
||||||
stream := make(chan int, 1)
|
stream := make(chan int, 1)
|
||||||
stream <- i
|
stream <- i
|
||||||
|
m1[i]++
|
||||||
close(stream)
|
close(stream)
|
||||||
chanStream <- stream
|
chanStream <- stream
|
||||||
}
|
}
|
||||||
@@ -188,9 +190,11 @@ func TestBridge(t *testing.T) {
|
|||||||
return chanStream
|
return chanStream
|
||||||
}
|
}
|
||||||
|
|
||||||
index := 0
|
|
||||||
for val := range c.Bridge(ctx, genVals()) {
|
for val := range c.Bridge(ctx, genVals()) {
|
||||||
assert.Equal(index, val)
|
m2[val]++
|
||||||
index++
|
}
|
||||||
|
|
||||||
|
for k, v := range m1 {
|
||||||
|
assert.Equal(m2[k], v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,6 +108,13 @@ func ToString(value any) string {
|
|||||||
if value == nil {
|
if value == nil {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
rv := reflect.ValueOf(value)
|
||||||
|
if rv.Kind() == reflect.Ptr {
|
||||||
|
if rv.IsNil() {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return ToString(rv.Elem().Interface())
|
||||||
|
}
|
||||||
|
|
||||||
switch val := value.(type) {
|
switch val := value.(type) {
|
||||||
case float32:
|
case float32:
|
||||||
|
|||||||
@@ -142,13 +142,24 @@ func TestToString(t *testing.T) {
|
|||||||
}
|
}
|
||||||
aStruct := TestStruct{Name: "TestStruct"}
|
aStruct := TestStruct{Name: "TestStruct"}
|
||||||
|
|
||||||
|
i32Val := int32(123)
|
||||||
|
i64Val := int64(123)
|
||||||
|
iZeroVal := 0
|
||||||
|
fVal := 12.3
|
||||||
|
sVal := "abc"
|
||||||
|
var iNilPointer *int
|
||||||
|
var sNilPointer *string
|
||||||
|
|
||||||
cases := []any{
|
cases := []any{
|
||||||
"", nil,
|
"", nil,
|
||||||
int(0), int8(1), int16(-1), int32(123), int64(123),
|
int(0), int8(1), int16(-1), int32(123), int64(123),
|
||||||
uint(123), uint8(123), uint16(123), uint32(123), uint64(123),
|
uint(123), uint8(123), uint16(123), uint32(123), uint64(123),
|
||||||
float64(12.3), float32(12.3),
|
float64(12.3), float32(12.3),
|
||||||
true, false,
|
true, false,
|
||||||
[]int{1, 2, 3}, aMap, aStruct, []byte{104, 101, 108, 108, 111}}
|
[]int{1, 2, 3}, aMap, aStruct, []byte{104, 101, 108, 108, 111},
|
||||||
|
&i32Val, &i64Val, &fVal, &sVal, &aStruct, iNilPointer, sNilPointer,
|
||||||
|
&iZeroVal,
|
||||||
|
}
|
||||||
|
|
||||||
expected := []string{
|
expected := []string{
|
||||||
"", "",
|
"", "",
|
||||||
@@ -157,6 +168,8 @@ func TestToString(t *testing.T) {
|
|||||||
"12.3", "12.3",
|
"12.3", "12.3",
|
||||||
"true", "false",
|
"true", "false",
|
||||||
"[1,2,3]", "{\"a\":1,\"b\":2,\"c\":3}", "{\"Name\":\"TestStruct\"}", "hello",
|
"[1,2,3]", "{\"a\":1,\"b\":2,\"c\":3}", "{\"Name\":\"TestStruct\"}", "hello",
|
||||||
|
"123", "123", "12.3", "abc", "{\"Name\":\"TestStruct\"}", "", "",
|
||||||
|
"0",
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i < len(cases); i++ {
|
for i := 0; i < len(cases); i++ {
|
||||||
|
|||||||
@@ -1,51 +1,51 @@
|
|||||||
-----BEGIN rsa private key-----
|
-----BEGIN rsa private key-----
|
||||||
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
|
||||||
-----END rsa private key-----
|
-----END rsa private key-----
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
-----BEGIN rsa public key-----
|
-----BEGIN rsa public key-----
|
||||||
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuYcMNNn4v0OaL/Ufwj0p
|
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAof7+5KVH6s/ID7onVeuC
|
||||||
kChajjUm1Nb3OeU4bXX26i+khkXNy6KaoRzlAfsH1Fli4iv7x6c9cde4Q63R7Wod
|
PVGPIW6TiHHjDlxbYLdA/CyhTvR2Pk8JvX9BjBXLI/+jTWsyTUucwszu3MaVhIS/
|
||||||
vzcH1W2HKxQ3Ht6hkeS2RKgJEm8o/Pbzr10yaULwjVLXsTkG6ssIdQLw3zwz6XRD
|
gzoLKjr5meVp+HEcFe98s4XRYhob2cdpDo+Jty8Vuodz5T2nYkIZP/oyJNmQCBYD
|
||||||
vyU66NbE3mNDIh1yAtJUmPoeRcA4QMbMM+5P888Ht6ETsLVkMx1uFYALbGidlACB
|
e20nBwmjjFfworEvwNy2fSucs8wrlJT2Xqy4oHZqERWvnIJZtBshX9//9Pw3m/Gu
|
||||||
S7hyBtc0ibWjdAG9rSZg7E3MAhz5dRYmkGAJqSA4aHWL6FT2gXXkrP36D4+hbQA6
|
pHeBFBNW2omWCQm4aTEbeepkXloTgVQ75FEpyyjNjDi+OG/Om2v5l+XCvOcV39Hc
|
||||||
UsBLxs5nM4Cl7fzdysJWv1suldiB84+gYRmiumsj/odwVcxxFcxI1sDgabzI5IKT
|
7sBovDFNX6w39zQSIKiMpFkxciKP9SPbqZz+Vv0iyUPKxi2gXwbgy0+k2aTQlsPS
|
||||||
waGLLz5hu+7in9lAIEqtfH/Ui5pfEw8qH1ymkLnlkSAtTZ4ByMaw869zP0AYnn1m
|
976+2/4QgLReU3Ujeh8Q6oRwB8HRfPlD7aY+dGPMT16o1R3nhs2jwsGId812lw5q
|
||||||
p+dJ5Mo1mqy0+qZn2E4FITrAOgr306D/7Ce1ZE+UZ2/i7hpkcdAD1PdY1c+Ffmps
|
gjaYZJCXCBhQcZFs+1IM7c6GmIGXYIAcFDWiVsENqqesQO5tCA1UTTGtIa9kMYD/
|
||||||
osZ/WVcvHUH65Fz1TR6YMz0poeBj27+CBziA6P1MKfBNpBx+UfHomK5O2356S90z
|
pwFK1ANVvrr2c6Qu/0UuBneawok76vDHTQCWmVcF0QIe5RaTj8YK9TaNAcQDPy9j
|
||||||
qd5z0W6t1rkgLSPcR592yszAM72h+KHUtGB/rs6OUum4yfw3EVA4R4plO1lU50sc
|
M0jWxJE1EBuRpDtIymQIcgMpXwguerh9NuXNoGEVPn4mvlVfy+1TVGzws8WsZwY/
|
||||||
UgwducOB7ihYSQPU87IPHcydWQ5NLobygxzqNYpIb0pPrLTBP1ZM9v6wY16xs6kC
|
LH07afdfIeDc1YwLadwq5S+wxuzwNuSCM9t2rIzfbRhorlg/lVDWqP8H6d9vF5MJ
|
||||||
knmr3e7aQckxq17MuNIkewsCAwEAAQ==
|
Y9kSiO3KgCSJLYfVl+Q+8asCAwEAAQ==
|
||||||
-----END rsa public key-----
|
-----END rsa public key-----
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ import (
|
|||||||
- [FlatMap](#FlatMap)
|
- [FlatMap](#FlatMap)
|
||||||
- [Merge](#Merge)
|
- [Merge](#Merge)
|
||||||
- [Reverse](#Reverse)
|
- [Reverse](#Reverse)
|
||||||
|
- [ReverseCopy](#ReverseCopy)
|
||||||
- [Reduce<sup>deprecated</sup>](#Reduce)
|
- [Reduce<sup>deprecated</sup>](#Reduce)
|
||||||
- [ReduceConcurrent](#ReduceConcurrent)
|
- [ReduceConcurrent](#ReduceConcurrent)
|
||||||
- [ReduceBy](#ReduceBy)
|
- [ReduceBy](#ReduceBy)
|
||||||
@@ -78,6 +79,7 @@ import (
|
|||||||
- [ReplaceAll](#ReplaceAll)
|
- [ReplaceAll](#ReplaceAll)
|
||||||
- [Repeat](#Repeat)
|
- [Repeat](#Repeat)
|
||||||
- [Shuffle](#Shuffle)
|
- [Shuffle](#Shuffle)
|
||||||
|
- [ShuffleCopy](#ShuffleCopy)
|
||||||
- [IsAscending](#IsAscending)
|
- [IsAscending](#IsAscending)
|
||||||
- [IsDescending](#IsDescending)
|
- [IsDescending](#IsDescending)
|
||||||
- [IsSorted](#IsSorted)
|
- [IsSorted](#IsSorted)
|
||||||
@@ -1760,6 +1762,38 @@ func main() {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### <span id="ReverseCopy">ReverseCopy</span>
|
||||||
|
|
||||||
|
<p>反转切片中的元素顺序, 不改变原slice。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ReverseCopy[T any](slice []T) []T
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>示例:<span style="float:right;display:inline-block;">[运行](todo)</span></b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/slice"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
strs := []string{"a", "b", "c", "d"}
|
||||||
|
|
||||||
|
reversedStrs := slice.ReverseCopy(strs)
|
||||||
|
|
||||||
|
fmt.Println(reversedStrs)
|
||||||
|
fmt.Println(strs)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// [d c b a]
|
||||||
|
// [a b c d]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### <span id="Reduce">Reduce</span>
|
### <span id="Reduce">Reduce</span>
|
||||||
|
|
||||||
<p>将切片中的元素依次运行iteratee函数,返回运行结果。</p>
|
<p>将切片中的元素依次运行iteratee函数,返回运行结果。</p>
|
||||||
@@ -1994,7 +2028,7 @@ func main() {
|
|||||||
|
|
||||||
### <span id="Shuffle">Shuffle</span>
|
### <span id="Shuffle">Shuffle</span>
|
||||||
|
|
||||||
<p>随机打乱切片中的元素顺序</p>
|
<p>随机打乱切片中的元素顺序。</p>
|
||||||
|
|
||||||
<b>函数签名:</b>
|
<b>函数签名:</b>
|
||||||
|
|
||||||
@@ -2021,6 +2055,37 @@ func main() {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### <span id="ShuffleCopy">ShuffleCopy</span>
|
||||||
|
|
||||||
|
<p>随机打乱切片中的元素顺序, 不改变原切片。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ShuffleCopy[T any](slice []T) []T
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>示例:<span style="float:right;display:inline-block;">[运行](todo)</span></b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/slice"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
nums := []int{1, 2, 3, 4, 5}
|
||||||
|
result := slice.ShuffleCopy(nums)
|
||||||
|
|
||||||
|
fmt.Println(result)
|
||||||
|
fmt.Println(nums)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// [3 1 5 4 2] (random order)
|
||||||
|
// [1 2 3 4 5]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### <span id="IsAscending">IsAscending</span>
|
### <span id="IsAscending">IsAscending</span>
|
||||||
|
|
||||||
<p>检查切片元素是否按升序排列。</p>
|
<p>检查切片元素是否按升序排列。</p>
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ import (
|
|||||||
- [FlatMap](#FlatMap)
|
- [FlatMap](#FlatMap)
|
||||||
- [Merge](#Merge)
|
- [Merge](#Merge)
|
||||||
- [Reverse](#Reverse)
|
- [Reverse](#Reverse)
|
||||||
|
- [ReverseCopy](#ReverseCopy)
|
||||||
- [Reduce<sup>deprecated</sup>](#Reduce)
|
- [Reduce<sup>deprecated</sup>](#Reduce)
|
||||||
- [ReduceConcurrent](#ReduceConcurrent)
|
- [ReduceConcurrent](#ReduceConcurrent)
|
||||||
- [ReduceBy](#ReduceBy)
|
- [ReduceBy](#ReduceBy)
|
||||||
@@ -78,6 +79,7 @@ import (
|
|||||||
- [ReplaceAll](#ReplaceAll)
|
- [ReplaceAll](#ReplaceAll)
|
||||||
- [Repeat](#Repeat)
|
- [Repeat](#Repeat)
|
||||||
- [Shuffle](#Shuffle)
|
- [Shuffle](#Shuffle)
|
||||||
|
- [ShuffleCopy](#ShuffleCopy)
|
||||||
- [IsAscending](#IsAscending)
|
- [IsAscending](#IsAscending)
|
||||||
- [IsDescending](#IsDescending)
|
- [IsDescending](#IsDescending)
|
||||||
- [IsSorted](#IsSorted)
|
- [IsSorted](#IsSorted)
|
||||||
@@ -1756,6 +1758,38 @@ func main() {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### <span id="ReverseCopy">ReverseCopy</span>
|
||||||
|
|
||||||
|
<p>Return a new slice of element order is reversed to the given slice.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ReverseCopy[T any](slice []T) []T
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:<span style="float:right;display:inline-block;">[Run](todo)</span></b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/slice"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
strs := []string{"a", "b", "c", "d"}
|
||||||
|
|
||||||
|
reversedStrs := slice.ReverseCopy(strs)
|
||||||
|
|
||||||
|
fmt.Println(reversedStrs)
|
||||||
|
fmt.Println(strs)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// [d c b a]
|
||||||
|
// [a b c d]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### <span id="Reduce">Reduce</span>
|
### <span id="Reduce">Reduce</span>
|
||||||
|
|
||||||
<p>Reduce slice.</p>
|
<p>Reduce slice.</p>
|
||||||
@@ -2018,6 +2052,37 @@ func main() {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### <span id="ShuffleCopy">ShuffleCopy</span>
|
||||||
|
|
||||||
|
<p>Return a new slice with elements shuffled.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func ShuffleCopy[T any](slice []T) []T
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:<span style="float:right;display:inline-block;">[Run](todo)</span></b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/slice"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
nums := []int{1, 2, 3, 4, 5}
|
||||||
|
result := slice.ShuffleCopy(nums)
|
||||||
|
|
||||||
|
fmt.Println(result)
|
||||||
|
fmt.Println(nums)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// [3 1 5 4 2] (random order)
|
||||||
|
// [1 2 3 4 5]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### <span id="IsAscending">IsAscending</span>
|
### <span id="IsAscending">IsAscending</span>
|
||||||
|
|
||||||
<p>Checks if a slice is ascending order.</p>
|
<p>Checks if a slice is ascending order.</p>
|
||||||
|
|||||||
+14
-6
@@ -145,10 +145,14 @@ func CeilToString[T constraints.Float | constraints.Integer](x T, n int) string
|
|||||||
|
|
||||||
// Max return max value of numbers.
|
// Max return max value of numbers.
|
||||||
// Play: https://go.dev/play/p/cN8DHI0rTkH
|
// Play: https://go.dev/play/p/cN8DHI0rTkH
|
||||||
func Max[T constraints.Integer | constraints.Float](numbers ...T) T {
|
func Max[T constraints.Ordered](items ...T) T {
|
||||||
max := numbers[0]
|
if len(items) < 1 {
|
||||||
|
panic("mathutil.Max: empty list")
|
||||||
|
}
|
||||||
|
|
||||||
for _, v := range numbers {
|
max := items[0]
|
||||||
|
|
||||||
|
for _, v := range items {
|
||||||
if max < v {
|
if max < v {
|
||||||
max = v
|
max = v
|
||||||
}
|
}
|
||||||
@@ -181,10 +185,14 @@ func MaxBy[T any](slice []T, comparator func(T, T) bool) T {
|
|||||||
|
|
||||||
// Min return min value of numbers.
|
// Min return min value of numbers.
|
||||||
// Play: https://go.dev/play/p/21BER_mlGUj
|
// Play: https://go.dev/play/p/21BER_mlGUj
|
||||||
func Min[T constraints.Integer | constraints.Float](numbers ...T) T {
|
func Min[T constraints.Ordered](items ...T) T {
|
||||||
min := numbers[0]
|
if len(items) < 1 {
|
||||||
|
panic("mathutil.min: empty list")
|
||||||
|
}
|
||||||
|
|
||||||
for _, v := range numbers {
|
min := items[0]
|
||||||
|
|
||||||
|
for _, v := range items {
|
||||||
if min > v {
|
if min > v {
|
||||||
min = v
|
min = v
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -178,6 +178,7 @@ func TestMax(t *testing.T) {
|
|||||||
assert.Equal(0, Max(0, 0))
|
assert.Equal(0, Max(0, 0))
|
||||||
assert.Equal(3, Max(1, 2, 3))
|
assert.Equal(3, Max(1, 2, 3))
|
||||||
assert.Equal(1.4, Max(1.2, 1.4, 1.1, 1.4))
|
assert.Equal(1.4, Max(1.2, 1.4, 1.1, 1.4))
|
||||||
|
assert.Equal("abc", Max("a", "ab", "abc"))
|
||||||
|
|
||||||
type Integer int
|
type Integer int
|
||||||
assert.Equal(Integer(1), Max(Integer(1), Integer(0)))
|
assert.Equal(Integer(1), Max(Integer(1), Integer(0)))
|
||||||
@@ -212,6 +213,8 @@ func TestMin(t *testing.T) {
|
|||||||
assert.Equal(0, Min(0, 0))
|
assert.Equal(0, Min(0, 0))
|
||||||
assert.Equal(1, Min(1, 2, 3))
|
assert.Equal(1, Min(1, 2, 3))
|
||||||
assert.Equal(1.1, Min(1.2, 1.4, 1.1, 1.4))
|
assert.Equal(1.1, Min(1.2, 1.4, 1.1, 1.4))
|
||||||
|
|
||||||
|
assert.Equal("a", Min("a", "ab", "abc"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMinBy(t *testing.T) {
|
func TestMinBy(t *testing.T) {
|
||||||
|
|||||||
+27
-1
@@ -1002,7 +1002,19 @@ func Reverse[T any](slice []T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shuffle the slice.
|
// ReverseCopy return a new slice of element order is reversed to the given slice.
|
||||||
|
// Play: todo
|
||||||
|
func ReverseCopy[T any](slice []T) []T {
|
||||||
|
result := make([]T, len(slice))
|
||||||
|
|
||||||
|
for i, j := 0, len(slice)-1; i < len(slice); i, j = i+1, j-1 {
|
||||||
|
result[i] = slice[j]
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shuffle return a new slice with elements shuffled.
|
||||||
// Play: https://go.dev/play/p/YHvhnWGU3Ge
|
// Play: https://go.dev/play/p/YHvhnWGU3Ge
|
||||||
func Shuffle[T any](slice []T) []T {
|
func Shuffle[T any](slice []T) []T {
|
||||||
rand.Seed(time.Now().UnixNano())
|
rand.Seed(time.Now().UnixNano())
|
||||||
@@ -1014,6 +1026,20 @@ func Shuffle[T any](slice []T) []T {
|
|||||||
return slice
|
return slice
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ShuffleCopy return a new slice with elements shuffled.
|
||||||
|
// Play: todo
|
||||||
|
func ShuffleCopy[T any](slice []T) []T {
|
||||||
|
result := make([]T, len(slice))
|
||||||
|
copy(result, slice)
|
||||||
|
|
||||||
|
rand.Seed(time.Now().UnixNano())
|
||||||
|
rand.Shuffle(len(result), func(i, j int) {
|
||||||
|
result[i], result[j] = result[j], result[i]
|
||||||
|
})
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
// IsAscending checks if a slice is ascending order.
|
// IsAscending checks if a slice is ascending order.
|
||||||
// Play: https://go.dev/play/p/9CtsFjet4SH
|
// Play: https://go.dev/play/p/9CtsFjet4SH
|
||||||
func IsAscending[T constraints.Ordered](slice []T) bool {
|
func IsAscending[T constraints.Ordered](slice []T) bool {
|
||||||
|
|||||||
@@ -937,6 +937,41 @@ func ExampleReverse() {
|
|||||||
// [d c b a]
|
// [d c b a]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ExampleReverseCopy() {
|
||||||
|
strs := []string{"a", "b", "c", "d"}
|
||||||
|
|
||||||
|
reversedStrs := ReverseCopy(strs)
|
||||||
|
|
||||||
|
fmt.Println(reversedStrs)
|
||||||
|
fmt.Println(strs)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// [d c b a]
|
||||||
|
// [a b c d]
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleShuffle() {
|
||||||
|
strs := []string{"a", "b", "c", "d"}
|
||||||
|
Shuffle(strs)
|
||||||
|
|
||||||
|
fmt.Println(len(strs))
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 4
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleShuffleCopy() {
|
||||||
|
strs := []string{"a", "b", "c", "d"}
|
||||||
|
shuffledStrs := ShuffleCopy(strs)
|
||||||
|
|
||||||
|
fmt.Println(len(shuffledStrs))
|
||||||
|
fmt.Println(strs)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 4
|
||||||
|
// [a b c d]
|
||||||
|
}
|
||||||
|
|
||||||
func ExampleIsAscending() {
|
func ExampleIsAscending() {
|
||||||
|
|
||||||
result1 := IsAscending([]int{1, 2, 3, 4, 5})
|
result1 := IsAscending([]int{1, 2, 3, 4, 5})
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
@@ -1114,6 +1115,17 @@ func TestReverse(t *testing.T) {
|
|||||||
assert.Equal([]string{"e", "d", "c", "b", "a"}, s2)
|
assert.Equal([]string{"e", "d", "c", "b", "a"}, s2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestReverseCopy(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
assert := internal.NewAssert(t, "TestReverseCopy")
|
||||||
|
|
||||||
|
numbers := []int{1, 2, 3, 4, 5}
|
||||||
|
reversedNumbers := ReverseCopy(numbers)
|
||||||
|
|
||||||
|
assert.Equal([]int{5, 4, 3, 2, 1}, reversedNumbers)
|
||||||
|
assert.Equal([]int{1, 2, 3, 4, 5}, numbers)
|
||||||
|
}
|
||||||
|
|
||||||
func TestDifference(t *testing.T) {
|
func TestDifference(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
@@ -1329,6 +1341,18 @@ func TestShuffle(t *testing.T) {
|
|||||||
assert.Equal(5, len(result))
|
assert.Equal(5, len(result))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestShuffleCopy(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
assert := internal.NewAssert(t, "TestShuffleCopy")
|
||||||
|
|
||||||
|
numbers := []int{1, 2, 3, 4, 5}
|
||||||
|
result := ShuffleCopy(numbers)
|
||||||
|
|
||||||
|
assert.Equal(5, len(result))
|
||||||
|
assert.Equal([]int{1, 2, 3, 4, 5}, numbers)
|
||||||
|
}
|
||||||
|
|
||||||
func TestIndexOf(t *testing.T) {
|
func TestIndexOf(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
@@ -1794,6 +1818,8 @@ func TestFilterConcurrent(t *testing.T) {
|
|||||||
nums := []int{1, 2, 3, 4, 5, 6}
|
nums := []int{1, 2, 3, 4, 5, 6}
|
||||||
expected := []int{4, 5, 6}
|
expected := []int{4, 5, 6}
|
||||||
actual := FilterConcurrent(nums, func(_, n int) bool { return n > 3 }, 4)
|
actual := FilterConcurrent(nums, func(_, n int) bool { return n > 3 }, 4)
|
||||||
|
sort.Ints(actual)
|
||||||
|
sort.Ints(expected)
|
||||||
assert.Equal(expected, actual)
|
assert.Equal(expected, actual)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user