github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/18channeluse/stream/main.go (about)

     1  package main
     2  
     3  func asStream(done <-chan struct{}, values ...interface{}) <-chan interface{} {
     4  	s := make(chan interface{})
     5  	go func() {
     6  		defer close(s)
     7  
     8  		for _, v := range values {
     9  			select {
    10  			case <-done:
    11  				return
    12  			case s <- v:
    13  			}
    14  		}
    15  
    16  	}()
    17  	return s
    18  }
    19  
    20  func skipN(done <-chan struct{}, valueStream <-chan interface{}, num int) <-chan interface{} {
    21  	takeStream := make(chan interface{})
    22  	go func() {
    23  		defer close(takeStream)
    24  		for i := 0; i < num; i++ {
    25  			select {
    26  			case <-done:
    27  				return
    28  			case <-valueStream:
    29  			}
    30  		}
    31  		for {
    32  			select {
    33  			case <-done:
    34  				return
    35  			case takeStream <- <-valueStream:
    36  			}
    37  		}
    38  	}()
    39  	return takeStream
    40  }
    41  
    42  func skipFn(done <-chan struct{}, valueStream <-chan interface{}, fn func(interface{}) bool) <-chan interface{} {
    43  	takeStream := make(chan interface{})
    44  	go func() {
    45  		defer close(takeStream)
    46  		for {
    47  			select {
    48  			case <-done:
    49  				return
    50  			case v := <-valueStream:
    51  				if !fn(v) {
    52  					takeStream <- v
    53  				}
    54  			}
    55  		}
    56  	}()
    57  
    58  	return takeStream
    59  }