-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patharray.go
74 lines (60 loc) · 1.23 KB
/
array.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package array2d
// Array is a generic 2D array.
type Array[T any] struct {
v []T
w, h int
}
// New creates empty array with given dimensions.
func New[T any](w, h int) (a Array[T]) {
return Array[T]{
w: w,
h: h,
v: make([]T, w*h),
}
}
// Bounds returns width and height of array.
func (a Array[T]) Bounds() (w, h int) {
return a.w, a.h
}
// Len returns length of array.
func (a Array[T]) Len() (rv int) {
return len(a.v)
}
// Get returns value at given coords, if any.
func (a Array[T]) Get(x, y int) (rv T, ok bool) {
if !a.valid(x, y) {
return
}
return a.v[a.index(x, y)], true
}
// Set sets value at given coords.
func (a *Array[T]) Set(x, y int, v T) (ok bool) {
if !a.valid(x, y) {
return
}
a.v[a.index(x, y)] = v
return true
}
// Iter iterates over array items.
func (a *Array[T]) Iter(it func(x, y int, v T) bool) {
for i, v := range a.v {
if !it(i%a.w, i/a.w, v) {
return
}
}
}
// Fill fills array with given function.
func (a *Array[T]) Fill(fn func() T) {
for i := 0; i < len(a.v); i++ {
a.v[i] = fn()
}
}
func (a *Array[T]) valid(x, y int) (ok bool) {
if (0 > x || x >= a.w) || (0 > y || y >= a.h) {
return
}
return true
}
func (a *Array[T]) index(x, y int) (rv int) {
return x + y*a.w
}