package main

const ArraySize = 7

// HashTable structure
type HashTable struct {
	array [ArraySize]*bucket
}

// bucket structure
type bucket struct {
	key   string
	value int
	next  *bucket
}

// Insert will take in a key and will add the item to the hash table array.
func (h *HashTable) Insert(key string, value int) {
	index := hash(key)
	h.array[index] = &bucket{key, value, h.array[index]}
}

// Search will take in a key and RETURN true if that key is stored in the hash table.
func (h *HashTable) Search(key string) bool {
	index := hash(key)
	b := h.array[index]
	for b != nil {
		if b.key == key {
			return true
		}
		b = b.next
	}
	return false
}

// Delete will take in a key and DELETE it from the hash table.
func (h *HashTable) Delete(key string) {
	index := hash(key)
	b := h.array[index]
	if b.key == key {
		h.array[index] = b.next
		return
	}
	for b.next != nil {
		if b.next.key == key {
			b.next = b.next.next
			return
		}
		b = b.next
	}
}

// hash is the basic hashing function.
func hash(key string) int {
	sum := 0
	for _, v := range key {
		sum += int(v)
	}
	return sum % ArraySize
}