package main

import "fmt"

// makeCounter mengembalikan closure yang menaikkan hitungannya sendiri.
func makeCounter() func() int {
	hitungan := 0
	return func() int {
		hitungan++
		return hitungan
	}
}

func main() {
	next := makeCounter()
	fmt.Println(next())
	fmt.Println(next())
	fmt.Println(next())

	pemanggilLain := makeCounter()
	fmt.Println(pemanggilLain())

	// Dua closure membagi satu variabel yang sama.
	skor := 0
	naik := func() {
		skor += 10
	}
	turun := func() {
		skor -= 5
	}
	naik()
	naik()
	turun()
	fmt.Println("skor =", skor)

	// Setiap iterasi loop mendapat variabel i sendiri (Go 1.22+).
	fungsi := make([]func() int, 0, 3)
	for i := 1; i <= 3; i++ {
		fungsi = append(fungsi, func() int { return i * 10 })
	}
	for _, f := range fungsi {
		fmt.Println(f())
	}
}
