use std::cmp::Ordering;
use crate::types::{
Currency,
LimitOrder,
Mon,
Pending,
Side,
UserOrderId,
};
#[derive(Debug, PartialEq, Eq)]
pub struct Bids;
impl<I, const D: u8, BaseOrQuote, UserOrderIdT> Cmp<I, D, BaseOrQuote, UserOrderIdT> for Bids
where
I: Mon<D>,
BaseOrQuote: Currency<I, D>,
UserOrderIdT: UserOrderId,
{
#[inline(always)]
fn is_same_side(side: Side) -> bool {
side == Side::Buy
}
#[inline(always)]
fn cmp(
new_order: &LimitOrder<I, D, BaseOrQuote, UserOrderIdT, Pending<I, D, BaseOrQuote>>,
existing_order: &LimitOrder<I, D, BaseOrQuote, UserOrderIdT, Pending<I, D, BaseOrQuote>>,
) -> Ordering {
use Ordering::*;
match new_order.limit_price().cmp(&existing_order.limit_price()) {
Less => Less,
Equal => {
match new_order
.state()
.meta()
.ts_exchange_received()
.cmp(&existing_order.state().meta().ts_exchange_received())
{
Less => Greater, Equal => Equal,
Greater => Less,
}
}
Greater => Greater,
}
}
}
#[derive(Debug, PartialEq, Eq)]
pub struct Asks;
impl<I, const D: u8, BaseOrQuote, UserOrderIdT> Cmp<I, D, BaseOrQuote, UserOrderIdT> for Asks
where
I: Mon<D>,
BaseOrQuote: Currency<I, D>,
UserOrderIdT: UserOrderId,
{
#[inline(always)]
fn is_same_side(side: Side) -> bool {
side == Side::Sell
}
#[inline(always)]
fn cmp(
new_order: &LimitOrder<I, D, BaseOrQuote, UserOrderIdT, Pending<I, D, BaseOrQuote>>,
existing_order: &LimitOrder<I, D, BaseOrQuote, UserOrderIdT, Pending<I, D, BaseOrQuote>>,
) -> Ordering {
use Ordering::*;
match new_order.limit_price().cmp(&existing_order.limit_price()) {
Less => Greater,
Equal => {
match new_order
.state()
.meta()
.ts_exchange_received()
.cmp(&existing_order.state().meta().ts_exchange_received())
{
Less => Greater,
Equal => Equal,
Greater => Less,
}
}
Greater => Less,
}
}
}
pub trait Cmp<I, const D: u8, BaseOrQuote, UserOrderIdT>
where
I: Mon<D>,
BaseOrQuote: Currency<I, D>,
UserOrderIdT: UserOrderId,
{
fn is_same_side(side: Side) -> bool;
fn cmp(
new_order: &LimitOrder<I, D, BaseOrQuote, UserOrderIdT, Pending<I, D, BaseOrQuote>>,
existing_order: &LimitOrder<I, D, BaseOrQuote, UserOrderIdT, Pending<I, D, BaseOrQuote>>,
) -> Ordering;
}