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 {
    time.Sleep(time.Millisecond * 200)
    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)
    }
}
