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] rt Optional initial exchange rate data.
# File lib/money/rates_store/memory.rb, line 21 def initialize(opts = {}, rt = {}) @options, @index = opts, rt @mutex = Mutex.new @in_transaction = false 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 39 def add_rate(currency_iso_from, currency_iso_to, rate) transaction { index[rate_key_for(currency_iso_from, currency_iso_to)] = rate } 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 90 def each_rate(&block) enum = Enumerator.new do |yielder| index.each do |key, rate| iso_from, iso_to = key.split(INDEX_KEY_SEPARATOR) yielder.yield iso_from, iso_to, rate end end block_given? ? enum.each(&block) : enum 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 56 def get_rate(currency_iso_from, currency_iso_to) transaction { index[rate_key_for(currency_iso_from, currency_iso_to)] } end
# File lib/money/rates_store/memory.rb, line 60 def marshal_dump [self.class, options, index] end
Wraps block execution in a thread-safe transaction
# File lib/money/rates_store/memory.rb, line 65 def transaction(&block) if @in_transaction || options[:without_mutex] block.call self else @mutex.synchronize do @in_transaction = true result = block.call @in_transaction = false result end 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 114 def rate_key_for(currency_iso_from, currency_iso_to) [currency_iso_from, currency_iso_to].join(INDEX_KEY_SEPARATOR).upcase end