 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)
+    func collect<Indices : SequenceType where Index == Indices.Generator.Element>(indices: Indices) -> [Generator.Element] {
+        return Array(self.lazy.collect(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
+    func collect<Indices : SequenceType where Elements.Index == Indices.Generator.Element>(indices: Indices) -> LazyGatherSequence<Elements, Indices> {
+        return LazyGatherSequence(_base: self.elements, _indices: indices)
+    }
+    
+    @warn_unused_result
+    func collect<Indices : CollectionType where Elements.Index == Indices.Generator.Element>(indices: Indices) -> LazyGatherCollection<Elements, Indices> {
+        return LazyGatherCollection(_base: self.elements, _indices: indices)
     }
 }
 

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

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