 }
 
 
-// MARK: - Merge
+// MARK: - Merge: Styles
+//
+private extension NSAttributedStringToNodes {
+
+    ///
+    ///
+    typealias Branch = (styles: [ElementNode], leaves: [Node])
+
+
+    ///
+    ///
+    func merge(branches: [Branch]) -> [Node] {
+        return branches.flatMap { branch in
+            return self.reduce(nodes: branch.styles, leaves: branch.leaves)
+        }
+    }
+}
+
+
+// MARK: - Merge: Paragraphs
 //
 private extension NSAttributedStringToNodes {
 

            return []
        }

        var children = [Node]()

        paragraph.enumerateAttributes(in: paragraph.rangeOfEntireString, options: []) { (attrs, range, _) in


            let leafNodes = createLeafNodes(from: substring)
            let styleNodes = createStyleNodes(from: attrs)

            let branch = Branch(styles: styleNodes, leaves: leafNodes)
            branches.append(branch)
        }

        let paragraphNodes = createParagraphNodes(from: paragraph)
        let paragraphChildren = merge(branches: branches)

        return reduce(nodes: paragraphNodes, leaves: paragraphChildren)
    }
}


// MARK: - Merge: Helpers
//
private extension NSAttributedStringToNodes {

    /// Sets Up a collection of Nodes and Leaves as a chain of Parent-Children, and returns the root node.and
    /// If the collection of nodes is empty, will return the leaves parameters 'as is'.
    ///
    func reduce(nodes: [ElementNode], leaves: [Node]) -> [Node] {
        return nodes.reduce(leaves) { (result, node) in
            node.children = result
            return [node]
