49 lines
986 B
Go
49 lines
986 B
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
)
|
|
|
|
func newPowGen(e float64) chan float64 {
|
|
ch := make(chan float64)
|
|
go func() {
|
|
for i := 0.; ; i++ {
|
|
ch <- math.Pow(i, e)
|
|
}
|
|
}()
|
|
return ch
|
|
}
|
|
|
|
// given two input channels, a and b, both known to return monotonically
|
|
// increasing values, supply on channel c values of a not returned by b.
|
|
func newMonoIncA_NotMonoIncB_Gen(a, b chan float64) chan float64 {
|
|
ch := make(chan float64)
|
|
go func() {
|
|
for va, vb := <-a, <-b; ; {
|
|
switch {
|
|
case va < vb:
|
|
ch <- va
|
|
fallthrough
|
|
case va == vb:
|
|
va = <-a
|
|
default:
|
|
vb = <-b
|
|
|
|
}
|
|
}
|
|
}()
|
|
return ch
|
|
}
|
|
|
|
func main() {
|
|
ch := newMonoIncA_NotMonoIncB_Gen(newPowGen(2), newPowGen(3))
|
|
for i := 0; i < 20; i++ {
|
|
<-ch
|
|
}
|
|
for i := 0; i < 10; i++ {
|
|
fmt.Print(<-ch, " ")
|
|
}
|
|
fmt.Println()
|
|
}
|