     }
 }
 
-public extension CollectionType {
-    
-    /// Returns sub-sequence of `self`.
-    var slice: Self.SubSequence {
-        return self as? Self.SubSequence ?? self[self.indices]
-    }
-}
-
 public extension GeneratorType {
     
     /// Returns the first element of `self`, or `nil` if `self` is empty.
-    var first: Self.Element? {
+    var first: Element? {
         var generator = self
         return generator.next()
     }

    
    /// Return an `Array` containing tuples satisfies `predicate` with each elements of two `sources`.
    @warn_unused_result
    func merge<S : SequenceType>(with: S, @noescape predicate: (Self.Generator.Element, S.Generator.Element) throws -> Bool) rethrows -> [(Self.Generator.Element, S.Generator.Element)] {
        var result: [(Self.Generator.Element, S.Generator.Element)] = []
        for lhs in self {
            for rhs in with where try predicate(lhs, rhs) {
                result.append((lhs, rhs))

    /// - Complexity: O(`elements.count`).
    ///
    @warn_unused_result
    public func maxElement<R : Comparable>(@noescape by: (Generator.Element) throws -> R) rethrows -> Generator.Element? {
        return try self.maxElement { try by($0) < by($1) }
    }
}
