ordinal_array 0.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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.
@@ -6,14 +6,20 @@ class Array
6
6
  include OrdinalArray::Constant
7
7
  include OrdinalArray
8
8
 
9
- def self.respond_to? method_sym, include_private = false
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 name, *params
14
+ def method_missing(name, *params)
15
15
  if Array.number_in_letter? name
16
- value_by_number_in_letter name, params
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? name
25
- ordinal_figure = false
26
- possible_followers = [:hundred, :decade, :ordinal]
27
- name.to_s.split('_').drop_while do |letter_number|
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
- figure = Numbers_in_letter.element_by_name letter_number
30
- return false if figure.nil?
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
- possible_followers = figure.can_be_followed_by
33
- ordinal_figure = !figure.kind_of?(ComposedOrdinal)
40
+
41
+ possible_followers = figure.can_be_followed_by
42
+ ordinal_figure = !figure.kind_of?(ComposedOrdinal)
43
+
34
44
  true
35
- end.empty? && ordinal_figure
45
+ end
46
+ letter_numbers.empty? && ordinal_figure
36
47
  end
37
48
 
38
- def value_by_number_in_letter name, *params
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
- number = Numbers_in_letter.element_by_name(letter_number).number
42
- if partial_sum < number
43
- partial_sum = partial_sum * number
44
- else
45
- sum = sum + partial_sum
46
- partial_sum = number
47
- end
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 = sum + partial_sum
61
+ sum = sum + partial_sum
51
62
  index = sum - 1
52
- self.[] index if index > 0
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 number_in_letter, number
7
- @number_in_letter = 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 number_in_letter, number
19
- super number_in_letter, number
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 number_in_letter, number
30
- super number_in_letter, number
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 number_in_letter, number
41
- super number_in_letter, number
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 number_in_letter, number
52
- super number_in_letter, number
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 number_in_letter, number
63
- super number_in_letter, number
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 = 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
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 name
76
+ def element_by_name(name)
77
77
  index = self.index {|n| n.number_in_letter == name }
78
- return nil if index.nil?
79
- self.[] index
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: '0.1'
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: 2011-11-21 00:00:00.000000000Z
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.10
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