package main

import (
	"fmt"
)

type Callback func() int
type Wrapper 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(wrappers []Wrapper) int {
	sum := 0
	for _, wrapper := range wrappers {
		result := wrapper()
		sum += result
		if result == 2 {
			break
		}
	}
	return sum
}

func wrapperFactory(callback Callback) Wrapper {
	return func() int {
		doSomething()
		return callback()
	}
}

func main() {
	wrappers := make([]Wrapper, len(callbacks))
	for idx, callback := range callbacks {
		wrappers[idx] = wrapperFactory(callback)
	}

	fmt.Println("sum", combiner(wrappers))
}
