fn begin_merge(batch1: Option<B>, batch2: Option<B>, compaction_frontier: AntichainRef<B::Time>) -> MergeState<B> {
        let variant =
        match (batch1, batch2) {
            (Some(batch1), Some(batch2)) => {
                assert!(batch1.upper() == batch2.lower());
                let begin_merge = <B as Batch>::begin_merge(&batch1, &batch2, compaction_frontier);
                MergeVariant::InProgress(batch1, batch2, begin_merge)
            }
            (None, Some(x)) => MergeVariant::Complete(Some((x, None))),
            (Some(x), None) => MergeVariant::Complete(Some((x, None))),
            (None, None) => MergeVariant::Complete(None),
        };

        MergeState::Double(variant)
    }
Initiates the merge of an "old" batch with a "new" batch.

The upper frontier of the old batch should match the lower
frontier of the new batch, with the resulting batch describing
their composed interval, from the lower frontier of the old
batch to the upper frontier of the new batch.

Either batch may be `None` which corresponds to a structurally
empty batch whose upper and lower froniers are equal. This
option exists purely for bookkeeping purposes, and no computation
is performed to merge the two batches.
differential-dataflow/src/trace/implementations/spine_fueled.rs