use crate::Dir;
use derive::FromValue;
use netidx_derive::Pack;
use rust_decimal::Decimal;
use rust_decimal_macros::dec;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Pack, FromValue)]
pub struct DirPair<T: 'static> {
pub buy: T,
pub sell: T,
}
impl<T: Default + 'static> Default for DirPair<T> {
fn default() -> Self {
Self { buy: T::default(), sell: T::default() }
}
}
impl<T: 'static> DirPair<T> {
pub fn get(&self, dir: Dir) -> &T {
match dir {
Dir::Buy => &self.buy,
Dir::Sell => &self.sell,
}
}
pub fn get_mut(&mut self, dir: Dir) -> &mut T {
match dir {
Dir::Buy => &mut self.buy,
Dir::Sell => &mut self.sell,
}
}
}
impl DirPair<Decimal> {
pub fn is_empty(&self) -> bool {
self.buy == dec!(0) && self.sell == dec!(0)
}
pub fn net(&self) -> Decimal {
self.buy - self.sell
}
}