Skip to content

Instantly share code, notes, and snippets.

@heyimalex
Created September 21, 2018 20:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save heyimalex/cb1b8fd2feac76f4fedc0e2d80c9a614 to your computer and use it in GitHub Desktop.
Save heyimalex/cb1b8fd2feac76f4fedc0e2d80c9a614 to your computer and use it in GitHub Desktop.
batching channel implementation
package batchchan
import "github.com/cheekybits/genny/generic"
import (
"fmt"
)
type T generic.Type
func batchTChan(
inputc <-chan T,
outputc chan []T,
batchsize int,
) {
if batchsize <= 1 {
panic(fmt.Sprintf("invalid batch size: %d", batchsize))
}
var values []T
Main:
for {
v, ok := <-inputc
if !ok {
return
}
values = append(values, v)
Consume:
for len(values) < batchsize {
select {
case v, ok := <-inputc:
if !ok {
break Main
}
values = append(values, v)
continue Consume
default:
}
select {
case v, ok := <-inputc:
if !ok {
break Main
}
values = append(values, v)
continue Consume
case outputc <- values:
values = nil
continue Main
}
}
outputc <- values
values = nil
}
outputc <- values
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment