1package funk
2
3import "strings"
4
5// MinInt validates the input, compares the elements and returns the minimum element in an array/slice.
6// It accepts []int
7// It returns int
8func MinInt(i []int) int {
9	if len(i) == 0 {
10		panic("arg is an empty array/slice")
11	}
12	var min int
13	for idx := 0; idx < len(i); idx++ {
14		item := i[idx]
15		if idx == 0 {
16			min = item
17			continue
18		}
19		if item < min {
20			min = item
21		}
22	}
23	return min
24}
25
26// MinInt8 validates the input, compares the elements and returns the minimum element in an array/slice.
27// It accepts []int8
28// It returns int8
29func MinInt8(i []int8) int8 {
30	if len(i) == 0 {
31		panic("arg is an empty array/slice")
32	}
33	var min int8
34	for idx := 0; idx < len(i); idx++ {
35		item := i[idx]
36		if idx == 0 {
37			min = item
38			continue
39		}
40		if item < min {
41			min = item
42		}
43	}
44	return min
45}
46
47// MinInt16 validates the input, compares the elements and returns the minimum element in an array/slice.
48// It accepts []int16
49// It returns int16
50func MinInt16(i []int16) int16 {
51	if len(i) == 0 {
52		panic("arg is an empty array/slice")
53	}
54	var min int16
55	for idx := 0; idx < len(i); idx++ {
56		item := i[idx]
57		if idx == 0 {
58			min = item
59			continue
60		}
61		if item < min {
62			min = item
63		}
64	}
65	return min
66}
67
68// MinInt32 validates the input, compares the elements and returns the minimum element in an array/slice.
69// It accepts []int32
70// It returns int32
71func MinInt32(i []int32) int32 {
72	if len(i) == 0 {
73		panic("arg is an empty array/slice")
74	}
75	var min int32
76	for idx := 0; idx < len(i); idx++ {
77		item := i[idx]
78		if idx == 0 {
79			min = item
80			continue
81		}
82		if item < min {
83			min = item
84		}
85	}
86	return min
87}
88
89// MinInt64 validates the input, compares the elements and returns the minimum element in an array/slice.
90// It accepts []int64
91// It returns int64
92func MinInt64(i []int64) int64 {
93	if len(i) == 0 {
94		panic("arg is an empty array/slice")
95	}
96	var min int64
97	for idx := 0; idx < len(i); idx++ {
98		item := i[idx]
99		if idx == 0 {
100			min = item
101			continue
102		}
103		if item < min {
104			min = item
105		}
106	}
107	return min
108}
109
110// MinFloat32 validates the input, compares the elements and returns the minimum element in an array/slice.
111// It accepts []float32
112// It returns float32
113func MinFloat32(i []float32) float32 {
114	if len(i) == 0 {
115		panic("arg is an empty array/slice")
116	}
117	var min float32
118	for idx := 0; idx < len(i); idx++ {
119		item := i[idx]
120		if idx == 0 {
121			min = item
122			continue
123		}
124		if item < min {
125			min = item
126		}
127	}
128	return min
129}
130
131// MinFloat64 validates the input, compares the elements and returns the minimum element in an array/slice.
132// It accepts []float64
133// It returns float64
134func MinFloat64(i []float64) float64 {
135	if len(i) == 0 {
136		panic("arg is an empty array/slice")
137	}
138	var min float64
139	for idx := 0; idx < len(i); idx++ {
140		item := i[idx]
141		if idx == 0 {
142			min = item
143			continue
144		}
145		if item < min {
146			min = item
147		}
148	}
149	return min
150}
151
152// MinString validates the input, compares the elements and returns the minimum element in an array/slice.
153// It accepts []string
154// It returns string
155func MinString(i []string) string {
156	if len(i) == 0 {
157		panic("arg is an empty array/slice")
158	}
159	var min string
160	for idx := 0; idx < len(i); idx++ {
161		item := i[idx]
162		if idx == 0 {
163			min = item
164			continue
165		}
166		min = compareStringsMin(min, item)
167	}
168	return min
169}
170
171func compareStringsMin(min, current string) string {
172	r := strings.Compare(strings.ToLower(min), strings.ToLower(current))
173	if r < 0 {
174		return min
175	}
176	return current
177}
178