-
Notifications
You must be signed in to change notification settings - Fork 0
/
iteration.go
124 lines (109 loc) · 2.5 KB
/
iteration.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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package tiiio
type Array []any
func (arr *Array) Reduce(reducer func(any, any) any, initial any) any {
acc := initial
for _, item := range *arr {
acc = reducer(acc, item)
}
return acc
}
func (arr *Array) Map(iterator func(any) any) *Array {
result := Array{}
for _, item := range *arr {
result = append(result, iterator(item))
}
return &result
}
func (arr *Array) Filter(iterator func(any) bool) *Array {
result := Array{}
for _, item := range *arr {
if iterator(item) {
result = append(result, item)
}
}
return &result
}
func (arr *Array) ForEach(iterator func(any)) {
for _, item := range *arr {
iterator(item)
}
}
func (arr *Array) Find(iterator func(any) bool) any {
for _, item := range *arr {
if iterator(item) {
return item
}
}
return nil
}
func (arr *Array) FindIndex(iterator func(any) bool) int {
for i, item := range *arr {
if iterator(item) {
return i
}
}
return -1
}
func (arr *Array) Some(iterator func(any) bool) bool {
for _, item := range *arr {
if iterator(item) {
return true
}
}
return false
}
func (arr *Array) Every(iterator func(any) bool) bool {
for _, item := range *arr {
if !iterator(item) {
return false
}
}
return true
}
func (arr *Array) IndexOf(element any, fromIndex int) int {
for i := fromIndex; i < len(*arr); i++ {
if (*arr)[i] == element {
return i
}
}
return -1
}
func (arr *Array) LastIndexOf(element any, fromIndex int) int {
for i := fromIndex; i >= 0; i-- {
if (*arr)[i] == element {
return i
}
}
return -1
}
func (arr *Array) Includes(element any, fromIndex int) bool {
return arr.IndexOf(element, fromIndex) != -1
}
func (arr *Array) FlatMap(iterator func(any) *Array) *Array {
result := Array{}
for _, item := range *arr {
flattened := iterator(item)
result = append(result, (*flattened)...)
}
return &result
}
func (arr *Array) Flat(depth int) *Array {
result := Array{}
for _, item := range *arr {
if nestedArr, ok := item.(*Array); ok && depth > 0 {
flattened := nestedArr.Flat(depth - 1)
result = append(result, (*flattened)...)
} else {
result = append(result, item)
}
}
return &result
}
// Note: For ReduceRight, you may want to reverse the array first or iterate backwards.
func (arr *Array) ReduceRight(reducer func(any, any) any, initial any) any {
acc := initial
for i := len(*arr) - 1; i >= 0; i-- {
acc = reducer(acc, (*arr)[i])
}
return acc
}