Sha256: 2da9f158436a759de61b18069ab56ed388aab787ce1a0d2a03574c1fe2df5668

Contents?: true

Size: 1.22 KB

Versions: 2

Compression:

Stored size: 1.22 KB

Contents

require 'thread'

class Currency
  class ExchangeBank
    def self.instance
      @@singleton
    end

    def initialize
      @rates = {}
      @mutex = Mutex.new
    end

    def add_rate(from, to, rate)
      @mutex.synchronize do
        @rates["#{from}_TO_#{to}".upcase] = rate
      end
    end

    def get_rate(from, to)
      @mutex.synchronize do
        @rates["#{from}_TO_#{to}".upcase] 
      end
    end

    def same_currency?(currency1, currency2)
      currency1.upcase == currency2.upcase
    end

    def exchange(cents, from_currency, to_currency)
      rate = get_rate(from_currency, to_currency)
      if rate
        (cents * rate).floor
      else
        from_currency = Currency.from_code(from_currency)
        to_currency = Currency.from_code(to_currency)
                
        if from_currency && to_currency && from_currency.exchange_rate && to_currency.exchange_rate && (from_currency.exchange_currency == to_currency.exchange_currency)
          ((cents * from_currency.exchange_rate) / to_currency.exchange_rate).floor
        else
          raise Money::UnknownRate, "No conversion rate known for '#{from_currency}' -> '#{to_currency}'"
        end
      end
    end

    @@singleton = ExchangeBank.new
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
currencies-0.3.0 lib/currencies/exchange_bank.rb
currencies-0.2.1 lib/currencies/exchange_bank.rb