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