 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]

        }
    }
    
    public var description: String {
        return "\(H[0]) -> \(H[1]) -> \(H[2])"
    }

        self.bottomDegree = Swift.min(chain0.offset,    chain1.offset,    chain2.offset)
    }
    
    internal func seqIndex(_ i: Int, _ n: Int) -> Int {
        return chainType.descending ? (topDegree - n) * 3 + i : (n - bottomDegree) * 3 + i
    }
    
    internal func gridIndex(_ k: Int) -> (Int, Int) {
        let (i, j) = (k >= 0) ? (k % 3, k / 3) : (k % 3 + 3, k / 3 - 1)
        return (i, chainType.descending ? topDegree - j : bottomDegree + j)
    }
    
    public subscript(i: Int, n: Int) -> Object {
        assert((0 ..< 3).contains(i))
        return H[i][n]
    }
    
    public subscript(k: Int) -> Object {
        return object(k)
    }
    
    public func object(_ k: Int) -> Object {
        let (i, n) = gridIndex(k)
        return H[i][n]
    }
    
    public func arrow(_ k: Int) -> Arrow {
        let i = gridIndex(k).0
        return map[i]
    }
    
    internal var degrees: [Int] {
