package main

import (
	"fmt"
	"time"
)

type Callback func() int

func doSomething() {}

func callbackFactory(i int) Callback {
	return func() int {
		fmt.Println("callback", i)
		return i
	}
}

var callbacks []Callback = []Callback{
	callbackFactory(1),
	callbackFactory(2),
	callbackFactory(3),
	callbackFactory(4)}

func combiner(iterator chan int) int {
	sum := 0
	for result := range iterator {
		sum += result
		if result == 2 {
			break
		}
	}
	return sum
}

func main() {
	iterator := make(chan int)
	go func() {
		for _, callback := range callbacks {
			doSomething()
			iterator <- callback()
		}
		close(iterator)
		fmt.Println("terminate goroutine")
	}()
	fmt.Println("sum", combiner(iterator))
	time.Sleep(time.Second)
}
