Skip to content

Commit

Permalink
add fx.Split
Browse files Browse the repository at this point in the history
  • Loading branch information
kevwan committed Oct 17, 2020
1 parent 1d9c4a4 commit d2ed140
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 0 deletions.
27 changes: 27 additions & 0 deletions core/fx/fn.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ func Range(source <-chan interface{}) Stream {
}

// Buffer buffers the items into a queue with size n.
// It can balance the producer and the consumer if their processing throughput don't match.
func (p Stream) Buffer(n int) Stream {
if n < 0 {
n = 0
Expand Down Expand Up @@ -247,6 +248,32 @@ func (p Stream) Sort(less LessFunc) Stream {
return Just(items...)
}

// Split splits the elements into chunk with size up to n,
// might be less than n on tailing elements.
func (p Stream) Split(n int) Stream {
if n < 1 {
panic("n should be greater than 0")
}

source := make(chan interface{})
go func() {
var chunk []interface{}
for item := range p.source {
chunk = append(chunk, item)
if len(chunk) == n {
source <- chunk
chunk = nil
}
}
if chunk != nil {
source <- chunk
}
close(source)
}()

return Range(source)
}

func (p Stream) Tail(n int64) Stream {
if n < 1 {
panic("n should be greater than 0")
Expand Down
16 changes: 16 additions & 0 deletions core/fx/fn_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,22 @@ func TestSort(t *testing.T) {
})
}

func TestSplit(t *testing.T) {
assert.Panics(t, func() {
Just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).Split(0).Done()
})
var chunks [][]interface{}
Just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).Split(4).ForEach(func(item interface{}) {
chunk := item.([]interface{})
chunks = append(chunks, chunk)
})
assert.EqualValues(t, [][]interface{}{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10},
}, chunks)
}

func TestTail(t *testing.T) {
var result int
Just(1, 2, 3, 4).Tail(2).Reduce(func(pipe <-chan interface{}) (interface{}, error) {
Expand Down
8 changes: 8 additions & 0 deletions example/fx/fx_test.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
package main

import (
"fmt"
"testing"

"github.com/tal-tech/go-zero/core/fx"
)

func TestFxSplit(t *testing.T) {
fx.Just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).Split(4).ForEach(func(item interface{}) {
vals := item.([]interface{})
fmt.Println(len(vals))
})
}

func BenchmarkFx(b *testing.B) {
type Mixed struct {
Name string
Expand Down

0 comments on commit d2ed140

Please sign in to comment.