   
   func matched<C: Collection>(atStartOf c: C) -> MatchResult<M0.Index, MatchData>
   where C.Index == M0.Index, C.Element == M0.Element
-  // The following requirements go away with upcoming generics features
-  , C.SubSequence : Collection  
   {
     var lastEnd = c.startIndex
     var rest = c.dropFirst(0)


  func matched<C: Collection>(atStartOf c: C) -> MatchResult<Index, MatchData>
  where C.Index == Index, C.Element == Element
  // The following requirements go away with upcoming generics features
  , C.SubSequence : Collection  
  {
    var src0 = c[c.startIndex..<c.endIndex]
    while true {

  
  func matched<C: Collection>(atStartOf c: C) -> MatchResult<Index, ()>
  where C.Index == Index, C.Element == Element
  {
    var i = c.startIndex
    for p in pattern {
