ordinal_array 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +25 -0
- data/lib/ordinal_array.rb +55 -0
- data/lib/ordinal_array/ordinal.rb +72 -0
- data/lib/ordinal_array/ordinal_constants.rb +85 -0
- metadata +51 -0
data/README.rdoc
ADDED
@@ -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: []
|