@@ -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