-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathgotin.go
127 lines (98 loc) · 2.39 KB
/
gotin.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
125
126
127
package gotin
import (
"errors"
"reflect"
"sort"
)
var (
ErrUnSupportHaystack = errors.New("haystack must be slice, array")
)
func In(haystack interface{}, needle interface{}) (bool, error) {
sVal := reflect.ValueOf(haystack)
kind := sVal.Kind()
if kind == reflect.Slice || kind == reflect.Array {
for i := 0; i < sVal.Len(); i++ {
if sVal.Index(i).Interface() == needle {
return true, nil
}
}
return false, nil
}
return false, ErrUnSupportHaystack
}
func InIntSlice(haystack []int, needle int) bool {
for _, e := range haystack {
if e == needle {
return true
}
}
return false
}
func InStringSlice(haystack []string, needle string) bool {
for _, e := range haystack {
if e == needle {
return true
}
}
return false
}
func InIntSliceSortedFunc(haystack []int) func(int) bool {
sort.Ints(haystack)
return func(needle int) bool {
index := sort.SearchInts(haystack, needle)
return index < len(haystack) && haystack[index] == needle
}
}
func InStringSliceSortedFunc(haystack []string) func(string) bool {
sort.Strings(haystack)
return func(needle string) bool {
index := sort.SearchStrings(haystack, needle)
return index < len(haystack) && haystack[index] == needle
}
}
func SortInIntSlice(haystack []int, needle int) bool {
sort.Ints(haystack)
index := sort.SearchInts(haystack, needle)
return index < len(haystack) && haystack[index] == needle
}
func SortInStringSlice(haystack []string, needle string) bool {
sort.Strings(haystack)
index := sort.SearchStrings(haystack, needle)
return index < len(haystack) && haystack[index] == needle
}
func InIntSliceMapKeyFunc(haystack []int) func(int) bool {
set := make(map[int]struct{})
for _ , e := range haystack {
set[e] = struct{}{}
}
return func(needle int) bool {
_, ok := set[needle]
return ok
}
}
func InStringSliceMapKeyFunc(haystack []string) func(string) bool {
set := make(map[string]struct{})
for _ , e := range haystack {
set[e] = struct{}{}
}
return func(needle string) bool {
_, ok := set[needle]
return ok
}
}
func MapKeyInIntSlice(haystack []int, needle int) bool {
set := make(map[int]struct{})
for _ , e := range haystack {
set[e] = struct{}{}
}
_, ok := set[needle]
return ok
}
func MapKeyInStringSlice(haystack []string, needle string) bool {
set := make(map[string]struct{})
for _ , e := range haystack {
set[e] = struct{}{}
}
_, ok := set[needle]
return ok
}