diff --git a/lib/rex/book/trade_tracker.rb b/lib/rex/book/trade_tracker.rb index e86c3e4..20cebe9 100644 --- a/lib/rex/book/trade_tracker.rb +++ b/lib/rex/book/trade_tracker.rb @@ -1,28 +1,28 @@ module Rex module Book + # Trade Tracker implemented as a simple ring buffer class TradeTracker + include Enumerable DEFAULT_TRADE_HISTORY_LIMIT = 200 attr_reader :trades def initialize(limit: DEFAULT_TRADE_HISTORY_LIMIT) @limit = limit - @trades = [] + @trades = Array.new(limit) + @current_id = -1 end def add(trade) - @trades.push(trade) - cap + @current_id += 1 + idx = (@current_id % @limit) + @trades[idx] = trade end - def fetch_trades(limit) - @trades.last(limit) - end - - private - - def cap - @trades = @trades.last(@limit) + def each(&block) + (([@current_id - @limit, 0].max)..@current_id ).each do |id| + yield @trades[id % @limit] + end end end end diff --git a/lib/rex/server/matching_engine.rb b/lib/rex/server/matching_engine.rb index 040374f..0b059bb 100644 --- a/lib/rex/server/matching_engine.rb +++ b/lib/rex/server/matching_engine.rb @@ -50,7 +50,7 @@ module Rex end def fetch_trades(user_id) - @trade_tracker.fetch_trades(50).each do |trade| + @trade_tracker.each do |trade| @outbox.push( Messages::TradeFetchEvent.new( trade.id, diff --git a/spec/book/trade_tracker_spec.rb b/spec/book/trade_tracker_spec.rb index 6e4f89d..a8e152f 100644 --- a/spec/book/trade_tracker_spec.rb +++ b/spec/book/trade_tracker_spec.rb @@ -15,10 +15,10 @@ RSpec.describe Rex::Book::TradeTracker do end end - describe "#fetch_trades" do + describe "#each" do let(:n) { 3 } it "returns only the last n trades" do - expect(instance.fetch_trades(1)).to eq([11]) + expect(instance.to_a).to eq([10, 11]) end end end