-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patharray.go
More file actions
136 lines (124 loc) · 2.91 KB
/
array.go
File metadata and controls
136 lines (124 loc) · 2.91 KB
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
125
126
127
128
129
130
131
132
133
134
135
136
package array
import (
"cmp"
"errors"
"github.com/Eclalang/Ecla/interpreter/eclaType"
"reflect"
"sort"
)
var Variables = map[string]eclaType.Type{
"ASC": eclaType.Int(0),
"DESC": eclaType.Int(1),
}
// Contains test if the value is in the array return True if inside and False if not inside
func Contains[T comparable](array []T, value T) bool {
size := len(array)
for i := 0; i < size; i++ {
if reflect.DeepEqual(array[i], value) {
return true
}
}
return false
}
// Find returns the index of the value in the array
func Find[T comparable](array []T, value T) int {
size := len(array)
for i := 0; i < size; i++ {
if reflect.DeepEqual(array[i], value) {
return i
}
}
return -1
}
// IsEqual test two array and return true if same or false if different
func IsEqual[T comparable](FirstArray, SecondArray []T) bool {
size := len(FirstArray)
if size != len(SecondArray) {
return false
} else {
if reflect.DeepEqual(FirstArray, SecondArray) {
return true
}
return false
}
}
// Max returns the maximum value in the array
func Max[T cmp.Ordered](array []T) (any, error) {
size := len(array)
if size == 0 {
return nil, errors.New("empty array")
}
m := array[0]
if reflect.TypeOf(m).Kind() == reflect.String {
for i := 1; i < size; i++ {
if len(any(m).(string)) < len(any(array[i]).(string)) {
m = array[i]
} else if len(any(m).(string)) == len(any(array[i]).(string)) {
m = max(m, array[i])
}
}
return m, nil
}
for i := 1; i < size; i++ {
m = max(m, array[i])
}
return m, nil
}
// Min returns the minimum value in the array
func Min[T cmp.Ordered](array []T) (any, error) {
size := len(array)
if size == 0 {
return nil, errors.New("empty array")
}
m := array[0]
if reflect.TypeOf(m).Kind() == reflect.String {
for i := 1; i < size; i++ {
if len(any(m).(string)) > len(any(array[i]).(string)) {
m = array[i]
} else if len(any(m).(string)) == len(any(array[i]).(string)) {
m = min(m, array[i])
}
}
return m, nil
}
for i := 1; i < size; i++ {
m = min(m, array[i])
}
return m, nil
}
// Remove the value at the index
func Remove[T comparable](array []T, index int) []T {
if len(array) <= index || index < 0 {
return array
}
return append(array[:index], array[index+1:]...)
}
// Slice the array from start to end included
func Slice[T comparable](array []T, start, end int) ([]T, error) {
var arrRet []T
if start < 0 {
start = 0
}
if end > len(array)-1 {
end = len(array) - 1
}
if start >= end {
return array, errors.New("start superior or equal to the end")
}
for i := start; i <= end; i++ {
arrRet = append(arrRet, array[i])
}
return arrRet, nil
}
// Sort sorts the array in ascending or descending order
func Sort[T cmp.Ordered](array []T, order int) {
if order == 0 {
sort.Slice(array, func(i, j int) bool {
return array[i] < array[j]
})
} else {
sort.Slice(array, func(i, j int) bool {
return array[i] > array[j]
})
}
}