         return (head + body).map{ $0.joined(separator: s) }.joined(separator: "\n")
     }
     
-    public static func table<S: Sequence, T>(elements: S, default d: String = "", symbol: String = "j\\i", separator s: String = "\t", printHeaders: Bool = true) -> String where S.Element == (Int, Int, T) {
+    public static func table<S, T>(elements: S, default d: String = "", symbol: String = "j\\i", separator s: String = "\t", printHeaders: Bool = true) -> String
+    where S: Sequence, S.Element == (Int, Int, T) {
         let dict = Dictionary(elements.map{ (i, j, t) in ([i, j], t) } )
         if dict.isEmpty {
             return "empty"

            dict[ [i, j] ].map{ "\($0)" } ?? d
        }
    }
}

public extension AdditiveGroup {

            }
    }
    
    public static func table<S1, S2, T>(rows: S1, cols: S2, symbol: String = "", separator s: String = "\t", printHeaders: Bool = true, op: (S1.Element, S2.Element) -> T) -> String
    where S1: Sequence, S2: Sequence {
        let head = printHeaders ? [[symbol] + cols.map{ y in "\(y)" }] : []
        let body = rows.enumerated().map { (i, x) -> [String] in
            let head = printHeaders ? ["\(x)"] : []
