Skip to content

Commit ccdafeb

Browse files
authored
Optimize OrderBook performance - v1.7 (#6)
OrderBook.mo - Optimize OrderBook performance
1 parent eb12d0e commit ccdafeb

File tree

1 file changed

+61
-46
lines changed

1 file changed

+61
-46
lines changed

src/OrderBook.mo

Lines changed: 61 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -270,56 +270,59 @@ module {
270270
};
271271
};
272272
};
273-
private func _popOrderPrice(_list: List.List<(Txid, OrderPrice)>, _temp: List.List<(Txid, OrderPrice)>, _condition: {#ge: Nat; #le: Nat; }) :
273+
private func _pop(_list: List.List<(Txid, OrderPrice)>, _temp: List.List<(Txid, OrderPrice)>, _condition: {#ge: Nat; #le: Nat; #txidEq: Txid }) :
274274
(list: List.List<(Txid, OrderPrice)>, temp: List.List<(Txid, OrderPrice)>) {
275275
var list = _list;
276276
var temp = _temp;
277277
var item = List.pop(list);
278-
switch(item.0){
279-
case(?(txid, orderPrice)){
280-
switch(_condition){
281-
case(#ge(value)){
282-
if (orderPrice.price >= value){
283-
list := item.1;
284-
temp := List.push((txid, orderPrice), temp);
285-
return _popOrderPrice(list, temp, _condition);
286-
}else {
287-
return (list, temp);
288-
};
289-
};
290-
case(#le(value)){
291-
if (orderPrice.price <= value){
292-
list := item.1;
293-
temp := List.push((txid, orderPrice), temp);
294-
return _popOrderPrice(list, temp, _condition);
295-
}else {
296-
return (list, temp);
297-
};
298-
};
299-
// case(#txidEq(_txid)){
300-
// if (_txid == txid){
301-
// list := item.1;
302-
// return (list, temp);
303-
// }else{
304-
// list := item.1;
305-
// temp := List.push((txid, orderPrice), temp);
306-
// return _popOrderPrice(list, temp, _condition);
307-
// };
308-
// };
278+
switch(item.0, _condition){
279+
case(?(txid, orderPrice), #ge(value)){
280+
if (orderPrice.price >= value){
281+
list := item.1;
282+
temp := List.push((txid, orderPrice), temp);
283+
return _pop(list, temp, _condition);
284+
}else {
285+
return (list, temp);
309286
};
310287
};
311-
case(_){ return (list, temp) };
288+
case(?(txid, orderPrice), #le(value)){
289+
if (orderPrice.price <= value){
290+
list := item.1;
291+
temp := List.push((txid, orderPrice), temp);
292+
return _pop(list, temp, _condition);
293+
}else {
294+
return (list, temp);
295+
};
296+
};
297+
case(?(txid, orderPrice), #txidEq(_txid)){
298+
if (_txid == txid){
299+
list := _push(item.1, temp);
300+
temp := List.nil<(Txid, OrderPrice)>();
301+
temp := List.push((txid, orderPrice), temp);
302+
return (list, temp);
303+
}else{
304+
list := item.1;
305+
temp := List.push((txid, orderPrice), temp);
306+
return _pop(list, temp, _condition);
307+
};
308+
};
309+
case(_, #txidEq(_txid)){
310+
return (_push(list, temp), List.nil<(Txid, OrderPrice)>())
311+
};
312+
case(_){
313+
return (list, temp)
314+
};
312315
};
313316
};
314-
private func _pushOrderPrice(_list: List.List<(Txid, OrderPrice)>, _temp: List.List<(Txid, OrderPrice)>) : List.List<(Txid, OrderPrice)>{
317+
private func _push(_list: List.List<(Txid, OrderPrice)>, _temp: List.List<(Txid, OrderPrice)>) : List.List<(Txid, OrderPrice)>{
315318
var list = _list;
316319
var temp = _temp;
317320
var tempItem = List.pop(temp);
318321
switch(tempItem.0){
319322
case(?(txid, orderPrice)){
320323
temp := tempItem.1;
321324
list := List.push((txid, orderPrice), list);
322-
return _pushOrderPrice(list, temp);
325+
return _push(list, temp);
323326
};
324327
case(_){ return list };
325328
};
@@ -331,26 +334,41 @@ module {
331334
case(#Buy){
332335
var bid = _ob.bid;
333336
var temp: List.List<(Txid, OrderPrice)> = List.nil();
334-
let res = _popOrderPrice(bid, temp, #ge(_orderPrice.price));
337+
let res = _pop(bid, temp, #ge(_orderPrice.price));
335338
bid := res.0;
336339
temp := res.1;
337340
bid := List.push((_txid, _orderPrice), bid);
338-
bid := _pushOrderPrice(bid, temp);
341+
bid := _push(bid, temp);
339342
return { ask = _ob.ask; bid = bid };
340343
};
341344
case(#Sell){
342345
var ask = _ob.ask;
343346
var temp: List.List<(Txid, OrderPrice)> = List.nil();
344-
let res = _popOrderPrice(ask, temp, #le(_orderPrice.price));
347+
let res = _pop(ask, temp, #le(_orderPrice.price));
345348
ask := res.0;
346349
temp := res.1;
347350
ask := List.push((_txid, _orderPrice), ask);
348-
ask := _pushOrderPrice(ask, temp);
351+
ask := _push(ask, temp);
349352
return { ask = ask; bid = _ob.bid };
350353
};
351354
};
352355
};
353356

357+
private func _remove(_ob: OrderBook, _txid: Txid, _side: OrderSide) : OrderBook{
358+
switch(_side){
359+
case(#Buy){
360+
var temp: List.List<(Txid, OrderPrice)> = List.nil();
361+
let res = _pop(_ob.bid, temp, #txidEq(_txid));
362+
return { ask = _ob.ask; bid = res.0 };
363+
};
364+
case(#Sell){
365+
var temp: List.List<(Txid, OrderPrice)> = List.nil();
366+
let res = _pop(_ob.ask, temp, #txidEq(_txid));
367+
return { ask = res.0; bid = _ob.bid };
368+
};
369+
};
370+
};
371+
354372
public func create() : OrderBook{
355373
return {
356374
ask = List.nil<(Txid, OrderPrice)>();
@@ -485,21 +503,18 @@ module {
485503
};
486504

487505
public func remove(_ob: OrderBook, _txid: Txid, _side: ?OrderSide) : OrderBook{
488-
var ask = _ob.ask;
489-
var bid = _ob.bid;
490506
switch(_side){
491507
case(?(#Buy)){
492-
bid := List.filter(bid, func (item:(Txid, OrderPrice)):Bool{ item.0 != _txid });
508+
return _remove(_ob, _txid, #Buy);
493509
};
494510
case(?(#Sell)){
495-
ask := List.filter(ask, func (item:(Txid, OrderPrice)):Bool{ item.0 != _txid });
511+
return _remove(_ob, _txid, #Sell);
496512
};
497513
case(_){
498-
bid := List.filter(bid, func (item:(Txid, OrderPrice)):Bool{ item.0 != _txid });
499-
ask := List.filter(ask, func (item:(Txid, OrderPrice)):Bool{ item.0 != _txid });
514+
let obTemp = _remove(_ob, _txid, #Buy);
515+
return _remove(obTemp, _txid, #Sell);
500516
};
501517
};
502-
return { ask = ask; bid = bid; };
503518
};
504519

505520
/// Warning: Do not call clear() lightly. Calling this method may result in inconsistent order status data.

0 commit comments

Comments
 (0)