35 lines
584 B
Go
35 lines
584 B
Go
package prism
|
|
|
|
func bufferedPipe[T any](input <-chan T, output chan<- T) {
|
|
var buffer []T
|
|
|
|
for {
|
|
var outOrNil chan<- T
|
|
var next T
|
|
|
|
// toggle send channel
|
|
if len(buffer) > 0 {
|
|
outOrNil = output
|
|
next = buffer[0]
|
|
} else if input == nil {
|
|
// input closed
|
|
return
|
|
}
|
|
|
|
select {
|
|
case item, ok := <-input:
|
|
if !ok {
|
|
// input is closed, set input nil
|
|
input = nil
|
|
continue
|
|
}
|
|
buffer = append(buffer, item)
|
|
case outOrNil <- next:
|
|
// discard element, set to zero to free memory
|
|
var zero T
|
|
buffer[0] = zero
|
|
buffer = buffer[1:]
|
|
}
|
|
}
|
|
}
|