contract LibFillResults {
    using LibSafeMath for uint256;

    struct FillResults {
        uint256 makerAssetFilledAmount;  // Total amount of makerAsset(s) filled.
        uint256 takerAssetFilledAmount;  // Total amount of takerAsset(s) filled.
        uint256 makerFeePaid;            // Total amount of ZRX paid by maker(s) to feeRecipient(s).
        uint256 takerFeePaid;            // Total amount of ZRX paid by taker to feeRecipients(s).
    }

    struct MatchedFillResults {
        FillResults left;                    // Amounts filled and fees paid of left order.
        FillResults right;                   // Amounts filled and fees paid of right order.
        uint256 leftMakerAssetSpreadAmount;  // Spread between price of left and right order, denominated in the left order's makerAsset, paid to taker.
    }

    /// @dev Adds properties of both FillResults instances.
    ///      Modifies the first FillResults instance specified.
    /// @param totalFillResults Fill results instance that will be added onto.
    /// @param singleFillResults Fill results instance that will be added to totalFillResults.
    function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)
        internal
        pure
    {
        totalFillResults.makerAssetFilledAmount = totalFillResults.makerAssetFilledAmount.safeAdd(singleFillResults.makerAssetFilledAmount);
        totalFillResults.takerAssetFilledAmount = totalFillResults.takerAssetFilledAmount.safeAdd(singleFillResults.takerAssetFilledAmount);
        totalFillResults.makerFeePaid = totalFillResults.makerFeePaid.safeAdd(singleFillResults.makerFeePaid);
        totalFillResults.takerFeePaid = totalFillResults.takerFeePaid.safeAdd(singleFillResults.takerFeePaid);
    }
}
function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)
    internal
    pure
{
    totalFillResults.makerAssetFilledAmount = totalFillResults.makerAssetFilledAmount.safeAdd(singleFillResults.makerAssetFilledAmount);
    totalFillResults.takerAssetFilledAmount = totalFillResults.takerAssetFilledAmount.safeAdd(singleFillResults.takerAssetFilledAmount);
    totalFillResults.makerFeePaid = totalFillResults.makerFeePaid.safeAdd(singleFillResults.makerFeePaid);
    totalFillResults.takerFeePaid = totalFillResults.takerFeePaid.safeAdd(singleFillResults.takerFeePaid);
}

/// @dev Adds properties of both FillResults instances.
///      Modifies the first FillResults instance specified.
/// @param totalFillResults Fill results instance that will be added onto.
/// @param singleFillResults Fill results instance that will be added to totalFillResults.