 public struct _HomologyExactSequence<chainType: ChainType, A: FreeModuleBase, R: EuclideanRing>: Sequence, CustomStringConvertible {
     public typealias Object = _Homology<chainType, A, R>.Summand
     public typealias Arrow  = _HomologyMap<chainType, A, A, R>
-    public typealias Element = (Object, Arrow)
     
     internal let H:    [_Homology<chainType, A, R>]       // [0,      1,      2]
     internal let map : [_HomologyMap<chainType, A, A, R>] // [0 -> 1, 1 -> 2, 2 -> 0]

            : (bottomDegree ... topDegree).toArray()
    }
    
    public func assertExactness(at i1: Int, _ n1: Int, debug: Bool = false) {
        if H[i1][n1].isTrivial {
            return
        }
        
        let (i0, n0) = (i1 > 0) ? (i1 - 1, n1) : (2, n1 + 1)
        let (i2, n2) = (i1 < 2) ? (i1 + 1, n1) : (0, n1 - 1)
        
        let (H0, H1, H2) = (H[i0][n0], H[i1][n1], H[i2][n2])
        let (f0, f1) =     (map[i0],   map[i1])
        
        debugLog(print: debug, "----------\nExactness at \(H[i1])[\((n1))]\n\(H0) -> * \(H1) * -> \(H2)\n----------")
        
        // Im ⊂ Ker
        for x in H0.generators {

        }
    }
    
    public func makeIterator() -> AnyIterator<Object> {
        let lazy = (0 ..< (topDegree - bottomDegree + 1) * 3).lazy.map{ k in self.object(k) }
        return AnyIterator(lazy.makeIterator())
    }
    
    public var description: String {
        return "\(H[0]) -> \(H[1]) -> \(H[2])"
    }
