package main
import (
"fmt"
"errors"
)
type Array[T any] struct {
length int
data map[int]T
}
func (a Array[T]) Get(index int) (T, error) {
val, exists := a.data[index]
if (exists) {
return val, nil
}
return val, errors.New("No value exists in the index position")
}
func (a *Array[T]) Push(val T) {
(*a).data[(*a).length] = val
(*a).length++
}
func (a *Array[T]) Pop() T {
poppedIndex := a.length - 1
poppedValue := a.data[poppedIndex]
delete(a.data, poppedIndex)
a.length--
return poppedValue
}
func (a *Array[T]) Shift(index int) {
for i := index; i < a.length; i++ {
a.data[i] = a.data[i+1]
}
delete(a.data, a.length)
}
func (a *Array[T]) Delete(index int) error {
if (index >= a.length) {
return errors.New("No item in the index!")
}
delete(a.data, index)
a.length--
a.Shift(index)
return nil
}
func NewArray[T any]() Array[T] {
return Array[T]{length: 0, data: make(map[int]T)}
}
func main() {
newArray := NewArray[int]()
fmt.Println(newArray.Get(0))
newArray.Push(1)
newArray.Push(2)
// fmt.Println(newArray.Pop())
// fmt.Println(newArray.data)
// fmt.Println("Length: ", newArray.length)
// newArray.Push(2)
fmt.Println(newArray.data)
fmt.Println(newArray.Delete(2))
fmt.Println(newArray.Delete(0))
fmt.Println(newArray.data)
fmt.Println(newArray.Delete(0))
fmt.Println(newArray.data)
}