ordinal_array 0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,25 @@
1
+ = Ordinal array
2
+
3
+ Ordinal array is a Gem which allows you to access to a value of an array by an ordinal value. You can access to the first element of an array by the "first" method. Now you can access to the second element by "second", the third by "third" and that until the 999th elements.
4
+
5
+ Works with Ruby 1.9
6
+
7
+ = How to use
8
+
9
+ Just add gem "ordinal_array" in your gemfile.
10
+ It provides you some methods on the basic array class
11
+
12
+ Exemple of use:
13
+
14
+ my_array = ["value1", "value2", "value3"]
15
+ puts my_array.third # print: value 3
16
+ my_array[41] = "it works fine"
17
+ puts my_array.fourty_second # print: it works fine
18
+
19
+ = Contributors
20
+
21
+ *Kevin Disneur
22
+
23
+ = License
24
+
25
+ Ordinal array is released under the MIT license.
@@ -0,0 +1,55 @@
1
+ require_relative './ordinal_array/ordinal'
2
+ require_relative './ordinal_array/ordinal_constants'
3
+
4
+ class Array
5
+
6
+ include OrdinalArray::Constant
7
+ include OrdinalArray
8
+
9
+ def self.respond_to? method_sym, include_private = false
10
+ return true if Array.number_in_letter? method_sym
11
+ super
12
+ end
13
+
14
+ def method_missing name, *params
15
+ if Array.number_in_letter? name
16
+ value_by_number_in_letter name, params
17
+ else
18
+ super
19
+ end
20
+ end
21
+
22
+ private
23
+
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|
28
+ return false if ordinal_figure
29
+ figure = Numbers_in_letter.element_by_name letter_number
30
+ return false if figure.nil?
31
+ return false unless possible_followers.include? figure.to_sym
32
+ possible_followers = figure.can_be_followed_by
33
+ ordinal_figure = !figure.kind_of?(ComposedOrdinal)
34
+ true
35
+ end.empty? && ordinal_figure
36
+ end
37
+
38
+ def value_by_number_in_letter name, *params
39
+ partial_sum = 1
40
+ 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
48
+ sum
49
+ end
50
+ sum = sum + partial_sum
51
+ index = sum - 1
52
+ self.[] index if index > 0
53
+ end
54
+ end
55
+
@@ -0,0 +1,72 @@
1
+ module OrdinalArray
2
+
3
+ class Ordinal
4
+ attr_accessor :number_in_letter, :number, :can_be_followed_by
5
+
6
+ def initialize number_in_letter, number
7
+ @number_in_letter = number_in_letter
8
+ @number = number
9
+ @can_be_followed_by = nil
10
+ end
11
+
12
+ def to_sym
13
+ :ordinal
14
+ end
15
+ end
16
+
17
+ class ComposedOrdinal < Ordinal
18
+ def initialize number_in_letter, number
19
+ super number_in_letter, number
20
+ @can_be_followed_by = [:hundred]
21
+ end
22
+
23
+ def to_sym
24
+ :ordinal
25
+ end
26
+ end
27
+
28
+ class DecadeOrdinal < Ordinal
29
+ def initialize number_in_letter, number
30
+ super number_in_letter, number
31
+ @can_be_followed_by = nil
32
+ end
33
+
34
+ def to_sym
35
+ :decade
36
+ end
37
+ end
38
+
39
+ class ComposedDecadeOrdinal < ComposedOrdinal
40
+ def initialize number_in_letter, number
41
+ super number_in_letter, number
42
+ @can_be_followed_by = [:ordinal]
43
+ end
44
+
45
+ def to_sym
46
+ :decade
47
+ end
48
+ end
49
+
50
+ class HundredOrdinal < Ordinal
51
+ def initialize number_in_letter, number
52
+ super number_in_letter, number
53
+ @can_be_followed_by = nil
54
+ end
55
+
56
+ def to_sym
57
+ :hundred
58
+ end
59
+ end
60
+
61
+ class ComposedHundredOrdinal < ComposedDecadeOrdinal
62
+ def initialize number_in_letter, number
63
+ super number_in_letter, number
64
+ @can_be_followed_by = [:decade, :ordinal]
65
+ end
66
+
67
+ def to_sym
68
+ :hundred
69
+ end
70
+ end
71
+ end
72
+
@@ -0,0 +1,85 @@
1
+ require_relative './ordinal'
2
+
3
+ module OrdinalArray
4
+ module Constant
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
62
+
63
+ Numbers_in_letter = [
64
+ One, Two, Three, Four, Five, Six, Seven, Eight, Nine,
65
+ Ten, Eleven, Twelve, Thirteen, Fourteen, Fifteen, Sixteen, Seventeen, Eighteen, Nineteen,
66
+ Twenty, Thirty, Fourty, Fifty, Sixty, Seventy, Eighty, Ninety,
67
+ Hundred,
68
+
69
+ First, Second, Third, Fourth, Fifth, Sixth, Seventh, Eighth, Ninth,
70
+ Tenth, Eleventh, Twelfth, Thirteenth, Fourteenth, Fifteenth, Sixteenth, Seventeenth, Eighteenth, Nineteenth,
71
+ Twentieth, Thirtieth, Fortieth, Fiftieth, Sixtieth, Seventieth, Eightieth, Ninetieth,
72
+ Hundredth
73
+ ]
74
+
75
+ class << Numbers_in_letter
76
+ def element_by_name name
77
+ index = self.index {|n| n.number_in_letter == name }
78
+ return nil if index.nil?
79
+ self.[] index
80
+ end
81
+ end
82
+
83
+ end
84
+ end
85
+
metadata ADDED
@@ -0,0 +1,51 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ordinal_array
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Kevin Disneur
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-11-21 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: You can access to the first element of an array by the 'first' method.
15
+ Now you can access to the second element by 'second' and that until the 999th elements
16
+ email:
17
+ - kevin.disneur@gmail.com
18
+ executables: []
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - lib/ordinal_array/ordinal.rb
23
+ - lib/ordinal_array/ordinal_constants.rb
24
+ - lib/ordinal_array.rb
25
+ - README.rdoc
26
+ homepage: https://github.com/kdisneur/ordinal_array
27
+ licenses: []
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ requirements: []
45
+ rubyforge_project:
46
+ rubygems_version: 1.8.10
47
+ signing_key:
48
+ specification_version: 3
49
+ summary: You can access to the first element of an array by the 'first' method. Now
50
+ you can access to the second element by 'second' and that until the 999th elements
51
+ test_files: []