From 5cae667cafada8056b37bb912dd290eb3017dc5c Mon Sep 17 00:00:00 2001 From: Stephen Celis Date: Tue, 7 Sep 2021 10:21:15 -0400 Subject: [PATCH] Prefix should match when maxLength < match.count (#50) * Prefix should match when maxLength < match.count * cleanup * wip --- Package.resolved | 2 +- Sources/Parsing/Parsers/Prefix.swift | 19 ++++++------------- Tests/ParsingTests/PrefixTests.swift | 6 ++++++ 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/Package.resolved b/Package.resolved index 8c3f8f8d85..a3e911222c 100644 --- a/Package.resolved +++ b/Package.resolved @@ -11,7 +11,7 @@ } }, { - "package": "swift-benchmark", + "package": "Benchmark", "repositoryURL": "https://github.com/google/swift-benchmark", "state": { "branch": null, diff --git a/Sources/Parsing/Parsers/Prefix.swift b/Sources/Parsing/Parsers/Prefix.swift index d79127c86b..b7e4ec52bc 100644 --- a/Sources/Parsing/Parsers/Prefix.swift +++ b/Sources/Parsing/Parsers/Prefix.swift @@ -148,19 +148,12 @@ where @inlinable public func parse(_ input: inout Input) -> Input? { - if let predicate = self.predicate { - let prefix = input.prefix(while: predicate) - let count = prefix.count - guard count >= self.minLength, self.maxLength.map({ count <= $0 }) ?? true else { return nil } - input.removeFirst(count) - return prefix - } else { - let prefix = self.maxLength.map(input.prefix) ?? input - let count = prefix.count - guard count >= self.minLength else { return nil } - input.removeFirst(count) - return prefix - } + var prefix = maxLength.map(input.prefix) ?? input + prefix = predicate.map { prefix.prefix(while: $0) } ?? prefix + let count = prefix.count + guard count >= self.minLength else { return nil } + input.removeFirst(count) + return prefix } } diff --git a/Tests/ParsingTests/PrefixTests.swift b/Tests/ParsingTests/PrefixTests.swift index 42ab140bd6..9acfc9e5d6 100644 --- a/Tests/ParsingTests/PrefixTests.swift +++ b/Tests/ParsingTests/PrefixTests.swift @@ -61,4 +61,10 @@ final class PrefixTests: XCTestCase { XCTAssertEqual("42", Prefix(...10, while: { $0.isNumber }).parse(&input)) XCTAssertEqual(" Hello, world!", input) } + + func testPrefixLengthFromWhileSuccess() { + var input = "42 Hello, world!"[...] + XCTAssertEqual("4", Prefix(1, while: { $0.isNumber }).parse(&input)) + XCTAssertEqual("2 Hello, world!", input) + } }