trade 0.1.0

Utilities for trading on crypto-currencies exchanges.
Documentation
#![cfg(test)]

use crate::Side;
use crate::tick::TickUnit;
use crate::order_book::{OrderBook, LimitUpdate};

fn lu(price: TickUnit, size: TickUnit, side: Side) -> LimitUpdate {
    LimitUpdate::new(price, size, side)
}

#[test]
fn test_diff() {
    let mut odb1 = OrderBook::new();
    odb1.update(lu(100, 10, Side::Ask));
    odb1.update(lu(90, 6, Side::Ask));
    odb1.update(lu(80, 8, Side::Bid));
    odb1.update(lu(77, 9, Side::Bid));

    let mut odb2 = OrderBook::new();
    odb2.update(lu(100, 10, Side::Ask));
    odb2.update(lu(91, 6, Side::Ask));
    odb2.update(lu(90, 3, Side::Ask));
    odb2.update(lu(78, 5, Side::Bid));
    odb2.update(lu(77, 4, Side::Bid));

    let mut diff: Vec<_> = odb1.diff(&odb2).collect();
    diff.sort_by(|x, y| x.price.cmp(&y.price));

    assert_eq!(
        diff,
        vec![
            lu(77, 4, Side::Bid),
            lu(78, 5, Side::Bid),
            lu(80, 0, Side::Bid),
            lu(90, 3, Side::Ask),
            lu(91, 6, Side::Ask),
        ]
    );

    for u in diff {
        odb1.update(u);
    }

    assert_eq!(odb1, odb2);

    let mut odb1 = OrderBook::new();
    for u in odb1.diff(&odb2) {
        odb1.update(u);
    }
    assert_eq!(odb1, odb2);
}