package main

import "fmt"

type Peserta struct {
	Nama string
	Skor int
}

// Index mengembalikan posisi pertama nilai yang sama, atau -1.
func Index[T comparable](data []T, dicari T) int {
	for i, v := range data {
		if v == dicari {
			return i
		}
	}
	return -1
}

// Frekuensi menghitung kemunculan tiap nilai; T dipakai sebagai kunci map.
func Frekuensi[T comparable](data []T) map[T]int {
	hasil := make(map[T]int)
	for _, v := range data {
		hasil[v]++
	}
	return hasil
}

func main() {
	angka := []int{10, 20, 30, 40}
	fmt.Println("Index angka 30  :", Index(angka, 30))
	fmt.Println("Index angka 99  :", Index(angka, 99))

	buah := []string{"apel", "jeruk", "mangga"}
	fmt.Println("Index pisang    :", Index(buah, "pisang"))

	// Struct comparable karena seluruh fieldnya comparable.
	daftar := []Peserta{
		{Nama: "Budi", Skor: 88},
		{Nama: "Siti", Skor: 92},
	}
	fmt.Println("Index Siti      :", Index(daftar, Peserta{Nama: "Siti", Skor: 92}))

	// T yang comparable sah dipakai sebagai kunci map.
	suara := Frekuensi([]string{"ya", "tidak", "ya", "ya", "tidak"})
	fmt.Println("Frekuensi suara:", suara)
}
