diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index d86995350b..209c7e6773 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -50,3 +50,16 @@ jobs:
- uses: MaxDesiatov/swift-windows-action@v1
with:
swift-version: "5.5.1"
+
+ library-evolution:
+ runs-on: macos-11
+ strategy:
+ matrix:
+ xcode:
+ - "13.2.1" # Swift 5.5
+ steps:
+ - uses: actions/checkout@v2
+ - name: Select Xcode ${{ matrix.xcode }}
+ run: sudo xcode-select -s /Applications/Xcode_${{ matrix.xcode }}.app
+ - name: Build for library evolution
+ run: make build-for-library-evolution
diff --git a/Makefile b/Makefile
index 2fe6249454..c07fad5993 100644
--- a/Makefile
+++ b/Makefile
@@ -34,6 +34,14 @@ test-swift:
--enable-test-discovery \
--parallel
+build-for-library-evolution:
+ swift build \
+ -c release \
+ --target Parsing \
+ -Xswiftc -emit-module-interface \
+ -Xswiftc -enable-library-evolution
+
+
format:
swift format --in-place --recursive \
./Package.swift ./Sources ./Tests
diff --git a/Sources/Parsing/Builders/OneOfBuilder.swift b/Sources/Parsing/Builders/OneOfBuilder.swift
index 150babbe39..4571426028 100644
--- a/Sources/Parsing/Builders/OneOfBuilder.swift
+++ b/Sources/Parsing/Builders/OneOfBuilder.swift
@@ -131,7 +131,13 @@ public enum OneOfBuilder {
where P0.Input == P1.Input, P0.Output == P1.Output {
public let p0: P0, p1: P1
- @inlinable public init(_ p0: P0, _ p1: P1) {
+ @inlinable
+ public init(_ p0: P0, _ p1: P1) {
+ self.init(internal: p0, p1)
+ }
+
+ @usableFromInline
+ init(internal p0: P0, _ p1: P1) {
self.p0 = p0
self.p1 = p1
}
diff --git a/Sources/Parsing/Conversions/AnyConversion.swift b/Sources/Parsing/Conversions/AnyConversion.swift
index 17a0a7f01c..bf23d78087 100644
--- a/Sources/Parsing/Conversions/AnyConversion.swift
+++ b/Sources/Parsing/Conversions/AnyConversion.swift
@@ -117,8 +117,14 @@ public struct AnyConversion: Conversion {
/// - Parameter conversion: A conversion to wrap with a type eraser.
@inlinable
public init(_ conversion: C) where C.Input == Input, C.Output == Output {
+ self.init(internal: conversion)
+ }
+
+ @usableFromInline
+ init(internal conversion: C) where C.Input == Input, C.Output == Output {
self._apply = conversion.apply
self._unapply = conversion.unapply
+
}
/// Creates a conversion that wraps the given closures in its ``apply(_:)`` and ``unapply(_:)``
@@ -135,6 +141,14 @@ public struct AnyConversion: Conversion {
public init(
apply: @escaping (Input) -> Output?,
unapply: @escaping (Output) -> Input?
+ ) {
+ self.init(internal: apply, unapply: unapply)
+ }
+
+ @usableFromInline
+ init(
+ internal apply: @escaping (Input) -> Output?,
+ unapply: @escaping (Output) -> Input?
) {
self._apply = {
guard let value = apply($0)
diff --git a/Sources/Parsing/Conversions/Identity.swift b/Sources/Parsing/Conversions/Identity.swift
index c407d2c8ab..29f14b2f00 100644
--- a/Sources/Parsing/Conversions/Identity.swift
+++ b/Sources/Parsing/Conversions/Identity.swift
@@ -3,7 +3,12 @@ import Foundation
extension Conversions {
public struct Identity: Conversion {
@inlinable
- public init() {}
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
@inlinable
@inline(__always)
diff --git a/Sources/Parsing/Conversions/JSON.swift b/Sources/Parsing/Conversions/JSON.swift
index 16816ec76d..2416589a0e 100644
--- a/Sources/Parsing/Conversions/JSON.swift
+++ b/Sources/Parsing/Conversions/JSON.swift
@@ -64,6 +64,19 @@ extension Conversions {
_ type: Value.Type,
decoder: JSONDecoder = .init(),
encoder: JSONEncoder = .init()
+ ) {
+ self.init(
+ internal: type,
+ decoder: decoder,
+ encoder: encoder
+ )
+ }
+
+ @usableFromInline
+ init(
+ internal type: Value.Type,
+ decoder: JSONDecoder = .init(),
+ encoder: JSONEncoder = .init()
) {
self.decoder = decoder
self.encoder = encoder
diff --git a/Sources/Parsing/Conversions/RawRepresentable.swift b/Sources/Parsing/Conversions/RawRepresentable.swift
index 5400543b3b..a859df6e28 100644
--- a/Sources/Parsing/Conversions/RawRepresentable.swift
+++ b/Sources/Parsing/Conversions/RawRepresentable.swift
@@ -79,7 +79,12 @@ extension Conversions {
/// the ``Conversion/representing(_:)-swift.type.method`` operation, which constructs this type.
public struct FromRawValue: Conversion {
@inlinable
- public init() {}
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
@inlinable
public func apply(_ input: Output.RawValue) throws -> Output {
diff --git a/Sources/Parsing/Conversions/String.swift b/Sources/Parsing/Conversions/String.swift
index c6ca29f564..c3abed3fb7 100644
--- a/Sources/Parsing/Conversions/String.swift
+++ b/Sources/Parsing/Conversions/String.swift
@@ -46,7 +46,12 @@ extension Conversions {
/// the ``Conversion/string-swift.type.property-3u2b5`` operation, which constructs this type.
public struct SubstringToString: Conversion {
@inlinable
- public init() {}
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
@inlinable
public func apply(_ input: Substring) -> String {
@@ -69,7 +74,12 @@ extension Conversions {
Input.Element == UTF8.CodeUnit
{
@inlinable
- public init() {}
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
@inlinable
public func apply(_ input: Input) -> String {
diff --git a/Sources/Parsing/Conversions/Substring.swift b/Sources/Parsing/Conversions/Substring.swift
index 845c49757b..abcf4cb7a4 100644
--- a/Sources/Parsing/Conversions/Substring.swift
+++ b/Sources/Parsing/Conversions/Substring.swift
@@ -55,7 +55,12 @@ extension Conversions {
/// type under the hood.
public struct UnicodeScalarViewToSubstring: Conversion {
@inlinable
- public init() {}
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
@inlinable
public func apply(_ input: Substring.UnicodeScalarView) -> Substring {
@@ -74,8 +79,13 @@ extension Conversions {
/// the ``Conversion/substring-swift.type.property-4r1aj`` operation, which constructs this type.
public struct UTF8ViewToSubstring: Conversion {
@inlinable
- public init() {}
-
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
+
@inlinable
public func apply(_ input: Substring.UTF8View) -> Substring {
Substring(input)
diff --git a/Sources/Parsing/Conversions/UTF8View.swift b/Sources/Parsing/Conversions/UTF8View.swift
index a3b7709b39..8c3834a859 100644
--- a/Sources/Parsing/Conversions/UTF8View.swift
+++ b/Sources/Parsing/Conversions/UTF8View.swift
@@ -22,7 +22,12 @@ extension Conversions {
/// the ``Conversion/utf8-swift.type.property`` operation, which constructs this type.
public struct SubstringToUTF8View: Conversion {
@inlinable
- public init() {}
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
@inlinable
public func apply(_ input: Substring) -> Substring.UTF8View {
diff --git a/Sources/Parsing/Internal/Deprecations.swift b/Sources/Parsing/Internal/Deprecations.swift
index 14feab02c8..f5bbc37ddf 100644
--- a/Sources/Parsing/Internal/Deprecations.swift
+++ b/Sources/Parsing/Internal/Deprecations.swift
@@ -540,6 +540,11 @@ where InputToBytes.Input: PrependableCollection, InputToBytes.Output: Prependabl
extension Newline {
@inlinable
public init() where InputToBytes == Conversions.Identity {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) where InputToBytes == Conversions.Identity {
self.inputToBytes = .init()
}
}
@@ -549,6 +554,11 @@ extension Newline where InputToBytes == Conversions.SubstringToUTF8View {
@_disfavoredOverload
@inlinable
public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {
self.inputToBytes = .init()
}
}
@@ -581,12 +591,25 @@ extension Prefix {
minLength: Int,
maxLength: Int?,
while predicate: @escaping (Input.Element) -> Bool
+ ) {
+ self.init(
+ minLength: minLength,
+ maxLength: maxLength,
+ predicate: predicate
+ )
+ }
+
+ @usableFromInline
+ init(
+ minLength: Int,
+ maxLength: Int?,
+ predicate: @escaping (Input.Element) -> Bool
) {
self.minimum = minLength
self.maximum = maxLength
self.predicate = predicate
}
-
+
@available(
*, deprecated,
message: "Use the initializer that takes a Length (Int or range expression), instead."
@@ -595,6 +618,18 @@ extension Prefix {
public init(
minLength: Int,
while predicate: @escaping (Input.Element) -> Bool
+ ) {
+ self.init(
+ minLength: minLength,
+ predicate: predicate
+ )
+ }
+
+ @usableFromInline
+ init(
+ minLength: Int,
+ predicate: @escaping (Input.Element) -> Bool
+
) {
self.minimum = minLength
self.maximum = nil
@@ -609,6 +644,14 @@ extension Prefix {
public init(
maxLength: Int,
while predicate: @escaping (Input.Element) -> Bool
+ ) {
+ self.init(maxLength: maxLength, predicate: predicate)
+ }
+
+ @usableFromInline
+ init(
+ maxLength: Int,
+ predicate: @escaping (Input.Element) -> Bool
) {
self.minimum = 0
self.maximum = maxLength
@@ -721,6 +764,11 @@ where SubstringParser.Input == Substring {
extension FromSubstring where Input == ArraySlice {
@inlinable
public init(@ParserBuilder _ build: () -> SubstringParser) {
+ self.init(internal: build)
+ }
+
+ @usableFromInline
+ init(@ParserBuilder internal build: () -> SubstringParser) {
self.substringParser = build()
self.toSubstring = { Substring(decoding: $0, as: UTF8.self) }
self.fromSubstring = { ArraySlice($0.utf8) }
@@ -731,6 +779,11 @@ extension FromSubstring where Input == ArraySlice {
extension FromSubstring where Input == Substring.UnicodeScalarView {
@inlinable
public init(@ParserBuilder _ build: () -> SubstringParser) {
+ self.init(build, internal: ())
+ }
+
+ @usableFromInline
+ init(@ParserBuilder _ build: () -> SubstringParser, internal: Void) {
self.substringParser = build()
self.toSubstring = Substring.init
self.fromSubstring = \.unicodeScalars
@@ -741,6 +794,11 @@ extension FromSubstring where Input == Substring.UnicodeScalarView {
extension FromSubstring where Input == Substring.UTF8View {
@inlinable
public init(@ParserBuilder _ build: () -> SubstringParser) {
+ self.init(internal: build)
+ }
+
+ @usableFromInline
+ init(@ParserBuilder internal build: () -> SubstringParser) {
self.substringParser = build()
self.toSubstring = Substring.init
self.fromSubstring = \.utf8
@@ -766,6 +824,11 @@ where UnicodeScalarsParser.Input == Substring.UnicodeScalarView {
extension FromUnicodeScalarView where Input == ArraySlice {
@inlinable
public init(@ParserBuilder _ build: () -> UnicodeScalarsParser) {
+ self.init(internal: build)
+ }
+
+ @usableFromInline
+ init(@ParserBuilder internal build: () -> UnicodeScalarsParser) {
self.unicodeScalarsParser = build()
self.toUnicodeScalars = { Substring(decoding: $0, as: UTF8.self).unicodeScalars }
self.fromUnicodeScalars = { ArraySlice(Substring($0).utf8) }
@@ -776,6 +839,10 @@ extension FromUnicodeScalarView where Input == ArraySlice {
extension FromUnicodeScalarView where Input == Substring {
@inlinable
public init(@ParserBuilder _ build: () -> UnicodeScalarsParser) {
+ self.init(internal: build)
+ }
+ @usableFromInline
+ init(@ParserBuilder internal build: () -> UnicodeScalarsParser) {
self.unicodeScalarsParser = build()
self.toUnicodeScalars = \.unicodeScalars
self.fromUnicodeScalars = Substring.init
@@ -786,6 +853,11 @@ extension FromUnicodeScalarView where Input == Substring {
extension FromUnicodeScalarView where Input == Substring.UTF8View {
@inlinable
public init(@ParserBuilder _ build: () -> UnicodeScalarsParser) {
+ self.init(internal: build)
+ }
+
+ @usableFromInline
+ init(@ParserBuilder internal build: () -> UnicodeScalarsParser) {
self.unicodeScalarsParser = build()
self.toUnicodeScalars = { Substring($0).unicodeScalars }
self.fromUnicodeScalars = { Substring($0).utf8 }
@@ -811,6 +883,11 @@ where UTF8Parser.Input == Substring.UTF8View {
extension FromUTF8View where Input == Substring {
@inlinable
public init(@ParserBuilder _ build: () -> UTF8Parser) {
+ self.init(internal: build)
+ }
+
+ @usableFromInline
+ init(@ParserBuilder internal build: () -> UTF8Parser) {
self.utf8Parser = build()
self.toUTF8 = \.utf8
self.fromUTF8 = Substring.init
@@ -821,6 +898,11 @@ extension FromUTF8View where Input == Substring {
extension FromUTF8View where Input == Substring.UnicodeScalarView {
@inlinable
public init(@ParserBuilder _ build: () -> UTF8Parser) {
+ self.init(internal: build)
+ }
+
+ @usableFromInline
+ init(@ParserBuilder internal build: () -> UTF8Parser) {
self.utf8Parser = build()
self.toUTF8 = { Substring($0).utf8 }
self.fromUTF8 = { Substring($0).unicodeScalars }
diff --git a/Sources/Parsing/ParserPrinters/Always.swift b/Sources/Parsing/ParserPrinters/Always.swift
index 173b420a23..59fdd7b988 100644
--- a/Sources/Parsing/ParserPrinters/Always.swift
+++ b/Sources/Parsing/ParserPrinters/Always.swift
@@ -66,6 +66,11 @@ public struct Always: ParserPrinter {
@inlinable
public init(_ output: Output) {
+ self.init(internal: output)
+ }
+
+ @usableFromInline
+ init(internal output: Output) {
self.output = output
}
@@ -81,6 +86,11 @@ public struct Always: ParserPrinter {
extension Always where Input == Substring {
@inlinable
public init(_ output: Output) {
+ self.init(internal: output)
+ }
+
+ @usableFromInline
+ init(internal output: Output) {
self.output = output
}
}
@@ -88,6 +98,11 @@ extension Always where Input == Substring {
extension Always where Input == Substring.UTF8View {
@inlinable
public init(_ output: Output) {
+ self.init(internal: output)
+ }
+
+ @usableFromInline
+ init(internal output: Output) {
self.output = output
}
}
diff --git a/Sources/Parsing/ParserPrinters/AnyParserPrinter.swift b/Sources/Parsing/ParserPrinters/AnyParserPrinter.swift
index 46fc928b20..096fb529ec 100644
--- a/Sources/Parsing/ParserPrinters/AnyParserPrinter.swift
+++ b/Sources/Parsing/ParserPrinters/AnyParserPrinter.swift
@@ -51,6 +51,14 @@ public struct AnyParserPrinter: ParserPrinter {
public init(
parse: @escaping (inout Input) throws -> Output,
print: @escaping (Output, inout Input) throws -> Void
+ ) {
+ self.init(internal: parse, print: print)
+ }
+
+ @usableFromInline
+ init(
+ internal parse: @escaping (inout Input) throws -> Output,
+ print: @escaping (Output, inout Input) throws -> Void
) {
self.parser = parse
self.printer = print
diff --git a/Sources/Parsing/ParserPrinters/Bool.swift b/Sources/Parsing/ParserPrinters/Bool.swift
index 4e290ae5de..7de9fbb260 100644
--- a/Sources/Parsing/ParserPrinters/Bool.swift
+++ b/Sources/Parsing/ParserPrinters/Bool.swift
@@ -61,7 +61,12 @@ extension Parsers {
Input.Element == UTF8.CodeUnit
{
@inlinable
- public init() {}
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
@inlinable
public func parse(_ input: inout Input) throws -> Bool {
diff --git a/Sources/Parsing/ParserPrinters/Consumed.swift b/Sources/Parsing/ParserPrinters/Consumed.swift
index 2c0743a039..3c77dc37fd 100644
--- a/Sources/Parsing/ParserPrinters/Consumed.swift
+++ b/Sources/Parsing/ParserPrinters/Consumed.swift
@@ -8,6 +8,11 @@ where
@inlinable
public init(@ParserBuilder _ build: () -> Upstream) {
+ self.init(internal: build)
+ }
+
+ @usableFromInline
+ init(internal build: () -> Upstream) {
self.upstream = build()
}
diff --git a/Sources/Parsing/ParserPrinters/End.swift b/Sources/Parsing/ParserPrinters/End.swift
index a2374433e8..a1c12c6b6e 100644
--- a/Sources/Parsing/ParserPrinters/End.swift
+++ b/Sources/Parsing/ParserPrinters/End.swift
@@ -18,7 +18,12 @@
/// > ``Parser/parse(_:)-6h1d0`` and ``Parser/parse(_:)-2wzcq`` methods.
public struct End: ParserPrinter {
@inlinable
- public init() {}
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
@inlinable
public func parse(_ input: inout Input) throws {
@@ -51,13 +56,23 @@ public struct End: ParserPrinter {
extension End where Input == Substring {
@_disfavoredOverload
@inlinable
- public init() {}
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
}
extension End where Input == Substring.UTF8View {
@_disfavoredOverload
@inlinable
- public init() {}
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
}
extension Parsers {
diff --git a/Sources/Parsing/ParserPrinters/Fail.swift b/Sources/Parsing/ParserPrinters/Fail.swift
index 37845b1b7e..8e893d6c26 100644
--- a/Sources/Parsing/ParserPrinters/Fail.swift
+++ b/Sources/Parsing/ParserPrinters/Fail.swift
@@ -34,6 +34,11 @@ public struct Fail: ParserPrinter {
/// - Parameter error: An error to throw when the parser is run.
@inlinable
public init(throwing error: Error) {
+ self.init(internal: error)
+ }
+
+ @usableFromInline
+ init(internal error: Error) {
self.error = error
}
diff --git a/Sources/Parsing/ParserPrinters/Filter.swift b/Sources/Parsing/ParserPrinters/Filter.swift
index e44c98c594..447eeb9ad8 100644
--- a/Sources/Parsing/ParserPrinters/Filter.swift
+++ b/Sources/Parsing/ParserPrinters/Filter.swift
@@ -38,6 +38,11 @@ extension Parsers {
@inlinable
public init(upstream: Upstream, predicate: @escaping (Upstream.Output) -> Bool) {
+ self.init(internal: upstream, predicate: predicate)
+ }
+
+ @usableFromInline
+ init(internal upstream: Upstream, predicate: @escaping (Upstream.Output) -> Bool) {
self.upstream = upstream
self.predicate = predicate
}
diff --git a/Sources/Parsing/ParserPrinters/First.swift b/Sources/Parsing/ParserPrinters/First.swift
index 02beeb9e41..5c3bef5f94 100644
--- a/Sources/Parsing/ParserPrinters/First.swift
+++ b/Sources/Parsing/ParserPrinters/First.swift
@@ -23,7 +23,12 @@
/// ```
public struct First: Parser where Input.SubSequence == Input {
@inlinable
- public init() {}
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
@inlinable
public func parse(_ input: inout Input) throws -> Input.Element {
@@ -45,13 +50,23 @@ extension First: ParserPrinter where Input: PrependableCollection {
extension First where Input == Substring {
@_disfavoredOverload
@inlinable
- public init() {}
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
}
extension First where Input == Substring.UTF8View {
@_disfavoredOverload
@inlinable
- public init() {}
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
}
extension Parsers {
diff --git a/Sources/Parsing/ParserPrinters/Float.swift b/Sources/Parsing/ParserPrinters/Float.swift
index ae76601a56..953937d23d 100644
--- a/Sources/Parsing/ParserPrinters/Float.swift
+++ b/Sources/Parsing/ParserPrinters/Float.swift
@@ -67,7 +67,12 @@ extension Parsers {
Output: LosslessStringConvertible
{
@inlinable
- public init() {}
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
@inlinable
public func parse(_ input: inout Input) throws -> Output {
diff --git a/Sources/Parsing/ParserPrinters/From.swift b/Sources/Parsing/ParserPrinters/From.swift
index c31f1da86f..ab7f19f9c1 100644
--- a/Sources/Parsing/ParserPrinters/From.swift
+++ b/Sources/Parsing/ParserPrinters/From.swift
@@ -8,6 +8,11 @@ where Upstream.Output == Downstream.Input {
@inlinable
public init(_ conversion: Upstream, @ParserBuilder _ parser: () -> Downstream) {
+ self.init(internal: conversion, parser)
+ }
+
+ @usableFromInline
+ init(internal conversion: Upstream, @ParserBuilder _ parser: () -> Downstream) {
self.conversion = conversion
self.parser = parser()
}
@@ -49,6 +54,11 @@ extension Parsers {
extension From {
@inlinable
public init(_ conversion: Upstream) where Downstream == Parsers.Identity {
+ self.init(internal: conversion)
+ }
+
+ @usableFromInline
+ init(internal conversion: Upstream) where Downstream == Parsers.Identity {
self.conversion = conversion
self.parser = .init()
}
diff --git a/Sources/Parsing/ParserPrinters/Int.swift b/Sources/Parsing/ParserPrinters/Int.swift
index fe30d79ee6..62d9aadb47 100644
--- a/Sources/Parsing/ParserPrinters/Int.swift
+++ b/Sources/Parsing/ParserPrinters/Int.swift
@@ -84,6 +84,11 @@ extension Parsers {
@inlinable
public init(radix: Int = 10) {
+ self.init(internal: radix)
+ }
+
+ @usableFromInline
+ init(internal radix: Int = 10) {
precondition((2...36).contains(radix), "Radix not in range 2...36")
self.radix = radix
}
diff --git a/Sources/Parsing/ParserPrinters/Lazy.swift b/Sources/Parsing/ParserPrinters/Lazy.swift
index 11a4f82674..f371f5d349 100644
--- a/Sources/Parsing/ParserPrinters/Lazy.swift
+++ b/Sources/Parsing/ParserPrinters/Lazy.swift
@@ -7,7 +7,12 @@ public final class Lazy: Parser {
public let createParser: () -> LazyParser
@inlinable
- public init(@ParserBuilder createParser: @escaping () -> LazyParser) {
+ public convenience init(@ParserBuilder createParser: @escaping () -> LazyParser) {
+ self.init(internal: createParser)
+ }
+
+ @usableFromInline
+ init(internal createParser: @escaping () -> LazyParser) {
self.createParser = createParser
}
diff --git a/Sources/Parsing/ParserPrinters/Many.swift b/Sources/Parsing/ParserPrinters/Many.swift
index 213ff8b2ca..b49cc21ca5 100644
--- a/Sources/Parsing/ParserPrinters/Many.swift
+++ b/Sources/Parsing/ParserPrinters/Many.swift
@@ -237,6 +237,27 @@ extension Many where Printability == Void {
@ParserBuilder element: () -> Element,
@ParserBuilder separator: () -> Separator,
@ParserBuilder terminator: () -> Terminator
+ ) where I.Element == Element.Output {
+ self.init(
+ internal: length,
+ into: initialResult,
+ updateAccumulatingResult,
+ decumulator: decumulator,
+ element: element,
+ separator: separator,
+ terminator: terminator
+ )
+ }
+
+ @usableFromInline
+ init(
+ internal length: R,
+ into initialResult: Result,
+ _ updateAccumulatingResult: @escaping (inout Result, Element.Output) throws -> Void,
+ decumulator: @escaping (Result) throws -> I,
+ @ParserBuilder element: () -> Element,
+ @ParserBuilder separator: () -> Separator,
+ @ParserBuilder terminator: () -> Terminator
) where I.Element == Element.Output {
self.element = element()
self.initialResult = initialResult
@@ -303,6 +324,25 @@ extension Many where Printability == Never {
@ParserBuilder element: () -> Element,
@ParserBuilder separator: () -> Separator,
@ParserBuilder terminator: () -> Terminator
+ ) {
+ self.init(
+ internal: length,
+ into: initialResult,
+ updateAccumulatingResult,
+ element: element,
+ separator: separator,
+ terminator: terminator
+ )
+ }
+
+ @usableFromInline
+ init(
+ internal length: R,
+ into initialResult: Result,
+ _ updateAccumulatingResult: @escaping (inout Result, Element.Output) throws -> Void,
+ @ParserBuilder element: () -> Element,
+ @ParserBuilder separator: () -> Separator,
+ @ParserBuilder terminator: () -> Terminator
) {
self.element = element()
self.initialResult = initialResult
diff --git a/Sources/Parsing/ParserPrinters/Map.swift b/Sources/Parsing/ParserPrinters/Map.swift
index 0ccfb6012e..b5a80f3484 100644
--- a/Sources/Parsing/ParserPrinters/Map.swift
+++ b/Sources/Parsing/ParserPrinters/Map.swift
@@ -81,6 +81,11 @@ extension Parsers {
@inlinable
public init(upstream: Upstream, transform: @escaping (Upstream.Output) -> NewOutput) {
+ self.init(internal: upstream, transform: transform)
+ }
+
+ @usableFromInline
+ init(internal upstream: Upstream, transform: @escaping (Upstream.Output) -> NewOutput) {
self.upstream = upstream
self.transform = transform
}
@@ -102,6 +107,11 @@ extension Parsers {
@inlinable
public init(upstream: Upstream, output: Output) {
+ self.init(internal: upstream, output: output)
+ }
+
+ @usableFromInline
+ init(internal upstream: Upstream, output: Output) {
self.upstream = upstream
self.output = output
}
@@ -125,6 +135,11 @@ extension Parsers {
@inlinable
public init(upstream: Upstream, downstream: Downstream) {
+ self.init(internal: upstream, downstream: downstream)
+ }
+
+ @usableFromInline
+ init(internal upstream: Upstream, downstream: Downstream) {
self.upstream = upstream
self.downstream = downstream
}
diff --git a/Sources/Parsing/ParserPrinters/Not.swift b/Sources/Parsing/ParserPrinters/Not.swift
index 0f251117b2..d613577760 100644
--- a/Sources/Parsing/ParserPrinters/Not.swift
+++ b/Sources/Parsing/ParserPrinters/Not.swift
@@ -25,6 +25,11 @@ public struct Not: ParserPrinter {
/// fails.
@inlinable
public init(@ParserBuilder _ build: () -> Upstream) {
+ self.init(internal: build)
+ }
+
+ @usableFromInline
+ init(internal build: () -> Upstream) {
self.upstream = build()
}
diff --git a/Sources/Parsing/ParserPrinters/OneOf.swift b/Sources/Parsing/ParserPrinters/OneOf.swift
index 296ff9b29a..a45a3b3da0 100644
--- a/Sources/Parsing/ParserPrinters/OneOf.swift
+++ b/Sources/Parsing/ParserPrinters/OneOf.swift
@@ -156,6 +156,11 @@ public struct OneOf: Parser {
@inlinable
public init(@OneOfBuilder _ build: () -> Parsers) {
+ self.init(internal: build)
+ }
+
+ @usableFromInline
+ init(internal build: () -> Parsers) {
self.parsers = build()
}
diff --git a/Sources/Parsing/ParserPrinters/OneOfMany.swift b/Sources/Parsing/ParserPrinters/OneOfMany.swift
index 3c92cccd16..1e5ec99339 100644
--- a/Sources/Parsing/ParserPrinters/OneOfMany.swift
+++ b/Sources/Parsing/ParserPrinters/OneOfMany.swift
@@ -22,6 +22,11 @@ extension Parsers {
@inlinable
public init(_ parsers: [Parsers]) {
+ self.init(internal: parsers)
+ }
+
+ @usableFromInline
+ init(internal parsers: [Parsers]) {
self.parsers = parsers
}
diff --git a/Sources/Parsing/ParserPrinters/Optionally.swift b/Sources/Parsing/ParserPrinters/Optionally.swift
index 01d7be5726..feb8064fc1 100644
--- a/Sources/Parsing/ParserPrinters/Optionally.swift
+++ b/Sources/Parsing/ParserPrinters/Optionally.swift
@@ -37,6 +37,11 @@ public struct Optionally: Parser {
@inlinable
public init(@ParserBuilder _ build: () -> Wrapped) {
+ self.init(internal: build)
+ }
+
+ @usableFromInline
+ init(@ParserBuilder internal build: () -> Wrapped) {
self.wrapped = build()
}
diff --git a/Sources/Parsing/ParserPrinters/Parse.swift b/Sources/Parsing/ParserPrinters/Parse.swift
index 06d4139412..f007f9b2f2 100644
--- a/Sources/Parsing/ParserPrinters/Parse.swift
+++ b/Sources/Parsing/ParserPrinters/Parse.swift
@@ -44,6 +44,11 @@ public struct Parse: Parser {
/// - Parameter with: A parser builder that will accumulate non-void outputs in a tuple.
@inlinable
public init(@ParserBuilder with build: () -> Parsers) {
+ self.init(internal: build)
+ }
+
+ @usableFromInline
+ init(internal build: () -> Parsers) {
self.parsers = build()
}
@@ -79,6 +84,14 @@ public struct Parse: Parser {
public init(
_ transform: @escaping (Upstream.Output) -> NewOutput,
@ParserBuilder with build: () -> Upstream
+ ) where Parsers == Parsing.Parsers.Map {
+ self.init(internal: transform, with: build)
+ }
+
+ @usableFromInline
+ init(
+ internal transform: @escaping (Upstream.Output) -> NewOutput,
+ @ParserBuilder with build: () -> Upstream
) where Parsers == Parsing.Parsers.Map {
self.parsers = build().map(transform)
}
@@ -102,6 +115,14 @@ public struct Parse: Parser {
public init(
_ output: NewOutput,
@ParserBuilder with build: () -> Upstream
+ ) where Parsers == Parsing.Parsers.MapConstant {
+ self.init(internal: output, with: build)
+ }
+
+ @usableFromInline
+ init(
+ internal output: NewOutput,
+ @ParserBuilder with build: () -> Upstream
) where Parsers == Parsing.Parsers.MapConstant {
self.parsers = build().map { output }
}
@@ -138,6 +159,14 @@ public struct Parse: Parser {
public init(
_ conversion: Downstream,
@ParserBuilder with build: () -> Upstream
+ ) where Parsers == Parsing.Parsers.MapConversion {
+ self.init(internal: conversion, with: build)
+ }
+
+ @usableFromInline
+ init(
+ internal conversion: Downstream,
+ @ParserBuilder with build: () -> Upstream
) where Parsers == Parsing.Parsers.MapConversion {
self.parsers = build().map(conversion)
}
@@ -193,6 +222,11 @@ public struct ParsePrint: ParserPrinter {
@inlinable
public init(@ParserBuilder with build: () -> ParserPrinters) {
+ self.init(internal: build)
+ }
+
+ @usableFromInline
+ init(internal build: () -> ParserPrinters) {
self.parserPrinters = build()
}
@@ -200,6 +234,14 @@ public struct ParsePrint: ParserPrinter {
public init(
_ output: NewOutput,
@ParserBuilder with build: () -> Upstream
+ ) where ParserPrinters == Parsers.MapConstant {
+ self.init(internal: output, with: build)
+ }
+
+ @usableFromInline
+ init(
+ internal output: NewOutput,
+ @ParserBuilder with build: () -> Upstream
) where ParserPrinters == Parsers.MapConstant {
self.parserPrinters = build().map { output }
}
@@ -208,6 +250,14 @@ public struct ParsePrint: ParserPrinter {
public init(
_ conversion: Downstream,
@ParserBuilder with build: () -> Upstream
+ ) where ParserPrinters == Parsers.MapConversion {
+ self.init(internal: conversion, with: build)
+ }
+
+ @usableFromInline
+ init(
+ internal conversion: Downstream,
+ @ParserBuilder with build: () -> Upstream
) where ParserPrinters == Parsers.MapConversion {
self.parserPrinters = build().map(conversion)
}
diff --git a/Sources/Parsing/ParserPrinters/ParseableFormatStyle.swift b/Sources/Parsing/ParserPrinters/ParseableFormatStyle.swift
index 15aedd35e8..d79b536aa2 100644
--- a/Sources/Parsing/ParserPrinters/ParseableFormatStyle.swift
+++ b/Sources/Parsing/ParserPrinters/ParseableFormatStyle.swift
@@ -12,6 +12,11 @@
@inlinable
public init(_ style: Style) {
+ self.init(internal: style)
+ }
+
+ @usableFromInline
+ init(internal style: Style) {
self.style = style
}
diff --git a/Sources/Parsing/ParserPrinters/Peek.swift b/Sources/Parsing/ParserPrinters/Peek.swift
index cafe33ebc8..90a3eea253 100644
--- a/Sources/Parsing/ParserPrinters/Peek.swift
+++ b/Sources/Parsing/ParserPrinters/Peek.swift
@@ -31,6 +31,11 @@ public struct Peek: ParserPrinter {
/// - Parameter build: A parser this parser wants to inspect.
@inlinable
public init(@ParserBuilder _ build: () -> Upstream) {
+ self.init(internal: build)
+ }
+
+ @usableFromInline
+ init(@ParserBuilder internal build: () -> Upstream) {
self.upstream = build()
}
diff --git a/Sources/Parsing/ParserPrinters/Pipe.swift b/Sources/Parsing/ParserPrinters/Pipe.swift
index 13f0f83c2d..0a001ae3ad 100644
--- a/Sources/Parsing/ParserPrinters/Pipe.swift
+++ b/Sources/Parsing/ParserPrinters/Pipe.swift
@@ -61,6 +61,11 @@ extension Parsers {
@inlinable
public init(upstream: Upstream, downstream: Downstream) {
+ self.init(internal: upstream, downstream: downstream)
+ }
+
+ @usableFromInline
+ init(internal upstream: Upstream, downstream: Downstream) {
self.upstream = upstream
self.downstream = downstream
}
diff --git a/Sources/Parsing/ParserPrinters/Prefix.swift b/Sources/Parsing/ParserPrinters/Prefix.swift
index ebc24ca2b4..6a31854491 100644
--- a/Sources/Parsing/ParserPrinters/Prefix.swift
+++ b/Sources/Parsing/ParserPrinters/Prefix.swift
@@ -74,6 +74,11 @@ public struct Prefix: Parser where Input.SubSequence == Input
/// Once the predicate returns `false` it will not be called again.
@inlinable
public init(_ length: R, while predicate: ((Input.Element) -> Bool)? = nil) {
+ self.init(internal: length, while: predicate)
+ }
+
+ @usableFromInline
+ init(internal length: R, while predicate: ((Input.Element) -> Bool)? = nil) {
self.minimum = length.minimum
self.maximum = length.maximum
self.predicate = predicate
@@ -93,6 +98,11 @@ public struct Prefix: Parser where Input.SubSequence == Input
/// the predicate returns `false` it will not be called again.
@inlinable
public init(while predicate: @escaping (Input.Element) -> Bool) {
+ self.init(internal: predicate)
+ }
+
+ @usableFromInline
+ init(internal predicate: @escaping (Input.Element) -> Bool) {
self.minimum = 0
self.maximum = nil
self.predicate = predicate
diff --git a/Sources/Parsing/ParserPrinters/PrefixThrough.swift b/Sources/Parsing/ParserPrinters/PrefixThrough.swift
index 5c08341b5a..0febd4b2a8 100644
--- a/Sources/Parsing/ParserPrinters/PrefixThrough.swift
+++ b/Sources/Parsing/ParserPrinters/PrefixThrough.swift
@@ -19,6 +19,14 @@ public struct PrefixThrough: Parser where Input.SubSequence =
public init(
_ possibleMatch: Input,
by areEquivalent: @escaping (Input.Element, Input.Element) -> Bool
+ ) {
+ self.init(internal: possibleMatch, by: areEquivalent)
+ }
+
+ @usableFromInline
+ init(
+ internal possibleMatch: Input,
+ by areEquivalent: @escaping (Input.Element, Input.Element) -> Bool
) {
self.possibleMatch = possibleMatch
self.areEquivalent = areEquivalent
diff --git a/Sources/Parsing/ParserPrinters/PrefixUpTo.swift b/Sources/Parsing/ParserPrinters/PrefixUpTo.swift
index 6f032417ce..788982303b 100644
--- a/Sources/Parsing/ParserPrinters/PrefixUpTo.swift
+++ b/Sources/Parsing/ParserPrinters/PrefixUpTo.swift
@@ -19,6 +19,14 @@ public struct PrefixUpTo: Parser where Input.SubSequence == I
public init(
_ possibleMatch: Input,
by areEquivalent: @escaping (Input.Element, Input.Element) -> Bool
+ ) {
+ self.init(internal: possibleMatch, by: areEquivalent)
+ }
+
+ @usableFromInline
+ init(
+ internal possibleMatch: Input,
+ by areEquivalent: @escaping (Input.Element, Input.Element) -> Bool
) {
self.possibleMatch = possibleMatch
self.areEquivalent = areEquivalent
diff --git a/Sources/Parsing/ParserPrinters/Printing.swift b/Sources/Parsing/ParserPrinters/Printing.swift
index 706a0c5267..6fbc5e6f5f 100644
--- a/Sources/Parsing/ParserPrinters/Printing.swift
+++ b/Sources/Parsing/ParserPrinters/Printing.swift
@@ -56,6 +56,14 @@ extension Parsers {
public init(
parser: Parser,
printer: Printer
+ ) {
+ self.init(internal: parser, printer: printer)
+ }
+
+ @usableFromInline
+ init(
+ internal parser: Parser,
+ printer: Printer
) {
self.parser = parser
self.printer = printer
@@ -80,6 +88,14 @@ extension Parsers {
public init(
parser: Upstream,
printer: @escaping (Upstream.Output, inout Upstream.Input) -> Void
+ ) {
+ self.init(internal: parser, printer: printer)
+ }
+
+ @usableFromInline
+ init(
+ internal parser: Upstream,
+ printer: @escaping (Upstream.Output, inout Upstream.Input) -> Void
) {
self.parser = parser
self.printer = printer
@@ -104,6 +120,14 @@ extension Parsers {
public init(
parser: Upstream,
printer: @escaping (Upstream.Output, inout Upstream.Input) throws -> Void
+ ) {
+ self.init(internal: parser, printer: printer)
+ }
+
+ @usableFromInline
+ init(
+ internal parser: Upstream,
+ printer: @escaping (Upstream.Output, inout Upstream.Input) throws -> Void
) {
self.parser = parser
self.printer = printer
diff --git a/Sources/Parsing/ParserPrinters/Pullback.swift b/Sources/Parsing/ParserPrinters/Pullback.swift
index 6245c357c9..da3070a8da 100644
--- a/Sources/Parsing/ParserPrinters/Pullback.swift
+++ b/Sources/Parsing/ParserPrinters/Pullback.swift
@@ -39,6 +39,11 @@ extension Parsers {
@inlinable
public init(downstream: Downstream, keyPath: WritableKeyPath) {
+ self.init(internal: downstream, keyPath: keyPath)
+ }
+
+ @usableFromInline
+ init(internal downstream: Downstream, keyPath: WritableKeyPath) {
self.downstream = downstream
self.keyPath = keyPath
}
diff --git a/Sources/Parsing/ParserPrinters/Rest.swift b/Sources/Parsing/ParserPrinters/Rest.swift
index 153ec5188e..93a4139bb7 100644
--- a/Sources/Parsing/ParserPrinters/Rest.swift
+++ b/Sources/Parsing/ParserPrinters/Rest.swift
@@ -23,7 +23,12 @@
/// to coalesce the error into a default output value.
public struct Rest: Parser where Input.SubSequence == Input {
@inlinable
- public init() {}
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
@inlinable
public func parse(_ input: inout Input) throws -> Input {
@@ -74,13 +79,23 @@ extension Rest: ParserPrinter where Input: PrependableCollection {
extension Rest where Input == Substring {
@_disfavoredOverload
@inlinable
- public init() {}
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
}
extension Rest where Input == Substring.UTF8View {
@_disfavoredOverload
@inlinable
- public init() {}
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
}
extension Parsers {
diff --git a/Sources/Parsing/ParserPrinters/Skip.swift b/Sources/Parsing/ParserPrinters/Skip.swift
index df5be070f7..5fea7781a6 100644
--- a/Sources/Parsing/ParserPrinters/Skip.swift
+++ b/Sources/Parsing/ParserPrinters/Skip.swift
@@ -5,6 +5,11 @@ public struct Skip: Parser {
@inlinable
public init(@ParserBuilder _ build: () -> Parsers) {
+ self.init(internal: build)
+ }
+
+ @usableFromInline
+ init(internal build: () -> Parsers) {
self.parsers = build()
}
diff --git a/Sources/Parsing/ParserPrinters/StartsWith.swift b/Sources/Parsing/ParserPrinters/StartsWith.swift
index d21568f005..541ecf4a66 100644
--- a/Sources/Parsing/ParserPrinters/StartsWith.swift
+++ b/Sources/Parsing/ParserPrinters/StartsWith.swift
@@ -54,6 +54,15 @@ public struct StartsWith: Parser where Input.SubSequence == I
_ possiblePrefix: PossiblePrefix,
by areEquivalent: @escaping (Input.Element, Input.Element) -> Bool
)
+ where PossiblePrefix.Element == Input.Element {
+ self.init(internal: possiblePrefix, by: areEquivalent)
+ }
+
+ @usableFromInline
+ init(
+ internal possiblePrefix: PossiblePrefix,
+ by areEquivalent: @escaping (Input.Element, Input.Element) -> Bool
+ )
where PossiblePrefix.Element == Input.Element {
self.count = possiblePrefix.count
self.possiblePrefix = AnyCollection(possiblePrefix)
diff --git a/Sources/Parsing/ParserPrinters/UUID.swift b/Sources/Parsing/ParserPrinters/UUID.swift
index 4355b9fad6..5a58a7617a 100644
--- a/Sources/Parsing/ParserPrinters/UUID.swift
+++ b/Sources/Parsing/ParserPrinters/UUID.swift
@@ -64,7 +64,12 @@ extension Parsers {
Input.Element == UTF8.CodeUnit
{
@inlinable
- public init() {}
+ public init() {
+ self.init(internal: ())
+ }
+
+ @usableFromInline
+ init(internal: Void) {}
@inlinable
public func parse(_ input: inout Input) throws -> UUID {
diff --git a/Sources/Parsing/ParserPrinters/Whitespace.swift b/Sources/Parsing/ParserPrinters/Whitespace.swift
index 62b379b59d..22645021ed 100644
--- a/Sources/Parsing/ParserPrinters/Whitespace.swift
+++ b/Sources/Parsing/ParserPrinters/Whitespace.swift
@@ -178,6 +178,12 @@ extension Whitespace {
@inlinable
public init(_ length: Length, _ configuration: Configuration = .all)
+ where InputToBytes == Conversions.Identity {
+ self.init(internal: length, configuration)
+ }
+
+ @usableFromInline
+ init(internal length: Length, _ configuration: Configuration)
where InputToBytes == Conversions.Identity {
self.length = length
self.configuration = configuration
@@ -195,6 +201,11 @@ extension Whitespace where InputToBytes == Conversions.SubstringToUTF8View {
@_disfavoredOverload
@inlinable
public init(_ length: Length, _ configuration: Configuration = .all) {
+ self.init(internal: length, configuration)
+ }
+
+ @usableFromInline
+ init(internal length: Length, _ configuration: Configuration) {
self.length = length
self.configuration = configuration
self.inputToBytes = .init()
diff --git a/Sources/Parsing/Parsers/AnyParser.swift b/Sources/Parsing/Parsers/AnyParser.swift
index 4647ae14a1..abda585e9e 100644
--- a/Sources/Parsing/Parsers/AnyParser.swift
+++ b/Sources/Parsing/Parsers/AnyParser.swift
@@ -44,6 +44,11 @@ public struct AnyParser: Parser {
/// executed each time the ``parse(_:)`` method is called on the resulting parser.
@inlinable
public init(_ parse: @escaping (inout Input) throws -> Output) {
+ self.init(internal: parse)
+ }
+
+ @usableFromInline
+ init(internal parse: @escaping (inout Input) throws -> Output) {
self.parser = parse
}
diff --git a/Sources/Parsing/Parsers/CompactMap.swift b/Sources/Parsing/Parsers/CompactMap.swift
index 8c04b23e15..634e627682 100644
--- a/Sources/Parsing/Parsers/CompactMap.swift
+++ b/Sources/Parsing/Parsers/CompactMap.swift
@@ -62,6 +62,14 @@ extension Parsers {
public init(
upstream: Upstream,
transform: @escaping (Upstream.Output) -> Output?
+ ) {
+ self.init(internal: upstream, transform: transform)
+ }
+
+ @usableFromInline
+ init(
+ internal upstream: Upstream,
+ transform: @escaping (Upstream.Output) -> Output?
) {
self.upstream = upstream
self.transform = transform
diff --git a/Sources/Parsing/Parsers/FlatMap.swift b/Sources/Parsing/Parsers/FlatMap.swift
index b41aacd0a2..1ca0176ad6 100644
--- a/Sources/Parsing/Parsers/FlatMap.swift
+++ b/Sources/Parsing/Parsers/FlatMap.swift
@@ -35,6 +35,11 @@ extension Parsers {
@inlinable
public init(upstream: Upstream, transform: @escaping (Upstream.Output) -> NewParser) {
+ self.init(internal: upstream, transform: transform)
+ }
+
+ @usableFromInline
+ init(internal upstream: Upstream, transform: @escaping (Upstream.Output) -> NewParser) {
self.upstream = upstream
self.transform = transform
}
diff --git a/Sources/Parsing/Parsers/Stream.swift b/Sources/Parsing/Parsers/Stream.swift
index b230ae1d48..f0a9facc30 100644
--- a/Sources/Parsing/Parsers/Stream.swift
+++ b/Sources/Parsing/Parsers/Stream.swift
@@ -35,6 +35,11 @@ public struct Stream: Parser where Parsers.Input: RangeReplacea
@inlinable
public init(@ParserBuilder build: () -> Parsers) {
+ self.init(internal: build)
+ }
+
+ @usableFromInline
+ init(internal build: () -> Parsers) {
self.parsers = build()
}