-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathruneSlices.go
158 lines (140 loc) · 3.77 KB
/
runeSlices.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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
// Code generated by yasupGen; DO NOT EDIT.
package yasup
import (
crypto "crypto/rand"
"math/big"
"math/rand"
)
var zeroValueRune rune
//RuneInsert will append elem at the position i. Might return ErrIndexOutOfBounds.
func RuneInsert(sl *[]rune, elem rune, i int) error {
if i < 0 || i > len(*sl) {
return ErrIndexOutOfBounds
}
*sl = append(*sl, elem)
copy((*sl)[i+1:], (*sl)[i:])
(*sl)[i] = elem
return nil
}
//RuneDelete delete the element at the position i. Might return ErrIndexOutOfBounds.
func RuneDelete(sl *[]rune, i int) error {
if i < 0 || i >= len(*sl) {
return ErrIndexOutOfBounds
}
*sl = append((*sl)[:i], (*sl)[i+1:]...)
return nil
}
//RuneContains will return true if elem is present in the slice and false otherwise.
func RuneContains(sl []rune, elem rune) bool {
for i := range sl {
if sl[i] == elem {
return true
}
}
return false
}
//RuneIndex returns the index of the first instance of elem, or -1 if elem is not present.
func RuneIndex(sl []rune, elem rune) int {
for i := range sl {
if sl[i] == elem {
return i
}
}
return -1
}
//RuneLastIndex returns the index of the last instance of elem in the slice, or -1 if elem is not present.
func RuneLastIndex(sl []rune, elem rune) int {
for i := len(sl) - 1; i >= 0; i-- {
if sl[i] == elem {
return i
}
}
return -1
}
//RuneCount will return an int representing the amount of times that elem is present in the slice.
func RuneCount(sl []rune, elem rune) int {
var n int
for i := range sl {
if sl[i] == elem {
n++
}
}
return n
}
//RunePush is equivalent to RuneInsert with index len(*sl).
func RunePush(sl *[]rune, elem rune) {
RuneInsert(sl, elem, len(*sl))
}
//RuneFrontPush is equivalent to RuneInsert with index 0.
func RuneFrontPush(sl *[]rune, elem rune) {
RuneInsert(sl, elem, 0)
}
//RunePop is equivalent to getting and removing the last element of the slice. Might return ErrEmptySlice.
func RunePop(sl *[]rune) (rune, error) {
if len(*sl) == 0 {
return zeroValueRune, ErrEmptySlice
}
last := len(*sl) - 1
ret := (*sl)[last]
RuneDelete(sl, last)
return ret, nil
}
//RunePop is equivalent to getting and removing the first element of the slice. Might return ErrEmptySlice.
func RuneFrontPop(sl *[]rune) (rune, error) {
if len(*sl) == 0 {
return zeroValueRune, ErrEmptySlice
}
ret := (*sl)[0]
RuneDelete(sl, 0)
return ret, nil
}
//RuneReplace modifies the slice with the first n non-overlapping instances of old replaced by new. If n equals -1, there is no limit on the number of replacements.
func RuneReplace(sl []rune, old, new rune, n int) (replacements int) {
left := n
for i := range sl {
if left == 0 {
break // no replacements left
}
if sl[i] == old {
sl[i] = new
left--
}
}
return n - left
}
//RuneReplaceAll is equivalent to RuneReplace with n = -1.
func RuneReplaceAll(sl []rune, old, new rune) (replacements int) {
return RuneReplace(sl, old, new, -1)
}
//RuneEquals compares two rune slices. Returns true if their elements are equal.
func RuneEquals(a, b []rune) bool {
if len(a) != len(b) {
return false
}
for i := range a {
if a[i] != b[i] {
return false
}
}
return true
}
//RuneFastShuffle will randomly swap the rune elements of a slice using math/rand (fast but not cryptographycally secure).
func RuneFastShuffle(sp []rune) {
rand.Shuffle(len(sp), func(i, j int) {
sp[i], sp[j] = sp[j], sp[i]
})
}
//RuneSecureShuffle will randomly swap the rune elements of a slice using crypto/rand (resource intensive but cryptographically secure).
func RuneSecureShuffle(sp []rune) error {
var i int64
size := int64(len(sp)) - 1
for i = 0; i < size+1; i++ {
bigRandI, err := crypto.Int(crypto.Reader, big.NewInt(size))
if err != nil {
return err
}
randI := bigRandI.Int64()
sp[size-i], sp[randI] = sp[randI], sp[size-i]
}
return nil
}