package main

import "fmt"

type Kamus struct {
	sinonim map[string][]string
}

func NewKamus() *Kamus {
	return &Kamus{sinonim: make(map[string][]string)}
}

func contains(daftar []string, kata string) bool {
	for _, s := range daftar {
		if s == kata {
			return true
		}
	}
	return false
}

func (k *Kamus) pastikanAda(kata string) {
	if _, ok := k.sinonim[kata]; !ok {
		k.sinonim[kata] = []string{}
	}
}

func (k *Kamus) hubungkan(a, b string) {
	if a == b {
		return
	}
	k.pastikanAda(a)
	k.pastikanAda(b)
	if !contains(k.sinonim[a], b) {
		k.sinonim[a] = append(k.sinonim[a], b)
	}
	if !contains(k.sinonim[b], a) {
		k.sinonim[b] = append(k.sinonim[b], a)
	}
}

func (k *Kamus) tambah(kata string, sinonim []string) {
	k.pastikanAda(kata)
	for _, s := range sinonim {
		k.hubungkan(kata, s)
	}
}

func (k *Kamus) ambilSinonim(kata string) []string {
	daftar, ok := k.sinonim[kata]
	if !ok {
		return nil
	}
	hasil := make([]string, len(daftar))
	copy(hasil, daftar)
	return hasil
}

func tampil(hasil []string) {
	if hasil == nil {
		fmt.Println("null")
		return
	}
	fmt.Println(hasil)
}

func main() {
	kamus := NewKamus()
	kamus.tambah("big", []string{"large", "great"})
	kamus.tambah("big", []string{"huge", "fat"})
	kamus.tambah("huge", []string{"enormous", "gigantic"})

	tampil(kamus.ambilSinonim("big"))
	tampil(kamus.ambilSinonim("huge"))
	tampil(kamus.ambilSinonim("gigantic"))
	tampil(kamus.ambilSinonim("colossal"))
}