         return ParserInput(stream.dropLast(n), at: location)
     }
 
+    public func split(maxSplits: Int, omittingEmptySubsequences: Bool,
+                      whereSeparator isSeparator: (Character) throws -> Bool) rethrows -> [ParserInput] {
+        return try stream.split(maxSplits: maxSplits,
+                                omittingEmptySubsequences: omittingEmptySubsequences,
+                                whereSeparator: isSeparator).map { sub in ParserInput(sub) }
+    }
+
 }
 
 extension ParserInput : CustomStringConvertible {


extension ParserInput : Sequence {

    public func split(maxSplits: Int, omittingEmptySubsequences: Bool,
                      whereSeparator isSeparator: (Character) throws -> Bool) rethrows -> [ParserInput] {
        return try stream.split(maxSplits: maxSplits,
                                omittingEmptySubsequences: omittingEmptySubsequences,
                                whereSeparator: isSeparator).map { sub in ParserInput(sub) }
    }


    public func prefix(_ maxLength: Int) -> ParserInput {
        return ParserInput(stream.prefix(maxLength), at: location)
    }

    public func suffix(_ maxLength: Int) -> ParserInput {
        return ParserInput(stream.suffix(maxLength), at: location)
    }


    public func makeIterator() -> String.CharacterView.Iterator {
        return stream.makeIterator()
    }

    public func drop(while predicate: (Character) throws -> Bool) rethrows -> ParserInput {
        var newLoc = location
        var rest = stream
        for char in stream {
            guard try predicate(char) else { break }
            rest.removeFirst()
            if char == "\n" {
                newLoc.line += 1
                newLoc.column = 0
            } else {
                newLoc.column += 1
            }
        }
        return ParserInput(rest, at: newLoc)
    }

    public func dropFirst() -> ParserInput {
