Skip to content

Commit

Permalink
EventEmitter is slow, make a much more optimized one to back Evt
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelgrosner committed May 15, 2017
1 parent 7a77c75 commit 2ad9cc7
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 12 deletions.
43 changes: 32 additions & 11 deletions src/service/utils.ts
Expand Up @@ -24,21 +24,42 @@ export function timeOrDefault(x: Models.ITimestamped, timeProvider : ITimeProvid
return timeProvider.utcNow();
}

// typesafe wrapper around EventEmitter
// typesafe event raiser
type EvtCallback<T> = (data?: T) => void;
export class Evt<T> {
private _event = new events.EventEmitter();
private _singleCallback : EvtCallback<T> = null;
private _multiCallback = new Array<EvtCallback<T>>();

public on = (handler: (data?: T) => void) => this._event.addListener("evt", handler);
public on = (handler: EvtCallback<T>) => {
if (this._singleCallback) {
this._multiCallback = [this._singleCallback, handler];
this._singleCallback = null;
}
else if (this._multiCallback.length > 0) {
this._multiCallback.push(handler);
}
else {
this._singleCallback = handler;
}
};

public off = (handler: (data?: T) => void) => this._event.removeListener("evt", handler);
public off = (handler: EvtCallback<T>) => {
if (this._multiCallback.length > 0)
this._multiCallback = _.pull(this._multiCallback, handler);
if (this._singleCallback === handler)
this._singleCallback = null;
};

public trigger = (data?: T) => this._event.emit("evt", data);

public once = (handler: (data?: T) => void) => this._event.once("evt", handler);

public setMaxListeners = (max: number) => this._event.setMaxListeners(max);

public removeAllListeners = () => this._event.removeAllListeners();
public trigger = (data?: T) => {
if (this._singleCallback !== null) {
this._singleCallback(data);
}
else {
const len = this._multiCallback.length;
for (let i = 0; i < len; i++)
this._multiCallback[i](data);
}
};
}

export function roundSide(x: number, minTick: number, side: Models.Side) {
Expand Down
2 changes: 1 addition & 1 deletion test/backtest.ts
Expand Up @@ -105,7 +105,7 @@ describe("BacktestGatewayTests", () => {
var timeProvider = new Backtest.BacktestTimeProvider(Moment.unix(1), Moment.unix(40));
var gateway = new Backtest.BacktestGateway(inputData, 10, 5000, timeProvider);

gateway.MarketData.once(m => {
gateway.MarketData.on(m => {
gateway.sendOrder(new Models.BrokeredOrder("A", Models.Side.Ask, 3, Models.OrderType.Limit, 12, Models.TimeInForce.GTC, Models.Exchange.Null));
});

Expand Down

0 comments on commit 2ad9cc7

Please sign in to comment.