package main

import (
	"fmt"
	"maps"
	"slices"
)

func main() {
	stok := map[string]int{
		"pensil":    24,
		"buku":      12,
		"penghapus": 7,
	}

	// Urutan iterasi map diacak Go; urutkan kuncinya agar output selalu sama.
	for _, nama := range slices.Sorted(maps.Keys(stok)) {
		fmt.Printf("%-9s : %d\n", nama, stok[nama])
	}

	// Clone menyalin seluruh map menjadi map baru yang mandiri.
	salinan := maps.Clone(stok)
	salinan["spidol"] = 3
	fmt.Println("kunci    :", len(salinan), "disalin,", len(stok), "asli")

	// Copy memindahkan pasangan kunci-nilai dari sumber ke target.
	target := map[string]int{"buku": 99}
	maps.Copy(target, stok)
	fmt.Println("copy     :", target)

	// DeleteFunc menghapus pasangan yang memenuhi predikat.
	sisa := maps.Clone(stok)
	maps.DeleteFunc(sisa, func(k string, v int) bool {
		return v < 10
	})
	fmt.Println("sisa     :", sisa)

	// Equal membandingkan isi dua map pasangan demi pasangan.
	fmt.Println("equal    :", maps.Equal(stok, maps.Clone(stok)), maps.Equal(stok, sisa))

	// Values mengembalikan iterator nilai (satu variabel loop) untuk dijumlahkan.
	total := 0
	for v := range maps.Values(stok) {
		total += v
	}
	fmt.Println("total    :", total)
}
