ordinal_array 0.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|