pointfreeco / swift-parsing

A library for turning nebulous data into well-structured data, with a focus on composition, performance, generality, and ergonomics.
https://www.pointfree.co/collections/parsing
MIT License
855 stars 75 forks source link

Swift 5.7 Improvements #261

Closed stephencelis closed 1 year ago

stephencelis commented 1 year ago

While we have some ideas to take Swift 5.7 even further, we need more time to let the details bake. Till then, we can still offer a quality-of-life improvement for folks using Swift 5.7, especially those working on Advent of Code 2022!

Improving Parsing's builder limits

This is perhaps the most notable improvement for now.

Currently, Parsing's builders limits the number of parsers allowed in a block because of how many overloads need to be maintained and generated.

Using Swift 5.7's new buildPartialBlock, we can greatly improve upon this limit:

Builder Block limit swift(<5.7) Block limit swift(>=5.7)
OneOfBuilder 10
ParserBuilder 6 10–∞*

* Up to 10 non-Void captures in a block, plus unlimited Void captures.

This should make working with larger builders much easier. The limit of 10 captures is arbitrary and could be expanded. If you hit it, please let us know!

Adding primary associated types

We've added primary associated types to a number of protocols:

This will allow you to express and constrain these protocols in a more lightweight, natural manner.

Formatter parser-printer support

We've added support for using formatters directly in your parser printers with the Formatted parser-printer:

let total = ParsePrint {
  "TOTAL: "
  Formatted(.currency(code: "USD"))
}

try total.parse("TOTAL: $42.42")  // 42.42
try total.print(99.95)            // "TOTAL: $99.95"

Formatted takes any of the many formatters shipping in iOS 15 and more recently.


We have more plans for Parsing in the coming months to take even greater advantage of modern Swift features, and we hope to explore them soon!

tgrapperon commented 1 year ago

Should the leaking Xcode schemes issue be fixed in this QoL PR, or is this orthogonal?

stephencelis commented 1 year ago

@tgrapperon I didn't realize this package still had that problem, but I'll tackle it in another PR before release!