blob: 9f6937ca07e4af6dab28a5262c1c2a5fbb869418 [file] [log] [blame]
// +build ignore,OMIT
package main
import (
"fmt"
)
func main() {
in, out := make(chan int), make(chan int)
go buffer(in, out)
for i := 0; i < 10; i++ {
in <- i
}
close(in)
for i := range out {
fmt.Println(i)
}
}
// buffer provides an unbounded buffer between in and out. buffer
// exits when in is closed and all items in the buffer have been sent
// to out, at which point it closes out.
func buffer(in <-chan int, out chan<- int) {
var buf []int
for in != nil || len(buf) > 0 {
var i int
var c chan<- int
if len(buf) > 0 {
i = buf[0]
c = out // enable send case
}
select {
case n, ok := <-in:
if ok {
buf = append(buf, n)
} else {
in = nil // disable receive case
}
case c <- i:
buf = buf[1:]
}
}
close(out)
}