ordinal_array 0.1 → 0.2.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.
- data/README.rdoc +7 -3
- data/lib/ordinal_array.rb +33 -23
- data/lib/ordinal_array/ordinal.rb +13 -14
- data/lib/ordinal_array/ordinal_constants.rb +59 -60
- metadata +3 -3
data/README.rdoc
CHANGED
@@ -4,6 +4,13 @@ Ordinal array is a Gem which allows you to access to a value of an array by an o
|
|
4
4
|
|
5
5
|
Works with Ruby 1.9
|
6
6
|
|
7
|
+
Improve ordinal array speed for multiple calls on the same method on the same array: (Benchmark results: https://gist.github.com/2337544)
|
8
|
+
|
9
|
+
Exemple:
|
10
|
+
my_array = ["value1", "value2", "value3"]
|
11
|
+
puts my_array.third # print: value 3
|
12
|
+
puts my_array.third # print: value 3 (But... much faster!)
|
13
|
+
|
7
14
|
= How to use
|
8
15
|
|
9
16
|
Just add gem "ordinal_array" in your gemfile.
|
@@ -20,6 +27,3 @@ Exemple of use:
|
|
20
27
|
|
21
28
|
*Kevin Disneur
|
22
29
|
|
23
|
-
= License
|
24
|
-
|
25
|
-
Ordinal array is released under the MIT license.
|
data/lib/ordinal_array.rb
CHANGED
@@ -6,14 +6,20 @@ class Array
|
|
6
6
|
include OrdinalArray::Constant
|
7
7
|
include OrdinalArray
|
8
8
|
|
9
|
-
def self.respond_to?
|
9
|
+
def self.respond_to?(method_sym, include_private=false)
|
10
10
|
return true if Array.number_in_letter? method_sym
|
11
11
|
super
|
12
12
|
end
|
13
13
|
|
14
|
-
def method_missing
|
14
|
+
def method_missing(name, *params)
|
15
15
|
if Array.number_in_letter? name
|
16
|
-
|
16
|
+
index = index_by_number_in_letter(name, params)
|
17
|
+
|
18
|
+
self.class.send(:define_method, name) do
|
19
|
+
self[index]
|
20
|
+
end
|
21
|
+
|
22
|
+
self.send(name)
|
17
23
|
else
|
18
24
|
super
|
19
25
|
end
|
@@ -21,35 +27,39 @@ class Array
|
|
21
27
|
|
22
28
|
private
|
23
29
|
|
24
|
-
def self.number_in_letter?
|
25
|
-
ordinal_figure
|
26
|
-
possible_followers
|
27
|
-
|
30
|
+
def self.number_in_letter?(name)
|
31
|
+
ordinal_figure = false
|
32
|
+
possible_followers = [:hundred, :decade, :ordinal]
|
33
|
+
|
34
|
+
letter_numbers = name.to_s.split('_').drop_while do |letter_number|
|
28
35
|
return false if ordinal_figure
|
29
|
-
|
30
|
-
|
36
|
+
|
37
|
+
figure = Numbers_in_letter.element_by_name(letter_number)
|
38
|
+
return false unless figure
|
31
39
|
return false unless possible_followers.include? figure.to_sym
|
32
|
-
|
33
|
-
|
40
|
+
|
41
|
+
possible_followers = figure.can_be_followed_by
|
42
|
+
ordinal_figure = !figure.kind_of?(ComposedOrdinal)
|
43
|
+
|
34
44
|
true
|
35
|
-
end
|
45
|
+
end
|
46
|
+
letter_numbers.empty? && ordinal_figure
|
36
47
|
end
|
37
48
|
|
38
|
-
def
|
49
|
+
def index_by_number_in_letter(name, *params)
|
39
50
|
partial_sum = 1
|
40
51
|
sum = name.to_s.split('_').inject(0) do |sum, letter_number|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
52
|
+
number = Numbers_in_letter.element_by_name(letter_number).number
|
53
|
+
if partial_sum < number
|
54
|
+
partial_sum = partial_sum * number
|
55
|
+
else
|
56
|
+
sum = sum + partial_sum
|
57
|
+
partial_sum = number
|
58
|
+
end
|
48
59
|
sum
|
49
60
|
end
|
50
|
-
sum
|
61
|
+
sum = sum + partial_sum
|
51
62
|
index = sum - 1
|
52
|
-
|
63
|
+
index > 0 ? index : nil
|
53
64
|
end
|
54
65
|
end
|
55
|
-
|
@@ -3,10 +3,10 @@ module OrdinalArray
|
|
3
3
|
class Ordinal
|
4
4
|
attr_accessor :number_in_letter, :number, :can_be_followed_by
|
5
5
|
|
6
|
-
def initialize
|
7
|
-
@number_in_letter
|
8
|
-
@number = number
|
6
|
+
def initialize(number_in_letter, number)
|
7
|
+
@number_in_letter = number_in_letter
|
9
8
|
@can_be_followed_by = nil
|
9
|
+
@number = number
|
10
10
|
end
|
11
11
|
|
12
12
|
def to_sym
|
@@ -15,8 +15,8 @@ module OrdinalArray
|
|
15
15
|
end
|
16
16
|
|
17
17
|
class ComposedOrdinal < Ordinal
|
18
|
-
def initialize
|
19
|
-
super
|
18
|
+
def initialize(number_in_letter, number)
|
19
|
+
super(number_in_letter, number)
|
20
20
|
@can_be_followed_by = [:hundred]
|
21
21
|
end
|
22
22
|
|
@@ -26,8 +26,8 @@ module OrdinalArray
|
|
26
26
|
end
|
27
27
|
|
28
28
|
class DecadeOrdinal < Ordinal
|
29
|
-
def initialize
|
30
|
-
super
|
29
|
+
def initialize(number_in_letter, number)
|
30
|
+
super(number_in_letter, number)
|
31
31
|
@can_be_followed_by = nil
|
32
32
|
end
|
33
33
|
|
@@ -37,8 +37,8 @@ module OrdinalArray
|
|
37
37
|
end
|
38
38
|
|
39
39
|
class ComposedDecadeOrdinal < ComposedOrdinal
|
40
|
-
def initialize
|
41
|
-
super
|
40
|
+
def initialize(number_in_letter, number)
|
41
|
+
super(number_in_letter, number)
|
42
42
|
@can_be_followed_by = [:ordinal]
|
43
43
|
end
|
44
44
|
|
@@ -48,8 +48,8 @@ module OrdinalArray
|
|
48
48
|
end
|
49
49
|
|
50
50
|
class HundredOrdinal < Ordinal
|
51
|
-
def initialize
|
52
|
-
super
|
51
|
+
def initialize(number_in_letter, number)
|
52
|
+
super(number_in_letter, number)
|
53
53
|
@can_be_followed_by = nil
|
54
54
|
end
|
55
55
|
|
@@ -59,8 +59,8 @@ module OrdinalArray
|
|
59
59
|
end
|
60
60
|
|
61
61
|
class ComposedHundredOrdinal < ComposedDecadeOrdinal
|
62
|
-
def initialize
|
63
|
-
super
|
62
|
+
def initialize(number_in_letter, number)
|
63
|
+
super(number_in_letter, number)
|
64
64
|
@can_be_followed_by = [:decade, :ordinal]
|
65
65
|
end
|
66
66
|
|
@@ -69,4 +69,3 @@ module OrdinalArray
|
|
69
69
|
end
|
70
70
|
end
|
71
71
|
end
|
72
|
-
|
@@ -3,62 +3,62 @@ require_relative './ordinal'
|
|
3
3
|
module OrdinalArray
|
4
4
|
module Constant
|
5
5
|
|
6
|
-
First
|
7
|
-
One
|
8
|
-
Second
|
9
|
-
Two
|
10
|
-
Third
|
11
|
-
Three
|
12
|
-
Fourth
|
13
|
-
Four
|
14
|
-
Fifth
|
15
|
-
Five
|
16
|
-
Sixth
|
17
|
-
Six
|
18
|
-
Seventh
|
19
|
-
Seven
|
20
|
-
Eighth
|
21
|
-
Eight
|
22
|
-
Ninth
|
23
|
-
Nine
|
24
|
-
Tenth
|
25
|
-
Ten
|
26
|
-
Eleventh
|
27
|
-
Eleven
|
28
|
-
Twelfth
|
29
|
-
Twelve
|
30
|
-
Thirteenth
|
31
|
-
Thirteen
|
32
|
-
Fourteenth
|
33
|
-
Fourteen
|
34
|
-
Fifteenth
|
35
|
-
Fifteen
|
36
|
-
Sixteenth
|
37
|
-
Sixteen
|
38
|
-
Seventeenth = DecadeOrdinal.new
|
39
|
-
Seventeen
|
40
|
-
Eighteenth
|
41
|
-
Eighteen
|
42
|
-
Nineteenth
|
43
|
-
Nineteen
|
44
|
-
Twentieth
|
45
|
-
Twenty
|
46
|
-
Thirtieth
|
47
|
-
Thirty
|
48
|
-
Fortieth
|
49
|
-
Fourty
|
50
|
-
Fiftieth
|
51
|
-
Fifty
|
52
|
-
Sixtieth
|
53
|
-
Sixty
|
54
|
-
Seventieth
|
55
|
-
Seventy
|
56
|
-
Eightieth
|
57
|
-
Eighty
|
58
|
-
Ninetieth
|
59
|
-
Ninety
|
60
|
-
Hundredth
|
61
|
-
Hundred
|
6
|
+
First = Ordinal.new("first", 1)
|
7
|
+
One = ComposedOrdinal.new("one", 1)
|
8
|
+
Second = Ordinal.new("second", 2)
|
9
|
+
Two = ComposedOrdinal.new("two", 2)
|
10
|
+
Third = Ordinal.new("third", 3)
|
11
|
+
Three = ComposedOrdinal.new("three", 3)
|
12
|
+
Fourth = Ordinal.new("fourth", 4)
|
13
|
+
Four = ComposedOrdinal.new("four", 4)
|
14
|
+
Fifth = Ordinal.new("fifth", 5)
|
15
|
+
Five = ComposedOrdinal.new("five", 5)
|
16
|
+
Sixth = Ordinal.new("sixth", 6)
|
17
|
+
Six = ComposedOrdinal.new("six", 6)
|
18
|
+
Seventh = Ordinal.new("seventh", 7)
|
19
|
+
Seven = ComposedOrdinal.new("seven", 7)
|
20
|
+
Eighth = Ordinal.new("eighth", 8)
|
21
|
+
Eight = ComposedOrdinal.new("eight", 8)
|
22
|
+
Ninth = Ordinal.new("ninth", 9)
|
23
|
+
Nine = ComposedOrdinal.new("nine", 9)
|
24
|
+
Tenth = DecadeOrdinal.new("tenth", 10)
|
25
|
+
Ten = ComposedDecadeOrdinal.new("ten", 10)
|
26
|
+
Eleventh = DecadeOrdinal.new("eleventh", 11)
|
27
|
+
Eleven = ComposedDecadeOrdinal.new("eleven", 11)
|
28
|
+
Twelfth = DecadeOrdinal.new("twelfth", 12)
|
29
|
+
Twelve = ComposedDecadeOrdinal.new("twelve", 12)
|
30
|
+
Thirteenth = DecadeOrdinal.new("thirteenth", 13)
|
31
|
+
Thirteen = ComposedDecadeOrdinal.new("thirteen", 13)
|
32
|
+
Fourteenth = DecadeOrdinal.new("fourteenth", 14)
|
33
|
+
Fourteen = ComposedDecadeOrdinal.new("fourteen", 14)
|
34
|
+
Fifteenth = DecadeOrdinal.new("fifteenth", 15)
|
35
|
+
Fifteen = ComposedDecadeOrdinal.new("fifteen", 15)
|
36
|
+
Sixteenth = DecadeOrdinal.new("sixteenth", 16)
|
37
|
+
Sixteen = ComposedDecadeOrdinal.new("sixteen", 16)
|
38
|
+
Seventeenth = DecadeOrdinal.new("seventeenth", 17)
|
39
|
+
Seventeen = ComposedDecadeOrdinal.new("seventeen", 17)
|
40
|
+
Eighteenth = DecadeOrdinal.new("eighteenth", 18)
|
41
|
+
Eighteen = ComposedDecadeOrdinal.new("eighteen", 18)
|
42
|
+
Nineteenth = DecadeOrdinal.new("nineteenth", 19)
|
43
|
+
Nineteen = ComposedDecadeOrdinal.new("nineteen", 19)
|
44
|
+
Twentieth = DecadeOrdinal.new("twentieth", 20)
|
45
|
+
Twenty = ComposedDecadeOrdinal.new("twenty", 20)
|
46
|
+
Thirtieth = DecadeOrdinal.new("thirtieth", 30)
|
47
|
+
Thirty = ComposedDecadeOrdinal.new("thirty", 30)
|
48
|
+
Fortieth = DecadeOrdinal.new("fortieth", 40)
|
49
|
+
Fourty = ComposedDecadeOrdinal.new("fourty", 40)
|
50
|
+
Fiftieth = DecadeOrdinal.new("fiftieth", 50)
|
51
|
+
Fifty = ComposedDecadeOrdinal.new("fifty", 50)
|
52
|
+
Sixtieth = DecadeOrdinal.new("sixtieth", 60)
|
53
|
+
Sixty = ComposedDecadeOrdinal.new("sixty", 60)
|
54
|
+
Seventieth = DecadeOrdinal.new("seventieth", 70)
|
55
|
+
Seventy = ComposedDecadeOrdinal.new("seventy", 70)
|
56
|
+
Eightieth = DecadeOrdinal.new("eightieth", 80)
|
57
|
+
Eighty = ComposedDecadeOrdinal.new("eighty", 80)
|
58
|
+
Ninetieth = DecadeOrdinal.new("ninetieth", 90)
|
59
|
+
Ninety = ComposedDecadeOrdinal.new("ninety", 90)
|
60
|
+
Hundredth = HundredOrdinal.new("hundredth", 100)
|
61
|
+
Hundred = ComposedHundredOrdinal.new("hundred", 100)
|
62
62
|
|
63
63
|
Numbers_in_letter = [
|
64
64
|
One, Two, Three, Four, Five, Six, Seven, Eight, Nine,
|
@@ -73,13 +73,12 @@ module OrdinalArray
|
|
73
73
|
]
|
74
74
|
|
75
75
|
class << Numbers_in_letter
|
76
|
-
def element_by_name
|
76
|
+
def element_by_name(name)
|
77
77
|
index = self.index {|n| n.number_in_letter == name }
|
78
|
-
return nil
|
79
|
-
self.[]
|
78
|
+
return nil unless index
|
79
|
+
self.[](index)
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
83
|
end
|
84
84
|
end
|
85
|
-
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ordinal_array
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-04-08 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: You can access to the first element of an array by the 'first' method.
|
15
15
|
Now you can access to the second element by 'second' and that until the 999th elements
|
@@ -43,7 +43,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
43
43
|
version: '0'
|
44
44
|
requirements: []
|
45
45
|
rubyforge_project:
|
46
|
-
rubygems_version: 1.8.
|
46
|
+
rubygems_version: 1.8.15
|
47
47
|
signing_key:
|
48
48
|
specification_version: 3
|
49
49
|
summary: You can access to the first element of an array by the 'first' method. Now
|