     }
 }
 
-public struct GatherCollection<C : CollectionType, Indices : CollectionType where C.Index == Indices.Generator.Element> : CollectionType {
-    
-    public typealias Generator = GatherGenerator<C, Indices.Generator>
+public struct LazyGatherCollection<C : CollectionType, Indices : CollectionType where C.Index == Indices.Generator.Element> : LazyCollectionType {
+    
+    public typealias Generator = LazyGatherGenerator<C, Indices.Generator>
     
     public typealias Index = Indices.Index
     public typealias Element = C.Generator.Element

public extension CollectionType {
    
    @warn_unused_result
    func collect<Indices : SequenceType where Index == Indices.Generator.Element>(indices: Indices) -> GatherSequence<Self, Indices> {
        return GatherSequence(_base: self, _indices: indices)
    }
    
    @warn_unused_result
    func collect<Indices : CollectionType where Index == Indices.Generator.Element>(indices: Indices) -> GatherCollection<Self, Indices> {
        return GatherCollection(_base: self, _indices: indices)
    }
}

public extension LazyCollectionType {
    
    @warn_unused_result
    func collect<Indices : SequenceType where Elements.Index == Indices.Generator.Element>(indices: Indices) -> LazySequence<GatherSequence<Elements, Indices>> {
        return self.elements.collect(indices).lazy
    }
    
    @warn_unused_result
    func collect<Indices : CollectionType where Elements.Index == Indices.Generator.Element>(indices: Indices) -> LazyCollection<GatherCollection<Elements, Indices>> {
        return self.elements.collect(indices).lazy
    }
}


    }
    
    public func generate() -> Generator {
        return LazyGatherGenerator(seq: _base, indices: _indices.generate())
    }
    
    public func underestimateCount() -> Int {
