Class: Latinum::Resource
- Inherits:
-
Object
- Object
- Latinum::Resource
- Includes:
- Comparable
- Defined in:
- lib/latinum/resource.rb
Overview
A Resource represents a fixed amount of a named currency or material.
Instance Attribute Summary collapse
-
#amount ⇒ Object
The amount of the resource.
-
#name ⇒ Object
readonly
The name of the resource.
Class Method Summary collapse
-
.dump(resource) ⇒ Object
Dump a string representation of a resource.
-
.load(input) ⇒ Object
Load a string representation of a resource.
-
.parse(string, default_name: nil) ⇒ Object
Parse a string representation of a resource.
Instance Method Summary collapse
-
#*(factor) ⇒ Object
Multiplies the resource by a given factor.
-
#+(other) ⇒ Object
Add two resources.
-
#-(other) ⇒ Object
Subtract two resources.
-
#-@ ⇒ Object
Invert the amount of the resource.
-
#/(factor) ⇒ Object
Divides the resource by a given factor.
-
#<=>(other) ⇒ Object
Compare with another Resource or a Numeric value.
- #eql?(other) ⇒ Boolean
-
#exchange(rate, name, precision = nil) ⇒ Object
Compute a new resource using the given exchange rate for the specified name.
- #hash ⇒ Object
-
#initialize(amount, name) ⇒ Resource
constructor
A new instance of Resource.
- #inspect ⇒ Object
-
#to_digits ⇒ Object
A human readable string representation of the resource amount.
-
#to_s ⇒ Object
A human readable string representation of the resource amount and name.
-
#zero? ⇒ Boolean
Whether the amount of the resource is zero.
Constructor Details
#initialize(amount, name) ⇒ Resource
Returns a new instance of Resource.
44 45 46 47 |
# File 'lib/latinum/resource.rb', line 44 def initialize(amount, name) @amount = amount.to_d @name = name end |
Instance Attribute Details
#amount ⇒ Object
The amount of the resource.
51 52 53 |
# File 'lib/latinum/resource.rb', line 51 def amount @amount end |
#name ⇒ Object (readonly)
The name of the resource.
55 56 57 |
# File 'lib/latinum/resource.rb', line 55 def name @name end |
Class Method Details
.dump(resource) ⇒ Object
Dump a string representation of a resource.
38 39 40 |
# File 'lib/latinum/resource.rb', line 38 def self.dump(resource) resource.to_s if resource end |
.load(input) ⇒ Object
Load a string representation of a resource.
28 29 30 31 32 33 |
# File 'lib/latinum/resource.rb', line 28 def self.load(input) if input.is_a?(String) input = input.strip return parse(input) unless input.empty? end end |
.parse(string, default_name: nil) ⇒ Object
Parse a string representation of a resource.
19 20 21 22 23 |
# File 'lib/latinum/resource.rb', line 19 def self.parse(string, default_name: nil) amount, name = string.split(/\s+/, 2) self.new(amount, name || default_name) end |
Instance Method Details
#*(factor) ⇒ Object
Multiplies the resource by a given factor.
81 82 83 |
# File 'lib/latinum/resource.rb', line 81 def * factor self.class.new(@amount * factor, @name) end |
#+(other) ⇒ Object
Add two resources. Must have the same name.
59 60 61 62 63 |
# File 'lib/latinum/resource.rb', line 59 def + other raise DifferentResourceNameError if @name != other.name self.class.new(@amount + other.amount, @name) end |
#-(other) ⇒ Object
Subtract two resources. Must have the same name.
67 68 69 70 71 |
# File 'lib/latinum/resource.rb', line 67 def - other raise DifferentResourceNameError if @name != other.name self.class.new(@amount - other.amount, @name) end |
#-@ ⇒ Object
Invert the amount of the resource.
75 76 77 |
# File 'lib/latinum/resource.rb', line 75 def -@ self.class.new(-@amount, @name) end |
#/(factor) ⇒ Object
Divides the resource by a given factor.
87 88 89 90 91 92 93 94 95 |
# File 'lib/latinum/resource.rb', line 87 def / factor if factor.is_a? self.class raise DifferentResourceNameError if @name != factor.name @amount / factor.amount else self.class.new(@amount / factor, @name) end end |
#<=>(other) ⇒ Object
Compare with another Latinum::Resource or a Numeric value.
128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/latinum/resource.rb', line 128 def <=> other if other.is_a? self.class result = @amount <=> other.amount return result unless result == 0 result = @name <=> other.name return result elsif other.is_a? Numeric @amount <=> other end end |
#eql?(other) ⇒ Boolean
144 145 146 |
# File 'lib/latinum/resource.rb', line 144 def eql? other self.class.eql?(other.class) and @name.eql?(other.name) and @amount.eql?(other.amount) end |
#exchange(rate, name, precision = nil) ⇒ Object
Compute a new resource using the given exchange rate for the specified name.
101 102 103 104 105 106 107 108 109 |
# File 'lib/latinum/resource.rb', line 101 def exchange(rate, name, precision = nil) return self if @name == name exchanged_amount = @amount * rate exchanged_amount = exchanged_amount.round(precision) if precision self.class.new(exchanged_amount, name) end |
#hash ⇒ Object
140 141 142 |
# File 'lib/latinum/resource.rb', line 140 def hash [@amount, @name].hash end |
#inspect ⇒ Object
123 124 125 |
# File 'lib/latinum/resource.rb', line 123 def inspect "#<#{self.class.name} #{self.to_s.dump}>" end |
#to_digits ⇒ Object
A human readable string representation of the resource amount.
119 120 121 |
# File 'lib/latinum/resource.rb', line 119 def to_digits @amount.to_s('F') end |
#to_s ⇒ Object
A human readable string representation of the resource amount and name.
113 114 115 |
# File 'lib/latinum/resource.rb', line 113 def to_s "#{@amount.to_s('F')} #{@name}" end |
#zero? ⇒ Boolean
Whether the amount of the resource is zero.
150 151 152 |
# File 'lib/latinum/resource.rb', line 150 def zero? @amount.zero? end |