Compare commits

...

3 Commits

5 changed files with 19 additions and 19 deletions

View File

@ -1,28 +1,28 @@
module Rex module Rex
module Book module Book
# Trade Tracker implemented as a simple ring buffer
class TradeTracker class TradeTracker
include Enumerable
DEFAULT_TRADE_HISTORY_LIMIT = 200 DEFAULT_TRADE_HISTORY_LIMIT = 200
attr_reader :trades attr_reader :trades
def initialize(limit: DEFAULT_TRADE_HISTORY_LIMIT) def initialize(limit: DEFAULT_TRADE_HISTORY_LIMIT)
@limit = limit @limit = limit
@trades = [] @trades = Array.new(limit)
@current_id = -1
end end
def add(trade) def add(trade)
@trades.push(trade) @current_id += 1
cap idx = (@current_id % @limit)
@trades[idx] = trade
end end
def fetch_trades(limit) def each(&block)
@trades.last(limit) (([@current_id - @limit, 0].max)..@current_id ).each do |id|
yield @trades[id % @limit]
end end
private
def cap
@trades = @trades.last(@limit)
end end
end end
end end

View File

@ -50,7 +50,7 @@ module Rex
end end
def fetch_trades(user_id) def fetch_trades(user_id)
@trade_tracker.fetch_trades(50).each do |trade| @trade_tracker.each do |trade|
@outbox.push( @outbox.push(
Messages::TradeFetchEvent.new( Messages::TradeFetchEvent.new(
trade.id, trade.id,

View File

@ -1,5 +1,5 @@
# frozen_string_literal: true # frozen_string_literal: true
module Rex module Rex
VERSION = "0.1.0" VERSION = "0.1.1"
end end

View File

@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
spec.description = "A simple limit order book with a matching engine implementation" spec.description = "A simple limit order book with a matching engine implementation"
spec.homepage = "https://git.timkaechele.me/timkaechele/rex" spec.homepage = "https://git.timkaechele.me/timkaechele/rex"
spec.required_ruby_version = ">= 2.6.0" spec.required_ruby_version = ">= 2.6.0"
spec.licenses = ["AGPL-3.0-only"]
spec.metadata["homepage_uri"] = spec.homepage spec.metadata["homepage_uri"] = spec.homepage
# Specify which files should be added to the gem when it is released. # Specify which files should be added to the gem when it is released.
@ -28,10 +28,10 @@ Gem::Specification.new do |spec|
spec.add_dependency "rbtree", "~> 0.4.6" spec.add_dependency "rbtree", "~> 0.4.6"
spec.add_runtime_dependency "eventmachine", "~> 1.2" spec.add_dependency "eventmachine", "~> 1.2"
spec.add_runtime_dependency "em-websocket", "~> 0.5" spec.add_dependency "em-websocket", "~> 0.5"
spec.add_runtime_dependency "json-schema", "~> 4" spec.add_dependency "json-schema", "~> 4"
# For more information and examples about making a new gem, check out our # For more information and examples about making a new gem, check out our
# guide at: https://bundler.io/guides/creating_gem.html # guide at: https://bundler.io/guides/creating_gem.html
end end

View File

@ -15,10 +15,10 @@ RSpec.describe Rex::Book::TradeTracker do
end end
end end
describe "#fetch_trades" do describe "#each" do
let(:n) { 3 } let(:n) { 3 }
it "returns only the last n trades" do 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 end
end end