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))
}
cGFja2FnZSBtYWluCgppbXBvcnQgKAoJImZtdCIKKQoKdHlwZSBDYWxsYmFjayBmdW5jKCkgaW50CnR5cGUgV3JhcHBlciBmdW5jKCkgaW50CgpmdW5jIGRvU29tZXRoaW5nKCkge30KZnVuYyBjYWxsYmFja0ZhY3RvcnkoaSBpbnQpIENhbGxiYWNrIHsKCXJldHVybiBmdW5jKCkgaW50IHsKCQlmbXQuUHJpbnRsbigiY2FsbGJhY2siLCBpKQoJCXJldHVybiBpCgl9Cn0KCnZhciBjYWxsYmFja3MgW11DYWxsYmFjayA9IFtdQ2FsbGJhY2t7CgljYWxsYmFja0ZhY3RvcnkoMSksCgljYWxsYmFja0ZhY3RvcnkoMiksCgljYWxsYmFja0ZhY3RvcnkoMyksCgljYWxsYmFja0ZhY3RvcnkoNCl9CgpmdW5jIGNvbWJpbmVyKHdyYXBwZXJzIFtdV3JhcHBlcikgaW50IHsKCXN1bSA6PSAwCglmb3IgXywgd3JhcHBlciA6PSByYW5nZSB3cmFwcGVycyB7CgkJcmVzdWx0IDo9IHdyYXBwZXIoKQoJCXN1bSArPSByZXN1bHQKCQlpZiByZXN1bHQgPT0gMiB7CgkJCWJyZWFrCgkJfQoJfQoJcmV0dXJuIHN1bQp9CgpmdW5jIHdyYXBwZXJGYWN0b3J5KGNhbGxiYWNrIENhbGxiYWNrKSBXcmFwcGVyIHsKCXJldHVybiBmdW5jKCkgaW50IHsKCQlkb1NvbWV0aGluZygpCgkJcmV0dXJuIGNhbGxiYWNrKCkKCX0KfQoKZnVuYyBtYWluKCkgewoJd3JhcHBlcnMgOj0gbWFrZShbXVdyYXBwZXIsIGxlbihjYWxsYmFja3MpKQoJZm9yIGlkeCwgY2FsbGJhY2sgOj0gcmFuZ2UgY2FsbGJhY2tzIHsKCQl3cmFwcGVyc1tpZHhdID0gd3JhcHBlckZhY3RvcnkoY2FsbGJhY2spCgl9CgoJZm10LlByaW50bG4oInN1bSIsIGNvbWJpbmVyKHdyYXBwZXJzKSkKfQo=