package ds type ArrayList[T any] struct { values []T } var _ List[int] = &ArrayList[int]{} func NewArrayList[T any](initCap int) *ArrayList[T] { return &ArrayList[T]{make([]T, 0, initCap)} } func (s *ArrayList[T]) init() { if s.values == nil { s.values = make([]T, 0) } } func (s *ArrayList[T]) Add(value T) { s.init() s.values = append(s.values, value) } func (s *ArrayList[T]) AddAll(values Iterable[T]) { values.Each(s.Add) } func (s *ArrayList[T]) Get(index int) T { s.init() return s.values[index] } func (s *ArrayList[T]) Set(index int, value T) { s.init() s.values[index] = value } func (s *ArrayList[T]) RemoveAt(index int) T { s.init() ret := s.values[index] s.values = append(s.values[:index], s.values[index+1:]...) return ret } func (s *ArrayList[T]) Clear() { s.values = make([]T, 0) } func (s *ArrayList[T]) Size() int { s.init() return len(s.values) } func (s *ArrayList[T]) Empty() bool { return s.Size() == 0 } func (s *ArrayList[T]) Each(f func(value T)) { s.init() for _, value := range s.values { f(value) } }