chars 0.2.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ChangeLog.md +12 -0
- data/README.md +61 -10
- data/benchmarks/compare.rb +1 -1
- data/benchmarks/substrings.rb +25 -0
- data/lib/chars/char_set.rb +285 -56
- data/lib/chars/chars.rb +33 -4
- data/lib/chars/string_enumerator.rb +98 -0
- data/lib/chars/version.rb +1 -1
- data/spec/char_set_spec.rb +415 -31
- data/spec/chars_spec.rb +183 -27
- data/spec/string_enumerator_spec.rb +99 -0
- metadata +4 -2
- data/benchmarks/strings_in.rb +0 -23
data/lib/chars/chars.rb
CHANGED
@@ -6,6 +6,11 @@ module Chars
|
|
6
6
|
# The numeric decimal character set
|
7
7
|
NUMERIC = CharSet['0'..'9']
|
8
8
|
|
9
|
+
# @see NUMERIC
|
10
|
+
#
|
11
|
+
# @since 0.3.0
|
12
|
+
DIGITS = NUMERIC
|
13
|
+
|
9
14
|
# The octal character set
|
10
15
|
OCTAL = CharSet['0'..'7']
|
11
16
|
|
@@ -41,7 +46,11 @@ module Chars
|
|
41
46
|
]
|
42
47
|
|
43
48
|
# The space character set
|
44
|
-
|
49
|
+
#
|
50
|
+
# @since 0.3.0
|
51
|
+
WHITESPACE = CharSet[' ', "\f", "\n", "\r", "\t", "\v"]
|
52
|
+
|
53
|
+
SPACE = WHITESPACE
|
45
54
|
|
46
55
|
# The set of printable characters (not including spaces)
|
47
56
|
VISIBLE = ALPHA_NUMERIC | CharSet[
|
@@ -74,6 +83,15 @@ module Chars
|
|
74
83
|
NUMERIC
|
75
84
|
end
|
76
85
|
|
86
|
+
#
|
87
|
+
# @see numeric
|
88
|
+
#
|
89
|
+
# @since 0.3.0
|
90
|
+
#
|
91
|
+
def self.digits
|
92
|
+
numeric
|
93
|
+
end
|
94
|
+
|
77
95
|
#
|
78
96
|
# The octal-digit character set.
|
79
97
|
#
|
@@ -195,15 +213,26 @@ module Chars
|
|
195
213
|
end
|
196
214
|
|
197
215
|
#
|
198
|
-
# The
|
216
|
+
# The whitespace character set.
|
199
217
|
#
|
200
218
|
# @return [CharSet]
|
201
|
-
# The
|
219
|
+
# The whitespace character set.
|
202
220
|
#
|
203
221
|
# @see SPACE
|
204
222
|
#
|
223
|
+
# @since 0.3.0
|
224
|
+
#
|
225
|
+
def self.whitespace
|
226
|
+
WHITESPACE
|
227
|
+
end
|
228
|
+
|
229
|
+
#
|
230
|
+
# The whitespace character set.
|
231
|
+
#
|
232
|
+
# @see #whitespace
|
233
|
+
#
|
205
234
|
def self.space
|
206
|
-
|
235
|
+
whitespace
|
207
236
|
end
|
208
237
|
|
209
238
|
#
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module Chars
|
2
|
+
#
|
3
|
+
# Enumerates through every possible string belonging to a character set and
|
4
|
+
# of a given length.
|
5
|
+
#
|
6
|
+
# @api private
|
7
|
+
#
|
8
|
+
# @since 0.3.0
|
9
|
+
#
|
10
|
+
class StringEnumerator
|
11
|
+
|
12
|
+
include Enumerable
|
13
|
+
|
14
|
+
# The character set to generate the strings from.
|
15
|
+
#
|
16
|
+
# @return [CharSet]
|
17
|
+
attr_reader :char_set
|
18
|
+
|
19
|
+
# The desired length of each string.
|
20
|
+
#
|
21
|
+
# @return [Integer]
|
22
|
+
attr_reader :length
|
23
|
+
|
24
|
+
#
|
25
|
+
# Initializes the string enumerator.
|
26
|
+
#
|
27
|
+
# @param [Chars::CharSet] char_set
|
28
|
+
# The character set to generate the strings from.
|
29
|
+
#
|
30
|
+
# @param [Integer] length
|
31
|
+
# The desired length of each string.
|
32
|
+
#
|
33
|
+
def initialize(char_set,length)
|
34
|
+
@char_set = char_set
|
35
|
+
@length = length
|
36
|
+
end
|
37
|
+
|
38
|
+
#
|
39
|
+
# Enumerates through every possible string belonging to {#char_set} and
|
40
|
+
# {#length} long.
|
41
|
+
#
|
42
|
+
# @yield [string]
|
43
|
+
# The given block will be passed each sequential string.
|
44
|
+
#
|
45
|
+
# @yieldparam [String] string
|
46
|
+
# A string belonging to {#char_set} and {#length} long.
|
47
|
+
#
|
48
|
+
# @return [Enumerator]
|
49
|
+
# If no block is given, an Enumerator will be returned.
|
50
|
+
#
|
51
|
+
def each
|
52
|
+
return enum_for(__method__) unless block_given?
|
53
|
+
|
54
|
+
if @char_set.empty?
|
55
|
+
return
|
56
|
+
elsif @length == 0
|
57
|
+
yield ""
|
58
|
+
return
|
59
|
+
end
|
60
|
+
|
61
|
+
chars = char_set.chars
|
62
|
+
first_char = chars.first
|
63
|
+
last_char = chars.last
|
64
|
+
|
65
|
+
next_char = {}
|
66
|
+
|
67
|
+
chars.each_cons(2) do |c1,c2|
|
68
|
+
next_char[c1] = c2
|
69
|
+
end
|
70
|
+
|
71
|
+
string = String.new(first_char * @length)
|
72
|
+
|
73
|
+
last_index = @length - 1
|
74
|
+
|
75
|
+
loop do
|
76
|
+
chars.each do |c|
|
77
|
+
string[last_index] = c
|
78
|
+
|
79
|
+
yield string.dup
|
80
|
+
end
|
81
|
+
|
82
|
+
last_index.downto(0) do |i|
|
83
|
+
if string[i] == last_char
|
84
|
+
string[i] = first_char
|
85
|
+
|
86
|
+
if i == 0
|
87
|
+
return
|
88
|
+
end
|
89
|
+
else
|
90
|
+
string[i] = next_char[string[i]]
|
91
|
+
break
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|
data/lib/chars/version.rb
CHANGED