             case .color(let c): return "ss:Color=\"\(c.hexString())\""
             }
         }
+        
+        public static func ==(lhs: FontStyle, rhs: FontStyle) -> Bool {
+            switch (lhs, rhs) {
+            case (.bold, .bold): return true
+            case (.color(let l), .color(let r)): return l == r
+            default: return false
+            }
+        }
     }
     
     case backgroundColor(Color)


public enum TextAttribute {
    
    public enum FontStyle {
        case color(Color), bold
        
        var parsed: String {

                    let data = "<Data ss:Type=\"\(cell.type.rawValue)\">\(cell.value)</Data>"
                    
                    //style
                    let styleId: String
                    let styleValue = TextAttribute.styleValue(for: cell.attributes)
                    if let id = styles.filter({ k, v in v == styleValue }).first?.key {
                        styleId = id //reuse existing style
                    } else {
                        styleId = appendStyle(styleValue) //create new style
                    }
                    
                    let merge = cell.colspan.map{ "ss:MergeAcross=\"\($0)\"" } ?? ""
                    
