package main
import "fmt"
import "time"
func background_merger(f func(int) int, in1 <-chan int, in2 <-chan int, out chan<- int, n int) {
for i:=0; i<n; i++ {
num1 := <-in1
num2 := <-in2
out<- (f(num1) + f(num2))
}
}
func Merge2Channels(f func(int) int, in1 <-chan int, in2 <-chan int, out chan<- int, n int) {
go background_merger(f, in1, in2, out, n)
}
func foo(num int) int {
return num;
}
func feed_channels(in1 chan<- int, in2 chan<- int, n int) {
for i:=0; i<n; i++ {
in1 <- i*1000
in2 <- i*20
}
}
func main() {
ch1 := make(chan int)
ch2 := make(chan int)
out := make(chan int)
fmt.Println("start")
Merge2Channels(foo, ch1, ch2, out, 10)
go feed_channels(ch1, ch2, 10)
fmt.Println("end")
for i:=0; i<10; i++ {
res := <-out
fmt.Println(res)
}
}
cGFja2FnZSBtYWluCgppbXBvcnQgImZtdCIKaW1wb3J0ICJ0aW1lIgoKZnVuYyBiYWNrZ3JvdW5kX21lcmdlcihmIGZ1bmMoaW50KSBpbnQsIGluMSA8LWNoYW4gaW50LCBpbjIgPC1jaGFuIGludCwgb3V0IGNoYW48LSBpbnQsIG4gaW50KSB7CiAgICBmb3IgaTo9MDsgaTxuOyBpKysgewogICAgICAgIG51bTEgOj0gPC1pbjEKICAgICAgICBudW0yIDo9IDwtaW4yCiAgICAgICAgb3V0PC0gKGYobnVtMSkgKyBmKG51bTIpKQogICAgfQp9CgpmdW5jIE1lcmdlMkNoYW5uZWxzKGYgZnVuYyhpbnQpIGludCwgaW4xIDwtY2hhbiBpbnQsIGluMiA8LWNoYW4gaW50LCBvdXQgY2hhbjwtIGludCwgbiBpbnQpIHsKICAgIGdvIGJhY2tncm91bmRfbWVyZ2VyKGYsIGluMSwgaW4yLCBvdXQsIG4pCn0KCmZ1bmMgZm9vKG51bSBpbnQpIGludCB7CiAgICB0aW1lLlNsZWVwKHRpbWUuTWlsbGlzZWNvbmQgKiAyMDApCiAgICByZXR1cm4gbnVtOwp9CgpmdW5jIGZlZWRfY2hhbm5lbHMoaW4xIGNoYW48LSBpbnQsIGluMiBjaGFuPC0gaW50LCBuIGludCkgewogICAgZm9yIGk6PTA7IGk8bjsgaSsrIHsKICAgICAgICBpbjEgPC0gaSoxMDAwCiAgICAgICAgaW4yIDwtIGkqMjAKICAgIH0KfQoKZnVuYyBtYWluKCkgewogICAgY2gxIDo9IG1ha2UoY2hhbiBpbnQpCiAgICBjaDIgOj0gbWFrZShjaGFuIGludCkKICAgIG91dCA6PSBtYWtlKGNoYW4gaW50KQoKICAgIGZtdC5QcmludGxuKCJzdGFydCIpCiAgICBNZXJnZTJDaGFubmVscyhmb28sIGNoMSwgY2gyLCBvdXQsIDEwKQogICAgZ28gZmVlZF9jaGFubmVscyhjaDEsIGNoMiwgMTApCiAgICBmbXQuUHJpbnRsbigiZW5kIikKCiAgICBmb3IgaTo9MDsgaTwxMDsgaSsrIHsKICAgICAgICByZXMgOj0gPC1vdXQKICAgICAgICBmbXQuUHJpbnRsbihyZXMpCiAgICB9Cn0K