func (m *M) fillableBuy(b *pqueue.OrderNode, q *pqueue.MatchQueues) bool { for { s := q.PeekSell() if s == nil { return false } if b.Price() >= s.Price() { if b.Amount() > s.Amount() { amount := s.Amount() price := price(b.Price(), s.Price()) s.Remove() m.slab.Free(s) b.ReduceAmount(amount) m.completeTrade(msg.PARTIAL, msg.FULL, b, s, price, amount) continue // The sell has been used up } if s.Amount() > b.Amount() { amount := b.Amount() price := price(b.Price(), s.Price()) s.ReduceAmount(amount) m.completeTrade(msg.FULL, msg.PARTIAL, b, s, price, amount) m.slab.Free(b) return true // The buy has been used up } if s.Amount() == b.Amount() { amount := b.Amount() price := price(b.Price(), s.Price()) m.completeTrade(msg.FULL, msg.FULL, b, s, price, amount) s.Remove() m.slab.Free(s) m.slab.Free(b) return true // The buy and sell have been used up } } else { return false } } }
func (m *M) fillableSell(s *pqueue.OrderNode, q *pqueue.MatchQueues) bool { for { b := q.PeekBuy() if b == nil { return false } if b.Price() >= s.Price() { if b.Amount() > s.Amount() { amount := s.Amount() price := price(b.Price(), s.Price()) b.ReduceAmount(amount) completeTrade(m.Out, msg.PARTIAL, msg.FULL, b, s, price, amount) m.slab.Free(s) return true // The sell has been used up } if s.Amount() > b.Amount() { amount := b.Amount() price := price(b.Price(), s.Price()) s.ReduceAmount(amount) completeTrade(m.Out, msg.FULL, msg.PARTIAL, b, s, price, amount) m.slab.Free(q.PopBuy()) continue } if s.Amount() == b.Amount() { amount := b.Amount() price := price(b.Price(), s.Price()) completeTrade(m.Out, msg.FULL, msg.FULL, b, s, price, amount) m.slab.Free(q.PopBuy()) m.slab.Free(s) return true // The sell has been used up } } else { return false } } panic("Unreachable") }