package main

import "fmt"

// Operation mendefinisikan tipe fungsi yang menerima dan mengembalikan int.
type Operation func(int) int

// double menggandakan nilai masukan.
func double(x int) int {
	return x * 2
}

// addOne menambah satu pada nilai masukan.
func addOne(x int) int {
	return x + 1
}

// apply menjalankan fungsi f terhadap nilai v.
func apply(f Operation, v int) int {
	return f(v)
}

// makeMultiplier mengembalikan fungsi pengali dengan faktor tertentu.
func makeMultiplier(factor int) Operation {
	return func(x int) int {
		return x * factor
	}
}

func main() {
	f := double
	fmt.Println("f(8) =", f(8))

	fmt.Println("apply(double, 5) =", apply(double, 5))
	fmt.Println("apply(addOne, 5) =", apply(addOne, 5))

	kaliTiga := makeMultiplier(3)
	fmt.Println("kaliTiga(7) =", kaliTiga(7))
}
