class Money::RatesStore::Memory
Class for thread-safe storage of exchange rate pairs. Used by instances of Money::Bank::VariableExchange
.
@example
store = Money::RatesStore::Memory.new store.add_rate 'USD', 'CAD', 0.98 store.get_rate 'USD', 'CAD' # => 0.98 # iterates rates store.each_rate {|iso_from, iso_to, rate| puts "#{from} -> #{to}: #{rate}" }
Constants
- INDEX_KEY_SEPARATOR
Attributes
Public Class Methods
Initializes a new Money::RatesStore::Memory
object.
@param [Hash] opts Optional store options. @option opts [Boolean] :without_mutex disables the usage of a mutex @param [Hash] rates Optional initial exchange rate data.
# File lib/money/rates_store/memory.rb, line 23 def initialize(opts = {}, rates = {}) @rates = rates @options = opts @guard = Monitor.new end
Public Instance Methods
Registers a conversion rate and returns it. Uses Mutex
to synchronize data access.
@param [String] currency_iso_from Currency
to exchange from. @param [String] currency_iso_to Currency
to exchange to. @param [Numeric] rate Rate to use when exchanging currencies.
@return [Numeric]
@example
store = Money::RatesStore::Memory.new store.add_rate("USD", "CAD", 1.24515) store.add_rate("CAD", "USD", 0.803115)
# File lib/money/rates_store/memory.rb, line 41 def add_rate(currency_iso_from, currency_iso_to, rate) guard.synchronize do rates[rate_key_for(currency_iso_from, currency_iso_to)] = rate end end
Iterate over rate tuples (iso_from, iso_to, rate)
@yieldparam iso_from [String] Currency
ISO string. @yieldparam iso_to [String] Currency
ISO string. @yieldparam rate [Numeric] Exchange rate.
@return [Enumerator]
@example
store.each_rate do |iso_from, iso_to, rate| puts [iso_from, iso_to, rate].join end
# File lib/money/rates_store/memory.rb, line 91 def each_rate(&block) return to_enum(:each_rate) unless block_given? guard.synchronize do rates.each do |key, rate| iso_from, iso_to = key.split(INDEX_KEY_SEPARATOR) yield iso_from, iso_to, rate end end end
Retrieve the rate for the given currencies. Uses Mutex
to synchronize data access. Delegates to Money::RatesStore::Memory
@param [String] currency_iso_from Currency
to exchange from. @param [String] currency_iso_to Currency
to exchange to.
@return [Numeric]
@example
store = Money::RatesStore::Memory.new store.add_rate("USD", "CAD", 1.24515) store.get_rate("USD", "CAD") #=> 1.24515
# File lib/money/rates_store/memory.rb, line 60 def get_rate(currency_iso_from, currency_iso_to) guard.synchronize do rates[rate_key_for(currency_iso_from, currency_iso_to)] end end
# File lib/money/rates_store/memory.rb, line 66 def marshal_dump guard.synchronize do return [self.class, options, rates.dup] end end
Wraps block execution in a thread-safe transaction
# File lib/money/rates_store/memory.rb, line 73 def transaction(&block) guard.synchronize do yield end end
Private Instance Methods
Return the rate hashkey for the given currencies.
@param [String] currency_iso_from The currency to exchange from. @param [String] currency_iso_to The currency to exchange to.
@return [String]
@example
rate_key_for("USD", "CAD") #=> "USD_TO_CAD"
# File lib/money/rates_store/memory.rb, line 115 def rate_key_for(currency_iso_from, currency_iso_to) [currency_iso_from, currency_iso_to].join(INDEX_KEY_SEPARATOR).upcase end