# some variants of this:
# "quad" probing: use an exponential instead of just adding

class Dictionary:
    backing: "list" = [None] * 100

    def hash(self, key: str):
        ord_total = 0;
        for letter in key:
            ord_total += ord(letter)
        return ord_total % len(self.backing)

    def get_actual_index_recursion(self, key: str, num_attempts = 0):
        index = self.hash(key) + num_attempts

        if self.backing[index] is not None and self.backing[index][0] != key:
            return self.get_actual_index_recursion(key, num_attempts + 1)

        return index
    
    def get_actual_index_loop(self, key: str):
        # the loop version; works pretty much the same
        index = self.hash(key)
        while self.backing[index] is not None and self.backing[index][0] != key:
            index += 1
        
        return index

    def get(self, key: str):
        index = self.get_actual_index_recursion(key)
        return self.backing[index][1]

    def set(self, key: str, value):
        index = self.get_actual_index_recursion(key)
        # instead of storing just values, store tuples (key-value pairs)
        self.backing[index] = (key, value)

sample_dict = Dictionary()
sample_dict.set("test string", "test value")
sample_dict.set("tets string", "this value will *not* overwrite the other one")
print(sample_dict.get("test string"))
print(sample_dict.get("tets string"))

print(sample_dict.backing)
