       result.append(try transform(element))
     }
     return result
+  }
+
+  @warn_unused_result
+  public func dropFirst(n: Int) -> SubSequence {
+    _precondition(n >= 0, "Can't drop a negative number of elements from a collection")
+    fatalError("implement")
+  }
+
+  @warn_unused_result
+  public func dropLast(n: Int) -> SubSequence {
+    _precondition(n >= 0, "Can't drop a negative number of elements from a collection")
+    fatalError("implement")
+  }
+
+  @warn_unused_result
+  public func prefix(maxLength: Int) -> SubSequence {
+    _precondition(maxLength >= 0, "Can't take a prefix of negative length from a collection")
+    fatalError("implement")
+  }
+
+  @warn_unused_result
+  public func suffix(maxLength: Int) -> SubSequence {
+    _precondition(maxLength >= 0, "Can't take a suffix of negative length from a collection")
+    fatalError("implement")
   }
 }
 

  expectEmpty(MyArray([1,2,3]).indexOf(42))
}

NewCollection.test("first") {
  expectOptionalEqual(1, MyArray([1,2,3]).first)
  expectEmpty(MyArray<Int>().first)

public protocol MySequenceType {
  associatedtype Generator : MyGeneratorType
  associatedtype SubSequence /* : MySequenceType */

  func generate() -> Generator

  @warn_unused_result
  func map<T>(
    @noescape transform: (Generator.Element) throws -> T
  ) rethrows -> [T]

  @warn_unused_result
  func dropFirst(n: Int) -> SubSequence

  @warn_unused_result
  func dropLast(n: Int) -> SubSequence

  @warn_unused_result
  func prefix(maxLength: Int) -> SubSequence

  @warn_unused_result
  func suffix(maxLength: Int) -> SubSequence
}
extension MySequenceType {
  @warn_unused_result
