@Override
    @GuardedBy("this")
    public List<Stock<S>> removeMostProfitableFirst(Stock<S> traded) {
        List<Stock<S>> result = new ArrayList<>(0);

        ConcurrentNavigableMap<BigDecimal, Stock<S>> matched = book.tailMap(traded.price).descendingMap();

        if (matched.size() > 0) {

            // first, find the result
            result = new ArrayList<>(matched.size());
            int totalSize = 0;
            for (Stock<S> bookOrder : matched.values()) {
                if (totalSize >= traded.size) {
                    break;
                }

                totalSize += bookOrder.size;
                result.add(bookOrder);
            }

            // second, removes them
            for (Stock<S> matchedStock : result) {
                book.remove(matchedStock.price);
            }
        }
        return result;
    }