github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/talks/2013/advconc/buffer/buffer.go (about)

     1  // +build OMIT
     2  
     3  package main
     4  
     5  import (
     6  	"fmt"
     7  )
     8  
     9  func main() {
    10  	in, out := make(chan int), make(chan int)
    11  	go buffer(in, out)
    12  	for i := 0; i < 10; i++ {
    13  		in <- i
    14  	}
    15  	close(in)
    16  	for i := range out {
    17  		fmt.Println(i)
    18  	}
    19  }
    20  
    21  // buffer provides an unbounded buffer between in and out.  buffer
    22  // exits when in is closed and all items in the buffer have been sent
    23  // to out, at which point it closes out.
    24  func buffer(in <-chan int, out chan<- int) {
    25  	var buf []int
    26  	for in != nil || len(buf) > 0 {
    27  		var i int
    28  		var c chan<- int
    29  		if len(buf) > 0 {
    30  			i = buf[0]
    31  			c = out // enable send case
    32  		}
    33  		select {
    34  		case n, ok := <-in:
    35  			if ok {
    36  				buf = append(buf, n)
    37  			} else {
    38  				in = nil // disable receive case
    39  			}
    40  		case c <- i:
    41  			buf = buf[1:]
    42  		}
    43  	}
    44  	close(out)
    45  }