     }
 
 
+    /// Finds the Deepest node that can be merged "Right to Left", and returns the Left / Right matching touple, if any.
+    ///
+    private func findMergeableNodes(left: [ElementNode], right: [ElementNode]) -> [MergeablePair]? {
+        var currentIndex = 0
+        var matching = [MergeablePair]()
+
+        while currentIndex < left.count && currentIndex < right.count {
+            let left = left[currentIndex]
+            let right = right[currentIndex]
+
+            guard left.canMergeChildren(of: right) else {
+                break
+            }
+
+            let pair = MergeablePair(left: left, right: right)
+            matching.append(pair)
+            currentIndex += 1
+        }
+        
+        return matching.isEmpty ? nil : matching
+    }
+}
+
+
+// MARK: - Paragraph Nodes Extraction
+//
+extension NSAttributedStringToNodes {
+
     /// Returns the "Rightmost" Blocklevel Node from a collection fo nodes.
     ///
     func rightmostParagraphStyleElements(from nodes: [Node]) -> [ElementNode] {

}


// MARK: - Dimensionality
//
private extension NSAttributedStringToNodes {

    /// Attempts to merge the Right array of Element Nodes (Paragraph Level) into the Left array of Nodes.
    ///
    /// - We expect two collections of Mergeable Elements: Paragraph Level, with matching Names + Attributes
    /// - Last LI item is never merged
    /// - Last 'Mergeable' element is never merged (ie. <h1>Hello\nWorld</h1> >> <h1>Hello</h1><h1>World</h1>
    /// - The remaining elements will get merged
    ///
    func merge(left: [ElementNode], right: [ElementNode]) -> Bool {
        guard let mergeableNodes = findMergeableNodes(left: left, right: right)?.dropLast(),
            !mergeableNodes.isEmpty
        else {
            return false
        }

        guard let (target, source) = prefix(upTo: "li", from: mergeableNodes).last else {
            return false
        }

        target.children += source.children

        return true
    }



    ///
    /// - Output: [.ul]
    ///
    private func prefix(upToLast name: String, from nodes: ArraySlice<MergeablePair>) -> ArraySlice<MergeablePair> {
        var lastItemIndex: Int?
        for (index, node) in nodes.enumerated().reversed() where node.left.name == name {
            lastItemIndex = index
