From 725c5a2156084c326a1ee11fa1c06fbaff3c0ab0 Mon Sep 17 00:00:00 2001 From: Stephen Celis Date: Tue, 5 Apr 2022 10:55:15 -0400 Subject: [PATCH] 184 --- 0184-parser-printers-pt7/README.md | 5 + .../swift-parsing/.github/CODE_OF_CONDUCT.md | 84 + .../swift-parsing/.github/workflows/ci.yml | 52 + .../.github/workflows/documentation.yml | 112 + .../.github/workflows/format.yml | 27 + .../swift-parsing/.gitignore | 5 + .../swift-parsing/.spi.yml | 9 + .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Parsing.xcscheme | 77 + .../xcschemes/Parsing_watchOS.xcscheme | 67 + .../xcschemes/swift-parsing-Package.xcscheme | 139 + .../swift-parsing-benchmark.xcscheme | 98 + .../xcschemes/variadics-generator.xcscheme | 78 + .../swift-parsing/LICENSE | 21 + .../swift-parsing/Makefile | 42 + .../swift-parsing/Package.swift | 29 + .../Printing.xcplaygroundpage/Contents.swift | 753 ++ .../Race.xcplaygroundpage/Contents.swift | 650 ++ .../Parsing.playground/contents.xcplayground | 2 + .../swift-parsing/README.md | 372 + .../Parsing/Builders/OneOfBuilder.swift | 132 + .../Parsing/Builders/ParserBuilder.swift | 93 + .../Sources/Parsing/Builders/Variadics.swift | 6099 +++++++++++++++++ .../Articles/Backtracking.md | 132 + .../Documentation.docc/Articles/Design.md | 131 + .../Articles/ErrorMessages.md | 239 + .../Articles/GettingStarted.md | 303 + .../Articles/StringAbstractions.md | 183 + .../Parsing/Documentation.docc/Parsing.md | 99 + .../Sources/Parsing/Internal/Breakpoint.swift | 34 + .../Parsing/Internal/Deprecations.swift | 4 + .../Sources/Parsing/Parser.swift | 92 + .../Sources/Parsing/Parsers/Always.swift | 101 + .../Sources/Parsing/Parsers/AnyParser.swift | 63 + .../Sources/Parsing/Parsers/Bool.swift | 92 + .../Parsing/Parsers/CharacterSet.swift | 10 + .../Sources/Parsing/Parsers/CompactMap.swift | 78 + .../Sources/Parsing/Parsers/Conditional.swift | 49 + .../Sources/Parsing/Parsers/Double.swift | 350 + .../Sources/Parsing/Parsers/End.swift | 54 + .../Sources/Parsing/Parsers/Fail.swift | 72 + .../Sources/Parsing/Parsers/Filter.swift | 61 + .../Sources/Parsing/Parsers/First.swift | 52 + .../Sources/Parsing/Parsers/FlatMap.swift | 52 + .../Parsing/Parsers/FromSubstring.swift | 72 + .../Parsing/Parsers/FromUTF8View.swift | 32 + .../Parsers/FromUnicodeScalarView.swift | 42 + .../Sources/Parsing/Parsers/Int.swift | 194 + .../Sources/Parsing/Parsers/Lazy.swift | 27 + .../Sources/Parsing/Parsers/Literal.swift | 39 + .../Sources/Parsing/Parsers/Many.swift | 353 + .../Sources/Parsing/Parsers/Map.swift | 42 + .../Sources/Parsing/Parsers/Newline.swift | 70 + .../Sources/Parsing/Parsers/Not.swift | 37 + .../Sources/Parsing/Parsers/OneOf.swift | 166 + .../Sources/Parsing/Parsers/OneOfMany.swift | 47 + .../Sources/Parsing/Parsers/Optional.swift | 40 + .../Sources/Parsing/Parsers/Optionally.swift | 53 + .../Sources/Parsing/Parsers/Parse.swift | 51 + .../Sources/Parsing/Parsers/Parsers.swift | 6 + .../Sources/Parsing/Parsers/Peek.swift | 35 + .../Sources/Parsing/Parsers/Pipe.swift | 76 + .../Sources/Parsing/Parsers/Prefix.swift | 286 + .../Parsing/Parsers/PrefixThrough.swift | 73 + .../Sources/Parsing/Parsers/PrefixUpTo.swift | 71 + .../Sources/Parsing/Parsers/Pullback.swift | 58 + .../Parsing/Parsers/ReplaceError.swift | 70 + .../Sources/Parsing/Parsers/Rest.swift | 52 + .../Sources/Parsing/Parsers/Skip.swift | 19 + .../Sources/Parsing/Parsers/StartsWith.swift | 92 + .../Sources/Parsing/Parsers/Stream.swift | 55 + .../Sources/Parsing/Parsers/UUID.swift | 137 + .../Sources/Parsing/Parsers/Whitespace.swift | 66 + .../Sources/Parsing/ParsingError.swift | 481 ++ .../swift-parsing-benchmark/Arithmetic.swift | 131 + .../swift-parsing-benchmark/BinaryData.swift | 200 + .../swift-parsing-benchmark/Bool.swift | 50 + .../Sources/swift-parsing-benchmark/CSV.swift | 106 + .../swift-parsing-benchmark/Color.swift | 34 + .../Common/Benchmarking.swift | 46 + .../Common/ParsingError.swift | 1 + .../swift-parsing-benchmark/Date.swift | 156 + .../swift-parsing-benchmark/HTTP.swift | 142 + .../swift-parsing-benchmark/JSON.swift | 157 + .../swift-parsing-benchmark/Numerics.swift | 153 + .../swift-parsing-benchmark/PrefixUpTo.swift | 49 + .../swift-parsing-benchmark/Race.swift | 175 + .../ReadmeExample.swift | 113 + .../swift-parsing-benchmark/Routing.swift | 143 + .../Samples/CSVSample.swift | 1002 +++ .../Samples/XCTestLogsSample.swift | 5143 ++++++++++++++ .../StringAbstractions.swift | 51 + .../URLRequestRouter+Foundation.swift | 36 + .../URLRequestRouter/URLRequestRouter.swift | 260 + .../swift-parsing-benchmark/UUID.swift | 23 + .../swift-parsing-benchmark/XCTestLogs.swift | 125 + .../swift-parsing-benchmark/main.swift | 24 + README.md | 1 + 98 files changed, 22367 insertions(+) create mode 100644 0184-parser-printers-pt7/README.md create mode 100644 0184-parser-printers-pt7/swift-parsing/.github/CODE_OF_CONDUCT.md create mode 100644 0184-parser-printers-pt7/swift-parsing/.github/workflows/ci.yml create mode 100644 0184-parser-printers-pt7/swift-parsing/.github/workflows/documentation.yml create mode 100644 0184-parser-printers-pt7/swift-parsing/.github/workflows/format.yml create mode 100644 0184-parser-printers-pt7/swift-parsing/.gitignore create mode 100644 0184-parser-printers-pt7/swift-parsing/.spi.yml create mode 100644 0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata create mode 100644 0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/Parsing.xcscheme create mode 100644 0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/Parsing_watchOS.xcscheme create mode 100644 0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/swift-parsing-Package.xcscheme create mode 100644 0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/swift-parsing-benchmark.xcscheme create mode 100644 0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/variadics-generator.xcscheme create mode 100644 0184-parser-printers-pt7/swift-parsing/LICENSE create mode 100644 0184-parser-printers-pt7/swift-parsing/Makefile create mode 100644 0184-parser-printers-pt7/swift-parsing/Package.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Parsing.playground/Pages/Printing.xcplaygroundpage/Contents.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Parsing.playground/Pages/Race.xcplaygroundpage/Contents.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Parsing.playground/contents.xcplayground create mode 100644 0184-parser-printers-pt7/swift-parsing/README.md create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Builders/OneOfBuilder.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Builders/ParserBuilder.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Builders/Variadics.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/Backtracking.md create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/Design.md create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/ErrorMessages.md create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/GettingStarted.md create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/StringAbstractions.md create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Parsing.md create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Internal/Breakpoint.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Internal/Deprecations.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parser.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Always.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/AnyParser.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Bool.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/CharacterSet.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/CompactMap.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Conditional.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Double.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/End.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Fail.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Filter.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/First.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/FlatMap.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/FromSubstring.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/FromUTF8View.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/FromUnicodeScalarView.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Int.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Lazy.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Literal.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Many.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Map.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Newline.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Not.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/OneOf.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/OneOfMany.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Optional.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Optionally.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Parse.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Parsers.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Peek.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Pipe.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Prefix.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/PrefixThrough.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/PrefixUpTo.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Pullback.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/ReplaceError.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Rest.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Skip.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/StartsWith.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Stream.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/UUID.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Whitespace.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/Parsing/ParsingError.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Arithmetic.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/BinaryData.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Bool.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/CSV.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Color.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Common/Benchmarking.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Common/ParsingError.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Date.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/HTTP.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/JSON.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Numerics.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/PrefixUpTo.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Race.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/ReadmeExample.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Routing.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Samples/CSVSample.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Samples/XCTestLogsSample.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/StringAbstractions.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/URLRequestRouter/URLRequestRouter+Foundation.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/URLRequestRouter/URLRequestRouter.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/UUID.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/XCTestLogs.swift create mode 100644 0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/main.swift diff --git a/0184-parser-printers-pt7/README.md b/0184-parser-printers-pt7/README.md new file mode 100644 index 00000000..de8a2943 --- /dev/null +++ b/0184-parser-printers-pt7/README.md @@ -0,0 +1,5 @@ +## [Point-Free](https://www.pointfree.co) + +> #### This directory contains code from Point-Free Episode: [Invertible Parsing: The Point](https://www.pointfree.co/episodes/ep184-invertible-parsing-the-point) +> +> We conclude our series on invertible parsing by converting a more complex parser into a parser-printer, and even enhance its format. This will push us to think through a couple more fun parser-printer problems. diff --git a/0184-parser-printers-pt7/swift-parsing/.github/CODE_OF_CONDUCT.md b/0184-parser-printers-pt7/swift-parsing/.github/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..703a4725 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,84 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at support@pointfree.co. All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of actions. + +**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, +available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations. diff --git a/0184-parser-printers-pt7/swift-parsing/.github/workflows/ci.yml b/0184-parser-printers-pt7/swift-parsing/.github/workflows/ci.yml new file mode 100644 index 00000000..d8699535 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/.github/workflows/ci.yml @@ -0,0 +1,52 @@ +name: CI + +on: + push: + branches: + - main + pull_request: + branches: + - '*' + workflow_dispatch: + +jobs: + macos_tests: + runs-on: macos-11 + strategy: + matrix: + xcode: + - "13.2.1" # Swift 5.5 + command: + - test + - benchmarks + steps: + - uses: actions/checkout@v2 + - name: Select Xcode ${{ matrix.xcode }} + run: sudo xcode-select -s /Applications/Xcode_${{ matrix.xcode }}.app + - name: System + run: system_profiler SPHardwareDataType + - name: Run ${{ matrix.command }} + run: make ${{ matrix.command }} + + ubuntu_tests: + strategy: + matrix: + os: [ubuntu-18.04, ubuntu-20.04] + + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v2 + - name: Build + run: swift build + - name: Run tests + run: swift test + + windows_tests: + runs-on: windows-2019 + + steps: + - uses: actions/checkout@v2 + - uses: MaxDesiatov/swift-windows-action@v1 + with: + swift-version: "5.5.1" diff --git a/0184-parser-printers-pt7/swift-parsing/.github/workflows/documentation.yml b/0184-parser-printers-pt7/swift-parsing/.github/workflows/documentation.yml new file mode 100644 index 00000000..ad8e0197 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/.github/workflows/documentation.yml @@ -0,0 +1,112 @@ +# Build and deploy DocC to GitHub pages. Based off of @karwa's work here: +# https://github.com/karwa/swift-url/blob/main/.github/workflows/docs.yml +name: Documentation + +on: + release: + types: + - published + push: + branches: + - main + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout Package + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Download Swift 5.5.1 + run: wget -q https://download.swift.org/swift-5.5.1-release/ubuntu2004/swift-5.5.1-RELEASE/swift-5.5.1-RELEASE-ubuntu20.04.tar.gz + - name: Extract Swift 5.5.1 + run: tar xzf swift-5.5.1-RELEASE-ubuntu20.04.tar.gz + - name: Add Swift toolchain to PATH + run: | + echo "$GITHUB_WORKSPACE/swift-5.5.1-RELEASE-ubuntu20.04/usr/bin" >> $GITHUB_PATH + + - name: Checkout swift-docc + uses: actions/checkout@v2 + with: + repository: apple/swift-docc + ref: main + path: swift-docc + - name: Cache DocC + id: cache-docc + uses: actions/cache@v2 + with: + key: swift-url-docc-build + path: swift-docc/.build + - name: Build swift-docc + if: ${{ !steps.cache-docc.outputs.cache-hit }} + run: | + cd swift-docc; swift build --product docc -c release; cd .. + + - name: Checkout swift-docc-render + uses: actions/checkout@v2 + with: + repository: apple/swift-docc-render + ref: main + path: swift-docc-render + - name: Build swift-docc-render + run: | + cd swift-docc-render; npm install && npm run build; cd .. + + - name: Checkout gh-pages Branch + uses: actions/checkout@v2 + with: + ref: gh-pages + path: docs-out + + - name: Build documentation + run: > + rm -rf docs-out/.git; + rm -rf docs-out/main; + + for tag in $(echo "main"; git tag); + do + echo "⏳ Generating documentation for "$tag" release."; + + if [ -d "docs-out/$tag" ] + then + echo "✅ Documentation for "$tag" already exists."; + else + git checkout "$tag"; + mkdir -p Sources/Parsing/Documentation.docc; + export DOCC_HTML_DIR="$(pwd)/swift-docc-render/dist"; + + rm -rf .build/symbol-graphs; + mkdir -p .build/symbol-graphs; + swift build \ + --target Parsing \ + -Xswiftc \ + -emit-symbol-graph \ + -Xswiftc \ + -emit-symbol-graph-dir \ + -Xswiftc \ + .build/symbol-graphs \ + && swift-docc/.build/release/docc convert Sources/Parsing/Documentation.docc \ + --fallback-display-name Parsing \ + --fallback-bundle-identifier co.pointfree.Parsing \ + --fallback-bundle-version 0.0.0 \ + --additional-symbol-graph-dir \ + .build/symbol-graphs \ + --transform-for-static-hosting \ + --hosting-base-path /swift-parsing/"$tag" \ + --output-path docs-out/"$tag" \ + && echo "✅ Documentation generated for "$tag" release." \ + || echo "⚠️ Documentation skipped for "$tag"."; + fi; + done + + - name: Fix permissions + run: 'sudo chown --recursive $USER docs-out' + - name: Publish documentation to GitHub Pages + uses: JamesIves/github-pages-deploy-action@4.1.7 + with: + branch: gh-pages + folder: docs-out + single-commit: true diff --git a/0184-parser-printers-pt7/swift-parsing/.github/workflows/format.yml b/0184-parser-printers-pt7/swift-parsing/.github/workflows/format.yml new file mode 100644 index 00000000..dc82144b --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/.github/workflows/format.yml @@ -0,0 +1,27 @@ +name: Format + +on: + push: + branches: + - main + +jobs: + swift_format: + name: swift-format + runs-on: macOS-11 + steps: + - uses: actions/checkout@v2 + - name: Xcode Select + run: sudo xcode-select -s /Applications/Xcode_13.0.app + - name: Tap + run: brew tap pointfreeco/formulae + - name: Install + run: brew install Formulae/swift-format@5.5 + - name: Format + run: make format + - uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Run swift-format + branch: 'main' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/0184-parser-printers-pt7/swift-parsing/.gitignore b/0184-parser-printers-pt7/swift-parsing/.gitignore new file mode 100644 index 00000000..95c43209 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/.gitignore @@ -0,0 +1,5 @@ +.DS_Store +/.build +/Packages +/*.xcodeproj +xcuserdata/ diff --git a/0184-parser-printers-pt7/swift-parsing/.spi.yml b/0184-parser-printers-pt7/swift-parsing/.spi.yml new file mode 100644 index 00000000..4310cbf8 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/.spi.yml @@ -0,0 +1,9 @@ +version: 1 +builder: + configs: + - platform: ios + scheme: Parsing + - platform: tvos + scheme: Parsing + - platform: watchos + scheme: Parsing_watchOS diff --git a/0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/Parsing.xcscheme b/0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/Parsing.xcscheme new file mode 100644 index 00000000..395a3a06 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/Parsing.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/Parsing_watchOS.xcscheme b/0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/Parsing_watchOS.xcscheme new file mode 100644 index 00000000..66240709 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/Parsing_watchOS.xcscheme @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/swift-parsing-Package.xcscheme b/0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/swift-parsing-Package.xcscheme new file mode 100644 index 00000000..a51fd97f --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/swift-parsing-Package.xcscheme @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/swift-parsing-benchmark.xcscheme b/0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/swift-parsing-benchmark.xcscheme new file mode 100644 index 00000000..468d153b --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/swift-parsing-benchmark.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/variadics-generator.xcscheme b/0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/variadics-generator.xcscheme new file mode 100644 index 00000000..2cfb69db --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/.swiftpm/xcode/xcshareddata/xcschemes/variadics-generator.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/0184-parser-printers-pt7/swift-parsing/LICENSE b/0184-parser-printers-pt7/swift-parsing/LICENSE new file mode 100644 index 00000000..9d6cb13b --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Point-Free, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/0184-parser-printers-pt7/swift-parsing/Makefile b/0184-parser-printers-pt7/swift-parsing/Makefile new file mode 100644 index 00000000..3605edf4 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Makefile @@ -0,0 +1,42 @@ +PLATFORM_IOS = iOS Simulator,name=iPhone 11 Pro +PLATFORM_MACOS = macOS +PLATFORM_TVOS = tvOS Simulator,name=Apple TV 4K (at 1080p) + +default: test + +benchmarks: + swift run -c release swift-parsing-benchmark + +test: + xcodebuild test \ + -scheme Parsing \ + -destination platform="$(PLATFORM_IOS)" + xcodebuild test \ + -scheme Parsing \ + -destination platform="$(PLATFORM_MACOS)" + xcodebuild test \ + -scheme Parsing \ + -destination platform="$(PLATFORM_TVOS)" + +test-linux: + docker run \ + --rm \ + -v "$(PWD):$(PWD)" \ + -w "$(PWD)" \ + swift:5.3 \ + bash -c 'make test-swift' + +test-swift: + swift test \ + --enable-test-discovery \ + --parallel + +format: + swift format --in-place --recursive \ + ./Package.swift ./Sources ./Tests + find . -type f -name '*.md' -print0 | xargs -0 perl -pi -e 's/ +$$//' + +generate-variadics: + swift run variadics-generator > Sources/Parsing/Builders/Variadics.swift + +.PHONY: benchmarks format generate-variadics test diff --git a/0184-parser-printers-pt7/swift-parsing/Package.swift b/0184-parser-printers-pt7/swift-parsing/Package.swift new file mode 100644 index 00000000..64dced2d --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Package.swift @@ -0,0 +1,29 @@ +// swift-tools-version:5.5 + +import PackageDescription + +let package = Package( + name: "swift-parsing", + products: [ + .library( + name: "Parsing", + targets: ["Parsing"] + ) + ], + dependencies: [ + .package(url: "https://github.com/apple/swift-argument-parser", from: "0.5.0"), + .package(name: "Benchmark", url: "https://github.com/google/swift-benchmark", from: "0.1.1"), + ], + targets: [ + .target( + name: "Parsing" + ), + .executableTarget( + name: "swift-parsing-benchmark", + dependencies: [ + "Parsing", + .product(name: "Benchmark", package: "Benchmark"), + ] + ), + ] +) diff --git a/0184-parser-printers-pt7/swift-parsing/Parsing.playground/Pages/Printing.xcplaygroundpage/Contents.swift b/0184-parser-printers-pt7/swift-parsing/Parsing.playground/Pages/Printing.xcplaygroundpage/Contents.swift new file mode 100644 index 00000000..f30441af --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Parsing.playground/Pages/Printing.xcplaygroundpage/Contents.swift @@ -0,0 +1,753 @@ +import Parsing + +var input = ""[...] + +protocol AppendableCollection: Collection { + mutating func append(contentsOf newElements: S) where S : Sequence, Self.Element == S.Element + mutating func prepend(contentsOf newElements: S) where S : Sequence, Self.Element == S.Element +} + +extension Substring: AppendableCollection { + mutating func prepend(contentsOf newElements: S) where S : Sequence, Character == S.Element { + var result = ""[...] + defer { self = result } + result.append(contentsOf: newElements) + result.append(contentsOf: self) + } +} + +extension Substring.UTF8View: AppendableCollection { + mutating func append(contentsOf newElements: S) where S : Sequence, String.UTF8View.Element == S.Element { + var result = Substring(self) + switch newElements { + case let newElements as Substring.UTF8View: + result.append(contentsOf: Substring(newElements)) + default: + result.append(contentsOf: Substring(decoding: Array(newElements), as: UTF8.self)) + } + self = result.utf8 + } + + mutating func prepend(contentsOf newElements: S) where S : Sequence, String.UTF8View.Element == S.Element { + var result = Substring(self) + switch newElements { + case let newElements as Substring.UTF8View: + result.prepend(contentsOf: Substring(newElements)) + default: + result.prepend(contentsOf: Substring(decoding: Array(newElements), as: UTF8.self)) + } + self = result.utf8 + } +} + +protocol Printer { + associatedtype Input + associatedtype Output + func print(_ output: Output, to input: inout Input) throws +} + +extension String: Printer { + func print(_ output: (), to input: inout Substring) { + input.prepend(contentsOf: self) + } +} + +extension String.UTF8View: Printer { + func print(_ output: (), to input: inout Substring.UTF8View) { + input.prepend(contentsOf: self) + } +} + +struct PrintingError: Error {} + +extension Prefix: Printer where Input: AppendableCollection { + func print(_ output: Input, to input: inout Input) throws { + guard input.isEmpty || !self.predicate!(input.first!) + else { throw PrintingError() } + + guard output.allSatisfy(self.predicate!) + else { throw PrintingError() } + + input.prepend(contentsOf: output) + } +} + +extension First: Printer where Input: AppendableCollection { + func print(_ output: Input.Element, to input: inout Input) throws { + input.prepend(contentsOf: [output]) + } +} + +extension Parse: Printer where Parsers: Printer { + func print(_ output: Parsers.Output, to input: inout Parsers.Input) throws { + try self.parsers.print(output, to: &input) + } +} + +extension Parsers.ZipVOV: Printer +where P0: Printer, P1: Printer, P2: Printer +{ + func print( + _ output: P1.Output, + to input: inout P0.Input + ) throws { + try self.p2.print((), to: &input) + try self.p1.print(output, to: &input) + try self.p0.print((), to: &input) + } +} + +typealias ParsePrint = Parse

+ +extension OneOf: Printer where Parsers: Printer { + func print(_ output: Parsers.Output, to input: inout Parsers.Input) throws { + try self.parsers.print(output, to: &input) + } +} + +extension Parsers.OneOf2: Printer where P0: Printer, P1: Printer { + func print(_ output: P0.Output, to input: inout P0.Input) throws { + let original = input + do { + try self.p1.print(output, to: &input) + } catch { + input = original + try self.p0.print(output, to: &input) + } + } +} + +extension Parsers.OneOf3: Printer where P0: Printer, P1: Printer, P2: Printer { + func print(_ output: P0.Output, to input: inout P0.Input) throws { + let original = input + do { + try self.p2.print(output, to: &input) + } catch { + input = original + do { + try self.p1.print(output, to: &input) + } catch { + input = original + try self.p0.print(output, to: &input) + } + } + } +} + +extension Skip: Printer where Parsers: Printer, Parsers.Output == Void { + func print( + _ output: (), + to input: inout Parsers.Input + ) throws { + try self.parsers.print((), to: &input) + } +} + +extension Parsers.ZipVV: Printer where P0: Printer, P1: Printer { + func print(_ output: (), to input: inout P0.Input) throws { + try self.p1.print((), to: &input) + try self.p0.print((), to: &input) + } +} + +extension Parsers.IntParser: Printer where Input: AppendableCollection { + func print(_ output: Output, to input: inout Input) { + input.prepend(contentsOf: String(output).utf8) + } +} + +extension FromUTF8View: Printer where UTF8Parser: Printer { + func print( + _ output: UTF8Parser.Output, + to input: inout Input + ) throws { + var utf8 = self.toUTF8(input) + defer { input = self.fromUTF8(utf8) } + try self.utf8Parser.print(output, to: &utf8) + } +} + +extension Parsers.BoolParser: Printer where Input: AppendableCollection { + func print( + _ output: Bool, + to input: inout Input + ) throws { + input.prepend(contentsOf: String(output).utf8) + } +} + +extension Parsers.ZipOVOVO: Printer +where + P0: Printer, + P1: Printer, + P2: Printer, + P3: Printer, + P4: Printer +{ + func print(_ output: (P0.Output, P2.Output, P4.Output), to input: inout P0.Input) throws { + try self.p4.print(output.2, to: &input) + try self.p3.print((), to: &input) + try self.p2.print(output.1, to: &input) + try self.p1.print((), to: &input) + try self.p0.print(output.0, to: &input) + } +} + +extension Parsers.ZipOO: Printer where P0: Printer, P1: Printer { + func print(_ output: (P0.Output, P1.Output), to input: inout P0.Input) throws { + try p1.print(output.1, to: &input) + try p0.print(output.0, to: &input) + } +} + +extension Parsers.ZipVO: Printer where P0: Printer, P1: Printer { + func print(_ output: P1.Output, to input: inout P0.Input) throws { + try p1.print(output, to: &input) + try p0.print((), to: &input) + } +} + +extension Many: Printer +where + Element: Printer, + Separator: Printer, + Separator.Output == Void, + Terminator: Printer, + Terminator.Output == Void, + Result == [Element.Output] +{ + func print(_ output: [Element.Output], to input: inout Element.Input) throws { + try self.terminator.print((), to: &input) + var firstElement = true + for elementOutput in output.reversed() { + defer { firstElement = false } + if !firstElement { + try self.separator.print((), to: &input) + } + try self.element.print(elementOutput, to: &input) + } + } +} + +extension Parsers.Map: Printer where + Upstream: Printer, + Upstream.Output == Void, + NewOutput: Equatable +{ + func print(_ output: NewOutput, to input: inout Upstream.Input) throws { + guard self.transform(()) == output + else { + throw PrintingError() + } + try self.upstream.print((), to: &input) + } +} + +typealias ParserPrinter = Parser & Printer + +struct Conversion { + let apply: (A) throws -> B + let unapply: (B) throws -> A +} + +extension Conversion where A == Substring, B == String { + static let string = Self( + apply: { String($0) }, + unapply: { Substring($0) } + ) +} + +extension Parser where Self: Printer { + func map( + _ conversion: Conversion + ) -> Parsers.InvertibleMap { + .init(upstream: self, transform: conversion.apply, untransform: conversion.unapply) + } +} + +extension Parsers { + struct InvertibleMap: ParserPrinter { + let upstream: Upstream + let transform: (Upstream.Output) throws -> NewOutput + let untransform: (NewOutput) throws -> Upstream.Output + + func parse(_ input: inout Upstream.Input) throws -> NewOutput { + try self.transform(self.upstream.parse(&input)) + } + + func print(_ output: NewOutput, to input: inout Upstream.Input) throws { + try self.upstream.print(self.untransform(output), to: &input) + } + } +} + +extension Parse { + init( + _ conversion: Conversion, + @ParserBuilder with build: () -> Upstream + ) where Parsers == Parsing.Parsers.InvertibleMap { + self.init { build().map(conversion) } + } +} + +extension Parsers.ZipOVO: Printer where P0: Printer, P1: Printer, P2: Printer { + func print(_ output: (P0.Output, P2.Output), to input: inout P0.Input) throws { + try self.p2.print(output.1, to: &input) + try self.p1.print((), to: &input) + try self.p0.print(output.0, to: &input) + } +} + +extension Parser { + func printing(_ input: Input) -> Parsers.Printing where Input: AppendableCollection { + .init(upstream: self, input: input) + } +} + +extension Parsers { + struct Printing: ParserPrinter where Upstream.Input: AppendableCollection { + let upstream: Upstream + let input: Upstream.Input + + func parse(_ input: inout Upstream.Input) throws -> Upstream.Output { + try self.upstream.parse(&input) + } + + func print(_ output: Upstream.Output, to input: inout Upstream.Input) throws { + input.prepend(contentsOf: self.input) + } + } +} + +extension End: Printer { + func print(_ output: (), to input: inout Input) throws { + guard input.isEmpty + else { throw PrintingError() } + } +} + +extension Rest: Printer where Input: AppendableCollection { + func print(_ output: Input, to input: inout Input) throws { + guard !output.isEmpty, input.isEmpty + else { throw PrintingError() } + + input.prepend(contentsOf: output) + } +} + +extension Not: Printer where Upstream: Printer, Upstream.Output == Void { + func print(_ output: (), to input: inout Upstream.Input) throws { + var input = input + do { + try self.upstream.parse(&input) + } catch { + return + } + throw PrintingError() + } +} + +struct ConvertingError: Error {} + +extension Conversion { + static func `struct`(_ `init`: @escaping (A) -> B) -> Self { + Self( + apply: `init`, + unapply: { unsafeBitCast($0, to: A.self) } + ) + } +} + +let x = 1 +// let y = 2 + +let uncommentedLine = Parse { + Not { "//" } + Prefix { $0 != "\n" } +} + +input = "" +try uncommentedLine.print("let x = 1", to: &input) +input +try uncommentedLine.parse(input) +//try uncommentedLine.parse("// let x = 1") + + +input = "" +try ParsePrint { + "Hello " + Int.parser() +} +.print(42, to: &input) +input + + +//input = "" +//try ParsePrint +//{ +// Rest() +// Rest() +//} +//.print(("Hello", "World"), to: &input) +//input +//try Parse +//{ +// Rest() +// Rest() +//} +//.parse(input) + +input = "" +try Parse { + "Hello" + End() +} +.print((), to: &input) +input +//.parse("") + + +input = "" +try Parse { + Prefix { $0 != "\"" } +} +.print("Blob, Esq.", to: &input) +input + +try Prefix +{ $0 != "\"" }.parse(&input) + +input = "" +"Hello".print((), to: &input) +try "Hello".parse(&input) // () + +//print(<#T##items: Any...##Any#>, to: &<#T##TextOutputStream#>) + +// parse: (inout Input) throws -> Output + +// parse: (Input) throws -> (Output, Input) +// print: (Output, Input) throws -> Input + +// print: (Output, inout Input) throws -> Void + +// (S) -> (S, A) +// (inout S) -> A + +let usersCsv = """ +1, Blob, admin +2, Blob Jr, member +3, Blob Sr, guest +4, "Blob, Esq.", admin +""" + +enum Role { + case admin, guest, member +} + +struct User: Equatable { + var id: Int + var name: String + var role: Role +} + +extension Conversion where A == Void, B: Equatable { + static func exactly(_ output: B) -> Self { + .init(apply: { output }, unapply: { + guard $0 == output + else { throw ConvertingError() } + }) + } +} + +let role = OneOf { + "admin".map { Role.admin } + "guest".map { Role.guest } + "member".map { Role.member } +} + +input = "" +try role.print(.guest, to: &input) +input +input = "" +try role.print(.admin, to: &input) +input +input = "" +try role.print(.member, to: &input) +input + + +//OneOf { +// a.map(f) +// b.map(f) +// c.map(f) +//} +//== +//OneOf { +// a +// b +// c +//} +//.map(f) + +let quotedFieldUtf8 = ParsePrint { + "\"".utf8 + Prefix { $0 != .init(ascii: "\"") } + "\"".utf8 +} +var inputUtf8 = ""[...].utf8 +try quotedFieldUtf8.print("Blob, Esq"[...].utf8, to: &inputUtf8) +Substring(inputUtf8) + +let quotedField = ParsePrint { + "\"" + Prefix { $0 != "\"" } + "\"" +} + +input = "" +try quotedField.print("Blob, Esq.", to: &input) +input +let parsedQuotedField = try quotedField.parse(&input) +try quotedField.print(parsedQuotedField, to: &input) +input + +let fieldUtf8 = OneOf { + quotedFieldUtf8 + + Prefix { $0 != .init(ascii: ",") } +} +// .map { String(Substring($0)) } + +let field = OneOf { + quotedField + + Prefix { $0 != "," } +} +.map(.string) + +input = "" +try field.print("Blob, Esq." as String, to: &input) +input + +input = "" +try field.print("Blob Jr." as String, to: &input) +input + +let zeroOrOneSpaceUtf8 = OneOf { + " ".utf8 + "".utf8 +} + +let zeroOrOneSpace = OneOf { + " " + "" +} +.printing(" ") + +input = "" +try Skip { + "," + zeroOrOneSpace +} +.print((), to: &input) +input + +let userUtf8 = Parse { + Int.parser() + Skip { + ",".utf8 + zeroOrOneSpaceUtf8 + } + fieldUtf8 + Skip { + ",".utf8 + zeroOrOneSpaceUtf8 + } + Bool.parser() +} + +unsafeBitCast((1, "Blob", true), to: User.self) +unsafeBitCast(User(id: 1, name: "Blob", role: .admin), to: (Int, String, Bool).self) + + +struct Private { + private let value: Int +// private let other: Int = 1 + private init(value: Int) { + self.value = value + } +} + +//Never + +//Private(value: 42) +let `private` = unsafeBitCast(42, to: Private.self) +unsafeBitCast(`private`, to: Int.self) + +extension Conversion where A == (Int, String, Role), B == User { + static let user = Self( + apply: B.init, + unapply: { unsafeBitCast($0, to: A.self) } + ) +} + + +struct Person { + let firstName, lastName: String + var bio: String = "" + + init(lastName: String, firstName: String) { + self.firstName = firstName + self.lastName = lastName + } +} + +MemoryLayout<(String, String)>.size +MemoryLayout.size + +let person = ParsePrint(.struct(Person.init)) { + Prefix { $0 != " " }.map(.string) + " " + Prefix { $0 != " " }.map(.string) +} + +input = "Blob McBlob" +let p = try person.parse(&input) +input +//try person.print(p, to: &input) +input + + +let user = ParsePrint(.struct(User.init)) { + Int.parser() + Skip { + "," + zeroOrOneSpace + } + field + Skip { + "," + zeroOrOneSpace + } + role +} +//.map(User.init) +//.map(.struct(User.init)) + +input = "" +try user.print(User(id: 42, name: "Blob, Esq.", role: .admin), to: &input) +input + +let usersUtf8 = Many { + userUtf8 +} separator: { + "\n".utf8 +} terminator: { + End() +} + +let users = Many { + user +} separator: { + "\n" +} terminator: { + End() +} + +//try users.parse(""" +//1,Blob,admin +//2,Blob Jr,member +//3,Blob Sr,true +//""") + +inputUtf8 = ""[...].utf8 +try usersUtf8.print([ + (1, "Blob"[...].utf8, true), + (2, "Blob, Esq."[...].utf8, false), +], to: &inputUtf8) +Substring(inputUtf8) + +input = "" +try users.print([ + User(id: 1, name: "Blob", role: .admin), + User(id: 2, name: "Blob, Esq.", role: .member), +], to: &input) +input + +input = "A,A,A,B" +try Many { "A" } separator: { "," }.parse(&input) +input + +input = usersCsv[...] +let output = try users.parse(&input) +input + +"," == "," + +func print(user: User) -> String { + "\(user.id), \(user.name.contains(",") ? "\"\(user.name)\"" : "\(user.name)"), \(user.role)" +} +struct UserPrinter: Printer { + func print(_ user: User, to input: inout String) { + input.append(contentsOf: "\(user.id),") + if user.name.contains(",") { + input.append(contentsOf: "\"\(user.name)\"") + } else { + input.append(contentsOf: user.name) + } + input.append(contentsOf: ",\(user.role)") + } +} + +print(user: .init(id: 42, name: "Blob", role: .admin)) + +func print(users: [User]) -> String { + users.map(print(user:)).joined(separator: "\n") +} +struct UsersPrinter: Printer { + func print(_ users: [User], to input: inout String) { + var firstElement = true + for user in users { + defer { firstElement = false } + if !firstElement { + input += "\n" + } + UserPrinter().print(user, to: &input) + } + } +} + +input = "" +//users.print(output, to: &input) + +//print(users: output) +// +//input = usersCsv[...] +//try print(users: users.parse(input)) == input +//try users.parse(print(users: output)) == output +// +//var inputString = "" +//UsersPrinter().print(output, to: &inputString) +//inputString + + + + +"🇺🇸".count +"🇺🇸".unicodeScalars.count +Array("🇺🇸".unicodeScalars) +String.UnicodeScalarView([.init(127482)!]) +String.UnicodeScalarView([.init(127480)!]) + +"🇺🇸".utf8.count +Array("🇺🇸".utf8) + +String(decoding: [240, 159, 135, 186, 240, 159, 135, 184], as: UTF8.self) +String(decoding: [240, 159, 135, 186], as: UTF8.self) +String(decoding: [240, 159, 135, 184], as: UTF8.self) + +String(decoding: [240, 159], as: UTF8.self) +String(decoding: [135, 186, 240, 159, 135, 184], as: UTF8.self) + +var utf8 = "🇺🇸".utf8 +//utf8.replaceSubrange(0...0, with: [241]) diff --git a/0184-parser-printers-pt7/swift-parsing/Parsing.playground/Pages/Race.xcplaygroundpage/Contents.swift b/0184-parser-printers-pt7/swift-parsing/Parsing.playground/Pages/Race.xcplaygroundpage/Contents.swift new file mode 100644 index 00000000..162fedde --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Parsing.playground/Pages/Race.xcplaygroundpage/Contents.swift @@ -0,0 +1,650 @@ +import Parsing + +protocol AppendableCollection: Collection { + mutating func append(contentsOf newElements: S) where S : Sequence, Self.Element == S.Element + mutating func prepend(contentsOf newElements: S) where S : Sequence, Self.Element == S.Element +} + +extension Substring: AppendableCollection { + mutating func prepend(contentsOf newElements: S) where S : Sequence, Character == S.Element { + var result = ""[...] + defer { self = result } + result.append(contentsOf: newElements) + result.append(contentsOf: self) + } +} + +extension Substring.UTF8View: AppendableCollection { + mutating func append(contentsOf newElements: S) where S : Sequence, String.UTF8View.Element == S.Element { + var result = Substring(self) + switch newElements { + case let newElements as Substring.UTF8View: + result.append(contentsOf: Substring(newElements)) + default: + result.append(contentsOf: Substring(decoding: Array(newElements), as: UTF8.self)) + } + self = result.utf8 + } + + mutating func prepend(contentsOf newElements: S) where S : Sequence, String.UTF8View.Element == S.Element { + var result = Substring(self) + switch newElements { + case let newElements as Substring.UTF8View: + result.prepend(contentsOf: Substring(newElements)) + default: + result.prepend(contentsOf: Substring(decoding: Array(newElements), as: UTF8.self)) + } + self = result.utf8 + } +} + +protocol Printer { + associatedtype Input + associatedtype Output + func print(_ output: Output, to input: inout Input) throws +} + +extension String: Printer { + func print(_ output: (), to input: inout Substring) { + input.prepend(contentsOf: self) + } +} + +extension String.UTF8View: Printer { + func print(_ output: (), to input: inout Substring.UTF8View) { + input.prepend(contentsOf: self) + } +} + +struct PrintingError: Error {} + +extension Prefix: Printer where Input: AppendableCollection { + func print(_ output: Input, to input: inout Input) throws { + guard input.isEmpty || !self.predicate!(input.first!) + else { throw PrintingError() } + + guard output.allSatisfy(self.predicate!) + else { throw PrintingError() } + + input.prepend(contentsOf: output) + } +} + +extension First: Printer where Input: AppendableCollection { + func print(_ output: Input.Element, to input: inout Input) throws { + input.prepend(contentsOf: [output]) + } +} + +extension Parse: Printer where Parsers: Printer { + func print(_ output: Parsers.Output, to input: inout Parsers.Input) throws { + try self.parsers.print(output, to: &input) + } +} + +extension Parsers.ZipVOV: Printer +where P0: Printer, P1: Printer, P2: Printer +{ + func print( + _ output: P1.Output, + to input: inout P0.Input + ) throws { + try self.p2.print((), to: &input) + try self.p1.print(output, to: &input) + try self.p0.print((), to: &input) + } +} + +typealias ParsePrint = Parse

+ +extension OneOf: Printer where Parsers: Printer { + func print(_ output: Parsers.Output, to input: inout Parsers.Input) throws { + try self.parsers.print(output, to: &input) + } +} + +extension Parsers.OneOf2: Printer where P0: Printer, P1: Printer { + func print(_ output: P0.Output, to input: inout P0.Input) throws { + let original = input + do { + try self.p1.print(output, to: &input) + } catch { + input = original + try self.p0.print(output, to: &input) + } + } +} + +extension Parsers.OneOf3: Printer where P0: Printer, P1: Printer, P2: Printer { + func print(_ output: P0.Output, to input: inout P0.Input) throws { + let original = input + do { + try self.p2.print(output, to: &input) + } catch { + input = original + do { + try self.p1.print(output, to: &input) + } catch { + input = original + try self.p0.print(output, to: &input) + } + } + } +} + +extension Skip: Printer where Parsers: Printer, Parsers.Output == Void { + func print( + _ output: (), + to input: inout Parsers.Input + ) throws { + try self.parsers.print((), to: &input) + } +} + +extension Parsers.ZipVV: Printer where P0: Printer, P1: Printer { + func print(_ output: (), to input: inout P0.Input) throws { + try self.p1.print((), to: &input) + try self.p0.print((), to: &input) + } +} + +extension Parsers.IntParser: Printer where Input: AppendableCollection { + func print(_ output: Output, to input: inout Input) { + input.prepend(contentsOf: String(output).utf8) + } +} +extension Parsers.DoubleParser: Printer where Input: AppendableCollection { + func print(_ output: Output, to input: inout Input) { + input.prepend(contentsOf: String(output).utf8) + } +} + +extension FromUTF8View: Printer where UTF8Parser: Printer { + func print( + _ output: UTF8Parser.Output, + to input: inout Input + ) throws { + var utf8 = self.toUTF8(input) + defer { input = self.fromUTF8(utf8) } + try self.utf8Parser.print(output, to: &utf8) + } +} + +extension Parsers.BoolParser: Printer where Input: AppendableCollection { + func print( + _ output: Bool, + to input: inout Input + ) throws { + input.prepend(contentsOf: String(output).utf8) + } +} + +extension Parsers.ZipOVOVO: Printer +where + P0: Printer, + P1: Printer, + P2: Printer, + P3: Printer, + P4: Printer +{ + func print(_ output: (P0.Output, P2.Output, P4.Output), to input: inout P0.Input) throws { + try self.p4.print(output.2, to: &input) + try self.p3.print((), to: &input) + try self.p2.print(output.1, to: &input) + try self.p1.print((), to: &input) + try self.p0.print(output.0, to: &input) + } +} + +extension Parsers.ZipOV: Printer where P0: Printer, P1: Printer { + func print(_ output: (P0.Output), to input: inout P0.Input) throws { + try self.p1.print((), to: &input) + try self.p0.print(output, to: &input) + } +} + +extension Parsers.ZipOVOVOO: Printer where P0: Printer, P1: Printer, P2: Printer, P3: Printer, P4: Printer, P5: Printer { + func print(_ output: (P0.Output, P2.Output, P4.Output, P5.Output), to input: inout P0.Input) throws { + try self.p5.print(output.3, to: &input) + try self.p4.print(output.2, to: &input) + try self.p3.print((), to: &input) + try self.p2.print(output.1, to: &input) + try self.p1.print((), to: &input) + try self.p0.print(output.0, to: &input) + } +} + +extension Parsers.ZipOO: Printer where P0: Printer, P1: Printer { + func print(_ output: (P0.Output, P1.Output), to input: inout P0.Input) throws { + try p1.print(output.1, to: &input) + try p0.print(output.0, to: &input) + } +} + +extension Parsers.ZipVO: Printer where P0: Printer, P1: Printer { + func print(_ output: P1.Output, to input: inout P0.Input) throws { + try p1.print(output, to: &input) + try p0.print((), to: &input) + } +} + +extension Many: Printer +where + Element: Printer, + Separator: Printer, + Separator.Output == Void, + Terminator: Printer, + Terminator.Output == Void, + Result == [Element.Output] +{ + func print(_ output: [Element.Output], to input: inout Element.Input) throws { + try self.terminator.print((), to: &input) + var firstElement = true + for elementOutput in output.reversed() { + defer { firstElement = false } + if !firstElement { + try self.separator.print((), to: &input) + } + try self.element.print(elementOutput, to: &input) + } + } +} + +extension Parsers.Map: Printer where + Upstream: Printer, + Upstream.Output == Void, + NewOutput: Equatable +{ + func print(_ output: NewOutput, to input: inout Upstream.Input) throws { + guard self.transform(()) == output + else { + throw PrintingError() + } + try self.upstream.print((), to: &input) + } +} + +typealias ParserPrinter = Parser & Printer + +struct Conversion { + let apply: (A) throws -> B + let unapply: (B) throws -> A +} + +extension Conversion where A == Substring, B == String { + static let string = Self( + apply: { String($0) }, + unapply: { Substring($0) } + ) +} + +extension Parser where Self: Printer { + func map( + _ conversion: Conversion + ) -> Parsers.InvertibleMap { + .init(upstream: self, transform: conversion.apply, untransform: conversion.unapply) + } +} + +extension Parsers { + struct InvertibleMap: ParserPrinter { + let upstream: Upstream + let transform: (Upstream.Output) throws -> NewOutput + let untransform: (NewOutput) throws -> Upstream.Output + + func parse(_ input: inout Upstream.Input) throws -> NewOutput { + try self.transform(self.upstream.parse(&input)) + } + + func print(_ output: NewOutput, to input: inout Upstream.Input) throws { + try self.upstream.print(self.untransform(output), to: &input) + } + } +} + +extension Parse { + init( + _ conversion: Conversion, + @ParserBuilder with build: () -> Upstream + ) where Parsers == Parsing.Parsers.InvertibleMap { + self.init { build().map(conversion) } + } +} + +extension Parsers.ZipOVO: Printer where P0: Printer, P1: Printer, P2: Printer { + func print(_ output: (P0.Output, P2.Output), to input: inout P0.Input) throws { + try self.p2.print(output.1, to: &input) + try self.p1.print((), to: &input) + try self.p0.print(output.0, to: &input) + } +} + +extension Parser { + func printing(_ input: Input) -> Parsers.Printing where Input: AppendableCollection { + .init(upstream: self, input: input) + } +} + +extension Parsers { + struct Printing: ParserPrinter where Upstream.Input: AppendableCollection { + let upstream: Upstream + let input: Upstream.Input + + func parse(_ input: inout Upstream.Input) throws -> Upstream.Output { + try self.upstream.parse(&input) + } + + func print(_ output: Upstream.Output, to input: inout Upstream.Input) throws { + input.prepend(contentsOf: self.input) + } + } +} + +extension End: Printer { + func print(_ output: (), to input: inout Input) throws { + guard input.isEmpty + else { throw PrintingError() } + } +} + +extension Rest: Printer where Input: AppendableCollection { + func print(_ output: Input, to input: inout Input) throws { + guard !output.isEmpty, input.isEmpty + else { throw PrintingError() } + + input.prepend(contentsOf: output) + } +} + +extension Not: Printer where Upstream: Printer, Upstream.Output == Void { + func print(_ output: (), to input: inout Upstream.Input) throws { + var input = input + do { + try self.upstream.parse(&input) + } catch { + return + } + throw PrintingError() + } +} + +struct ConvertingError: Error {} + +extension Conversion { + static func `struct`(_ `init`: @escaping (A) -> B) -> Self { + Self( + apply: `init`, + unapply: { unsafeBitCast($0, to: A.self) } + ) + } +} +extension Always: Printer where Output == Void { + func print(_ output: Void, to input: inout Input) throws { + } +} + +struct Coordinate { + let latitude: Double + let longitude: Double +} + +enum Currency { case eur, gbp, usd } + +struct Money { + let currency: Currency + let dollars: Int +} + +Array("🥵".utf8) + +let count = Conversion<[Void], Int>( + apply: \.count, + unapply: { count in Array(repeating: (), count: count) } +) + +let difficulty = // Prefix { $0 == "🥵" }.map(\.count) +Many { "🥵".utf8 }.map(count) + +input = ""[...].utf8 +try Many { "🥵".utf8 }.print([(), (), ()], to: &input) +Substring(input) + +try difficulty.parse("🥵🥵🥵🥵".utf8) + +input = ""[...].utf8 +try difficulty.print(5, to: &input) +Substring(input) + +struct Race { + let location: String + let entranceFee: Money + let difficulty: Int + let path: [Coordinate] +} + +let northSouthSign = OneOf { + "N".utf8.map { 1.0 } + "S".utf8.map { -1.0 } +} + +var input = ""[...].utf8 +try northSouthSign.print(-1, to: &input) +Substring(input) + +let eastWestSign = OneOf { + "E".utf8.map { 1.0 } + "W".utf8.map { -1.0 } +} + +let magnitudeSign = Conversion<(Double, Double), Double>( + apply: *, + unapply: { value in + value < 0 ? (-value, -1) : (value, 1) + } +) + +func print(coordinate: Coordinate) -> String { + "\(abs(coordinate.latitude))° \(coordinate.latitude < 0 ? "S" : "N"), \(abs(coordinate.longitude))° \(coordinate.longitude < 0 ? "W" : "E")" +} + +let latitude = ParsePrint(magnitudeSign) { + Double.parser() + "° ".utf8 + northSouthSign +} +input = ""[...].utf8 +try latitude.print(-37, to: &input) +Substring(input) + +let longitude = ParsePrint(magnitudeSign) { + Double.parser() + "° ".utf8 + eastWestSign +} + +let zeroOrMoreSpaces = Skip { Prefix { $0 == .init(ascii: " ") } } + .printing(" "[...].utf8) + +let coord = ParsePrint(.struct(Coordinate.init)) { + latitude + Skip { + ",".utf8 + zeroOrMoreSpaces + } + longitude +} + +input = ""[...].utf8 +try coord.print(.init(latitude: 37, longitude: -42), to: &input) +Substring(input) + +let currency = OneOf { + "€".utf8.map { Currency.eur } + "£".utf8.map { Currency.gbp } + "$".utf8.map { Currency.usd } +} + +input = ""[...].utf8 +try currency.print(.eur, to: &input) +Substring(input) + +let money = Parse(.struct(Money.init)) { + currency + Int.parser() +} + +input = ""[...].utf8 +try money.print(.init(currency: .usd, dollars: 300), to: &input) +Substring(input) + +let locationName = Prefix { $0 != .init(ascii: ",") } + +extension Conversion where A == Substring.UTF8View, B == String { + static let string = Self( + apply: { String(Substring($0)) }, + unapply: { $0[...].utf8 } + ) +} + +let race = ParsePrint(.struct(Race.init)) { + locationName.map(.string) + Skip { + ",".utf8 + zeroOrMoreSpaces + } + money + Skip { + ",".utf8 + zeroOrMoreSpaces + } + ParsePrint { + difficulty + "\n".utf8 + } + Many { + coord + } separator: { + "\n".utf8 + } +} + +input = ""[...].utf8 +try race.print( + .init( + location: "New York", + entranceFee: .init(currency: .usd, dollars: 300), + difficulty: 4, + path: [ + .init(latitude: 37, longitude: 42), + .init(latitude: 37.01, longitude: 42.01) + ] + ), + to: &input +) +Substring(input) + +let races = Many { + race +} separator: { + "\n---\n".utf8 +} + +input = ""[...].utf8 +try races.print( + [ + .init( + location: "New York", + entranceFee: .init(currency: .usd, dollars: 300), + difficulty: 4, + path: [ + .init(latitude: 37, longitude: 42), + .init(latitude: 37.01, longitude: 42.01) + ] + ), + .init( + location: "Berlin", + entranceFee: .init(currency: .eur, dollars: 200), + difficulty: 3, + path: [ + .init(latitude: 37, longitude: 42), + .init(latitude: 37.01, longitude: 42.01) + ] + ) + ], + to: &input +) +Substring(input) + +let racesInput = """ + New York City, $300, 🥵🥵🥵🥵 + 40.60248° N, 74.06433° W + 40.61807° N, 74.02966° W + 40.64953° N, 74.00929° W + 40.67884° N, 73.98198° W + 40.69894° N, 73.95701° W + 40.72791° N, 73.95314° W + 40.74882° N, 73.94221° W + 40.7574° N, 73.95309° W + 40.76149° N, 73.96142° W + 40.77111° N, 73.95362° W + 40.8026° N, 73.93061° W + 40.80409° N, 73.92893° W + 40.81432° N, 73.93292° W + 40.80325° N, 73.94472° W + 40.77392° N, 73.96917° W + 40.77293° N, 73.97671° W + --- + Berlin, €100, 🥵🥵🥵 + 13.36015° N, 52.51516° E + 13.33999° N, 52.51381° E + 13.32539° N, 52.51797° E + 13.33696° N, 52.52507° E + 13.36454° N, 52.52278° E + 13.38152° N, 52.52295° E + 13.40072° N, 52.52969° E + 13.42555° N, 52.51508° E + 13.41858° N, 52.49862° E + 13.40929° N, 52.48882° E + 13.37968° N, 52.49247° E + 13.34898° N, 52.48942° E + 13.34103° N, 52.47626° E + 13.32851° N, 52.47122° E + 13.30852° N, 52.46797° E + 13.28742° N, 52.47214° E + 13.29091° N, 52.4827° E + 13.31084° N, 52.49275° E + 13.32052° N, 52.5019° E + 13.34577° N, 52.50134° E + 13.36903° N, 52.50701° E + 13.39155° N, 52.51046° E + 13.37256° N, 52.51598° E + --- + London, £500, 🥵🥵 + 51.48205° N, 0.04283° E + 51.47439° N, 0.0217° E + 51.47618° N, 0.02199° E + 51.49295° N, 0.05658° E + 51.47542° N, 0.03019° E + 51.47537° N, 0.03015° E + 51.47435° N, 0.03733° E + 51.47954° N, 0.04866° E + 51.48604° N, 0.06293° E + 51.49314° N, 0.06104° E + 51.49248° N, 0.0474° E + 51.48888° N, 0.03564° E + 51.48655° N, 0.0183° E + 51.48085° N, 0.02223° W + 51.4921° N, 0.0451° W + 51.49324° N, 0.04699° W + 51.50959° N, 0.05491° W + 51.50961° N, 0.0539° W + 51.4995° N, 0.01356° W + 51.50898° N, 0.02341° W + 51.51069° N, 0.04225° W + 51.51056° N, 0.04353° W + 51.50946° N, 0.0781° W + 51.51121° N, 0.09786° W + 51.50964° N, 0.1187° W + 51.50273° N, 0.1385° W + 51.50095° N, 0.12411° W + """ diff --git a/0184-parser-printers-pt7/swift-parsing/Parsing.playground/contents.xcplayground b/0184-parser-printers-pt7/swift-parsing/Parsing.playground/contents.xcplayground new file mode 100644 index 00000000..82b9f612 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Parsing.playground/contents.xcplayground @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/0184-parser-printers-pt7/swift-parsing/README.md b/0184-parser-printers-pt7/swift-parsing/README.md new file mode 100644 index 00000000..8684dd30 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/README.md @@ -0,0 +1,372 @@ +# swift-parsing + +![CI](https://github.com/pointfreeco/swift-parsing/workflows/CI/badge.svg) +[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fpointfreeco%2Fswift-parsing%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/pointfreeco/swift-parsing) +[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fpointfreeco%2Fswift-parsing%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/pointfreeco/swift-parsing) + +A library for turning nebulous data into well-structured data, with a focus on composition, performance, generality, and ergonomics: + +* **Composition**: Ability to break large, complex parsing problems down into smaller, simpler ones. And the ability to take small, simple parsers and easily combine them into larger, more complex ones. + +* **Performance**: Parsers that have been composed of many smaller parts should perform as well as highly-tuned, hand-written parsers. + +* **Generality**: Ability to parse _any_ kind of input into _any_ kind of output. This allows you to choose which abstraction levels you want to work on based on how much performance you need or how much correctness you want guaranteed. For example, you can write a highly tuned parser on collections of UTF-8 code units, and it will automatically plug into parsers of strings, arrays, unsafe buffer pointers and more. + +* **Ergonomics**: Accomplish all of the above in a simple, fluent API that can succinctly describe your parsing problem. + +--- + +* [Motivation](#motivation) +* [Getting started](#getting-started) +* [Benchmarks](#benchmarks) +* [Documentation](#documentation) +* [Other libraries](#other-libraries) +* [License](#license) + +## Learn More + +This library was designed over the course of many [episodes](https://www.pointfree.co/collections/parsing) on [Point-Free](https://www.pointfree.co), a video series exploring functional programming and the Swift language, hosted by [Brandon Williams](https://twitter.com/mbrandonw) and [Stephen Celis](https://twitter.com/stephencelis). You can watch all of the episodes [here](https://www.pointfree.co/collections/parsing). + + + video poster image + + +## Motivation + +Parsing is a surprisingly ubiquitous problem in programming. We can define parsing as trying to take a more nebulous blob of data and transform it into something more well-structured. The Swift standard library comes with a number of parsers that we reach for every day. For example, there are initializers on `Int`, `Double`, and even `Bool`, that attempt to parse numbers and booleans from strings: + +```swift +Int("42") // 42 +Int("Hello") // nil + +Double("123.45") // 123.45 +Double("Goodbye") // nil + +Bool("true") // true +Bool("0") // nil +``` + +And there are types like `JSONDecoder` and `PropertyListDecoder` that attempt to parse `Decodable`-conforming types from data: + +```swift +try JSONDecoder().decode(User.self, from: data) +try PropertyListDecoder().decode(Settings.self, from: data) +``` + +While parsers are everywhere in Swift, Swift has no holistic story _for_ parsing. Instead, we typically parse data in an ad hoc fashion using a number of unrelated initializers, methods, and other means. And this typically leads to less maintainable, less reusable code. + +This library aims to write such a story for parsing in Swift. It introduces a single unit of parsing that can be combined in interesting ways to form large, complex parsers that can tackle the programming problems you need to solve in a maintainable way. + +## Getting started + +> This is an abridged version of the ["Getting Started"][getting-started-docs] article in the library's [documentation][swift-parsing-docs]. + +Suppose you have a string that holds some user data that you want to parse into an array of `User`s: + +```swift +var input = """ +1,Blob,true +2,Blob Jr.,false +3,Blob Sr.,true +""" + +struct User { + var id: Int + var name: String + var isAdmin: Bool +} +``` + +A naive approach to this would be a nested use of `.split(separator:)`, and then a little bit of extra work to convert strings into integers and booleans: + +```swift +let users = input + .split(separator: "\n") + .compactMap { row -> User? in + let fields = row.split(separator: ",") + guard + fields.count == 3, + let id = Int(fields[0]), + let isAdmin = Bool(String(fields[2])) + else { return nil } + + return User(id: id, name: String(fields[1]), isAdmin: isAdmin) + } +``` + +Not only is this code a little messy, but it is also inefficient since we are allocating arrays for the `.split` and then just immediately throwing away those values. + +It would be more straightforward and efficient to instead describe how to consume bits from the beginning of the input and convert that into users. This is what this parser library excels at 😄. + +We can start by describing what it means to parse a single row, first by parsing an integer off the front of the string, and then parsing a comma. We can do this by using the `Parse` type, which acts as an entry point into describing a list of parsers that you want to run one after the other to consume from an input: + +```swift +let user = Parse { + Int.parser() + "," +} +``` + +Already this can consume the beginning of the input: + +```swift +// Use a mutable substring to verify what is consumed +var input = input[...] + +try user.parse(&input) // 1 +input // "Blob,true\n2,Blob Jr.,false\n3,Blob Sr.,true" +``` + +> Note that we use a `Substring` instead of `String` because it allows for more efficient mutations and copying. See the article ["String Abstractions"][string-abstractions-docs] for more information. + +Next we want to take everything up until the next comma for the user's name, and then consume the comma: + +```swift +let user = Parse { + Int.parser() + "," + Prefix { $0 != "," } + "," +} +``` + +And then we want to take the boolean at the end of the row for the user's admin status: + +```swift +let user = Parse { + Int.parser() + "," + Prefix { $0 != "," } + "," + Bool.parser() +} +``` + +Currently this will parse a tuple `(Int, Substring, Bool)` from the input, and we can `.map` on that to turn it into a `User`: + +```swift +let user = Parse { + Int.parser() + "," + Prefix { $0 != "," } + "," + Bool.parser() +} +.map { User(id: $0, name: String($1), isAdmin: $2) } +``` + +To make the data we are parsing to more prominent, we can instead pass the transform closure as the first argument to `Parse`: + +```swift +let user = Parse { + User(id: $0, name: String($1), isAdmin: $2) +} with: { + Int.parser() + "," + Prefix { $0 != "," } + "," + Bool.parser() +} +``` + +Or we can pass the `User` initializer to `Parse` in a point-free style by transforming the `Prefix` parser's output from a `Substring` to ` String` first: + +```swift +let user = Parse(User.init(id:name:isAdmin:)) { + Int.parser() + "," + Prefix { $0 != "," }.map(String.init) + "," + Bool.parser() +} +``` + +That is enough to parse a single user from the input string, leaving behind a newline and the final two users: + +```swift +try user.parse(&input) // User(id: 1, name: "Blob", isAdmin: true) +input // "\n2,Blob Jr.,false\n3,Blob Sr.,true" +``` + +To parse multiple users from the input we can use the `Many` parser to run the user parser many times: + +```swift +let users = Many { + user +} separator: { + "\n" +} + +try users.parse(&input) // [User(id: 1, name: "Blob", isAdmin: true), ...] +input // "" +``` + +Now this parser can process an entire document of users, and the code is simpler and more straightforward than the version that uses `.split` and `.compactMap`. + +Even better, it's more performant. We've written [benchmarks](Sources/swift-parsing-benchmark/ReadmeExample.swift) for these two styles of parsing, and the `.split`-style of parsing is more than twice as slow: + +``` +name time std iterations +------------------------------------------------------------------ +README Example.Parser: Substring 3426.000 ns ± 63.40 % 385395 +README Example.Ad hoc 7631.000 ns ± 47.01 % 169332 +Program ended with exit code: 0 +``` + +Further, if you are willing write your parsers against `UTF8View` instead of `Substring`, you can eke out even more performance, more than doubling the speed: + +``` +name time std iterations +------------------------------------------------------------------ +README Example.Parser: Substring 3693.000 ns ± 81.76 % 349763 +README Example.Parser: UTF8 1272.000 ns ± 128.16 % 999150 +README Example.Ad hoc 8504.000 ns ± 59.59 % 151417 +``` + +We can also compare these times to a tool that Apple's Foundation gives us: `Scanner`. It's a type that allows you to consume from the beginning of strings in order to produce values, and provides a nicer API than using `.split`: + +```swift +var users: [User] = [] +while scanner.currentIndex != input.endIndex { + guard + let id = scanner.scanInt(), + let _ = scanner.scanString(","), + let name = scanner.scanUpToString(","), + let _ = scanner.scanString(","), + let isAdmin = scanner.scanBool() + else { break } + + users.append(User(id: id, name: name, isAdmin: isAdmin)) + _ = scanner.scanString("\n") +} +``` + +However, the `Scanner` style of parsing is more than 5 times as slow as the substring parser written above, and more than 15 times slower than the UTF-8 parser: + +``` +name time std iterations +------------------------------------------------------------------- +README Example.Parser: Substring 3481.000 ns ± 65.04 % 376525 +README Example.Parser: UTF8 1207.000 ns ± 110.96 % 1000000 +README Example.Ad hoc 8029.000 ns ± 44.44 % 163719 +README Example.Scanner 19786.000 ns ± 35.26 % 62125 +``` + +That's the basics of parsing a simple string format, but there's a lot more operators and tricks to learn in order to performantly parse larger inputs. Read the [documentation][swift-parsing-docs] to dive more deeply into the concepts of parsing, and view the [benchmarks](Sources/swift-parsing-benchmark) for more examples of real life parsing scenarios. + +### Error messages + +When a parser fails it throws an error containing information about what went wrong. The actual error thrown by the parsers shipped with this library is internal, and so should be considered opaque. To get a human-readable description of the error message you can stringify the error. For example, the following `UInt8` parser fails to parse a string that would cause it to overflow: + +```swift +do { + var input = "1234 Hello"[...] + let number = try UInt8.parser().parse(&input)) +} catch { + print(error) + // error: failed to process "UInt8" + // --> input:1:1-4 + // 1 | 1234 Hello + // | ^^^^ overflowed 255 +} +``` + +## Benchmarks + +This library comes with a benchmark executable that not only demonstrates the performance of the library, but also provides a wide variety of parsing examples: + +* [Hex color](Sources/swift-parsing-benchmark/Color.swift) +* [Simplified CSV](Sources/swift-parsing-benchmark/CSV.swift) +* [Simplified JSON](Sources/swift-parsing-benchmark/JSON.swift) +* [ISO8601 date](Sources/swift-parsing-benchmark/Date.swift) +* [HTTP request](Sources/swift-parsing-benchmark/HTTP.swift) +* [DNS header](Sources/swift-parsing-benchmark/BinaryData.swift) +* [Arithmetic grammar](Sources/swift-parsing-benchmark/Arithmetic.swift) +* [URL router](Sources/swift-parsing-benchmark/Routing.swift) +* [Xcode test logs](Sources/swift-parsing-benchmark/XCTestLogs.swift) +* and more + +These are the times we currently get when running the benchmarks: + +```text +MacBook Pro (16-inch, 2021) +Apple M1 Pro (10 cores, 8 performance and 2 efficiency) +32 GB (LPDDR5) + +name time std iterations +---------------------------------------------------------------------------------- +Arithmetic.Parser 8042.000 ns ± 5.91 % 174657 +BinaryData.Parser 42.000 ns ± 56.81 % 1000000 +Bool.Bool.init 41.000 ns ± 60.69 % 1000000 +Bool.Bool.parser 42.000 ns ± 57.28 % 1000000 +Bool.Scanner.scanBool 1041.000 ns ± 25.98 % 1000000 +Color.Parser 209.000 ns ± 13.68 % 1000000 +CSV.Parser 4047750.000 ns ± 1.18 % 349 +CSV.Ad hoc mutating methods 898604.000 ns ± 1.49 % 1596 +Date.Parser 6416.000 ns ± 2.56 % 219218 +Date.DateFormatter 25625.000 ns ± 2.19 % 54110 +Date.ISO8601DateFormatter 35125.000 ns ± 1.71 % 39758 +HTTP.HTTP 9709.000 ns ± 3.81 % 138868 +JSON.Parser 32292.000 ns ± 3.18 % 41890 +JSON.JSONSerialization 1833.000 ns ± 8.58 % 764057 +Numerics.Int.init 41.000 ns ± 84.54 % 1000000 +Numerics.Int.parser 42.000 ns ± 72.17 % 1000000 +Numerics.Scanner.scanInt 125.000 ns ± 20.26 % 1000000 +Numerics.Comma separated: Int.parser 8096459.000 ns ± 0.44 % 173 +Numerics.Comma separated: Scanner.scanInt 49178770.500 ns ± 0.24 % 28 +Numerics.Comma separated: String.split 14922583.500 ns ± 0.67 % 94 +Numerics.Double.init 42.000 ns ± 72.61 % 1000000 +Numerics.Double.parser 125.000 ns ± 58.57 % 1000000 +Numerics.Scanner.scanDouble 167.000 ns ± 18.84 % 1000000 +Numerics.Comma separated: Double.parser 11313395.500 ns ± 0.96 % 124 +Numerics.Comma separated: Scanner.scanDouble 50431521.000 ns ± 0.19 % 28 +Numerics.Comma separated: String.split 18744125.000 ns ± 0.46 % 75 +PrefixUpTo.Parser: Substring 249958.000 ns ± 0.88 % 5595 +PrefixUpTo.Parser: UTF8 13250.000 ns ± 2.96 % 105812 +PrefixUpTo.String.range(of:) 43084.000 ns ± 1.57 % 32439 +PrefixUpTo.Scanner.scanUpToString 47500.000 ns ± 1.27 % 29444 +Race.Parser 34417.000 ns ± 2.73 % 40502 +README Example.Parser: Substring 4000.000 ns ± 3.79 % 347868 +README Example.Parser: UTF8 1125.000 ns ± 7.92 % 1000000 +README Example.Ad hoc 3542.000 ns ± 4.13 % 394248 +README Example.Scanner 14292.000 ns ± 2.82 % 97922 +Routing.Parser 21750.000 ns ± 3.23 % 64256 +String Abstractions.Substring 934167.000 ns ± 0.60 % 1505 +String Abstractions.UTF8 158750.000 ns ± 1.36 % 8816 +UUID.UUID.init 209.000 ns ± 15.02 % 1000000 +UUID.UUID.parser 208.000 ns ± 24.17 % 1000000 +Xcode Logs.Parser 3768437.500 ns ± 0.56 % 372 +``` + +## Documentation + +The documentation for releases and main are available here: + +* [main][swift-parsing-docs] +* [0.7.1](https://pointfreeco.github.io/swift-parsing/0.7.1/documentation/parsing) +

+ + Other versions + + + * [0.7](https://pointfreeco.github.io/swift-parsing/0.7.0/documentation/parsing) + * [0.6](https://pointfreeco.github.io/swift-parsing/0.6.0/documentation/parsing) + * [0.5](https://pointfreeco.github.io/swift-parsing/0.5.0/documentation/parsing) + +
+ +## Other libraries + +There are a few other parsing libraries in the Swift community that you might also be interested in: + +* [Consumer](https://github.com/nicklockwood/Consumer) +* [Sparse](https://github.com/johnpatrickmorgan/Sparse) +* [SwiftParsec](https://github.com/davedufresne/SwiftParsec) + +## License + +This library is released under the MIT license. See [LICENSE](LICENSE) for details. + +[getting-started-docs]: https://pointfreeco.github.io/swift-parsing/main/documentation/parsing/gettingstarted +[string-abstractions-docs]: https://pointfreeco.github.io/swift-parsing/main/documentation/parsing/stringabstractions +[swift-parsing-docs]: https://pointfreeco.github.io/swift-parsing diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Builders/OneOfBuilder.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Builders/OneOfBuilder.swift new file mode 100644 index 00000000..0337ee1a --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Builders/OneOfBuilder.swift @@ -0,0 +1,132 @@ +/// A custom parameter attribute that constructs a parser that attempts to run a number of parsers, +/// one after the other, till one succeeds with an output. +/// +/// See ``OneOf`` for an entry point into this builder. +@resultBuilder +public enum OneOfBuilder { + /// Provides support for `for`-`in` loops in ``OneOfBuilder`` blocks. + /// + /// Useful for building up a parser from a dynamic source, like for a case-iterable enum: + /// + /// ```swift + /// enum Role: String, CaseIterable { + /// case admin + /// case guest + /// case member + /// } + /// + /// let roleParser = Parse { + /// for role in Role.allCases { + /// status.rawValue.map { role } + /// } + /// } + /// ``` + @inlinable + public static func buildArray

(_ parsers: [P]) -> Parsers.OneOfMany

{ + .init(parsers) + } + + /// Provides support for specifying a parser in ``OneOfBuilder`` blocks. + @inlinable + static public func buildBlock(_ parser: P) -> P { + parser + } + + /// Provides support for `if`-`else` statements in ``OneOfBuilder`` blocks, producing a + /// conditional parser for the `if` branch. + /// + /// ```swift + /// OneOf { + /// if useLegacyParser { + /// LegacyParser() + /// } else { + /// NewParser() + /// } + /// } + /// ``` + @inlinable + public static func buildEither( + first parser: TrueParser + ) -> Parsers.Conditional { + .first(parser) + } + + /// Provides support for `if`-`else` statements in ``OneOfBuilder`` blocks, producing a + /// conditional parser for the `if` branch. + /// + /// ```swift + /// OneOf { + /// if useLegacyParser { + /// LegacyParser() + /// } else { + /// NewParser() + /// } + /// } + /// ``` + @inlinable + public static func buildEither( + second parser: FalseParser + ) -> Parsers.Conditional { + .second(parser) + } + + /// Provides support for `if` statements in ``OneOfBuilder`` blocks, producing an optional parser. + /// + /// ```swift + /// let whitespace = OneOf { + /// if shouldParseNewlines { + /// "\r\n" + /// "\r" + /// "\n" + /// } + /// + /// " " + /// "\t" + /// } + /// ``` + @inlinable + public static func buildIf

(_ parser: P?) -> OptionalOneOf

{ + .init(wrapped: parser) + } + + /// Provides support for `if #available` statements in ``OneOfBuilder`` blocks, producing an + /// optional parser. + @inlinable + public static func buildLimitedAvailability

(_ parser: P?) -> OptionalOneOf

{ + .init(wrapped: parser) + } + + /// A parser that parses output from an optional parser. + /// + /// You won't typically construct this parser directly, but instead will use standard `if` + /// statements in a ``OneOfBuilder`` block to automatically build optional parsers: + /// + /// ```swift + /// let whitespace = OneOf { + /// if shouldParseNewlines { + /// "\r\n" + /// "\r" + /// "\n" + /// } + /// + /// " " + /// "\t" + /// } + /// ``` + public struct OptionalOneOf: Parser { + @usableFromInline + let wrapped: Wrapped? + + @usableFromInline + init(wrapped: Wrapped?) { + self.wrapped = wrapped + } + + @inlinable + public func parse(_ input: inout Wrapped.Input) throws -> Wrapped.Output { + guard let wrapped = self.wrapped + else { throw ParsingError.manyFailed([], at: input) } + return try wrapped.parse(&input) + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Builders/ParserBuilder.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Builders/ParserBuilder.swift new file mode 100644 index 00000000..137587af --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Builders/ParserBuilder.swift @@ -0,0 +1,93 @@ +/// A custom parameter attribute that constructs a parser that attempts to run a number of parsers, +/// one after the other, and accumulates their outputs. +/// +/// See ``Parse`` for an entry point into this builder. +@resultBuilder +public enum ParserBuilder { + /// Provides support for specifying a parser in ``ParserBuilder`` blocks. + @inlinable + public static func buildBlock(_ parser: P) -> P { + parser + } + + /// Provides support for `if`-`else` statements in ``ParserBuilder`` blocks, producing a + /// conditional parser for the `if` branch. + /// + /// ```swift + /// Parse { + /// "Hello" + /// if shouldParseComma { + /// ", " + /// } else { + /// " " + /// } + /// Rest() + /// } + /// ``` + @inlinable + public static func buildEither( + first parser: TrueParser + ) -> Parsers.Conditional { + .first(parser) + } + + /// Provides support for `if`-`else` statements in ``ParserBuilder`` blocks, producing a + /// conditional parser for the `else` branch. + /// + /// ```swift + /// Parse { + /// "Hello" + /// if shouldParseComma { + /// ", " + /// } else { + /// " " + /// } + /// Rest() + /// } + /// ``` + @inlinable + public static func buildEither( + second parser: FalseParser + ) -> Parsers.Conditional { + .second(parser) + } + + /// Provides support for `if` statements in ``ParserBuilder`` blocks, producing an optional + /// parser. + @inlinable + public static func buildIf(_ parser: P?) -> P? { + parser + } + + /// Provides support for `if` statements in ``ParserBuilder`` blocks, producing a void parser for + /// a given void parser. + /// + /// ```swift + /// Parse { + /// "Hello" + /// if shouldParseComma { + /// "," + /// } + /// " " + /// Rest() + /// } + /// ``` + @inlinable + public static func buildIf

(_ parser: P?) -> Parsers.OptionalVoid

{ + .init(wrapped: parser) + } + + /// Provides support for `if #available` statements in ``ParserBuilder`` blocks, producing an + /// optional parser. + @inlinable + public static func buildLimitedAvailability(_ parser: P?) -> P? { + parser + } + + /// Provides support for `if #available` statements in ``ParserBuilder`` blocks, producing a void + /// parser for a given void parser. + @inlinable + public static func buildLimitedAvailability

(_ parser: P?) -> Parsers.OptionalVoid

{ + .init(wrapped: parser) + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Builders/Variadics.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Builders/Variadics.swift new file mode 100644 index 00000000..bde7811e --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Builders/Variadics.swift @@ -0,0 +1,6099 @@ +// BEGIN AUTO-GENERATED CONTENT + +extension Parsers { + public struct ZipOO: Parser + where + P0.Input == P1.Input + { + public let p0: P0, p1: P1 + + @inlinable public init(_ p0: P0, _ p1: P1) { + self.p0 = p0 + self.p1 = p1 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + return (o0, o1) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1 + ) -> Parsers.ZipOO { + Parsers.ZipOO(p0, p1) + } +} + +extension Parsers { + public struct ZipOV: Parser + where + P0.Input == P1.Input, + P1.Output == Void + { + public let p0: P0, p1: P1 + + @inlinable public init(_ p0: P0, _ p1: P1) { + self.p0 = p0 + self.p1 = p1 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P0.Output { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + return o0 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1 + ) -> Parsers.ZipOV { + Parsers.ZipOV(p0, p1) + } +} + +extension Parsers { + public struct ZipVO: Parser + where + P0.Input == P1.Input, + P0.Output == Void + { + public let p0: P0, p1: P1 + + @inlinable public init(_ p0: P0, _ p1: P1) { + self.p0 = p0 + self.p1 = p1 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P1.Output { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + return o1 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1 + ) -> Parsers.ZipVO { + Parsers.ZipVO(p0, p1) + } +} + +extension Parsers { + public struct ZipVV: Parser + where + P0.Input == P1.Input, + P0.Output == Void, + P1.Output == Void + { + public let p0: P0, p1: P1 + + @inlinable public init(_ p0: P0, _ p1: P1) { + self.p0 = p0 + self.p1 = p1 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows { + do { + try p0.parse(&input) + try p1.parse(&input) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1 + ) -> Parsers.ZipVV { + Parsers.ZipVV(p0, p1) + } +} + +extension Parsers { + public struct ZipOOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input + { + public let p0: P0, p1: P1, p2: P2 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P2.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + return (o0, o1, o2) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2 + ) -> Parsers.ZipOOO { + Parsers.ZipOOO(p0, p1, p2) + } +} + +extension Parsers { + public struct ZipOOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Output == Void + { + public let p0: P0, p1: P1, p2: P2 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + return (o0, o1) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2 + ) -> Parsers.ZipOOV { + Parsers.ZipOOV(p0, p1, p2) + } +} + +extension Parsers { + public struct ZipOVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P1.Output == Void + { + public let p0: P0, p1: P1, p2: P2 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P2.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + return (o0, o2) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2 + ) -> Parsers.ZipOVO { + Parsers.ZipOVO(p0, p1, p2) + } +} + +extension Parsers { + public struct ZipOVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P1.Output == Void, + P2.Output == Void + { + public let p0: P0, p1: P1, p2: P2 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P0.Output { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + return o0 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2 + ) -> Parsers.ZipOVV { + Parsers.ZipOVV(p0, p1, p2) + } +} + +extension Parsers { + public struct ZipVOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P0.Output == Void + { + public let p0: P0, p1: P1, p2: P2 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P2.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + return (o1, o2) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2 + ) -> Parsers.ZipVOO { + Parsers.ZipVOO(p0, p1, p2) + } +} + +extension Parsers { + public struct ZipVOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P0.Output == Void, + P2.Output == Void + { + public let p0: P0, p1: P1, p2: P2 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P1.Output { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + return o1 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2 + ) -> Parsers.ZipVOV { + Parsers.ZipVOV(p0, p1, p2) + } +} + +extension Parsers { + public struct ZipVVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P0.Output == Void, + P1.Output == Void + { + public let p0: P0, p1: P1, p2: P2 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P2.Output { + do { + try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + return o2 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2 + ) -> Parsers.ZipVVO { + Parsers.ZipVVO(p0, p1, p2) + } +} + +extension Parsers { + public struct ZipVVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P0.Output == Void, + P1.Output == Void, + P2.Output == Void + { + public let p0: P0, p1: P1, p2: P2 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows { + do { + try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2 + ) -> Parsers.ZipVVV { + Parsers.ZipVVV(p0, p1, p2) + } +} + +extension Parsers { + public struct ZipOOOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input + { + public let p0: P0, p1: P1, p2: P2, p3: P3 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P2.Output, + P3.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + return (o0, o1, o2, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3 + ) -> Parsers.ZipOOOO { + Parsers.ZipOOOO(p0, p1, p2, p3) + } +} + +extension Parsers { + public struct ZipOOOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P2.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + return (o0, o1, o2) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3 + ) -> Parsers.ZipOOOV { + Parsers.ZipOOOV(p0, p1, p2, p3) + } +} + +extension Parsers { + public struct ZipOOVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P2.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P3.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + return (o0, o1, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3 + ) -> Parsers.ZipOOVO { + Parsers.ZipOOVO(p0, p1, p2, p3) + } +} + +extension Parsers { + public struct ZipOOVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P2.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + return (o0, o1) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3 + ) -> Parsers.ZipOOVV { + Parsers.ZipOOVV(p0, p1, p2, p3) + } +} + +extension Parsers { + public struct ZipOVOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P1.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P2.Output, + P3.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + return (o0, o2, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3 + ) -> Parsers.ZipOVOO { + Parsers.ZipOVOO(p0, p1, p2, p3) + } +} + +extension Parsers { + public struct ZipOVOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P1.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P2.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + return (o0, o2) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3 + ) -> Parsers.ZipOVOV { + Parsers.ZipOVOV(p0, p1, p2, p3) + } +} + +extension Parsers { + public struct ZipOVVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P1.Output == Void, + P2.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P3.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + return (o0, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3 + ) -> Parsers.ZipOVVO { + Parsers.ZipOVVO(p0, p1, p2, p3) + } +} + +extension Parsers { + public struct ZipOVVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P1.Output == Void, + P2.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P0.Output { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + return o0 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3 + ) -> Parsers.ZipOVVV { + Parsers.ZipOVVV(p0, p1, p2, p3) + } +} + +extension Parsers { + public struct ZipVOOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P0.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P2.Output, + P3.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + return (o1, o2, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3 + ) -> Parsers.ZipVOOO { + Parsers.ZipVOOO(p0, p1, p2, p3) + } +} + +extension Parsers { + public struct ZipVOOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P0.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P2.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + return (o1, o2) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3 + ) -> Parsers.ZipVOOV { + Parsers.ZipVOOV(p0, p1, p2, p3) + } +} + +extension Parsers { + public struct ZipVOVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P0.Output == Void, + P2.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P3.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + return (o1, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3 + ) -> Parsers.ZipVOVO { + Parsers.ZipVOVO(p0, p1, p2, p3) + } +} + +extension Parsers { + public struct ZipVOVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P0.Output == Void, + P2.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P1.Output { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + return o1 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3 + ) -> Parsers.ZipVOVV { + Parsers.ZipVOVV(p0, p1, p2, p3) + } +} + +extension Parsers { + public struct ZipVVOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P0.Output == Void, + P1.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P2.Output, + P3.Output + ) { + do { + try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + return (o2, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3 + ) -> Parsers.ZipVVOO { + Parsers.ZipVVOO(p0, p1, p2, p3) + } +} + +extension Parsers { + public struct ZipVVOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P0.Output == Void, + P1.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P2.Output { + do { + try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + return o2 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3 + ) -> Parsers.ZipVVOV { + Parsers.ZipVVOV(p0, p1, p2, p3) + } +} + +extension Parsers { + public struct ZipVVVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P0.Output == Void, + P1.Output == Void, + P2.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P3.Output { + do { + try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + return o3 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3 + ) -> Parsers.ZipVVVO { + Parsers.ZipVVVO(p0, p1, p2, p3) + } +} + +extension Parsers { + public struct ZipVVVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P0.Output == Void, + P1.Output == Void, + P2.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows { + do { + try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3 + ) -> Parsers.ZipVVVV { + Parsers.ZipVVVV(p0, p1, p2, p3) + } +} + +extension Parsers { + public struct ZipOOOOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P2.Output, + P3.Output, + P4.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + return (o0, o1, o2, o3, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipOOOOO { + Parsers.ZipOOOOO(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipOOOOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P2.Output, + P3.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + return (o0, o1, o2, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipOOOOV { + Parsers.ZipOOOOV(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipOOOVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P2.Output, + P4.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + return (o0, o1, o2, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipOOOVO { + Parsers.ZipOOOVO(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipOOOVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P3.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P2.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + return (o0, o1, o2) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipOOOVV { + Parsers.ZipOOOVV(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipOOVOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P2.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P3.Output, + P4.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + return (o0, o1, o3, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipOOVOO { + Parsers.ZipOOVOO(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipOOVOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P2.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P3.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + return (o0, o1, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipOOVOV { + Parsers.ZipOOVOV(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipOOVVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P2.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P4.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + return (o0, o1, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipOOVVO { + Parsers.ZipOOVVO(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipOOVVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P2.Output == Void, + P3.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + return (o0, o1) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipOOVVV { + Parsers.ZipOOVVV(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipOVOOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P1.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P2.Output, + P3.Output, + P4.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + return (o0, o2, o3, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipOVOOO { + Parsers.ZipOVOOO(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipOVOOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P1.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P2.Output, + P3.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + return (o0, o2, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipOVOOV { + Parsers.ZipOVOOV(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipOVOVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P1.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P2.Output, + P4.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + return (o0, o2, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipOVOVO { + Parsers.ZipOVOVO(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipOVOVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P1.Output == Void, + P3.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P2.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + return (o0, o2) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipOVOVV { + Parsers.ZipOVOVV(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipOVVOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P1.Output == Void, + P2.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P3.Output, + P4.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + return (o0, o3, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipOVVOO { + Parsers.ZipOVVOO(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipOVVOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P1.Output == Void, + P2.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P3.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + return (o0, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipOVVOV { + Parsers.ZipOVVOV(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipOVVVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P1.Output == Void, + P2.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P4.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + return (o0, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipOVVVO { + Parsers.ZipOVVVO(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipOVVVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P1.Output == Void, + P2.Output == Void, + P3.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P0.Output { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + return o0 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipOVVVV { + Parsers.ZipOVVVV(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipVOOOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P0.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P2.Output, + P3.Output, + P4.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + return (o1, o2, o3, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipVOOOO { + Parsers.ZipVOOOO(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipVOOOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P0.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P2.Output, + P3.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + return (o1, o2, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipVOOOV { + Parsers.ZipVOOOV(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipVOOVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P0.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P2.Output, + P4.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + return (o1, o2, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipVOOVO { + Parsers.ZipVOOVO(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipVOOVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P0.Output == Void, + P3.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P2.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + return (o1, o2) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipVOOVV { + Parsers.ZipVOOVV(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipVOVOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P0.Output == Void, + P2.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P3.Output, + P4.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + return (o1, o3, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipVOVOO { + Parsers.ZipVOVOO(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipVOVOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P0.Output == Void, + P2.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P3.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + return (o1, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipVOVOV { + Parsers.ZipVOVOV(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipVOVVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P0.Output == Void, + P2.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P4.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + return (o1, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipVOVVO { + Parsers.ZipVOVVO(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipVOVVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P0.Output == Void, + P2.Output == Void, + P3.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P1.Output { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + return o1 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipVOVVV { + Parsers.ZipVOVVV(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipVVOOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P0.Output == Void, + P1.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P2.Output, + P3.Output, + P4.Output + ) { + do { + try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + return (o2, o3, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipVVOOO { + Parsers.ZipVVOOO(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipVVOOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P0.Output == Void, + P1.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P2.Output, + P3.Output + ) { + do { + try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + return (o2, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipVVOOV { + Parsers.ZipVVOOV(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipVVOVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P0.Output == Void, + P1.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P2.Output, + P4.Output + ) { + do { + try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + return (o2, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipVVOVO { + Parsers.ZipVVOVO(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipVVOVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P0.Output == Void, + P1.Output == Void, + P3.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P2.Output { + do { + try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + return o2 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipVVOVV { + Parsers.ZipVVOVV(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipVVVOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P0.Output == Void, + P1.Output == Void, + P2.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P3.Output, + P4.Output + ) { + do { + try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + return (o3, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipVVVOO { + Parsers.ZipVVVOO(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipVVVOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P0.Output == Void, + P1.Output == Void, + P2.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P3.Output { + do { + try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + return o3 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipVVVOV { + Parsers.ZipVVVOV(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipVVVVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P0.Output == Void, + P1.Output == Void, + P2.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P4.Output { + do { + try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + return o4 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipVVVVO { + Parsers.ZipVVVVO(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipVVVVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P0.Output == Void, + P1.Output == Void, + P2.Output == Void, + P3.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows { + do { + try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.ZipVVVVV { + Parsers.ZipVVVVV(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct ZipOOOOOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P2.Output, + P3.Output, + P4.Output, + P5.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o0, o1, o2, o3, o4, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOOOOOO { + Parsers.ZipOOOOOO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOOOOOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P2.Output, + P3.Output, + P4.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + try p5.parse(&input) + return (o0, o1, o2, o3, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOOOOOV { + Parsers.ZipOOOOOV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOOOOVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P2.Output, + P3.Output, + P5.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o0, o1, o2, o3, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOOOOVO { + Parsers.ZipOOOOVO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOOOOVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P4.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P2.Output, + P3.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + try p5.parse(&input) + return (o0, o1, o2, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOOOOVV { + Parsers.ZipOOOOVV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOOOVOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P2.Output, + P4.Output, + P5.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o0, o1, o2, o4, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOOOVOO { + Parsers.ZipOOOVOO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOOOVOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P3.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P2.Output, + P4.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + try p5.parse(&input) + return (o0, o1, o2, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOOOVOV { + Parsers.ZipOOOVOV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOOOVVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P3.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P2.Output, + P5.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o0, o1, o2, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOOOVVO { + Parsers.ZipOOOVVO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOOOVVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P3.Output == Void, + P4.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P2.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + try p5.parse(&input) + return (o0, o1, o2) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOOOVVV { + Parsers.ZipOOOVVV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOOVOOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P2.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P3.Output, + P4.Output, + P5.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o0, o1, o3, o4, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOOVOOO { + Parsers.ZipOOVOOO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOOVOOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P2.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P3.Output, + P4.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + try p5.parse(&input) + return (o0, o1, o3, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOOVOOV { + Parsers.ZipOOVOOV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOOVOVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P2.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P3.Output, + P5.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o0, o1, o3, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOOVOVO { + Parsers.ZipOOVOVO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOOVOVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P2.Output == Void, + P4.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P3.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + try p5.parse(&input) + return (o0, o1, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOOVOVV { + Parsers.ZipOOVOVV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOOVVOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P2.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P4.Output, + P5.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o0, o1, o4, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOOVVOO { + Parsers.ZipOOVVOO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOOVVOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P2.Output == Void, + P3.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P4.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + try p5.parse(&input) + return (o0, o1, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOOVVOV { + Parsers.ZipOOVVOV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOOVVVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P2.Output == Void, + P3.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output, + P5.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o0, o1, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOOVVVO { + Parsers.ZipOOVVVO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOOVVVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P2.Output == Void, + P3.Output == Void, + P4.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P1.Output + ) { + do { + let o0 = try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + try p5.parse(&input) + return (o0, o1) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOOVVVV { + Parsers.ZipOOVVVV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOVOOOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P1.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P2.Output, + P3.Output, + P4.Output, + P5.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o0, o2, o3, o4, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOVOOOO { + Parsers.ZipOVOOOO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOVOOOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P1.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P2.Output, + P3.Output, + P4.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + try p5.parse(&input) + return (o0, o2, o3, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOVOOOV { + Parsers.ZipOVOOOV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOVOOVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P1.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P2.Output, + P3.Output, + P5.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o0, o2, o3, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOVOOVO { + Parsers.ZipOVOOVO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOVOOVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P1.Output == Void, + P4.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P2.Output, + P3.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + try p5.parse(&input) + return (o0, o2, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOVOOVV { + Parsers.ZipOVOOVV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOVOVOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P1.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P2.Output, + P4.Output, + P5.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o0, o2, o4, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOVOVOO { + Parsers.ZipOVOVOO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOVOVOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P1.Output == Void, + P3.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P2.Output, + P4.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + try p5.parse(&input) + return (o0, o2, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOVOVOV { + Parsers.ZipOVOVOV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOVOVVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P1.Output == Void, + P3.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P2.Output, + P5.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o0, o2, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOVOVVO { + Parsers.ZipOVOVVO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOVOVVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P1.Output == Void, + P3.Output == Void, + P4.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P2.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + try p5.parse(&input) + return (o0, o2) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOVOVVV { + Parsers.ZipOVOVVV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOVVOOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P1.Output == Void, + P2.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P3.Output, + P4.Output, + P5.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o0, o3, o4, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOVVOOO { + Parsers.ZipOVVOOO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOVVOOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P1.Output == Void, + P2.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P3.Output, + P4.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + try p5.parse(&input) + return (o0, o3, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOVVOOV { + Parsers.ZipOVVOOV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOVVOVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P1.Output == Void, + P2.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P3.Output, + P5.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o0, o3, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOVVOVO { + Parsers.ZipOVVOVO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOVVOVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P1.Output == Void, + P2.Output == Void, + P4.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P3.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + try p5.parse(&input) + return (o0, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOVVOVV { + Parsers.ZipOVVOVV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOVVVOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P1.Output == Void, + P2.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P4.Output, + P5.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o0, o4, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOVVVOO { + Parsers.ZipOVVVOO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOVVVOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P1.Output == Void, + P2.Output == Void, + P3.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P4.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + try p5.parse(&input) + return (o0, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOVVVOV { + Parsers.ZipOVVVOV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOVVVVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P1.Output == Void, + P2.Output == Void, + P3.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P0.Output, + P5.Output + ) { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o0, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOVVVVO { + Parsers.ZipOVVVVO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipOVVVVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P1.Output == Void, + P2.Output == Void, + P3.Output == Void, + P4.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P0.Output { + do { + let o0 = try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + try p5.parse(&input) + return o0 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipOVVVVV { + Parsers.ZipOVVVVV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVOOOOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P2.Output, + P3.Output, + P4.Output, + P5.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o1, o2, o3, o4, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVOOOOO { + Parsers.ZipVOOOOO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVOOOOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P2.Output, + P3.Output, + P4.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + try p5.parse(&input) + return (o1, o2, o3, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVOOOOV { + Parsers.ZipVOOOOV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVOOOVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P2.Output, + P3.Output, + P5.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o1, o2, o3, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVOOOVO { + Parsers.ZipVOOOVO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVOOOVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P4.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P2.Output, + P3.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + try p5.parse(&input) + return (o1, o2, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVOOOVV { + Parsers.ZipVOOOVV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVOOVOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P2.Output, + P4.Output, + P5.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o1, o2, o4, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVOOVOO { + Parsers.ZipVOOVOO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVOOVOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P3.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P2.Output, + P4.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + try p5.parse(&input) + return (o1, o2, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVOOVOV { + Parsers.ZipVOOVOV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVOOVVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P3.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P2.Output, + P5.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o1, o2, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVOOVVO { + Parsers.ZipVOOVVO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVOOVVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P3.Output == Void, + P4.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P2.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + try p5.parse(&input) + return (o1, o2) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVOOVVV { + Parsers.ZipVOOVVV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVOVOOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P2.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P3.Output, + P4.Output, + P5.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o1, o3, o4, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVOVOOO { + Parsers.ZipVOVOOO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVOVOOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P2.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P3.Output, + P4.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + try p5.parse(&input) + return (o1, o3, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVOVOOV { + Parsers.ZipVOVOOV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVOVOVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P2.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P3.Output, + P5.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o1, o3, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVOVOVO { + Parsers.ZipVOVOVO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVOVOVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P2.Output == Void, + P4.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P3.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + try p5.parse(&input) + return (o1, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVOVOVV { + Parsers.ZipVOVOVV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVOVVOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P2.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P4.Output, + P5.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o1, o4, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVOVVOO { + Parsers.ZipVOVVOO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVOVVOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P2.Output == Void, + P3.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P4.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + try p5.parse(&input) + return (o1, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVOVVOV { + Parsers.ZipVOVVOV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVOVVVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P2.Output == Void, + P3.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P1.Output, + P5.Output + ) { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o1, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVOVVVO { + Parsers.ZipVOVVVO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVOVVVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P2.Output == Void, + P3.Output == Void, + P4.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P1.Output { + do { + try p0.parse(&input) + let o1 = try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + try p5.parse(&input) + return o1 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVOVVVV { + Parsers.ZipVOVVVV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVVOOOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P1.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P2.Output, + P3.Output, + P4.Output, + P5.Output + ) { + do { + try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o2, o3, o4, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVVOOOO { + Parsers.ZipVVOOOO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVVOOOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P1.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P2.Output, + P3.Output, + P4.Output + ) { + do { + try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + try p5.parse(&input) + return (o2, o3, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVVOOOV { + Parsers.ZipVVOOOV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVVOOVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P1.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P2.Output, + P3.Output, + P5.Output + ) { + do { + try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o2, o3, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVVOOVO { + Parsers.ZipVVOOVO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVVOOVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P1.Output == Void, + P4.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P2.Output, + P3.Output + ) { + do { + try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + try p5.parse(&input) + return (o2, o3) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVVOOVV { + Parsers.ZipVVOOVV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVVOVOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P1.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P2.Output, + P4.Output, + P5.Output + ) { + do { + try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o2, o4, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVVOVOO { + Parsers.ZipVVOVOO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVVOVOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P1.Output == Void, + P3.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P2.Output, + P4.Output + ) { + do { + try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + try p5.parse(&input) + return (o2, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVVOVOV { + Parsers.ZipVVOVOV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVVOVVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P1.Output == Void, + P3.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P2.Output, + P5.Output + ) { + do { + try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o2, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVVOVVO { + Parsers.ZipVVOVVO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVVOVVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P1.Output == Void, + P3.Output == Void, + P4.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P2.Output { + do { + try p0.parse(&input) + try p1.parse(&input) + let o2 = try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + try p5.parse(&input) + return o2 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVVOVVV { + Parsers.ZipVVOVVV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVVVOOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P1.Output == Void, + P2.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P3.Output, + P4.Output, + P5.Output + ) { + do { + try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o3, o4, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVVVOOO { + Parsers.ZipVVVOOO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVVVOOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P1.Output == Void, + P2.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P3.Output, + P4.Output + ) { + do { + try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + let o4 = try p4.parse(&input) + try p5.parse(&input) + return (o3, o4) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVVVOOV { + Parsers.ZipVVVOOV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVVVOVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P1.Output == Void, + P2.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P3.Output, + P5.Output + ) { + do { + try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o3, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVVVOVO { + Parsers.ZipVVVOVO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVVVOVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P1.Output == Void, + P2.Output == Void, + P4.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P3.Output { + do { + try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + let o3 = try p3.parse(&input) + try p4.parse(&input) + try p5.parse(&input) + return o3 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVVVOVV { + Parsers.ZipVVVOVV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVVVVOO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P1.Output == Void, + P2.Output == Void, + P3.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> ( + P4.Output, + P5.Output + ) { + do { + try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + let o5 = try p5.parse(&input) + return (o4, o5) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVVVVOO { + Parsers.ZipVVVVOO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVVVVOV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P1.Output == Void, + P2.Output == Void, + P3.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P4.Output { + do { + try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + let o4 = try p4.parse(&input) + try p5.parse(&input) + return o4 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVVVVOV { + Parsers.ZipVVVVOV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVVVVVO: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P1.Output == Void, + P2.Output == Void, + P3.Output == Void, + P4.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P5.Output { + do { + try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + let o5 = try p5.parse(&input) + return o5 + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVVVVVO { + Parsers.ZipVVVVVO(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct ZipVVVVVV: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == Void, + P1.Output == Void, + P2.Output == Void, + P3.Output == Void, + P4.Output == Void, + P5.Output == Void + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows { + do { + try p0.parse(&input) + try p1.parse(&input) + try p2.parse(&input) + try p3.parse(&input) + try p4.parse(&input) + try p5.parse(&input) + } catch { throw ParsingError.wrap(error, at: input) } + } + } +} + +extension ParserBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.ZipVVVVVV { + Parsers.ZipVVVVVV(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct OneOf2: Parser + where + P0.Input == P1.Input, + P0.Output == P1.Output + { + public let p0: P0, p1: P1 + + @inlinable public init(_ p0: P0, _ p1: P1) { + self.p0 = p0 + self.p1 = p1 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P0.Output { + let original = input + do { return try self.p0.parse(&input) } catch let e0 { + do { input = original; return try self.p1.parse(&input) } catch let e1 { + throw ParsingError.manyFailed( + [e0, e1], at: input + ) + } + } + } + } +} + +extension OneOfBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1 + ) -> Parsers.OneOf2 { + Parsers.OneOf2(p0, p1) + } +} + +extension Parsers { + public struct OneOf3: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P0.Output == P1.Output, + P1.Output == P2.Output + { + public let p0: P0, p1: P1, p2: P2 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P0.Output { + let original = input + do { return try self.p0.parse(&input) } catch let e0 { + do { input = original; return try self.p1.parse(&input) } catch let e1 { + do { input = original; return try self.p2.parse(&input) } catch let e2 { + throw ParsingError.manyFailed( + [e0, e1, e2], at: input + ) + } + } + } + } + } +} + +extension OneOfBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2 + ) -> Parsers.OneOf3 { + Parsers.OneOf3(p0, p1, p2) + } +} + +extension Parsers { + public struct OneOf4: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P0.Output == P1.Output, + P1.Output == P2.Output, + P2.Output == P3.Output + { + public let p0: P0, p1: P1, p2: P2, p3: P3 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P0.Output { + let original = input + do { return try self.p0.parse(&input) } catch let e0 { + do { input = original; return try self.p1.parse(&input) } catch let e1 { + do { input = original; return try self.p2.parse(&input) } catch let e2 { + do { input = original; return try self.p3.parse(&input) } catch let e3 { + throw ParsingError.manyFailed( + [e0, e1, e2, e3], at: input + ) + } + } + } + } + } + } +} + +extension OneOfBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3 + ) -> Parsers.OneOf4 { + Parsers.OneOf4(p0, p1, p2, p3) + } +} + +extension Parsers { + public struct OneOf5: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P0.Output == P1.Output, + P1.Output == P2.Output, + P2.Output == P3.Output, + P3.Output == P4.Output + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P0.Output { + let original = input + do { return try self.p0.parse(&input) } catch let e0 { + do { input = original; return try self.p1.parse(&input) } catch let e1 { + do { input = original; return try self.p2.parse(&input) } catch let e2 { + do { input = original; return try self.p3.parse(&input) } catch let e3 { + do { input = original; return try self.p4.parse(&input) } catch let e4 { + throw ParsingError.manyFailed( + [e0, e1, e2, e3, e4], at: input + ) + } + } + } + } + } + } + } +} + +extension OneOfBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4 + ) -> Parsers.OneOf5 { + Parsers.OneOf5(p0, p1, p2, p3, p4) + } +} + +extension Parsers { + public struct OneOf6: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P0.Output == P1.Output, + P1.Output == P2.Output, + P2.Output == P3.Output, + P3.Output == P4.Output, + P4.Output == P5.Output + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P0.Output { + let original = input + do { return try self.p0.parse(&input) } catch let e0 { + do { input = original; return try self.p1.parse(&input) } catch let e1 { + do { input = original; return try self.p2.parse(&input) } catch let e2 { + do { input = original; return try self.p3.parse(&input) } catch let e3 { + do { input = original; return try self.p4.parse(&input) } catch let e4 { + do { input = original; return try self.p5.parse(&input) } catch let e5 { + throw ParsingError.manyFailed( + [e0, e1, e2, e3, e4, e5], at: input + ) + } + } + } + } + } + } + } + } +} + +extension OneOfBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5 + ) -> Parsers.OneOf6 { + Parsers.OneOf6(p0, p1, p2, p3, p4, p5) + } +} + +extension Parsers { + public struct OneOf7: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P5.Input == P6.Input, + P0.Output == P1.Output, + P1.Output == P2.Output, + P2.Output == P3.Output, + P3.Output == P4.Output, + P4.Output == P5.Output, + P5.Output == P6.Output + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5, _ p6: P6) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + self.p6 = p6 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P0.Output { + let original = input + do { return try self.p0.parse(&input) } catch let e0 { + do { input = original; return try self.p1.parse(&input) } catch let e1 { + do { input = original; return try self.p2.parse(&input) } catch let e2 { + do { input = original; return try self.p3.parse(&input) } catch let e3 { + do { input = original; return try self.p4.parse(&input) } catch let e4 { + do { input = original; return try self.p5.parse(&input) } catch let e5 { + do { input = original; return try self.p6.parse(&input) } catch let e6 { + throw ParsingError.manyFailed( + [e0, e1, e2, e3, e4, e5, e6], at: input + ) + } + } + } + } + } + } + } + } + } +} + +extension OneOfBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5, _ p6: P6 + ) -> Parsers.OneOf7 { + Parsers.OneOf7(p0, p1, p2, p3, p4, p5, p6) + } +} + +extension Parsers { + public struct OneOf8: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P5.Input == P6.Input, + P6.Input == P7.Input, + P0.Output == P1.Output, + P1.Output == P2.Output, + P2.Output == P3.Output, + P3.Output == P4.Output, + P4.Output == P5.Output, + P5.Output == P6.Output, + P6.Output == P7.Output + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5, _ p6: P6, _ p7: P7) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + self.p6 = p6 + self.p7 = p7 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P0.Output { + let original = input + do { return try self.p0.parse(&input) } catch let e0 { + do { input = original; return try self.p1.parse(&input) } catch let e1 { + do { input = original; return try self.p2.parse(&input) } catch let e2 { + do { input = original; return try self.p3.parse(&input) } catch let e3 { + do { input = original; return try self.p4.parse(&input) } catch let e4 { + do { input = original; return try self.p5.parse(&input) } catch let e5 { + do { input = original; return try self.p6.parse(&input) } catch let e6 { + do { input = original; return try self.p7.parse(&input) } catch let e7 { + throw ParsingError.manyFailed( + [e0, e1, e2, e3, e4, e5, e6, e7], at: input + ) + } + } + } + } + } + } + } + } + } + } +} + +extension OneOfBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5, _ p6: P6, _ p7: P7 + ) -> Parsers.OneOf8 { + Parsers.OneOf8(p0, p1, p2, p3, p4, p5, p6, p7) + } +} + +extension Parsers { + public struct OneOf9: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P5.Input == P6.Input, + P6.Input == P7.Input, + P7.Input == P8.Input, + P0.Output == P1.Output, + P1.Output == P2.Output, + P2.Output == P3.Output, + P3.Output == P4.Output, + P4.Output == P5.Output, + P5.Output == P6.Output, + P6.Output == P7.Output, + P7.Output == P8.Output + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5, _ p6: P6, _ p7: P7, _ p8: P8) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + self.p6 = p6 + self.p7 = p7 + self.p8 = p8 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P0.Output { + let original = input + do { return try self.p0.parse(&input) } catch let e0 { + do { input = original; return try self.p1.parse(&input) } catch let e1 { + do { input = original; return try self.p2.parse(&input) } catch let e2 { + do { input = original; return try self.p3.parse(&input) } catch let e3 { + do { input = original; return try self.p4.parse(&input) } catch let e4 { + do { input = original; return try self.p5.parse(&input) } catch let e5 { + do { input = original; return try self.p6.parse(&input) } catch let e6 { + do { input = original; return try self.p7.parse(&input) } catch let e7 { + do { input = original; return try self.p8.parse(&input) } catch let e8 { + throw ParsingError.manyFailed( + [e0, e1, e2, e3, e4, e5, e6, e7, e8], at: input + ) + } + } + } + } + } + } + } + } + } + } + } +} + +extension OneOfBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5, _ p6: P6, _ p7: P7, _ p8: P8 + ) -> Parsers.OneOf9 { + Parsers.OneOf9(p0, p1, p2, p3, p4, p5, p6, p7, p8) + } +} + +extension Parsers { + public struct OneOf10: Parser + where + P0.Input == P1.Input, + P1.Input == P2.Input, + P2.Input == P3.Input, + P3.Input == P4.Input, + P4.Input == P5.Input, + P5.Input == P6.Input, + P6.Input == P7.Input, + P7.Input == P8.Input, + P8.Input == P9.Input, + P0.Output == P1.Output, + P1.Output == P2.Output, + P2.Output == P3.Output, + P3.Output == P4.Output, + P4.Output == P5.Output, + P5.Output == P6.Output, + P6.Output == P7.Output, + P7.Output == P8.Output, + P8.Output == P9.Output + { + public let p0: P0, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9 + + @inlinable public init(_ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5, _ p6: P6, _ p7: P7, _ p8: P8, _ p9: P9) { + self.p0 = p0 + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.p5 = p5 + self.p6 = p6 + self.p7 = p7 + self.p8 = p8 + self.p9 = p9 + } + + @inlinable public func parse(_ input: inout P0.Input) rethrows -> P0.Output { + let original = input + do { return try self.p0.parse(&input) } catch let e0 { + do { input = original; return try self.p1.parse(&input) } catch let e1 { + do { input = original; return try self.p2.parse(&input) } catch let e2 { + do { input = original; return try self.p3.parse(&input) } catch let e3 { + do { input = original; return try self.p4.parse(&input) } catch let e4 { + do { input = original; return try self.p5.parse(&input) } catch let e5 { + do { input = original; return try self.p6.parse(&input) } catch let e6 { + do { input = original; return try self.p7.parse(&input) } catch let e7 { + do { input = original; return try self.p8.parse(&input) } catch let e8 { + do { input = original; return try self.p9.parse(&input) } catch let e9 { + throw ParsingError.manyFailed( + [e0, e1, e2, e3, e4, e5, e6, e7, e8, e9], at: input + ) + } + } + } + } + } + } + } + } + } + } + } + } +} + +extension OneOfBuilder { + @inlinable public static func buildBlock( + _ p0: P0, _ p1: P1, _ p2: P2, _ p3: P3, _ p4: P4, _ p5: P5, _ p6: P6, _ p7: P7, _ p8: P8, _ p9: P9 + ) -> Parsers.OneOf10 { + Parsers.OneOf10(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) + } +} + +// END AUTO-GENERATED CONTENT diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/Backtracking.md b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/Backtracking.md new file mode 100644 index 00000000..a1dc02e5 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/Backtracking.md @@ -0,0 +1,132 @@ +# Backtracking + +Learn what backtracking is, how it affects the performance of your parsers, and how to avoid it when +unnecessary. + +## Overview + +Backtracking is the process of restoring an input to its original value when parsing fails. While it +can be very useful, backtracking can lead to more complicated parser logic than necessary, and +backtracking too often can lead to performance issues. For this reason, most parsers are not +required to backtrack, and can therefore fail _and_ still consume from the input. + +The primary way to make use of backtracking in your parsers is through the ``OneOf`` parser, which +tries many parsers on an input and chooses the first that succeeds. This allows you to try many +parsers on the same input, regardless of how much each parser consumes: + +```swift +enum Currency { case eur, gbp, usd } + +let currency = OneOf { + "€".map { Currency.eur } + "£".map { Currency.gbp } + "$".map { Currency.usd } +} +``` + +## When to backtrack in your parsers? + +If you only use the parsers and operators that ship with this library, and in particular you do not +create custom conformances to the ``Parser`` protocol, then you never need to worry about explicitly +backtracking your input because it will be handled for you automatically. The primary way to allow +for backtracking is via the ``OneOf`` parser, but there are a few other parsers that also backtrack +internally. + +One such example is the ``Optionally`` parser, which transforms any parser into one that cannot fail +by catching any thrown errors and returning `nil`: + +```swift +let parser = Parse { + "Hello," + Optionally { " "; Bool.parser() } + " world!" +} + +try parser.parse("Hello, world!") // nil +try parser.parse("Hello, true world!") // true +``` + +If the parser captured inside ``Optionally`` fails then it backtracks the input to its state before +the parser ran. In particular, if the `Bool.parser()` fails then it will make sure to undo +consuming the leading space " " so that later parsers can try. + +Another example of a parser that internally backtracks is the ``Parser/replaceError(with:)`` +operator, which coalesces any error thrown by a parser into a default output value: + +```swift +let parser = Parse { + "Hello," + Optionally { " "; Bool.parser() } + .replaceError(with: false) + " world!" +} + +try parser.parse("Hello, world!") // false +try parser.parse("Hello, true world!") // true +``` + +It backtracks the input to its original value when the parser fails so that later parsers can try. + +The only time you need to worry about explicitly backtracking input is when making your own +``Parser`` conformances. As a general rule of thumb, if your parser recovers from all failures +in the `parse` method then it should backtrack the input to its state before the error was thrown. +This is exactly how ``OneOf``, ``Optionally`` and ``Parser/replaceError(with:)`` work. + +## Performance + +If used naively, backtracking can lead to less performant parsing code. For example, if we wanted to +parse two integers from a string that were separated by either a dash "-" or slash "/", then we +could write this as: + +```swift +OneOf { + Parse { Int.parser(); "-"; Int.parser() } // 1️⃣ + Parse { Int.parser(); "/"; Int.parser() } // 2️⃣ +} +``` + +However, parsing slash-separated integers is not going to be performant because it will first run +the entire 1️⃣ parser until it fails, then backtrack to the beginning, and run the 2️⃣ parser. In +particular, the first integer will get parsed twice, unnecessarily repeating that work. + +On the other hand, we can factor out the common work of the parser and localize the backtracking +``OneOf`` work to make a much more performant parser: + +```swift +Parse { + Int.parser() + OneOf { "-"; "/" } + Int.parser() +} +``` + +We can even write a benchmark to measure the performance difference: + +```swift +let first = OneOf { + Parse { Int.parser(); "-"; Int.parser() } + Parse { Int.parser(); "/"; Int.parser() } +} +benchmark("First") { + precondition(try! first.parse("100/200") == (100, 200)) +} +let second = Parse { + Int.parser() + OneOf { "-"; "/" } + Int.parser() +} +benchmark("Second") { + precondition(try! second.parse("100/200") == (100, 200)) +} +``` + +Running this produces the following results: + +``` +name time std iterations +---------------------------------------- +First 1500.000 ns ± 19.75 % 856753 +Second 917.000 ns ± 15.89 % 1000000 +``` + +The second parser takes only 60% of the time to run that the first parser does. diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/Design.md b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/Design.md new file mode 100644 index 00000000..1ad3a0a2 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/Design.md @@ -0,0 +1,131 @@ +# Design + +Learn how the library is designed, including its use of protocols, result builders and operators. + +## Protocol + +The design of the library is largely inspired by the Swift standard library and Apple's Combine +framework. A parser is represented as a protocol that many types conform to, and then parser +transformations (also known as "combinators") are methods that return concrete types conforming to +the parser protocol. + +For example, to parse all the characters from the beginning of a substring until you encounter a +comma you can use the `Prefix` parser: + +```swift +let parser = Prefix { $0 != "," } + +var input = "Hello,World"[...] +try parser.parse(&input) // "Hello" +input // ",World" +``` + +The type of this parser is: + +```swift +Prefix +``` + +We can `.map` on this parser in order to transform its output, which in this case is the string +"Hello": + +```swift +let parser = Prefix { $0 != "," } +.map { $0 + "!!!" } + +var input = "Hello,World"[...] +try parser.parse(&input) // "Hello!!!" +input // ",World" +``` + +The type of this parser is now: + +```swift +Parsers.Map, Substring> +``` + +Notice that the type of the parser encodes the operations that we performed. This adds a bit of +complexity when using these types, but comes with some performance benefits because Swift can +usually inline and optimize away the creation of those nested types. + +## Result Builders + +The library takes advantage of Swift's `@resultBuilder` feature to make constructing complex parsers +as fluent as possible, and should be reminiscent of how views are constructed in SwiftUI. The main +entry point into building a parser is the `Parse` builder: + +```swift +Parse { + +} +``` + +In this builder block you can specify parsers that will be run one after another. For example, if +you wanted to parse an integer, then a comma, and then a boolean from a string, you can simply do: + +```swift +Parse { + Int.parser() + "," + Bool.parser() +} +``` + +Note that the `String` type conforms to the ``Parser`` protocol, and represents a parser that +consumes that exact string from the beginning of an input if it matches, and otherwise fails. + +Many of the parsers and operators that come with the library are configured with parser builders +to maximize readability of the parsers. For example, to parse accounting syntax of numbers, where +parenthesized numbers are negative, we can use the ``OneOf`` parser builder: + +```swift +let accountingNumber = OneOf { + Int.parser(isSigned: false) + + Parse { + "(" + Int.parser(isSigned: false) + ")" + } + .map { -$0 } +} + +try accountingNumber.parse("100") // 100 +try accountingNumber.parse("(100)") // -100 +``` + +## Operators + +Parser operators (also called "combinators") are methods defined on the ``Parser`` protocol that +return a parser. For example, the ``Parser/map(_:)`` operator is a method that returns something +called a ``Parsers/Map``: + +```swift +extension Parser { + public func map( + _ transform: @escaping (Output) -> NewOutput + ) -> Parsers.Map { + .init(upstream: self, transform: transform) + } +} +``` + +And ``Parsers/Map`` is a dedicated type that implements the logic of the map operation. In +particular, in runs the upstream parser and then transforms its output: + +```swift +extension Parsers { + public struct Map: Parser { + public let upstream: Upstream + public let transform: (Upstream.Output) -> NewOutput + + public func parse(_ input: inout Upstream.Input) rethrows -> NewOutput { + self.transform(try self.upstream.parse(&input)) + } + } +} +``` + +Types that conform to the ``Parser`` protocol but are not constructed directly, and instead are +constructed via operators, are housed in the ``Parsers`` type. It's just an empty enum that +serves as a namespace for such parsers. diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/ErrorMessages.md b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/ErrorMessages.md new file mode 100644 index 00000000..b51a774c --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/ErrorMessages.md @@ -0,0 +1,239 @@ +# Error messages + +Learn how the library reports parsing errors and how to integrate your own custom error messages +into parsers. + +## Overview + +When a parser fails it throws an error containing information about what went wrong. The actual +error thrown by the parsers shipped with this library is internal, and so it should be considered +opaque. To get a human-readable debug description of the error message you can stringify the error. +For example, the following `UInt8` parser fails to parse a string that would cause it to overflow: + +```swift +do { + var input = "1234 Hello"[...] + let number = try UInt8.parser().parse(&input)) +} catch { + print(error) + + // error: failed to process "UInt8" + // --> input:1:1-4 + // 1 | 1234 Hello + // | ^^^^ overflowed 255 +} +``` + +When the ``OneOf`` parser is used and fails, there are multiple errors that can be shown. ``OneOf`` +prioritizes the error messages based on which parser got the furthest along. For example, consider +a parser that can parse accounting style of numbers, i.e. plain numbers are considered positive +and numbers in parentheses are considered negative: + +```swift +let accountingNumber = OneOf { + Int.parser(isSigned: false) + + Parse { + "(" + Int.parser(isSigned: false) + ")" + } + .map { -$0 } +} + +try accountingNumber.parse("100") // 100 +try accountingNumber.parse("(100)") // -100 +``` + +If we try parsing something erroneous, such as "(100]", we get multiple error messages, but the +second parser's error shows first since it was able to get the furthest: + +```swift +do { + try accountingNumber.parse("(100]") +} catch { + print(error) + + // error: multiple failures occurred + // + // error: unexpected input + // --> input:1:5 + // 1 | (100] + // | ^ expected ")" + // + // error: unexpected input + // --> input:1:1 + // 1 | (100] + // | ^ expected integer +} +``` + +## Improving error messages + +The quality of error messages emitted by a parser can depend on the manner in which the parser was +constructed. Some parser operators are powerful and convenient, but can cause the quality of error +messaging to degrade. + +For example, we could construct a parser that consumes a single uncommented line from an input +(_i.e._, a line that does not begin with "//") by using ``Parser/compactMap(_:)`` to check the line +for a prefix: + +```swift +let uncommentedLine = Prefix { $0 != "\n" } + .compactMap { $0.starts(with: "//") ? nil : $0 } + +try uncommentedLine.parse("// let x = 1") + +// error: failed to process "Substring" from "// let x = 1" +// --> input:1:1-12 +// 1 | // let x = 1 +// | ^^^^^^^^^^^^ +``` + +However, when this parser fails it can only highlight the entire line as having a problem because +it cannot know that the only thing that failed was that the first two characters were slashes. + +We can rewrite this parser in a different, but equivalent, way by using the ``Not`` parser to first +confirm that the line does not begin with "//", and then consume the entire line: + +```swift +let uncommentedLine = Parse { + Not { "//" } + Prefix { $0 != "\n" } +} + +try uncommentedLine.parse("// let x = 1") + +// error: unexpected input +// --> input:1:1-2 +// 1 | // let x = 1 +// | ^^ expected not to be processed +``` + +This provides better error messaging because ``Not`` knows exactly what matched that we did not want +to match, and so it can highlight those specific characters. + +When using the `Many` parser you can improve error messaging by supplying a "terminator" parser, +which is an optional argument. The terminator parser is run after the element and separator +parsers have consumed as much as they can, and allows you to assert on exactly what is left +afterwards. + +For example, if a parser is run on an input that has a typo in the last row of data, and a +terminator is not specified, the parser will succeed without consuming that last row and we won't +know what went wrong: + +```swift +struct User { + var id: Int + var name: String + var isAdmin: Bool +} + +let user = Parse(User.init(id:name:isAdmin:)) { + Int.parser() + "," + Prefix { $0 != "," }.map(String.init) + "," + Bool.parser() +} + +let users = Many { + user +} separator: { + "\n" +} + +var input = """ +1,Blob,true +2,Blob Jr.,false +3,Blob Sr.,tru +"""[...] + +let output = try users.parse(&input) +output.count // 2 +input // "\n3,Blob Sr.,tru" +``` + +However, by adding a terminator to this `users` parser an error will be throw that points to the +exact spot where the typo occurred: + +```swift +let users = Many { + user +} separator: { + "\n" +} terminator: { + End() +} + +let output = try users.parse(&input) + +// error: unexpected input +// --> input:3:11 +// 3 | 3,Blob Jr,tru +// | ^ expected "true" or "false" +``` + +## Throwing your own errors + +Although the error type thrown by the parsers that ship in this library is currently internal, and +so should be thought of as opaque, it is still possible to throw your own errors. Your errors will +automatically be reformatted and contextualized to show exactly where the error occurred. + +For example, suppose we wanted a parser that only parsed the digits 0-9 from the beginning of a +string and transformed it into an integer. This is subtly different from `Int.parser()` which +supports negative numbers, exponential formatting, and more. + +Constructing a `Digits` parser is easy enough, and we can introduce a custom struct error for +customizing the message displayed: + +```swift +struct DigitsError: Error { + let message = "Expected a prefix of digits 0-9" +} + +struct Digits: Parser { + func parse(_ input: inout Substring) throws -> Int { + let digits = input.prefix { $0 >= "0" && $0 <= "9" } + guard let output = Int(digits) + else { + throw DigitsError() + } + input.removeFirst(digits.count) + return output + } +} +``` + +If we swap out the `Int.parser()` for a `Digits` parser in `user`: + +```swift +let user = Parse(User.init) { + Digits() + "," + Prefix { $0 != "," }.map(String.init) + "," + Bool.parser() +} +``` + +And we introduce an incorrect value into the input: + +```swift +let input = """ +1,Blob,true +-2,Blob Jr.,false +3,Blob Sr.,true +"""[...] +``` + +Then when running the parser we get a nice error message that shows exactly what went wrong: + +```swift +try user.parse(&input) + +// error: DigitsError(message: "Expected a prefix of digits 0-9") +// --> input:2:1 +// 2 | -2,Blob Sr,false +// | ^ +``` diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/GettingStarted.md b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/GettingStarted.md new file mode 100644 index 00000000..f98f41fb --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/GettingStarted.md @@ -0,0 +1,303 @@ +# Getting Started + +Learn how to integrate Parsing into your project and write your first parser. + +## Adding Parsing as a dependency + +To use the Parsing library in a SwiftPM project, add it to the dependencies of your Package.swift +and specify the `Parsing` product in any targets that need access to the library: + +```swift +let package = Package( + dependencies: [ + .package(url: "https://github.com/pointfreeco/swift-parsing", from: "0.7.0"), + ], + targets: [ + .target( + name: "", + dependencies: [.product(name: "Parsing", package: "swift-parsing")] + ) + ] +) +``` + +## Your first parser + +Suppose you have a string that holds some user data that you want to parse into an array of `User`s: + +```swift +let input = """ + 1,Blob,true + 2,Blob Jr.,false + 3,Blob Sr.,true + """ + +struct User { + var id: Int + var name: String + var isAdmin: Bool +} +``` + +A naive approach to this would be a nested use of `.split(separator:)`, and then a little bit of +extra work to convert strings into integers and booleans: + +```swift +let users = input + .split(separator: "\n") + .compactMap { row -> User? in + let fields = row.split(separator: ",") + guard + fields.count == 3, + let id = Int(fields[0]), + let isAdmin = Bool(String(fields[2])) + else { return nil } + + return User(id: id, name: String(fields[1]), isAdmin: isAdmin) + } +``` + +Not only is this code a little messy, but it is also inefficient since we are allocating arrays for +the `.split` and then just immediately throwing away those values. + +It would be more straightforward and efficient to instead describe how to consume bits from the +beginning of the input and convert that into users. This is what this parser library excels at 😄. + +We can start by describing what it means to parse a single row, first by parsing an integer off the +front of the string, and then parsing a comma. We can do this by using the ``Parse`` type, which acts +as an entry point into describing a list of parsers that you want to run one after the other to +consume from an input: + +```swift +let user = Parse { + Int.parser() + "," +} +``` + +Already this can consume the leading integer and comma from the beginning of the input: + +```swift +// Use a mutable substring to verify what is consumed +var input = input[...] + +try user.parse(&input) // 1 +input // "Blob,true\n2,Blob Jr.,false\n3,Blob Sr.,true" +``` + +Next we want to take everything up until the next comma for the user's name, and then consume the +comma: + +```swift +let user = Parse { + Int.parser() + "," + Prefix { $0 != "," } + "," +} +``` + +And then we want to take the boolean at the end of the row for the user's admin status: + +```swift +let user = Parse { + Int.parser() + "," + Prefix { $0 != "," } + "," + Bool.parser() +} +``` + +Currently this will parse a tuple `(Int, Substring, Bool)` from the input, and we can `.map` on +that to turn it into a `User`: + +```swift +let user = Parse { + Int.parser() + "," + Prefix { $0 != "," } + "," + Bool.parser() +} +.map { User(id: $0, name: String($1), isAdmin: $2) } +``` + +To make the data we are parsing to more prominent, we can instead pass the transform closure as the +first argument to `Parse`: + +```swift +let user = Parse { + User(id: $0, name: String($1), isAdmin: $2) +} with: { + Int.parser() + "," + Prefix { $0 != "," } + "," + Bool.parser() +} +``` + +Or we can pass the `User` initializer to `Parse` in a point-free style by first transforming the +`Prefix` parser's output from a `Substring` to a `String`: + +```swift +let user = Parse(User.init(id:name:isAdmin:)) { + Int.parser() + "," + Prefix { $0 != "," }.map(String.init) + "," + Bool.parser() +} +``` + +That is enough to parse a single user from the input string, leaving behind a newline and the final +two users: + +```swift +try user.parse(&input) // User(id: 1, name: "Blob", isAdmin: true) +input // "\n2,Blob Jr.,false\n3,Blob Sr.,true" +``` + +To parse multiple users from the input we can use the `Many` parser to run the user parser many +times: + +```swift +let users = Many { + user +} separator: { + "\n" +} + +try users.parse(&input) // [User(id: 1, name: "Blob", isAdmin: true), ...] +input // "" +``` + +Now this parser can process an entire document of users, and the code is simpler and more +straightforward than the version that uses `.split` and `.compactMap`. + +Even better, it's more performant. We've written [benchmarks][benchmarks-readme] for these two +styles of parsing, and the `.split`-style of parsing is more than twice as slow: + +``` +name time std iterations +------------------------------------------------------------------ +README Example.Parser: Substring 3426.000 ns ± 63.40 % 385395 +README Example.Ad hoc 7631.000 ns ± 47.01 % 169332 +``` + +Further, if you are willing write your parsers against `UTF8View` instead of `Substring`, you can +eke out even more performance, more than doubling the speed: + +``` +name time std iterations +------------------------------------------------------------------ +README Example.Parser: Substring 3693.000 ns ± 81.76 % 349763 +README Example.Parser: UTF8 1272.000 ns ± 128.16 % 999150 +README Example.Ad hoc 8504.000 ns ± 59.59 % 151417 +``` + +See the article for more info on how to write parsers against different +string abstraction levels. + +We can also compare these times to a tool that Apple's Foundation gives us: `Scanner`. It's a type +that allows you to consume from the beginning of strings in order to produce values, and provides +a nicer API than using `.split`: + +```swift +var users: [User] = [] +while scanner.currentIndex != input.endIndex { + guard + let id = scanner.scanInt(), + let _ = scanner.scanString(","), + let name = scanner.scanUpToString(","), + let _ = scanner.scanString(","), + let isAdmin = scanner.scanBool() + else { break } + + users.append(User(id: id, name: name, isAdmin: isAdmin)) + _ = scanner.scanString("\n") +} +``` + +However, the `Scanner` style of parsing is more than 5 times as slow as the substring parser written +written above, and more than 15 times slower than the UTF-8 parser: + +``` +name time std iterations +------------------------------------------------------------------- +README Example.Parser: Substring 3481.000 ns ± 65.04 % 376525 +README Example.Parser: UTF8 1207.000 ns ± 110.96 % 1000000 +README Example.Ad hoc 8029.000 ns ± 44.44 % 163719 +README Example.Scanner 19786.000 ns ± 35.26 % 62125 +``` + +Not only are parsers built with the library more succinct and many times more performant than ad hoc +parsers, but they can also be easier to evolve to accommodate more features. For example, right now +our parser does not work correctly when the user's name contains a comma, such as "Blob, Esq.": + +```swift +try user.parse("1,Blob, Esq.,true") + +// error: unexpected input +// --> input:1:8 +// 1 | 1,Blob, Esq.,true +// | ^ expected "true" or "false" +``` + +The problem is that we are using the comma as a reserved identifier for delineating between fields, +and so a field cannot contain a comma. We can enhance the CSV format to allow for quoting fields +so that they can contain quotes: + +``` +1,"Blob, Esq.",true +``` + +To parse quoted fields we can first try parsing a quote, then everything up to the next quote, and +then the trailing quote: + +```swift +let quotedField = Parse { + "\"" + Prefix { $0 != "\"" } + "\"" +} +``` + +And then to parse a field, in general, we can first try parsing a quoted field, and if that fails we +will just take everything until the next comma. We can do this using the ``OneOf`` parser, which +allows us to run multiple parsers on the same input, and it will take the first that succeeds: + +```swift +let field = OneOf { + quotedField + Prefix { $0 != "," } +} +.map(String.init) +``` + +We can use this parser in the `user` parser, and now it properly handles quoted and non-quoted +fields: + +```swift +let user = Parse(User.init) { + Int.parser() + "," + field + "," + Bool.parser() +} + +try user.parse("1,\"Blob, Esq.\",true") // User(id: 1, name: "Blob, Esq.", admin: true) +``` + +It was quite straightforward to improve the `user` parser to handle quoted fields. Doing the same +with our ad hoc `split`/`compactMap` parser, and even the `Scanner`-based parser, would be a lot +more difficult. + +That's the basics of parsing a simple string format, but there's a lot more operators and tricks to +learn in order to performantly parse larger inputs. View the [benchmarks][benchmarks] for examples +of real-life parsing scenarios. + +[benchmarks-readme]: https://github.com/pointfreeco/swift-parsing/blob/main/Sources/swift-parsing-benchmark/ReadmeExample.swift +[benchmarks]: https://github.com/pointfreeco/swift-parsing/tree/main/Sources/swift-parsing-benchmark diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/StringAbstractions.md b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/StringAbstractions.md new file mode 100644 index 00000000..8ba2c455 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Articles/StringAbstractions.md @@ -0,0 +1,183 @@ +# String Abstractions + +Learn how to write parsers on different levels of string abstractions, giving you the ability to +trade performance for correctness where needed. + +## Levels of abstraction + +The parsers in the library do not work on `String`s directly, and instead operate on _views_ into a +string, such as `Substring`, `UnicodeScalarView` and `UTF8View`. Each of these types represents a +particular kind of "view" into some subset of a string, which means they are cheap to copy around, +and it makes consuming elements from the beginning and end of the string very efficient since only +their start and end index need to be mutated to point to different parts of the string. + +However, there are tradeoffs to using each type: + + * `Substring`, like `String`, is a collection of `Character`s, which are extended grapheme + clusters that most closely represents a single visual character one can see on the screen. This + type is easy to use and hides a lot of the complexities of UTF8 from you (such as multiple byte + sequences that represent the same visual character), and as such it is less efficient to use. + Its elements are variable width, which means scanning its elements is an O(n) operation. + + * `UnicodeScalarView` is a collection of unicode scalars represented by the `Unicode.Scalar` type. + Unicode scalars are 21-bit, and so not variable width like `Substring`, which makes scanning + `UnicodeScalarView`s more efficient, but at the cost of some additional complexity in the API. + + For example, complex elements that can be represented by a single `Character`, such as "🇺🇸", + are represented by multiple `Unicode.Scalar` elements, "🇺" and "🇸". When put together they + form the single extended grapheme cluster of the flag character. + + Further, some `Character`s have multiple representations as collections of unicode scalars. For + example, an "e" with an accute accent only has one visual representation, yet there are two + different sequences of unicode scalars that can represent that character: + + ```swift + Array("é".unicodeScalars) // [233] + Array("é".unicodeScalars) // [101, 769] + ``` + + You can't tell from looking at the character, but the first "é" is a single unicode scalar + called a "LATIN SMALL LETTER E WITH ACUTE" and the second "é" is two scalars, one just a plain + "e" and the second a "COMBINING ACUTE ACCENT". Importantly, these two accented e's are equal as + `Character`s but unequal as `UnicodeScalarView`s: + + ```swift + let e1 = "\u{00E9}" + let e2 = "e\u{0301}" + e1 == e2 // true + e1.unicodeScalars.elementsEqual(e2.unicodeScalars) // false + ``` + + So, when parsing on the level of `UnicodeScalarView` you have to be aware of these subtleties in + order to form a correct parser. + + * `UTF8View` is a collection of `Unicode.UTF8.CodeUnit`s, which is just a typealias for `UInt8`, + _i.e._, a single byte. This is an even lower-level representation of strings than + `UnicodeScalarView`, and scanning these collections is quite efficient, but at the cost of even + more complexity. + + For example, the non-ASCII characters described above have an even more complex representation + has UTF8 bytes: + + ```swift + Array("é".utf8) // [195, 169] + Array("é".utf8) // [101, 204, 129] + Array("🇺🇸".utf8) // [240, 159, 135, 186, 240, 159, 135, 184] + ``` + + * There's even `ArraySlice`, which is just a raw collection of bytes. This can be even more + efficient to parse than `UTF8View` because it does not require representing a valid UTF-8 + string, but then you have no guarantees that you can losslessly convert it back into a `String`. + +## Mixing and matching abstraction levels + +It is possible to plug together parsers that work on different abstraction levels so that you can +decide where you want to trade correctness for performance and vice-versa. + +For example, suppose you have an enum representing a few cities that you want to parse a string +into: + +```swift +enum City { + case losAngeles + case newYork + case sanJose +} + +let city = OneOf { + "Los Angeles".map { City.losAngeles } + "New York".map { City.newYork } + "San José".map { City.sanJose } +} +``` + +For the most part this parser could work on the level of UTF-8 because it is mostly dealing with +plain ASCII characters for which there are not multiple ways of representing the same visual +character. The only exception is "San José", which has an accented "e" that can be represented +by two different sequences of bytes. + +The `Substring` abstraction is hiding those details from us because this parser will happily parse +both representations of "San José" from a string: + +```swift +city.parse("San Jos\u{00E9}") // ✅ +city.parse("San Jose\u{0301}") // ✅ +``` + +But, if we naively convert this parser to work on the level of `UTF8View`: + +```swift +let city = OneOf { + "Los Angeles".utf8.map { City.losAngeles } + "New York".utf8.map { City.newYork } + "San José".utf8.map { City.sanJose } +} +``` + +We have accidentally introduced a bug into the parser in which it recognizes one version of +"San José", but not the other: + +```swift +city.parse("San Jos\u{00E9}".utf8) // ✅ +city.parse("San Jose\u{0301}".utf8) // ❌ +``` + +One way to fix this would be to add another case to the `OneOf` for this alternate representation +of "San José": + +```swift +let city = OneOf { + "Los Angeles".utf8.map { City.losAngeles } + "New York".utf8.map { City.newYork } + "San Jos\u{00E9}".utf8.map { City.sanJose } + "San Jose\u{0301}".utf8.map { City.sanJose } +} + +city.parse("San Jos\u{00E9}".utf8) // ✅ +city.parse("San Jose\u{0301}".utf8) // ✅ +``` + +This does work, but you are now responsible for understanding the ins and outs of UTF-8 +normalization. UTF-8 is incredibly complex and Swift does a lot of work to hide that complexity +from you. + +However, there's no need to parse everything on the level of `Substring` just because this one +parser needs to. We can parse everything on the level of `UTF8View` and then parse just "San José" +on the level of `Substring`. We do this by using the ``FromSubstring`` parser, which allows us to +temporarily leave the `UTF8View` world to work in the `Substring` world: + +```swift +let city = OneOf { + "Los Angeles".utf8.map { City.losAngeles } + "New York".utf8.map { City.newYork } + FromSubstring { "San José" }.map { City.sanJose } +} + +city.parse("San Jos\u{00E9}".utf8) // ✅ +city.parse("San Jose\u{0301}".utf8) // ✅ +``` + +This will run the "San José" parser on the level of `Substring`, meaning it will handle all the +complexities of UTF8 normalization so that we don't have to think about it. + +If we want to be _really_ pedantic we can even decide to parse only the "é" character on the +level of `Substring` and leave everything else to `UTF8View`: + +```swift +let city = OneOf { + "Los Angeles".utf8.map { City.losAngeles } + "New York".utf8.map { City.newYork } + Parse { + "San Jos".utf8 + FromSubstring { "é" } + } + .map { City.sanJose } +} + +city.parse("San Jos\u{00E9}".utf8) // ✅ +city.parse("San Jose\u{0301}".utf8) // ✅ +``` + +We don't necessarily recommend being this pedantic in general, at least not without benchmarking to +make sure it is worth it. But it does demonstrate how you can be very precise with which abstraction +levels you want to work on. diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Parsing.md b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Parsing.md new file mode 100644 index 00000000..10e1a3fe --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Documentation.docc/Parsing.md @@ -0,0 +1,99 @@ +# ``Parsing`` + +A library for turning nebulous data into well-structured data, with a focus on composition, +performance, generality, and ergonomics. + +## Additional Resources + +- [GitHub Repo](https://github.com/pointfreeco/swift-parsing/) +- [Discussions](https://github.com/pointfreeco/swift-parsing/discussions) +- [Point-Free Videos](https://www.pointfree.co/collections/parsing) + +## Overview + +Parsing with this library is performed by listing out many small parsers that describe how to +incrementally consume small bits from the beginning of an input string. For example, suppose you +have a string that holds some user data that you want to parse into an array of `User`s: + +```swift +var input = """ +1,Blob,true +2,Blob Jr.,false +3,Blob Sr.,true +""" + +struct User { + var id: Int + var name: String + var isAdmin: Bool +} +``` + +A parser can be constructed for transforming the input string into an array of users in succinct +and fluent API: + +```swift +let user = Parse(User.init) { + Int.parser() + "," + Prefix { $0 != "," }.map(String.init) + "," + Bool.parser() +} + +let users = Many { + user +} separator: { + "\n" +} terminator: { + End() +} + +try users.parse(input) // [User(id: 1, name: "Blob", isAdmin: true), ...] +``` + +This says that to parse a user we: + +* Parse and consume an integer from the beginning of the input +* then a comma +* then everything up to the next comma +* then another comma +* and finally a boolean. + +And to parse an entire array of users we: + +* Run the `user` parser many times +* between each invocation of `user` we run the separator parser to consume a newline +* and once the `user` and separator parsers have consumed all they can we run the terminator +parser to verify there is no more input to consume. + +Further, if the input is malformed, like say we mistyped one of the booleans, then the parser emits +an error that describes exactly what went wrong: + +```swift +var input = """ +1,Blob,true +2,Blob Jr.,false +3,Blob Sr.,tru +""" + +try users.parse(input) + +// error: unexpected input +// --> input:3:11 +// 3 | 3,Blob Jr,tru +// | ^ expected "true" or "false" +``` + +That's the basics of parsing a simple string format, but there are a lot more operators and tricks +to learn in order to performantly parse larger inputs. + +## Topics + +### Articles + +* +* +* +* +* diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Internal/Breakpoint.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Internal/Breakpoint.swift new file mode 100644 index 00000000..f4159e40 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Internal/Breakpoint.swift @@ -0,0 +1,34 @@ +#if canImport(Darwin) + import Darwin +#endif + +/// Raises a debug breakpoint if a debugger is attached. +@inline(__always) +@usableFromInline +func breakpoint(_ message: @autoclosure () -> String = "") { + #if canImport(Darwin) + // https://github.com/bitstadium/HockeySDK-iOS/blob/c6e8d1e940299bec0c0585b1f7b86baf3b17fc82/Classes/BITHockeyHelper.m#L346-L370 + var name: [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()] + var info: kinfo_proc = kinfo_proc() + var info_size = MemoryLayout.size + + let isDebuggerAttached = + sysctl(&name, 4, &info, &info_size, nil, 0) != -1 + && info.kp_proc.p_flag & P_TRACED != 0 + + if isDebuggerAttached { + fputs( + """ + \(message()) + + Caught debug breakpoint. Type "continue" ("c") to resume execution. + + """, + stderr + ) + raise(SIGTRAP) + } + #else + assertionFailure(message()) + #endif +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Internal/Deprecations.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Internal/Deprecations.swift new file mode 100644 index 00000000..33ec7a80 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Internal/Deprecations.swift @@ -0,0 +1,4 @@ +// NB: Deprecated after 0.6.0 + +@available(*, deprecated, renamed: "Parsers.Conditional") +public typealias Conditional = Parsers.Conditional diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parser.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parser.swift new file mode 100644 index 00000000..f85e3863 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parser.swift @@ -0,0 +1,92 @@ +/// Declares a type that can parse an `Input` value into an `Output` value. +/// +/// * [Getting started](#Getting-started) +/// * [String abstraction levels](#String-abstraction-levels) +/// * [Error messages](#Error-messages) +/// * [Backtracking](#Backtracking) +/// +/// ## Getting started +/// +/// A parser attempts to parse a nebulous piece of data, represented by the `Input` associated type, +/// into something more well-structured, represented by the `Output` associated type. The parser +/// implements the ``parse(_:)-76tcw`` method, which is handed an `inout Input`, and its job is to +/// turn this into an `Output` if possible, or throw an error if it cannot. +/// +/// The argument of the ``parse(_:)-76tcw`` function is `inout` because a parser will usually +/// consume some of the input in order to produce an output. For example, we can use an +/// `Int.parser()` parser to extract an integer from the beginning of a substring and consume that +/// portion of the string: +/// +/// ```swift +/// var input: Substring = "123 Hello world" +/// +/// try Int.parser().parse(&input) // 123 +/// input // " Hello world" +/// ``` +/// +/// Note that this parser works on `Substring` rather than `String` because substrings expose +/// efficient ways of removing characters from its beginning. Substrings are "views" into a string, +/// specificed by start and end indices. Operations like `removeFirst`, `removeLast` and others can +/// be implemented efficiently on substrings because they simply move the start and end indices, +/// whereas their implementation on strings must make a copy of the string with the characters +/// removed. +/// +/// To explore the concepts of parsers more deeply read the following articles: +/// +/// * +/// * +/// * +/// * +/// * +@rethrows public protocol Parser { + /// The kind of values this parser receives. + associatedtype Input + + /// The kind of values parsed by this parser. + associatedtype Output + + /// Attempts to parse a nebulous piece of data into something more well-structured. + /// + /// - Parameter input: A nebulous, mutable piece of data to be incrementally parsed. + /// - Returns: A more well-structured value parsed from the given input. + func parse(_ input: inout Input) throws -> Output +} + +extension Parser { + /// Attempts to parse a nebulous piece of data into something more well-structured. + /// + /// - Parameter input: A nebulous piece of data to be parsed. + /// - Returns: A more well-structured value parsed from the given input. + @inlinable + public func parse(_ input: Input) rethrows -> Output { + var input = input + return try self.parse(&input) + } + + /// Attempts to parse a nebulous collection of data into something more well-structured. + /// + /// - Parameter input: A nebulous collection of data to be parsed. + /// - Returns: A more well-structured value parsed from the given input. + @inlinable + public func parse(_ input: C) rethrows -> Output + where Input == C.SubSequence { + try Parse { + self + End() + }.parse(input[...]) + } + + /// Attempts to parse a nebulous collection of data into something more well-structured. + /// + /// - Parameter input: A nebulous collection of data to be parsed. + /// - Returns: A more well-structured value parsed from the given input. + @_disfavoredOverload + @inlinable + public func parse(_ input: S) rethrows -> Output + where Input == S.SubSequence.UTF8View { + try Parse { + self + End() + }.parse(input[...].utf8) + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Always.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Always.swift new file mode 100644 index 00000000..a616a51d --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Always.swift @@ -0,0 +1,101 @@ +/// A parser that always succeeds with the given value, and does not consume any input. +/// +/// While not very useful on its own, the `Always` parser can be helpful when combined with other +/// parsers or operators. +/// +/// When its `Output` is `Void`, it can be used as a "no-op" parser of sorts and be plugged into +/// other parser operations. For example, the ``Many`` parser can be configured with separator and +/// terminator parsers: +/// +/// ```swift +/// Many { +/// Int.parser() +/// } separator: { +/// "," +/// } terminator: { +/// End() +/// } +/// ``` +/// +/// But also exposes initializers that omit these parsers when there is no separator or terminator +/// to be parsed: +/// +/// ```swift +/// Many { +/// Prefix { $0 != "\n" } +/// "\n" +/// } +/// ``` +/// +/// To support this, `Many` plugs `Always` into each omitted parser. As a simplified +/// example: +/// +/// ```swift +/// struct Many: Parser +/// where Separator.Input == Element.Input, Terminator.Input == Element.Input { +/// ... +/// } +/// +/// extension Many where Separator == Always, Terminator == Always { +/// init(@ParserBuilder element: () -> Element) { +/// self.element = element() +/// self.separator = Always(()) +/// self.terminator = Always(()) +/// } +/// } +/// ``` +/// +/// This means the previous example is equivalent to: +/// +/// ```swift +/// Many { +/// Prefix { $0 != "\n" } +/// "\n" +/// } separator: { +/// Always(()) +/// } terminator: { +/// Always(()) +/// } +/// ``` +/// +/// > Note: While `Always` can be used as the last alternative of a ``OneOf`` to specify a default +/// > output, the resulting parser will be throwing. Instead, prefer ``Parser/replaceError(with:)``, +/// > which returns a non-throwing parser. +public struct Always: Parser { + public let output: Output + + @inlinable + public init(_ output: Output) { + self.output = output + } + + @inlinable + public func parse(_ input: inout Input) -> Output { + self.output + } + + @inlinable + public func map( + _ transform: @escaping (Output) -> NewOutput + ) -> Always { + .init(transform(self.output)) + } +} + +extension Always where Input == Substring { + @inlinable + public init(_ output: Output) { + self.output = output + } +} + +extension Always where Input == Substring.UTF8View { + @inlinable + public init(_ output: Output) { + self.output = output + } +} + +extension Parsers { + public typealias Always = Parsing.Always // NB: Convenience type alias for discovery +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/AnyParser.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/AnyParser.swift new file mode 100644 index 00000000..cac3f027 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/AnyParser.swift @@ -0,0 +1,63 @@ +extension Parser { + /// Wraps this parser with a type eraser. + /// + /// This form of _type erasure_ preserves abstraction across API boundaries, such as different + /// modules. + /// + /// When you expose your composed parsers as the ``AnyParser`` type, you can change the underlying + /// implementation over time without affecting existing clients. + /// + /// Equivalent to passing `self` to `AnyParser.init(_:)`. + /// + /// - Returns: An ``AnyParser`` wrapping this publisher. + @inlinable + public func eraseToAnyParser() -> AnyParser { + .init(self) + } +} + +/// A type-erased parser of `Output` from `Input`. +/// +/// This parser forwards its ``parse(_:)`` method to an arbitrary underlying parser having the same +/// `Input` and `Output` types, hiding the specifics of the underlying ``Parser``. +/// +/// Use ``AnyParser`` to wrap a parser whose type has details you don't want to expose across API +/// boundaries, such as different modules. When you use type erasure this way, you can change the +/// underlying parser over time without affecting existing clients. +public struct AnyParser: Parser { + @usableFromInline + let parser: (inout Input) throws -> Output + + /// Creates a type-erasing parser to wrap the given parser. + /// + /// Equivalent to calling ``Parser/eraseToAnyParser()`` on the parser. + /// + /// - Parameter parser: A parser to wrap with a type eraser. + @inlinable + public init(_ parser: P) where P.Input == Input, P.Output == Output { + self.init(parser.parse) + } + + /// Creates a parser that wraps the given closure in its ``parse(_:)`` method. + /// + /// - Parameter parse: A closure that attempts to parse an output from an input. `parse` is + /// executed each time the ``parse(_:)`` method is called on the resulting parser. + @inlinable + public init(_ parse: @escaping (inout Input) throws -> Output) { + self.parser = parse + } + + @inlinable + public func parse(_ input: inout Input) throws -> Output { + try self.parser(&input) + } + + @inlinable + public func eraseToAnyParser() -> Self { + self + } +} + +extension Parsers { + public typealias AnyParser = Parsing.AnyParser // NB: Convenience type alias for discovery +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Bool.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Bool.swift new file mode 100644 index 00000000..dfd9adbf --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Bool.swift @@ -0,0 +1,92 @@ +extension Bool { + /// A parser that consumes a Boolean value from the beginning of a collection of UTF-8 code units. + /// + /// This parser only recognizes the literal "true" and "false" characters: + /// + /// ```swift + /// // Parses "true": + /// var input = "true Hello"[...] + /// try Bool.parser().parse(&input) // true + /// input // " Hello" + /// + /// // Parses "false": + /// input = "false Hello"[...] + /// try Bool.parser().parse(&input) // false + /// input // " Hello" + /// + /// // Otherwise fails: + /// input = "1 Hello"[...] + /// try Bool.parser().parse(&input) + /// // error: unexpected input + /// // --> input:1:1 + /// // 1 | 1 Hello + /// // ^ expected "true" or "false" + /// ``` + /// + /// - Parameter inputType: The collection type of UTF-8 code units to parse. + /// - Returns: A parser that consumes a Boolean value from the beginning of a collection of UTF-8 + /// code units. + @inlinable + public static func parser( + of inputType: Input.Type = Input.self + ) -> Parsers.BoolParser { + .init() + } + + /// A parser that consumes a Boolean value from the beginning of a substring's UTF-8 view. + /// + /// This overload is provided to allow the `Input` generic to be inferred when it is + /// `Substring.UTF8View`. + /// + /// - Parameter inputType: The `Substring.UTF8View` type. This parameter is included to mirror the + /// interface that parses any collection of UTF-8 code units. + /// - Returns: A parser that consumes a Boolean value from the beginning of a substring's UTF-8 + /// view. + @inlinable + public static func parser( + of inputType: Substring.UTF8View.Type = Substring.UTF8View.self + ) -> Parsers.BoolParser { + .init() + } + + /// A parser that consumes a Boolean value from the beginning of a substring. + /// + /// This overload is provided to allow the `Input` generic to be inferred when it is `Substring`. + /// + /// - Parameter inputType: The `Substring` type. This parameter is included to mirror the + /// interface that parses any collection of UTF-8 code units. + /// - Returns: A parser that consumes a Boolean value from the beginning of a substring. + @inlinable + public static func parser( + of inputType: Substring.Type = Substring.self + ) -> FromUTF8View> { + .init { Parsers.BoolParser() } + } +} + +extension Parsers { + /// A parser that consumes a Boolean value from the beginning of a collection of UTF-8 code units. + /// + /// You will not typically need to interact with this type directly. Instead you will usually use + /// `Bool.parser()`, which constructs this type. + public struct BoolParser: Parser + where + Input.SubSequence == Input, + Input.Element == UTF8.CodeUnit + { + @inlinable + public init() {} + + @inlinable + public func parse(_ input: inout Input) throws -> Bool { + if input.starts(with: [116, 114, 117, 101] /*"true".utf8*/) { + input.removeFirst(4) + return true + } else if input.starts(with: [102, 97, 108, 115, 101] /*"false".utf8*/) { + input.removeFirst(5) + return false + } + throw ParsingError.expectedInput("\"true\" or \"false\"", at: input) + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/CharacterSet.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/CharacterSet.swift new file mode 100644 index 00000000..26e4a5cf --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/CharacterSet.swift @@ -0,0 +1,10 @@ +import Foundation + +extension CharacterSet: Parser { + @inlinable + public func parse(_ input: inout Substring) -> Substring { + let output = input.unicodeScalars.prefix(while: self.contains) + input.unicodeScalars.removeFirst(output.count) + return Substring(output) + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/CompactMap.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/CompactMap.swift new file mode 100644 index 00000000..430682bb --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/CompactMap.swift @@ -0,0 +1,78 @@ +extension Parser { + /// Returns a parser that outputs the non-`nil` result of calling the given closure with the + /// output of this parser. + /// + /// This method is similar to `Sequence.compactMap` in the Swift standard library, as well as + /// `Publisher.compactMap` in the Combine framework. + /// + /// ```swift + /// let evenParser = Int.parser().compactMap { $0.isMultiple(of: 2) } + /// + /// var input = "124 hello world"[...] + /// try evenParser.parse(&input) // 124 + /// input // " hello world" + /// ``` + /// + /// This parser fails when the provided closure returns `nil`. For example, the following parser tries + /// to convert two characters into a hex digit, but fails to do so because `"GG"` is not a valid + /// hex number: + /// + /// ```swift + /// var input = "GG0000"[...] + /// let hex = try Prefix(2).compactMap { Int(String($0), radix: 16) }.parse(&input) + /// // error: failed to process "Int" from "GG" + /// // --> input:1:1-2 + /// // 1 | GG0000 + /// // | ^^ + /// ``` + /// + /// - Parameter transform: A closure that accepts output of this parser as its argument and + /// returns an optional value. + /// - Returns: A parser that outputs the non-`nil` result of calling the given transformation + /// with the output of this parser. + @_disfavoredOverload + @inlinable + public func compactMap( + _ transform: @escaping (Output) -> NewOutput? + ) -> Parsers.CompactMap { + .init(upstream: self, transform: transform) + } +} + +extension Parsers { + /// A parser that outputs the non-`nil` result of calling the given transformation with the output + /// of its upstream parser. + /// + /// You will not typically need to interact with this type directly. Instead you will usually use + /// the ``Parser/compactMap(_:)`` operation, which constructs this type. + public struct CompactMap: Parser { + public let upstream: Upstream + public let transform: (Upstream.Output) -> Output? + + @inlinable + public init( + upstream: Upstream, + transform: @escaping (Upstream.Output) -> Output? + ) { + self.upstream = upstream + self.transform = transform + } + + @inlinable + public func parse(_ input: inout Upstream.Input) throws -> Output { + let original = input + let output = try self.upstream.parse(&input) + guard let newOutput = self.transform(output) + else { + throw ParsingError.failed( + summary: """ + failed to process "\(Output.self)" from \(formatValue(output)) + """, + from: original, + to: input + ) + } + return newOutput + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Conditional.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Conditional.swift new file mode 100644 index 00000000..2eb50503 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Conditional.swift @@ -0,0 +1,49 @@ +extension Parsers { + /// A parser that can parse output from two types of parsers. + /// + /// This parser is useful for situations where you want to run one of two different parsers based on + /// a condition, which typically would force you to perform ``Parser/eraseToAnyParser()`` and incur + /// a performance penalty. + /// + /// For example, you can use this parser in a ``Parser/flatMap(_:)`` operation to use the parsed + /// output to determine what parser to run next: + /// + /// ```swift + /// versionParser.flatMap { version in + /// version == "2.0" + /// ? Conditional.first(V2Parser()) + /// : Conditional.second(LegacyParser()) + /// } + /// ``` + /// + /// You won't typically construct this parser directly, but instead will use standard `if`-`else` + /// statements in a parser builder to automatically build conditional parsers: + /// + /// ```swift + /// versionParser.flatMap { version in + /// if version == "2.0" { + /// V2Parser() + /// } else { + /// LegacyParser() + /// } + /// } + /// ``` + public enum Conditional: Parser + where + First.Input == Second.Input, + First.Output == Second.Output + { + case first(First) + case second(Second) + + @inlinable + public func parse(_ input: inout First.Input) rethrows -> First.Output { + switch self { + case let .first(first): + return try first.parse(&input) + case let .second(second): + return try second.parse(&input) + } + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Double.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Double.swift new file mode 100644 index 00000000..642c3b8b --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Double.swift @@ -0,0 +1,350 @@ +import Foundation + +extension Double { + /// A parser that consumes a double from the beginning of a collection of UTF-8 code units. + /// + /// Parses the same format parsed by `Double.init(_:)`. + /// + /// ```swift + /// var input = "123.45 Hello world"[...] + /// try Double.parser().parse(&input) // 123.45 + /// input // " Hello world" + /// ``` + /// + /// - Parameter inputType: The collection type of UTF-8 code units to parse. + /// - Returns: A parser that consumes a double from the beginning of a collection of UTF-8 code + /// units. + @inlinable + public static func parser( + of inputType: Input.Type = Input.self + ) -> Parsers.DoubleParser { + .init() + } + + /// A parser that consumes a double from the beginning of a substring's UTF-8 view. + /// + /// This overload is provided to allow the `Input` generic to be inferred when it is + /// `Substring.UTF8View`. + /// + /// - Parameter inputType: The `Substring.UTF8View` type. This parameter is included to mirror the + /// interface that parses any collection of UTF-8 code units. + /// - Returns: A parser that consumes a double from the beginning of a substring's UTF-8 view. + @_disfavoredOverload + @inlinable + public static func parser( + of inputType: Substring.UTF8View.Type = Substring.UTF8View.self + ) -> Parsers.DoubleParser { + .init() + } + + /// A parser that consumes a double from the beginning of a substring. + /// + /// This overload is provided to allow the `Input` generic to be inferred when it is `Substring`. + /// + /// - Parameter inputType: The `Substring` type. This parameter is included to mirror the + /// interface that parses any collection of UTF-8 code units. + /// - Returns: A parser that consumes a double from the beginning of a substring. + @_disfavoredOverload + @inlinable + public static func parser( + of inputType: Substring.Type = Substring.self + ) -> FromUTF8View> { + .init { Parsers.DoubleParser() } + } +} + +extension Float { + /// A parser that consumes a float from the beginning of a collection of UTF-8 code units. + /// + /// Parses the same format parsed by `Float.init(_:)`. + /// + /// ```swift + /// var input = "123.45 Hello world"[...] + /// try Float.parser().parse(&input) // 123.45 + /// input // " Hello world" + /// ``` + /// + /// - Parameter inputType: The collection type of UTF-8 code units to parse. + /// - Returns: A parser that consumes a float from the beginning of a collection of UTF-8 code + /// units. + @inlinable + public static func parser( + of inputType: Input.Type = Input.self + ) -> Parsers.FloatParser { + .init() + } + + /// A parser that consumes a float from the beginning of a substring's UTF-8 view. + /// + /// This overload is provided to allow the `Input` generic to be inferred when it is + /// `Substring.UTF8View`. + /// + /// - Parameter inputType: The `Substring.UTF8View` type. This parameter is included to mirror the + /// interface that parses any collection of UTF-8 code units. + /// - Returns: A parser that consumes a float from the beginning of a substring's UTF-8 view. + @_disfavoredOverload + @inlinable + public static func parser( + of inputType: Substring.UTF8View.Type = Substring.UTF8View.self + ) -> Parsers.FloatParser { + .init() + } + + /// A parser that consumes a float from the beginning of a substring. + /// + /// This overload is provided to allow the `Input` generic to be inferred when it is `Substring`. + /// + /// - Parameter inputType: The `Substring` type. This parameter is included to mirror the + /// interface that parses any collection of UTF-8 code units. + /// - Returns: A parser that consumes a float from the beginning of a substring. + @_disfavoredOverload + @inlinable + public static func parser( + of inputType: Substring.Type = Substring.self + ) -> FromUTF8View> { + .init { Parsers.FloatParser() } + } +} + +#if !(os(Windows) || os(Android)) && (arch(i386) || arch(x86_64)) + extension Float80 { + /// A parser that consumes an extended-precision, floating-point value from the beginning of a + /// collection of UTF-8 code units. + /// + /// Parses the same format parsed by `Float80.init(_:)`. + /// + /// ```swift + /// var input = "123.45 Hello world"[...] + /// try Float80.parser().parse(&input) // 123.45 + /// input // " Hello world" + /// ``` + /// + /// - Parameter inputType: The collection type of UTF-8 code units to parse. + /// - Returns: A parser that consumes an extended-precision, floating-point value from the + /// beginning of a collection of UTF-8 code units. + @inlinable + public static func parser( + of inputType: Input.Type = Input.self + ) -> Parsers.Float80Parser { + .init() + } + + /// A parser that consumes an extended-precision, floating-point value from the beginning of a + /// substring's UTF-8 view. + /// + /// This overload is provided to allow the `Input` generic to be inferred when it is + /// `Substring.UTF8View`. + /// + /// - Parameter inputType: The `Substring.UTF8View` type. This parameter is included to mirror + /// the interface that parses any collection of UTF-8 code units. + /// - Returns: A parser that consumes an extended-precision, floating-point value from the + /// beginning of a substring's UTF-8 view. + @_disfavoredOverload + @inlinable + public static func parser( + of inputType: Substring.UTF8View.Type = Substring.UTF8View.self + ) -> Parsers.Float80Parser { + .init() + } + + /// A parser that consumes an extended-precision, floating-point value from the beginning of a + /// substring. + /// + /// This overload is provided to allow the `Input` generic to be inferred when it is + /// `Substring`. + /// + /// - Parameter inputType: The `Substring` type. This parameter is included to mirror the + /// interface that parses any collection of UTF-8 code units. + /// - Returns: A parser that consumes an extended-precision, floating-point value from the + /// beginning of a substring. + @_disfavoredOverload + @inlinable + public static func parser( + of inputType: Substring.Type = Substring.self + ) -> FromUTF8View> { + .init { Parsers.Float80Parser() } + } + } +#endif + +extension Parsers { + /// A parser that consumes a double from the beginning of a collection of UTF-8 code units. + /// + /// You will not typically need to interact with this type directly. Instead you will usually use + /// `Double.parser()`, which constructs this type. + /// + /// ```swift + /// var input = "123.45 Hello world"[...] + /// try Double.parser().parse(&input) // 123.45 + /// input // " Hello world" + /// ``` + public struct DoubleParser: Parser + where + Input: Collection, + Input.SubSequence == Input, + Input.Element == UTF8.CodeUnit + { + @inlinable + public init() {} + + @inlinable + public func parse(_ input: inout Input) throws -> Double { + let original = input + let s = input.parseFloat() + guard let n = Double(String(decoding: s, as: UTF8.self)) + else { throw ParsingError.expectedInput("double", from: original, to: input) } + return n + } + } + + /// A parser that consumes a float from the beginning of a collection of UTF-8 code units. + /// + /// You will not typically need to interact with this type directly. Instead you will usually use + /// `Float.parser()`, which constructs this type. + /// + /// ```swift + /// var input = "123.45 Hello world"[...] + /// try Float.parser().parse(&input) // 123.45 + /// input // " Hello world" + /// ``` + public struct FloatParser: Parser + where + Input: Collection, + Input.SubSequence == Input, + Input.Element == UTF8.CodeUnit + { + @inlinable + public init() {} + + @inlinable + public func parse(_ input: inout Input) throws -> Float { + let original = input + let s = input.parseFloat() + guard let n = Float(String(decoding: s, as: UTF8.self)) + else { throw ParsingError.expectedInput("float", from: original, to: input) } + return n + } + } + + #if !(os(Windows) || os(Android)) && (arch(i386) || arch(x86_64)) + /// A parser that consumes a float from the beginning of a collection of UTF-8 code units. + /// + /// You will not typically need to interact with this type directly. Instead you will usually + /// use `Float80.parser()`, which constructs this type. + /// + /// ```swift + /// var input = "123.45 Hello world"[...] + /// try Float80.parser().parse(&input) // 123.45 + /// input // " Hello world" + /// ``` + public struct Float80Parser: Parser + where + Input: Collection, + Input.SubSequence == Input, + Input.Element == UTF8.CodeUnit + { + @inlinable + public init() {} + + @inlinable + public func parse(_ input: inout Input) throws -> Float80 { + let original = input + let s = input.parseFloat() + guard let n = Float80(String(decoding: s, as: UTF8.self)) + else { + throw ParsingError.expectedInput("extended-precision float", from: original, to: input) + } + return n + } + } + #endif +} + +extension UTF8.CodeUnit { + @usableFromInline + var isDigit: Bool { + (.init(ascii: "0") ... .init(ascii: "9")).contains(self) + } + + @usableFromInline + var isHexDigit: Bool { + (.init(ascii: "0") ... .init(ascii: "9")).contains(self) + || (.init(ascii: "a") ... .init(ascii: "f")).contains(self) + || (.init(ascii: "A") ... .init(ascii: "F")).contains(self) + } + + @usableFromInline + var isSign: Bool { + self == .init(ascii: "-") || self == .init(ascii: "+") + } +} + +extension Collection where SubSequence == Self, Element == UTF8.CodeUnit { + @inlinable + @inline(__always) + mutating func parseFloat() -> SubSequence { + let original = self + if self.first?.isSign == true { + self.removeFirst() + } + if self.first == .init(ascii: "0") + && (self.dropFirst().first == .init(ascii: "x") + || self.dropFirst().first == .init(ascii: "X")) + { + self.removeFirst(2) + let integer = self.prefix(while: { $0.isHexDigit }) + self.removeFirst(integer.count) + if self.first == .init(ascii: ".") { + let fractional = + self + .dropFirst() + .prefix(while: { $0.isHexDigit }) + self.removeFirst(1 + fractional.count) + } + if self.first == .init(ascii: "p") || self.first == .init(ascii: "P") { + var n = 1 + if self.dropFirst().first?.isSign == true { n += 1 } + let exponent = + self + .dropFirst(n) + .prefix(while: { $0.isHexDigit }) + guard !exponent.isEmpty else { return original[..(_ other: S) -> Bool + where S.Element == Element { + self.elementsEqual(other, by: { $0 == $1 || $0 + 32 == $1 }) + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/End.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/End.swift new file mode 100644 index 00000000..61ec7c07 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/End.swift @@ -0,0 +1,54 @@ +/// A parser that succeeds if the input is empty, and fails otherwise. +/// +/// Useful as a final parser in a long sequence of parsers to guarantee that all input has been +/// consumed. +/// +/// ```swift +/// let parser = Parse { +/// "Hello, " +/// Prefix { $0 != "!" } +/// "!" +/// End() // NB: All input should be consumed. +/// } +/// +/// var input = "Hello, Blob!"[...] +/// try parser.parse(&input) // "Blob" +/// ``` +/// +/// This parser will fail if there are input elements that have not been consumed: +/// +/// ```swift +/// input = "Hello, Blob!!" +/// try parser.parse(&input) +/// // error: unexpected input +/// // --> input:1:13 +/// // 1 | Hello, Blob!! +/// // | ^ expected end of input +/// ``` +public struct End: Parser { + @inlinable + public init() {} + + @inlinable + public func parse(_ input: inout Input) throws { + guard input.isEmpty else { + throw ParsingError.expectedInput("end of input", at: input) + } + } +} + +extension End where Input == Substring { + @_disfavoredOverload + @inlinable + public init() {} +} + +extension End where Input == Substring.UTF8View { + @_disfavoredOverload + @inlinable + public init() {} +} + +extension Parsers { + public typealias End = Parsing.End // NB: Convenience type alias for discovery +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Fail.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Fail.swift new file mode 100644 index 00000000..b4620676 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Fail.swift @@ -0,0 +1,72 @@ +/// A parser that always fails, no matter the input. +/// +/// While not very useful on its own, this parser can be helpful when combined with other parsers or +/// operators. +/// +/// For example, it can be used to conditionally causing parsing to fail when used with +/// ``Parser/flatMap(_:)``: +/// +/// ```swift +/// struct OddFailure: Error {} +/// +/// let evens = Int.parser().flatMap { +/// if $0.isMultiple(of: 2) { +/// Always($0) +/// } else { +/// Fail(throwing: OddFailure()) +/// } +/// } +/// +/// try evens.parse("42") // 42 +/// +/// try evens.parse("123") +/// // error: OddFailure() +/// // --> input:1:1-3 +/// // 1 | 123 +/// // | ^^^ +/// ``` +public struct Fail: Parser { + @usableFromInline + let error: Error + + /// Creates a parser that throws an error when it runs. + /// + /// - Parameter error: An error to throw when the parser is run. + @inlinable + public init(throwing error: Error) { + self.error = error + } + + @inlinable + public func parse(_ input: inout Input) throws -> Output { + switch self.error { + case is ParsingError: + throw self.error + default: + throw ParsingError.wrap(self.error, at: input) + } + } +} + +extension Fail { + /// Creates a parser that throws an error when it runs. + @inlinable + public init() { + self.init(throwing: DefaultError()) + } + + @usableFromInline + struct DefaultError: Error, CustomDebugStringConvertible { + @usableFromInline + init() {} + + @usableFromInline + var debugDescription: String { + "failed" + } + } +} + +extension Parsers { + public typealias Fail = Parsing.Fail // NB: Convenience type alias for discovery +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Filter.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Filter.swift new file mode 100644 index 00000000..3be53282 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Filter.swift @@ -0,0 +1,61 @@ +extension Parser { + /// Returns a parser that filters output from this parser when its output does not satisfy the + /// given predicate. + /// + /// This method is similar to `Sequence.filter` in the Swift standard library, as well as + /// `Publisher.filter` in the Combine framework. + /// + /// This parser fails if the predicate is not satisfied on the output of the upstream parser. For example, + /// the following parser consumes only even integers and so fails when an odd integer is used: + /// + /// ```swift + /// var input = "43 Hello, world!"[...] + /// let number = try Int.parser().filter { $0.isMultiple(of: 2) }.parse(&input) + /// // error: processed value 43 failed to satisfy predicate + /// // --> input:1:1-2 + /// // 1 | 43 Hello, world! + /// // | ^^ processed input + /// ``` + /// + /// - Parameter predicate: A closure that takes an output from this parser and returns a Boolean + /// value indicating whether the output should be returned. + /// - Returns: A parser that filters its output. + @_disfavoredOverload + @inlinable + public func filter(_ predicate: @escaping (Output) -> Bool) -> Parsers.Filter { + .init(upstream: self, predicate: predicate) + } +} + +extension Parsers { + /// A parser that filters the output of an upstream parser when it does not satisfy a predicate. + /// + /// You will not typically need to interact with this type directly. Instead you will usually use + /// the ``Parser/filter(_:)`` operation, which constructs this type. + public struct Filter: Parser { + public let upstream: Upstream + public let predicate: (Upstream.Output) -> Bool + + @inlinable + public init(upstream: Upstream, predicate: @escaping (Upstream.Output) -> Bool) { + self.upstream = upstream + self.predicate = predicate + } + + @inlinable + public func parse(_ input: inout Upstream.Input) throws -> Upstream.Output { + let original = input + let output = try self.upstream.parse(&input) + guard self.predicate(output) + else { + throw ParsingError.failed( + summary: "processed value \(formatValue(output)) failed to satisfy predicate", + label: "processed input", + from: original, + to: input + ) + } + return output + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/First.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/First.swift new file mode 100644 index 00000000..c9005d9d --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/First.swift @@ -0,0 +1,52 @@ +/// A parser that consumes the first element from a collection. +/// +/// This parser is named after `Sequence.first`, and attempts to parse the first element from a +/// collection of input by calling this property under the hood. +/// +/// For example, it can parse the leading character off a substring: +/// +/// ```swift +/// var input = "Hello"[...] +/// try First().parse(&input) // "H" +/// input // "ello" +/// ``` +/// +/// This parser fails if the input collection is empty: +/// +/// ```swift +/// input = "" +/// try First().parse(&input) +/// // error: unexpected input +/// // --> input:1:1 +/// // 1 | +/// // | ^ expected element +/// ``` +public struct First: Parser where Input.SubSequence == Input { + @inlinable + public init() {} + + @inlinable + public func parse(_ input: inout Input) throws -> Input.Element { + guard let first = input.first else { + throw ParsingError.expectedInput("element", at: input) + } + input.removeFirst() + return first + } +} + +extension First where Input == Substring { + @_disfavoredOverload + @inlinable + public init() {} +} + +extension First where Input == Substring.UTF8View { + @_disfavoredOverload + @inlinable + public init() {} +} + +extension Parsers { + public typealias First = Parsing.First // NB: Convenience type alias for discovery +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/FlatMap.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/FlatMap.swift new file mode 100644 index 00000000..c64ef148 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/FlatMap.swift @@ -0,0 +1,52 @@ +extension Parser { + /// Returns a parser that transforms the output of this parser into a new parser. + /// + /// This method is similar to `Sequence.flatMap`, `Optional.flatMap`, and `Result.flatMap` in the + /// Swift standard library, as well as `Publisher.flatMap` in the Combine framework. + /// + /// - Parameter transform: A closure that transforms values of this parser's output and returns a + /// new parser. + /// - Returns: A parser that transforms output from an upstream parser into a new parser. + @inlinable + public func flatMap( + @ParserBuilder _ transform: @escaping (Output) -> NewParser + ) -> Parsers.FlatMap { + .init(upstream: self, transform: transform) + } +} + +extension Parsers { + /// A parser that transforms the output of another parser into a new parser. + /// + /// You will not typically need to interact with this type directly. Instead you will usually use + /// the ``Parser/flatMap(_:)`` operation, which constructs this type. + public struct FlatMap: Parser + where NewParser.Input == Upstream.Input { + public let upstream: Upstream + public let transform: (Upstream.Output) -> NewParser + + @inlinable + public init(upstream: Upstream, transform: @escaping (Upstream.Output) -> NewParser) { + self.upstream = upstream + self.transform = transform + } + + @inlinable + public func parse(_ input: inout Upstream.Input) rethrows -> NewParser.Output { + let original = input + do { + return try self.transform(self.upstream.parse(&input)).parse(&input) + } catch let ParsingError.failed(reason, context) { + throw ParsingError.failed( + reason, + .init( + originalInput: original, + remainingInput: input, + debugDescription: context.debugDescription, + underlyingError: ParsingError.failed(reason, context) + ) + ) + } + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/FromSubstring.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/FromSubstring.swift new file mode 100644 index 00000000..0101fb10 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/FromSubstring.swift @@ -0,0 +1,72 @@ +/// A parser that transforms a parser on `Substring` into a parser on another view. +/// +/// The `FromSubstring` operator allows you to mix and match representation levels of strings +/// so that you can maximize how much you parse on the faster, but more complex, lower level +/// representations and then switch to slower, but safer, higher level representations for +/// when you need that power. +/// +/// For example, to parse "café" as a collection of UTF8 code units you must be careful to parse +/// both representations of "é": +/// +/// ```swift +/// OneOf { +/// "caf\u{00E9}".utf8 // LATIN SMALL LETTER E WITH ACUTE +/// "cafe\u{0301}".utf8 // E + COMBINING ACUTE ACCENT +/// } +/// ``` +/// +/// Alternatively, you can parse the ASCII characters of "caf" as UTF8 code units, and then +/// switch to the higher level substring representation to parse "é" so that you don't have +/// to worry about UTF8 normalization: +/// +/// ```swift +/// Parse { +/// "caf".utf8 +/// +/// // Parse any recognized "é" character, including: +/// // - LATIN SMALL LETTER E WITH ACUTE ("\u{00E9}") +/// // - E + COMBINING ACUTE ACCENT ("e\u{0301}") +/// FromSubstring { "é" } +/// } +/// ``` +public struct FromSubstring: Parser +where SubstringParser.Input == Substring { + public let substringParser: SubstringParser + public let toSubstring: (Input) -> Substring + public let fromSubstring: (Substring) -> Input + + @inlinable + public func parse(_ input: inout Input) rethrows -> SubstringParser.Output { + var substring = self.toSubstring(input) + defer { input = self.fromSubstring(substring) } + return try self.substringParser.parse(&substring) + } +} + +extension FromSubstring where Input == ArraySlice { + @inlinable + public init(@ParserBuilder _ build: () -> SubstringParser) { + self.substringParser = build() + self.toSubstring = { Substring(decoding: $0, as: UTF8.self) } + self.fromSubstring = { ArraySlice($0.utf8) } + } +} + +extension FromSubstring where Input == Substring.UnicodeScalarView { + @_disfavoredOverload + @inlinable + public init(@ParserBuilder _ build: () -> SubstringParser) { + self.substringParser = build() + self.toSubstring = Substring.init + self.fromSubstring = \.unicodeScalars + } +} + +extension FromSubstring where Input == Substring.UTF8View { + @inlinable + public init(@ParserBuilder _ build: () -> SubstringParser) { + self.substringParser = build() + self.toSubstring = Substring.init + self.fromSubstring = \.utf8 + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/FromUTF8View.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/FromUTF8View.swift new file mode 100644 index 00000000..e5d05ed5 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/FromUTF8View.swift @@ -0,0 +1,32 @@ +public struct FromUTF8View: Parser +where UTF8Parser.Input == Substring.UTF8View { + public let utf8Parser: UTF8Parser + public let toUTF8: (Input) -> Substring.UTF8View + public let fromUTF8: (Substring.UTF8View) -> Input + + @inlinable + public func parse(_ input: inout Input) rethrows -> UTF8Parser.Output { + var utf8 = self.toUTF8(input) + defer { input = self.fromUTF8(utf8) } + return try self.utf8Parser.parse(&utf8) + } +} + +extension FromUTF8View where Input == Substring { + @inlinable + public init(@ParserBuilder _ build: () -> UTF8Parser) { + self.utf8Parser = build() + self.toUTF8 = \.utf8 + self.fromUTF8 = Substring.init + } +} + +extension FromUTF8View where Input == Substring.UnicodeScalarView { + @_disfavoredOverload + @inlinable + public init(@ParserBuilder _ build: () -> UTF8Parser) { + self.utf8Parser = build() + self.toUTF8 = { Substring($0).utf8 } + self.fromUTF8 = { Substring($0).unicodeScalars } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/FromUnicodeScalarView.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/FromUnicodeScalarView.swift new file mode 100644 index 00000000..4662d25a --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/FromUnicodeScalarView.swift @@ -0,0 +1,42 @@ +/// A parser that transforms a parser on `Substring.UnicodeScalarView` into a parser on another +/// view. +public struct FromUnicodeScalarView: Parser +where UnicodeScalarsParser.Input == Substring.UnicodeScalarView { + public let unicodeScalarsParser: UnicodeScalarsParser + public let toUnicodeScalars: (Input) -> Substring.UnicodeScalarView + public let fromUnicodeScalars: (Substring.UnicodeScalarView) -> Input + + @inlinable + public func parse(_ input: inout Input) rethrows -> UnicodeScalarsParser.Output { + var unicodeScalars = self.toUnicodeScalars(input) + defer { input = self.fromUnicodeScalars(unicodeScalars) } + return try self.unicodeScalarsParser.parse(&unicodeScalars) + } +} + +extension FromUnicodeScalarView where Input == ArraySlice { + @inlinable + public init(@ParserBuilder _ build: () -> UnicodeScalarsParser) { + self.unicodeScalarsParser = build() + self.toUnicodeScalars = { Substring(decoding: $0, as: UTF8.self).unicodeScalars } + self.fromUnicodeScalars = { ArraySlice(Substring($0).utf8) } + } +} + +extension FromUnicodeScalarView where Input == Substring { + @inlinable + public init(@ParserBuilder _ build: () -> UnicodeScalarsParser) { + self.unicodeScalarsParser = build() + self.toUnicodeScalars = \.unicodeScalars + self.fromUnicodeScalars = Substring.init + } +} + +extension FromUnicodeScalarView where Input == Substring.UTF8View { + @inlinable + public init(@ParserBuilder _ build: () -> UnicodeScalarsParser) { + self.unicodeScalarsParser = build() + self.toUnicodeScalars = { Substring($0).unicodeScalars } + self.fromUnicodeScalars = { Substring($0).utf8 } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Int.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Int.swift new file mode 100644 index 00000000..c59f33d4 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Int.swift @@ -0,0 +1,194 @@ +extension FixedWidthInteger { + /// A parser that consumes an integer (with an optional leading `+` or `-` sign) from the + /// beginning of a collection of UTF-8 code units. + /// + /// ```swift + /// var input = "123 Hello world"[...] + /// try Int.parser().parse(&input) // 123 + /// input // " Hello world") + /// ``` + /// + /// This parser fails when it does not find an integer at the beginning of the collection: + /// + /// ```swift + /// var input = "+Hello"[...] + /// let number = try Int.parser().parse(&input) + /// // error: unexpected input + /// // --> input:1:2 + /// // 1 | +Hello + /// // | ^ expected integer + /// ``` + /// + /// And it fails when the digits extracted from the beginning of the collection would cause the + /// integer type to overflow: + /// + /// ```swift + /// var input = "9999999999999999999 Hello"[...] + /// let number = try Int.parser().parse(&input) + /// // error: failed to process "Int" + /// // --> input:1:1-19 + /// // 1 | 9999999999999999999 Hello + /// // | ^^^^^^^^^^^^^^^^^^^ overflowed 9223372036854775807 + /// ``` + /// + /// - Parameters: + /// - inputType: The collection type of UTF-8 code units to parse. + /// - isSigned: If the parser will attempt to parse a leading `+` or `-` sign. + /// - radix: The radix, or base, to use for converting text to an integer value. `radix` must be + /// in the range `2...36`. + /// - Returns: A parser that consumes an integer from the beginning of a collection of UTF-8 code + /// units. + @inlinable + public static func parser( + of inputType: Input.Type = Input.self, + isSigned: Bool = true, + radix: Int = 10 + ) -> Parsers.IntParser { + .init(isSigned: isSigned, radix: radix) + } + + /// A parser that consumes an integer (with an optional leading `+` or `-` sign) from the + /// beginning of a substring's UTF-8 view. + /// + /// This overload is provided to allow the `Input` generic to be inferred when it is + /// `Substring.UTF8View`. + /// + /// - Parameters: + /// - inputType: The `Substring.UTF8View` type. This parameter is included to mirror the + /// interface that parses any collection of UTF-8 code units. + /// - isSigned: If the parser will attempt to parse a leading `+` or `-` sign. + /// - radix: The radix, or base, to use for converting text to an integer value. `radix` must be + /// in the range `2...36`. + /// - Returns: A parser that consumes an integer from the beginning of a substring's UTF-8 view. + @_disfavoredOverload + @inlinable + public static func parser( + of inputType: Substring.UTF8View.Type = Substring.UTF8View.self, + isSigned: Bool = true, + radix: Int = 10 + ) -> Parsers.IntParser { + .init(isSigned: isSigned, radix: radix) + } + + /// A parser that consumes an integer (with an optional leading `+` or `-` sign) from the + /// beginning of a substring. + /// + /// This overload is provided to allow the `Input` generic to be inferred when it is `Substring`. + /// + /// - Parameters: + /// - inputType: The `Substring` type. This parameter is included to mirror the interface that + /// parses any collection of UTF-8 code units. + /// - isSigned: If the parser will attempt to parse a leading `+` or `-` sign. + /// - radix: The radix, or base, to use for converting text to an integer value. `radix` must be + /// in the range `2...36`. + /// - Returns: A parser that consumes an integer from the beginning of a substring. + @_disfavoredOverload + @inlinable + public static func parser( + of inputType: Substring.Type = Substring.self, + isSigned: Bool = true, + radix: Int = 10 + ) -> FromUTF8View> { + .init { Parsers.IntParser(isSigned: isSigned, radix: radix) } + } +} + +extension Parsers { + /// A parser that consumes an integer (with an optional leading `+` or `-` sign) from the + /// beginning of a collection of UTF8 code units. + /// + /// You will not typically need to interact with this type directly. Instead you will usually use + /// the static `parser()` method on the `FixedWidthInteger` of your choice, e.g. `Int.parser()`, + /// `UInt8.parser()`, etc., all of which construct this type. + public struct IntParser: Parser + where + Input.SubSequence == Input, + Input.Element == UTF8.CodeUnit + { + /// If the parser will attempt to parse a leading `+` or `-` sign. + public let isSigned: Bool + + /// The radix, or base, to use for converting text to an integer value. + public let radix: Int + + @inlinable + public init(isSigned: Bool = true, radix: Int = 10) { + precondition((2...36).contains(radix), "Radix not in range 2...36") + self.isSigned = isSigned + self.radix = radix + } + + @inlinable + public func parse(_ input: inout Input) throws -> Output { + @inline(__always) + func digit(for n: UTF8.CodeUnit) -> Output? { + let output: Output + switch n { + case .init(ascii: "0") ... .init(ascii: "9"): + output = Output(n - .init(ascii: "0")) + case .init(ascii: "A") ... .init(ascii: "Z"): + output = Output(n - .init(ascii: "A") + 10) + case .init(ascii: "a") ... .init(ascii: "z"): + output = Output(n - .init(ascii: "a") + 10) + default: + return nil + } + return output < self.radix ? output : nil + } + var length = 0 + var iterator = input.makeIterator() + guard let first = iterator.next() else { + throw ParsingError.expectedInput("integer", at: input) + } + let isPositive: Bool + let parsedSign: Bool + var overflow = false + var output: Output + switch (self.isSigned, first) { + case (true, .init(ascii: "-")): + parsedSign = true + isPositive = false + output = 0 + case (true, .init(ascii: "+")): + parsedSign = true + isPositive = true + output = 0 + case let (_, n): + guard let n = digit(for: n) else { + throw ParsingError.expectedInput("integer", at: input) + } + parsedSign = false + isPositive = true + output = n + } + let original = input + input.removeFirst() + length += 1 + let radix = Output(self.radix) + while let next = iterator.next(), let n = digit(for: next) { + input.removeFirst() + (output, overflow) = output.multipliedReportingOverflow(by: radix) + func overflowError() -> Error { + ParsingError.failed( + summary: "failed to process \"\(Output.self)\"", + label: "overflowed \(Output.max)", + from: original, + to: input + ) + } + guard !overflow else { throw overflowError() } + (output, overflow) = + isPositive + ? output.addingReportingOverflow(n) + : output.subtractingReportingOverflow(n) + guard !overflow else { throw overflowError() } + length += 1 + } + guard length > (parsedSign ? 1 : 0) + else { + throw ParsingError.expectedInput("integer", at: input) + } + return output + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Lazy.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Lazy.swift new file mode 100644 index 00000000..331f7bd8 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Lazy.swift @@ -0,0 +1,27 @@ +/// A parser that waits for a call to its ``parse(_:)`` method before running the given closure to +/// create a parser for the given input. +public final class Lazy: Parser { + @usableFromInline + internal var lazyParser: LazyParser? + + public let createParser: () -> LazyParser + + @inlinable + public init(@ParserBuilder createParser: @escaping () -> LazyParser) { + self.createParser = createParser + } + + @inlinable + public func parse(_ input: inout LazyParser.Input) rethrows -> LazyParser.Output { + guard let parser = self.lazyParser else { + let parser = self.createParser() + self.lazyParser = parser + return try parser.parse(&input) + } + return try parser.parse(&input) + } +} + +extension Parsers { + public typealias Lazy = Parsing.Lazy // NB: Convenience type alias for discovery +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Literal.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Literal.swift new file mode 100644 index 00000000..311ce062 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Literal.swift @@ -0,0 +1,39 @@ +extension Array: Parser where Element: Equatable { + @inlinable + public func parse(_ input: inout ArraySlice) throws { + guard input.starts(with: self) else { + throw ParsingError.expectedInput(self.debugDescription, at: input) + } + input.removeFirst(self.count) + } +} + +extension String: Parser { + @inlinable + public func parse(_ input: inout Substring) throws { + guard input.starts(with: self) else { + throw ParsingError.expectedInput(self.debugDescription, at: input) + } + input.removeFirst(self.count) + } +} + +extension String.UnicodeScalarView: Parser { + @inlinable + public func parse(_ input: inout Substring.UnicodeScalarView) throws { + guard input.starts(with: self) else { + throw ParsingError.expectedInput(String(self).debugDescription, at: input) + } + input.removeFirst(self.count) + } +} + +extension String.UTF8View: Parser { + @inlinable + public func parse(_ input: inout Substring.UTF8View) throws { + guard input.starts(with: self) else { + throw ParsingError.expectedInput(String(self).debugDescription, at: input) + } + input.removeFirst(self.count) + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Many.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Many.swift new file mode 100644 index 00000000..b20d246e --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Many.swift @@ -0,0 +1,353 @@ +import Foundation + +/// A parser that attempts to run another parser as many times as specified, accumulating the result +/// of the outputs. +/// +/// For example, given a comma-separated string of numbers, one could parse out an array of +/// integers: +/// +/// ```swift +/// let intsParser = Many { +/// Int.parser() +/// } separator: { +/// "," +/// } +/// +/// var input = "1,2,3"[...] +/// try intsParser.parse(&input) // [1, 2, 3] +/// input // "" +/// ``` +/// +/// In addition to an element and separator parser, a "terminator" parser that is run after the element +/// parser has run as many times as possible. This can be useful for proving that the `Many` parser has +/// consumed everything you expect: +/// +/// ```swift +/// let intsParser = Many { +/// Int.parser() +/// } separator: { +/// "," +/// } terminator: { +/// "---" +/// } +/// +/// var input = "1,2,3---"[...] +/// try intsParser.parse(&input) // [1, 2, 3] +/// input // "" +/// ``` +/// +/// The outputs of the element parser do not need to be accumulated in an array. More generally one can +/// specify a closure that customizes how outputs are accumulated, much like `Sequence.reduce(into:_)`. We +/// could, for example, sum the numbers as we parse them instead of accumulating each value in an array: +/// +/// ```swift +/// let sumParser = Many(into: 0, +=) { +/// Int.parser() +/// } separator: { +/// "," +/// } +/// +/// var input = "1,2,3"[...] +/// try sumParser.parse(&input) // 6 +/// input // "" +/// ``` +/// +/// This parser fails if the terminator parser fails. For example, if we required our comma-separated +/// integer parser to be terminated by `"---"`, but we parsed a list that contained a non-integer we would +/// get an error: +/// +/// ```swift +/// let intsParser = Many { +/// Int.parser() +/// } separator: { +/// "," +/// } terminator: { +/// "---" +/// } +/// var input = "1,2,Hello---"[...] +/// try intsParser.parse(&input) +/// // error: unexpected input +/// // --> input:1:5 +/// // 1 | 1,2,Hello--- +/// // | ^ expected integer +/// ``` +public struct Many: Parser +where + Separator.Input == Element.Input, + Terminator.Input == Element.Input +{ + public let element: Element + public let initialResult: Result + public let maximum: Int + public let minimum: Int + public let separator: Separator + public let terminator: Terminator + public let updateAccumulatingResult: (inout Result, Element.Output) throws -> Void + + /// Initializes a parser that attempts to run the given parser at least and at most the given + /// number of times, accumulating the outputs into a result with a given closure. + /// + /// - Parameters: + /// - initialResult: The value to use as the initial accumulating value. + /// - minimum: The minimum number of times to run this parser and consider parsing to be + /// successful. + /// - maximum: The maximum number of times to run this parser before returning the output. + /// - updateAccumulatingResult: A closure that updates the accumulating result with each output + /// of the element parser. + /// - element: A parser to run multiple times to accumulate into a result. + /// - separator: A parser that consumes input between each parsed output. + @inlinable + public init( + into initialResult: Result, + atLeast minimum: Int = 0, + atMost maximum: Int = .max, + _ updateAccumulatingResult: @escaping (inout Result, Element.Output) throws -> Void, + @ParserBuilder element: () -> Element, + @ParserBuilder separator: () -> Separator, + @ParserBuilder terminator: () -> Terminator + ) { + self.element = element() + self.initialResult = initialResult + self.maximum = maximum + self.minimum = minimum + self.separator = separator() + self.terminator = terminator() + self.updateAccumulatingResult = updateAccumulatingResult + } + + @inlinable + public func parse(_ input: inout Element.Input) throws -> Result { + var rest = input + var previous = input + var result = self.initialResult + var count = 0 + var loopError: Error? + while count < self.maximum { + let output: Element.Output + do { + output = try self.element.parse(&input) + } catch { + loopError = error + break + } + defer { previous = input } + count += 1 + do { + try self.updateAccumulatingResult(&result, output) + } catch { + throw ParsingError.failed( + "", + .init( + originalInput: previous, remainingInput: input, debugDescription: "\(error)", + underlyingError: error) + ) + } + rest = input + do { + _ = try self.separator.parse(&input) + } catch { + loopError = error + break + } + if memcmp(&input, &previous, MemoryLayout.size) == 0 { + throw ParsingError.failed( + "expected input to be consumed", + .init(remainingInput: input, debugDescription: "infinite loop", underlyingError: nil) + ) + } + } + input = rest + do { + _ = try self.terminator.parse(&input) + } catch { + if let loopError = loopError { + throw ParsingError.manyFailed([loopError, error], at: input) + } else { + throw error + } + } + guard count >= self.minimum else { + let atLeast = self.minimum - count + throw ParsingError.expectedInput( + """ + \(atLeast) \(count == 0 ? "" : "more ")value\(atLeast == 1 ? "" : "s") of \ + "\(Element.Output.self)" + """, + at: rest + ) + } + return result + } +} + +extension Many where Separator == Always, Terminator == Always { + /// Initializes a parser that attempts to run the given parser at least and at most the given + /// number of times, accumulating the outputs into a result with a given closure. + /// + /// - Parameters: + /// - initialResult: The value to use as the initial accumulating value. + /// - minimum: The minimum number of times to run this parser and consider parsing to be + /// successful. + /// - maximum: The maximum number of times to run this parser before returning the output. + /// - updateAccumulatingResult: A closure that updates the accumulating result with each output + /// of the element parser. + /// - element: A parser to run multiple times to accumulate into a result. + @inlinable + public init( + into initialResult: Result, + atLeast minimum: Int = 0, + atMost maximum: Int = .max, + _ updateAccumulatingResult: @escaping (inout Result, Element.Output) throws -> Void, + @ParserBuilder element: () -> Element + ) { + self.element = element() + self.initialResult = initialResult + self.maximum = maximum + self.minimum = minimum + self.separator = .init(()) + self.terminator = .init(()) + self.updateAccumulatingResult = updateAccumulatingResult + } +} + +extension Many where Separator == Always { + @inlinable + public init( + into initialResult: Result, + atLeast minimum: Int = 0, + atMost maximum: Int = .max, + _ updateAccumulatingResult: @escaping (inout Result, Element.Output) throws -> Void, + @ParserBuilder element: () -> Element, + @ParserBuilder terminator: () -> Terminator + ) { + self.element = element() + self.initialResult = initialResult + self.maximum = maximum + self.minimum = minimum + self.separator = .init(()) + self.terminator = terminator() + self.updateAccumulatingResult = updateAccumulatingResult + } +} + +extension Many where Terminator == Always { + @inlinable + public init( + into initialResult: Result, + atLeast minimum: Int = 0, + atMost maximum: Int = .max, + _ updateAccumulatingResult: @escaping (inout Result, Element.Output) throws -> Void, + @ParserBuilder element: () -> Element, + @ParserBuilder separator: () -> Separator + ) { + self.element = element() + self.initialResult = initialResult + self.maximum = maximum + self.minimum = minimum + self.separator = separator() + self.terminator = .init(()) + self.updateAccumulatingResult = updateAccumulatingResult + } +} + +extension Many where Result == [Element.Output] { + /// Initializes a parser that attempts to run the given parser at least and at most the given + /// number of times, accumulating the outputs in an array. + /// + /// - Parameters: + /// - minimum: The minimum number of times to run this parser and consider parsing to be + /// successful. + /// - maximum: The maximum number of times to run this parser before returning the output. + /// - element: A parser to run multiple times to accumulate into an array. + /// - separator: A parser that consumes input between each parsed output. + @inlinable + public init( + atLeast minimum: Int = 0, + atMost maximum: Int = .max, + @ParserBuilder element: () -> Element, + @ParserBuilder separator: () -> Separator, + @ParserBuilder terminator: () -> Terminator + ) { + self.init( + into: [], + atLeast: minimum, + atMost: maximum, + { $0.append($1) }, + element: element, + separator: separator, + terminator: terminator + ) + } +} + +extension Many +where + Result == [Element.Output], + Separator == Always, + Terminator == Always +{ + /// Initializes a parser that attempts to run the given parser at least and at most the given + /// number of times, accumulating the outputs in an array. + /// + /// - Parameters: + /// - minimum: The minimum number of times to run this parser and consider parsing to be + /// successful. + /// - maximum: The maximum number of times to run this parser before returning the output. + /// - element: A parser to run multiple times to accumulate into an array. + @inlinable + public init( + atLeast minimum: Int = 0, + atMost maximum: Int = .max, + @ParserBuilder element: () -> Element + ) { + self.init( + into: [], + atLeast: minimum, + atMost: maximum, + { $0.append($1) }, + element: element + ) + } +} + +extension Many where Result == [Element.Output], Separator == Always { + @inlinable + public init( + atLeast minimum: Int = 0, + atMost maximum: Int = .max, + @ParserBuilder element: () -> Element, + @ParserBuilder terminator: () -> Terminator + ) { + self.init( + into: [], + atLeast: minimum, + atMost: maximum, + { $0.append($1) }, + element: element, + terminator: terminator + ) + } +} + +extension Many where Result == [Element.Output], Terminator == Always { + @inlinable + public init( + atLeast minimum: Int = 0, + atMost maximum: Int = .max, + @ParserBuilder element: () -> Element, + @ParserBuilder separator: () -> Separator + ) { + self.init( + into: [], + atLeast: minimum, + atMost: maximum, + { $0.append($1) }, + element: element, + separator: separator + ) + } +} + +extension Parsers { + public typealias Many = Parsing.Many // NB: Convenience type alias for discovery +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Map.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Map.swift new file mode 100644 index 00000000..11e136d0 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Map.swift @@ -0,0 +1,42 @@ +extension Parser { + /// Returns a parser that transforms the output of this parser with a given closure. + /// + /// This method is similar to `Sequence.map`, `Optional.map`, and `Result.map` in the Swift + /// standard library, as well as `Publisher.map` in the Combine framework. + /// + /// - Parameter transform: A closure that transforms values of this parser's output. + /// - Returns: A parser of transformed outputs. + @_disfavoredOverload + @inlinable + public func map( + _ transform: @escaping (Output) -> NewOutput + ) -> Parsers.Map { + .init(upstream: self, transform: transform) + } +} + +extension Parsers { + /// A parser that transforms the output of another parser with a given closure. + /// + /// You will not typically need to interact with this type directly. Instead you will usually use + /// the ``Parser/map(_:)`` operation, which constructs this type. + public struct Map: Parser { + /// The parser from which this parser receives output. + public let upstream: Upstream + + /// The closure that transforms output from the upstream parser. + public let transform: (Upstream.Output) -> NewOutput + + @inlinable + public init(upstream: Upstream, transform: @escaping (Upstream.Output) -> NewOutput) { + self.upstream = upstream + self.transform = transform + } + + @inlinable + @inline(__always) + public func parse(_ input: inout Upstream.Input) rethrows -> NewOutput { + self.transform(try self.upstream.parse(&input)) + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Newline.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Newline.swift new file mode 100644 index 00000000..547aca00 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Newline.swift @@ -0,0 +1,70 @@ +/// A parser that consumes a single newline from the beginning of the input. +/// +/// - Note: This parser only consumes a line feed (`"\n"`) or a carriage returns with line feed +/// (`"\r\n"`). If you need richer support that covers all unicode newline characters, use a +/// ``Prefix`` parser that operates on the `Substring` level with a predicate that consumes a +/// single newline: +/// +/// ```swift +/// Prefix(1) { $0.isNewline } +/// ``` +/// It will consume both line feeds (`"\n"`) and carriage returns with line feeds (`"\r\n"`). +public struct Newline: Parser +where + Input.SubSequence == Input, + Bytes.SubSequence == Bytes, + Bytes.Element == UTF8.CodeUnit +{ + @usableFromInline + let toBytes: (Input) -> Bytes + + @usableFromInline + let fromBytes: (Bytes) -> Input + + @inlinable + public func parse(_ input: inout Input) throws { + var bytes = self.toBytes(input) + if bytes.first == .init(ascii: "\n") { + bytes.removeFirst() + } else if bytes.first == .init(ascii: "\r"), bytes.dropFirst().first == .init(ascii: "\n") { + bytes.removeFirst(2) + } else { + throw ParsingError.expectedInput(#""\n" or "\r\n""#, at: input) + } + input = self.fromBytes(bytes) + } +} + +// NB: Swift 5.5.2 on Linux and Windows fails to build with a simpler `Bytes == Input` constraint +extension Newline where Bytes == Input.SubSequence, Bytes.SubSequence == Input { + @inlinable + public init() { + self.toBytes = { $0 } + self.fromBytes = { $0 } + } +} + +extension Newline where Input == Substring, Bytes == Substring.UTF8View { + @_disfavoredOverload + @inlinable + public init() { + self.toBytes = { $0.utf8 } + self.fromBytes = Substring.init + } +} + +extension Newline where Input == Substring.UTF8View, Bytes == Input { + @_disfavoredOverload + @inlinable + public init() { self.init() } +} + +extension Newline where Input == ArraySlice, Bytes == Input { + @_disfavoredOverload + @inlinable + public init() { self.init() } +} + +extension Parsers { + public typealias Newline = Parsing.Newline // NB: Convenience type alias for discovery +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Not.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Not.swift new file mode 100644 index 00000000..b98dd1a6 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Not.swift @@ -0,0 +1,37 @@ +/// A parser that succeeds if the given parser fails, and does not consume any input. +/// +/// For example: +/// +/// ```swift +/// let uncommentedLine = Parse { +/// Not { "//" } +/// PrefixUpTo("\n") +/// } +/// ``` +/// +/// This will check the input doesn't start with `"//"`, and if it doesn't, it will return the whole +/// input up to the first newline. +public struct Not: Parser { + public let upstream: Upstream + + /// Creates a parser that succeeds if the given parser fails, and does not consume any input. + /// + /// - Parameter build: A parser that causes this parser to fail if it succeeds, or succeed if it + /// fails. + @inlinable + public init(@ParserBuilder _ build: () -> Upstream) { + self.upstream = build() + } + + @inlinable + public func parse(_ input: inout Upstream.Input) throws { + let original = input + do { + _ = try self.upstream.parse(&input) + } catch { + input = original + return + } + throw ParsingError.expectedInput("not to be processed", from: original, to: input) + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/OneOf.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/OneOf.swift new file mode 100644 index 00000000..e25f631d --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/OneOf.swift @@ -0,0 +1,166 @@ +/// A parser that attempts to run a number of parsers till one succeeds. +/// +/// Use this parser to list out a number of parsers in a ``OneOfBuilder`` result builder block. +/// +/// The following example uses ``OneOf`` to parse an enum value. To do so, it spells out a list of +/// parsers to `OneOf`, one for each case: +/// +/// ```swift +/// enum Currency { case eur, gbp, usd } +/// +/// let currency = OneOf { +/// "€".map { Currency.eur } +/// "£".map { Currency.gbp } +/// "$".map { Currency.usd } +/// } +/// ``` +/// +/// This parser fails if every parser inside fails: +/// +/// ```swift +/// var input = "London, Hello!"[...] +/// try OneOf { "New York"; "Berlin" }.parse(&input) +/// +/// // error: multiple failures occurred +/// // +/// // error: unexpected input +/// // --> input:1:1 +/// // 1 | London, Hello! +/// // | ^ expected "New York" +/// // | ^ expected "Berlin" +/// ``` +/// +/// If you are parsing input that should coalesce into some default, avoid using a final ``Always`` +/// parser, and instead opt for a trailing ``replaceError(with:)``, which returns a parser that +/// cannot fail: +/// +/// ```swift +/// enum Currency { case eur, gbp, usd, unknown } +/// +/// let currency = OneOf { +/// "€".map { Currency.eur } +/// "£".map { Currency.gbp } +/// "$".map { Currency.usd } +/// } +/// .replaceError(with: Currency.unknown) +/// +/// currency.parse("$") // Currency.usd +/// currency.parse("฿") // Currency.unknown +/// ``` +/// +/// ## Specificity +/// +/// The order of the parsers in the above ``OneOf`` does not matter because each of "€", "£" and "$" +/// are mutually exclusive, i.e. at most one will succeed on any given input. +/// +/// However, that is not always true, and when the parsers are not mutually exclusive (i.e. multiple +/// can succeed on a given input) you must order them from most specific to least specific. That is, +/// the first parser should succeed on the fewest number of inputs and the last parser should +/// succeed on the most number of inputs. +/// +/// For example, suppose you wanted to parse a simple CSV format into a doubly-nested array of +/// strings, and the fields in the CSV are allowed to contain commas themselves as long as they +/// are quoted: +/// +/// ```swift +/// let input = #""" +/// lastName,firstName +/// McBlob,Blob +/// "McBlob, Esq.",Blob Jr. +/// "McBlob, MD",Blob Sr. +/// """# +/// ``` +/// +/// Here we have a list of last and first names separated by a comma, and some of the last names are +/// quoted because they contain commas. +/// +/// In order to safely parse this we must first try parsing a field as a quoted field, and then only +/// if that fails we can parse a plain field that takes everything up until the next comma or +/// newline: +/// +/// ```swift +/// let quotedField = Parse { +/// "\"" +/// Prefix { $0 != "\"" } +/// "\"" +/// } +/// let plainField = Prefix { $0 != "," && $0 != "\n" } +/// +/// let field = OneOf { +/// quotedField +/// plainField +/// } +/// ``` +/// +/// Then we can parse many fields to form an array of fields making up a line, and then parse many +/// lines to make up a full, doubly-nested array for the CSV: +/// +/// ```swift +/// let line = Many { field } separator: { "," } +/// let csv = Many { line } separator: { "\n" } +/// ``` +/// +/// Running this parser on the input shows that it properly isolates each field of the CSV, even +/// fields that are quoted and contain a comma: +/// +/// ```swift +/// XCTAssertEqual( +/// try csv.parse(input), +/// [ +/// ["lastName", "firstName"], +/// ["McBlob", "Blob"], +/// ["McBlob, Esq.", "Blob Jr."], +/// ["McBlob, MD", "Blob Sr."], +/// ] +/// ) +/// // ✅ +/// ``` +/// +/// The reason this parser works is because the `quotedField` and `plainField` parsers are listed in +/// a very specific order inside the `OneOf`: +/// +/// ```swift +/// let field = OneOf { +/// quotedField +/// plainField +/// } +/// ``` +/// +/// The `quotedField` parser is a _more_ specific parser in that it will succeed on fewer inputs +/// than the `plainField` parser does. For example: +/// +/// ```swift +/// try quotedField.parse("Blob Jr.") // ❌ +/// try plainField.parse("Blob Jr.") // ✅ +/// ``` +/// +/// Whereas the `plainField` parser will happily succeed on anything the `quotedField` parser will +/// succeed on: +/// +/// ```swift +/// try quotedField.parse("\"Blob, Esq\"") // ✅ +/// try plainField.parse("\"Blob, Esq\"") // ✅ +/// ``` +/// +/// For this reason the `quotedField` parser must be listed first so that it can try its logic +/// first, which succeeds less frequently, before then trying the `plainField` parser, which +/// succeeds more often. +/// +/// ## Backtracking +/// +/// The ``OneOf`` parser is the primary tool for introducing backtracking into your parsers, +/// which means to undo the consumption of a parser when it fails. For more information, see the +/// article . +public struct OneOf: Parser where Parsers: Parser { + public let parsers: Parsers + + @inlinable + public init(@OneOfBuilder _ build: () -> Parsers) { + self.parsers = build() + } + + @inlinable + public func parse(_ input: inout Parsers.Input) rethrows -> Parsers.Output { + try self.parsers.parse(&input) + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/OneOfMany.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/OneOfMany.swift new file mode 100644 index 00000000..1f7a072b --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/OneOfMany.swift @@ -0,0 +1,47 @@ +extension Parsers { + /// A parser that attempts to run a number of parsers till one succeeds. + /// + /// You will not typically need to interact with this type directly. Instead you will usually loop + /// over each parser in a builder block: + /// + /// ```swift + /// enum Role: String, CaseIterable { + /// case admin + /// case guest + /// case member + /// } + /// + /// let roleParser = OneOf { + /// for role in Role.allCases { + /// status.rawValue.map { role } + /// } + /// } + /// ``` + public struct OneOfMany: Parser { + public let parsers: [Parsers] + + @inlinable + public init(_ parsers: [Parsers]) { + self.parsers = parsers + } + + @inlinable + @inline(__always) + public func parse(_ input: inout Parsers.Input) throws -> Parsers.Output { + let original = input + var count = self.parsers.count + var errors: [Error] = [] + errors.reserveCapacity(count) + for parser in self.parsers { + do { + return try parser.parse(&input) + } catch { + count -= 1 + if count > 0 { input = original } + errors.append(error) + } + } + throw ParsingError.manyFailed(errors, at: original) + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Optional.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Optional.swift new file mode 100644 index 00000000..4a57102a --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Optional.swift @@ -0,0 +1,40 @@ +extension Optional: Parser where Wrapped: Parser { + public func parse(_ input: inout Wrapped.Input) rethrows -> Wrapped.Output? { + guard let self = self + else { return nil } + + return try self.parse(&input) + } +} + +extension Parsers { + /// A parser that attempts to run a given void parser, succeeding with void. + /// + /// You will not typically need to interact with this type directly. Instead you will usually use + /// `if` statements in parser builder blocks: + /// + /// ```swift + /// Parse { + /// "Hello" + /// if useComma { + /// "," + /// } + /// " " + /// Rest() + /// } + /// ``` + public struct OptionalVoid: Parser where Wrapped.Output == Void { + let wrapped: Wrapped? + + public init(wrapped: Wrapped?) { + self.wrapped = wrapped + } + + public func parse(_ input: inout Wrapped.Input) rethrows { + guard let wrapped = self.wrapped + else { return } + + try wrapped.parse(&input) + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Optionally.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Optionally.swift new file mode 100644 index 00000000..5cc3b13e --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Optionally.swift @@ -0,0 +1,53 @@ +/// A parser that runs the given parser and succeeds with `nil` if it fails. +/// +/// Use this parser when you are parsing into an output data model that contains `nil`. +/// +/// When the wrapped parser fails ``Optionally`` will backtrack any consumption of the input so +/// that later parsers can attempt to parser the input: +/// +/// ```swift +/// let parser = Parse { +/// "Hello," +/// Optionally { " "; Bool.parser() } +/// " world!" +/// } +/// +/// try parser.parse("Hello, world!") // nil 1️⃣ +/// try parser.parse("Hello, true world!") // true +/// ``` +/// +/// If ``Optionally`` did not backtrack then 1️⃣ would fail because it would consume a space, +/// causing the `" world!"` parser to fail since there is no longer any space to consume. +/// Read the article to learn more about how backtracking works. +/// +/// If you are optionally parsing input that should coalesce into some default, you can skip the +/// optionality and instead use ``replaceError(with:)`` with a default: +/// +/// ```swift +/// Optionally { Int.parser() } +/// .map { $0 ?? 0 } +/// +/// // vs. +/// +/// Int.parser() +/// .replaceError(with: 0) +/// ``` +public struct Optionally: Parser { + public let wrapped: Wrapped + + @inlinable + public init(@ParserBuilder _ build: () -> Wrapped) { + self.wrapped = build() + } + + @inlinable + public func parse(_ input: inout Wrapped.Input) -> Wrapped.Output? { + let original = input + do { + return try self.wrapped.parse(&input) + } catch { + input = original + return nil + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Parse.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Parse.swift new file mode 100644 index 00000000..a5d8836e --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Parse.swift @@ -0,0 +1,51 @@ +/// A parser that attempts to run a number of parsers to accumulate their outputs. +/// +/// A general entry point into ``ParserBuilder`` syntax, which can be used to build complex parsers +/// from simpler ones. +/// +/// ```swift +/// let point = Parse { +/// "(" +/// Int.parser() +/// "," +/// Int.parser() +/// ")" +/// } +/// +/// try point.parse("(2,-4)") // (2, -4) +/// +/// try point.parse("(42,blob)") +/// // error: unexpected input +/// // --> input:1:5 +/// // 1 | (42,blob) +/// // | ^ expected integer +/// ``` +public struct Parse: Parser { + public let parsers: Parsers + + @inlinable + public init(@ParserBuilder _ build: () -> Parsers) { + self.parsers = build() + } + + @inlinable + public init( + _ transform: @escaping (Upstream.Output) -> NewOutput, + @ParserBuilder with build: () -> Upstream + ) where Parsers == Parsing.Parsers.Map { + self.parsers = build().map(transform) + } + + @inlinable + public init( + _ output: NewOutput, + @ParserBuilder with build: () -> Upstream + ) where Upstream.Output == Void, Parsers == Parsing.Parsers.Map { + self.parsers = build().map { output } + } + + @inlinable + public func parse(_ input: inout Parsers.Input) rethrows -> Parsers.Output { + try self.parsers.parse(&input) + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Parsers.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Parsers.swift new file mode 100644 index 00000000..bde92706 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Parsers.swift @@ -0,0 +1,6 @@ +/// A namespace for types that serve as parsers. +/// +/// The various operators defined as extensions on ``Parser`` implement their functionality as +/// classes or structures that extend this enumeration. For example, the ``Parser/map(_:)`` operator +/// returns a ``Map`` parser. +public enum Parsers {} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Peek.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Peek.swift new file mode 100644 index 00000000..2d3be5ed --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Peek.swift @@ -0,0 +1,35 @@ +/// A parser that runs the given parser, but does not consume any input. +/// +/// It lets the upstream parser "peek" into the input without consuming it. +/// +/// For example, identifiers (variables, functions, etc.) in Swift allow the first character to be a +/// letter or underscore, but not a digit, but subsequent characters can be digits. _E.g._, `foo123` +/// is a valid identifier, but `123foo` is not. We can create an identifier parser by using `Peek` +/// to first check if the input starts with a letter or underscore, and if it does, return the +/// remainder of the input up to the first character that is not a letter, a digit, or an +/// underscore. +/// +/// ```swift +/// let identifier = Parse { +/// Peek { Prefix(1) { $0.isLetter || $0 == "_" } } +/// Prefix { $0.isNumber || $0.isLetter || $0 == "_" } +/// } +/// ``` +public struct Peek: Parser { + public let upstream: Upstream + + /// Construct a parser that runs the given parser, but does not consume any input. + /// + /// - Parameter build: A parser this parser wants to inspect. + @inlinable + public init(@ParserBuilder _ build: () -> Upstream) { + self.upstream = build() + } + + @inlinable + public func parse(_ input: inout Upstream.Input) rethrows { + let original = input + _ = try self.upstream.parse(&input) + input = original + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Pipe.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Pipe.swift new file mode 100644 index 00000000..6c0b0107 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Pipe.swift @@ -0,0 +1,76 @@ +extension Parser { + /// Returns a parser that runs this parser, pipes its output into the given parser, and returns + /// the output of the given parser. + /// + /// For example, we can try to parse an integer of exactly 4 digits by piping the output of + /// ``Prefix`` into an `Int.parser()`: + /// + /// ```swift + /// let year = Prefix(4).pipe { Int.parser() } + /// + /// try year.parse("2022") // 2022 + /// try year.parse("0123") // 123 + /// ``` + /// + /// This parser fails if either the upstream or downstream parser fails. For example: + /// + /// ```swift + /// try year.parse("123") + /// // error: unexpected input + /// // --> input:1:4 + /// // 1 | 123 + /// // | ^ expected 1 more element + /// + /// try year.parse("fail!") + /// // error: unexpected input + /// // --> input:1:1-4 + /// // 1 | fail! + /// // | ^^^^ pipe: expected integer + /// ``` + /// + /// - Parameter downstream: A parser that parses the output of this parser. + /// - Returns: A parser that pipes this parser's output into another parser. @inlinable + public func pipe( + @ParserBuilder _ build: () -> Downstream + ) -> Parsers.Pipe { + .init(upstream: self, downstream: build()) + } +} + +extension Parsers { + /// A parser that runs this parser, pipes its output into the given parser, and returns the output + /// of the given parser. + /// + /// You will not typically need to interact with this type directly. Instead you will usually use + /// the ``Parser/pipe(_:)`` operation, which constructs this type. + public struct Pipe: Parser + where Upstream.Output == Downstream.Input { + public let upstream: Upstream + public let downstream: Downstream + + @inlinable + public init(upstream: Upstream, downstream: Downstream) { + self.upstream = upstream + self.downstream = downstream + } + + @inlinable + public func parse(_ input: inout Upstream.Input) rethrows -> Downstream.Output { + let original = input + var downstreamInput = try self.upstream.parse(&input) + do { + return try self.downstream.parse(&downstreamInput) + } catch let ParsingError.failed(reason, context) { + throw ParsingError.failed( + "pipe: \(reason)", + .init( + originalInput: original, + remainingInput: input, + debugDescription: context.debugDescription, + underlyingError: ParsingError.failed(reason, context) + ) + ) + } + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Prefix.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Prefix.swift new file mode 100644 index 00000000..e63beb74 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Prefix.swift @@ -0,0 +1,286 @@ +/// A parser that consumes a subsequence from the beginning of its input. +/// +/// This parser is named after `Sequence.prefix`, which it uses under the hood to consume a number +/// of elements and return them as output. It can be configured with minimum and maximum lengths, +/// as well as a predicate. +/// +/// For example, to parse as many numbers off the beginning of a substring: +/// +/// ```swift +/// var input = "123 hello world"[...] +/// try Prefix { $0.isNumber }.parse(&input) // "123" +/// input // " Hello world" +/// ``` +/// +/// If you wanted this parser to fail if _no_ numbers are consumed, you could introduce a minimum +/// length. +/// +/// ```swift +/// var input = "No numbers here"[...] +/// try Prefix(1...) { $0.isNumber }.parse(&input) +/// // error: unexpected input +/// // --> input:1:1 +/// // 1 | No numbers here +/// // | ^ expected 1 element satisfying predicate +/// ``` +/// +/// If a predicate is not provided, the parser will simply consume the prefix within the minimum and +/// maximum lengths provided: +/// +/// ```swift +/// var input = "Lorem ipsum dolor"[...] +/// try Prefix(2).parse(&input) // "Lo" +/// input // "rem ipsum dolor" +/// ``` +public struct Prefix: Parser where Input.SubSequence == Input { + public let maxLength: Int? + public let minLength: Int + public let predicate: ((Input.Element) -> Bool)? + + /// Initializes a parser that consumes a subsequence from the beginning of its input. + /// + /// - Parameters: + /// - minLength: The minimum number of elements to consume for parsing to be considered + /// successful. + /// - maxLength: The maximum number of elements to consume before the parser will return its + /// output. + /// - predicate: A closure that takes an element of the input sequence as its argument and + /// returns `true` if the element should be included or `false` if it should be excluded. Once + /// the predicate returns `false` it will not be called again. + @inlinable + public init( + minLength: Int = 0, + maxLength: Int? = nil, + while predicate: @escaping (Input.Element) -> Bool + ) { + self.minLength = minLength + self.maxLength = maxLength + self.predicate = predicate + } + + /// Initializes a parser that consumes a subsequence from the beginning of its input. + /// + /// ```swift + /// try Prefix(2...4, while: \.isNumber).parse("123456") // "1234" + /// try Prefix(2...4, while: \.isNumber).parse("123") // "123" + /// + /// try Prefix(2...4, while: \.isNumber).parse("1") + /// // error: unexpected input + /// // --> input:1:1 + /// // 1 | 1 + /// // | ^ expected 1 more element satisfying predicate + /// ``` + /// + /// - Parameters: + /// - length: A closed range that provides a minimum number and maximum of elements to consume + /// for parsing to be considered successful. + /// - predicate: An optional closure that takes an element of the input sequence as its argument + /// and returns `true` if the element should be included or `false` if it should be excluded. + /// Once the predicate returns `false` it will not be called again. + @inlinable + public init( + _ length: ClosedRange, + while predicate: ((Input.Element) -> Bool)? = nil + ) { + self.minLength = length.lowerBound + self.maxLength = length.upperBound + self.predicate = predicate + } + + /// Initializes a parser that consumes a subsequence from the beginning of its input. + /// + /// ```swift + /// try Prefix(4, while: \.isNumber).parse("123456") // "1234" + /// + /// try Prefix(4, while: \.isNumber).parse("123") + /// // error: unexpected input + /// // --> input:1:1 + /// // 1 | 123 + /// // | ^ expected 1 more element satisfying predicate + /// ``` + /// + /// - Parameters: + /// - length: An exact number of elements to consume for parsing to be considered successful. + /// - predicate: An optional closure that takes an element of the input sequence as its argument + /// and returns `true` if the element should be included or `false` if it should be excluded. + /// Once the predicate returns `false` it will not be called again. + @inlinable + public init( + _ length: Int, + while predicate: ((Input.Element) -> Bool)? = nil + ) { + self.minLength = length + self.maxLength = length + self.predicate = predicate + } + + /// Initializes a parser that consumes a subsequence from the beginning of its input. + /// + /// ``` swift + /// try Prefix(4..., while: \.isNumber).parse("123456") // "123456" + /// + /// try Prefix(4..., while: \.isNumber).parse("123") + /// // error: unexpected input + /// // --> input:1:1 + /// // 1 | 123 + /// // | ^ expected 1 more element satisfying predicate + /// ``` + /// + /// - Parameters: + /// - length: A partial range that provides a minimum number of elements to consume for + /// parsing to be considered successful. + /// - predicate: An optional closure that takes an element of the input sequence as its argument + /// and returns `true` if the element should be included or `false` if it should be excluded. + /// Once the predicate returns `false` it will not be called again. + @inlinable + public init( + _ length: PartialRangeFrom, + while predicate: ((Input.Element) -> Bool)? = nil + ) { + self.minLength = length.lowerBound + self.maxLength = nil + self.predicate = predicate + } + + /// Initializes a parser that consumes a subsequence from the beginning of its input. + /// + /// ```swift + /// try Prefix(...4, while: \.isNumber).parse("123456") // "1234" + /// try Prefix(...4, while: \.isNumber).parse("123") // "123" + /// ``` + /// + /// - Parameters: + /// - length: A partial, inclusive range that provides a maximum number of elements to consume. + /// - predicate: An optional closure that takes an element of the input sequence as its argument + /// and returns `true` if the element should be included or `false` if it should be excluded. + /// Once the predicate returns `false` it will not be called again. + @inlinable + public init( + _ length: PartialRangeThrough, + while predicate: ((Input.Element) -> Bool)? = nil + ) { + self.minLength = 0 + self.maxLength = length.upperBound + self.predicate = predicate + } + + @inlinable + @inline(__always) + public func parse(_ input: inout Input) throws -> Input { + var prefix = maxLength.map(input.prefix) ?? input + prefix = predicate.map { prefix.prefix(while: $0) } ?? prefix + let count = prefix.count + input.removeFirst(count) + guard count >= self.minLength else { + let atLeast = self.minLength - count + throw ParsingError.expectedInput( + """ + \(self.minLength - count) \(count == 0 ? "" : "more ")element\(atLeast == 1 ? "" : "s")\ + \(predicate == nil ? "" : " satisfying predicate") + """, + at: input + ) + } + return prefix + } +} + +extension Prefix where Input == Substring { + @_disfavoredOverload + @inlinable + public init( + minLength: Int = 0, + maxLength: Int? = nil, + while predicate: @escaping (Input.Element) -> Bool + ) { + self.init(minLength: minLength, maxLength: maxLength, while: predicate) + } + + @_disfavoredOverload + @inlinable + public init( + _ length: ClosedRange, + while predicate: ((Input.Element) -> Bool)? = nil + ) { + self.init(length, while: predicate) + } + + @_disfavoredOverload + @inlinable + public init( + _ length: Int, + while predicate: ((Input.Element) -> Bool)? = nil + ) { + self.init(length, while: predicate) + } + + @_disfavoredOverload + @inlinable + public init( + _ length: PartialRangeFrom, + while predicate: ((Input.Element) -> Bool)? = nil + ) { + self.init(length, while: predicate) + } + + @_disfavoredOverload + @inlinable + public init( + _ length: PartialRangeThrough, + while predicate: ((Input.Element) -> Bool)? = nil + ) { + self.init(length, while: predicate) + } +} + +extension Prefix where Input == Substring.UTF8View { + @_disfavoredOverload + @inlinable + public init( + minLength: Int = 0, + maxLength: Int? = nil, + while predicate: @escaping (Input.Element) -> Bool + ) { + self.init(minLength: minLength, maxLength: maxLength, while: predicate) + } + + @_disfavoredOverload + @inlinable + public init( + _ length: ClosedRange, + while predicate: ((Input.Element) -> Bool)? = nil + ) { + self.init(length, while: predicate) + } + + @_disfavoredOverload + @inlinable + public init( + _ length: Int, + while predicate: ((Input.Element) -> Bool)? = nil + ) { + self.init(length, while: predicate) + } + + @_disfavoredOverload + @inlinable + public init( + _ length: PartialRangeFrom, + while predicate: ((Input.Element) -> Bool)? = nil + ) { + self.init(length, while: predicate) + } + + @_disfavoredOverload + @inlinable + public init( + _ length: PartialRangeThrough, + while predicate: ((Input.Element) -> Bool)? = nil + ) { + self.init(length, while: predicate) + } +} + +extension Parsers { + public typealias Prefix = Parsing.Prefix // NB: Convenience type alias for discovery +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/PrefixThrough.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/PrefixThrough.swift new file mode 100644 index 00000000..4dacef06 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/PrefixThrough.swift @@ -0,0 +1,73 @@ +/// A parser that consumes a subsequence from the beginning of its input through a given sequence of +/// elements. +/// +/// This parser is named after `Sequence.prefix(through:)`, and uses similar logic under the hood to +/// consume and return input through a particular subsequence. +/// +/// ```swift +/// let lineParser = PrefixThrough("\n") +/// +/// var input = "Hello\nworld\n"[...] +/// try line.parse(&input) // "Hello\n" +/// input // "world\n" +/// ``` +public struct PrefixThrough: Parser where Input.SubSequence == Input { + public let possibleMatch: Input + public let areEquivalent: (Input.Element, Input.Element) -> Bool + + @inlinable + public init( + _ possibleMatch: Input, + by areEquivalent: @escaping (Input.Element, Input.Element) -> Bool + ) { + self.possibleMatch = possibleMatch + self.areEquivalent = areEquivalent + } + + @inlinable + @inline(__always) + public func parse(_ input: inout Input) throws -> Input { + guard let first = self.possibleMatch.first else { return self.possibleMatch } + let count = self.possibleMatch.count + let original = input + while let index = input.firstIndex(where: { self.areEquivalent(first, $0) }) { + input = input[index...] + if input.count >= count, + zip(input[index...], self.possibleMatch).allSatisfy(self.areEquivalent) + { + let index = input.index(index, offsetBy: count) + input = input[index...] + return original[..: Parser where Input.SubSequence == Input { + public let possibleMatch: Input + public let areEquivalent: (Input.Element, Input.Element) -> Bool + + @inlinable + public init( + _ possibleMatch: Input, + by areEquivalent: @escaping (Input.Element, Input.Element) -> Bool + ) { + self.possibleMatch = possibleMatch + self.areEquivalent = areEquivalent + } + + @inlinable + @inline(__always) + public func parse(_ input: inout Input) throws -> Input { + guard let first = self.possibleMatch.first else { return self.possibleMatch } + let count = self.possibleMatch.count + let original = input + while let index = input.firstIndex(where: { self.areEquivalent(first, $0) }) { + input = input[index...] + if input.count >= count, + zip(input[index...], self.possibleMatch).allSatisfy(self.areEquivalent) + { + return original[..( + _ keyPath: WritableKeyPath + ) -> Parsers.Pullback { + .init(downstream: self, keyPath: keyPath) + } +} + +extension Parsers { + /// Transforms the `Input` of a downstream parser. + /// + /// You will not typically need to interact with this type directly. Instead you will usually use + /// the ``Parser/pullback(_:)`` operator, which constructs this type. + public struct Pullback: Parser { + public let downstream: Downstream + public let keyPath: WritableKeyPath + + @inlinable + public init(downstream: Downstream, keyPath: WritableKeyPath) { + self.downstream = downstream + self.keyPath = keyPath + } + + @inlinable + public func parse(_ input: inout Input) rethrows -> Downstream.Output { + try self.downstream.parse(&input[keyPath: self.keyPath]) + } + + @inlinable + public func pullback( + _ keyPath: WritableKeyPath + ) -> Pullback { + .init(downstream: self.downstream, keyPath: keyPath.appending(path: self.keyPath)) + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/ReplaceError.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/ReplaceError.swift new file mode 100644 index 00000000..fcb8c09b --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/ReplaceError.swift @@ -0,0 +1,70 @@ +extension Parser { + /// A parser that replaces its error with a provided output. + /// + /// Useful for providing a default output for a parser. + /// + /// For example, we could create a parser that parses a plus or minus sign and maps the result to + /// a positive or negative multiplier respectively, or else defaults to a positive multiplier: + /// + /// ```swift + /// let sign = OneOf { + /// "+".map { 1 } + /// "-".map { -1 } + /// } + /// .replaceError(with: 1) + /// ``` + /// + /// Notably this parser is non-throwing: + /// + /// ```swift + /// var input = "-123"[...] + /// + /// // No `try` required: + /// sign.parse(&input) // -1 + /// input // "123" + /// + /// // Simply returns the default when parsing fails: + /// sign.parse(&input) // 1 + /// ``` + /// + /// This means it can be used to turn throwing parsers into non-throwing ones, which is important + /// for building up complex parsers that cannot fail. + /// + /// - Parameter output: An output to return should the upstream parser fail. + /// - Returns: A parser that never fails. + @inlinable + public func replaceError(with output: Output) -> Parsers.ReplaceError { + .init(output: output, upstream: self) + } +} + +extension Parsers { + /// A parser that replaces its error with a provided output. + /// + /// You will not typically need to interact with this type directly. Instead you will usually use + /// the ``Parser/replaceError(with:)`` operation, which constructs this type. + public struct ReplaceError: Parser { + @usableFromInline + let output: Upstream.Output + + @usableFromInline + let upstream: Upstream + + @usableFromInline + init(output: Upstream.Output, upstream: Upstream) { + self.output = output + self.upstream = upstream + } + + @inlinable + public func parse(_ input: inout Upstream.Input) -> Upstream.Output { + let original = input + do { + return try self.upstream.parse(&input) + } catch { + input = original + return self.output + } + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Rest.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Rest.swift new file mode 100644 index 00000000..03db1aa9 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Rest.swift @@ -0,0 +1,52 @@ +/// A parser that consumes everything to the end of the collection and returns this subsequence as +/// its output. +/// +/// ```swift +/// var input = "Hello"[...] +/// Rest().parse(&input) // "Hello" +/// input // "" +/// ``` +/// +/// This parser fails if there is no input to consume: +/// +/// ```swift +/// try Rest().parse("") +/// +/// /// error: unexpected input +/// /// --> input:1:1 +/// /// 1 | +/// /// | ^ expected a non-empty input +/// ``` +/// +/// If you want to allow for the possibility of an empty remaining input you can use the +/// ``Optionally`` parser to parse an optional output value, or the ``replaceError(with:)`` method +/// to coalesce the error into a default output value. +public struct Rest: Parser where Input.SubSequence == Input { + @inlinable + public init() {} + + @inlinable + public func parse(_ input: inout Input) throws -> Input { + guard !input.isEmpty + else { throw ParsingError.expectedInput("a non-empty input", at: input) } + let output = input + input.removeFirst(input.count) + return output + } +} + +extension Rest where Input == Substring { + @_disfavoredOverload + @inlinable + public init() {} +} + +extension Rest where Input == Substring.UTF8View { + @_disfavoredOverload + @inlinable + public init() {} +} + +extension Parsers { + public typealias Rest = Parsing.Rest // NB: Convenience type alias for discovery +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Skip.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Skip.swift new file mode 100644 index 00000000..a0872947 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Skip.swift @@ -0,0 +1,19 @@ +/// A parser that discards the output of another parser. +public struct Skip: Parser { + /// The parser from which this parser receives output. + public let parsers: Parsers + + @inlinable + public init(@ParserBuilder _ build: () -> Parsers) { + self.parsers = build() + } + + @inlinable + public func parse(_ input: inout Parsers.Input) rethrows { + _ = try self.parsers.parse(&input) + } +} + +extension Parsers { + public typealias Skip = Parsing.Skip // NB: Convenience type alias for discovery +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/StartsWith.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/StartsWith.swift new file mode 100644 index 00000000..b805fe2f --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/StartsWith.swift @@ -0,0 +1,92 @@ +/// A parser that parses a sequence of elements from its input. +/// +/// This parser is named after `Sequence.starts(with:)`, and tests that the input it is parsing +/// starts with a given subsequence by calling this method under the hood. +/// +/// If `true`, it consumes this prefix and returns `Void`: +/// +/// ```swift +/// var input = "Hello, Blob!"[...] +/// +/// StartsWith("Hello, ").parse(&input) // () +/// input // "Blob!" +/// ``` +/// +/// If `false`, it fails and leaves input intact: +/// +/// ```swift +/// var input = "Goodnight, Blob!"[...] +/// try StartsWith("Hello, ").parse(&input) +/// // error: unexpected input +/// // --> input:1:1 +/// // 1 | Goodnight, Blob! +/// // | ^ expected "Hello, " +/// ``` +/// +/// This parser returns `Void` and _not_ the sequence of elements it consumes because the sequence +/// is already known at the time the parser is created (it is the value quite literally passed to +/// ``StartsWith/init(_:)``). +/// +/// In many circumstances you can omit the `StartsWith` parser entirely and just use the collection +/// as the parser. For example: +/// +/// ```swift +/// var input = "Hello, Blob!"[...] +/// +/// try "Hello, ".parse(&input) // () +/// input // "Blob!" +/// ``` +public struct StartsWith: Parser where Input.SubSequence == Input { + public let count: Int + public let possiblePrefix: AnyCollection + public let startsWith: (Input) -> Bool + + /// Initializes a parser that successfully returns `Void` when the initial elements of its input + /// are equivalent to the elements in another sequence, using the given predicate as the + /// equivalence test. + /// + /// - Parameters: + /// - possiblePrefix: A sequence to compare to the start of an input sequence. + /// - areEquivalent: A predicate that returns `true` if its two arguments are equivalent; + /// otherwise, `false`. + @inlinable + public init( + _ possiblePrefix: PossiblePrefix, + by areEquivalent: @escaping (Input.Element, Input.Element) -> Bool + ) + where + PossiblePrefix: Collection, + PossiblePrefix.Element == Input.Element + { + self.count = possiblePrefix.count + self.possiblePrefix = AnyCollection(possiblePrefix) + self.startsWith = { input in input.starts(with: possiblePrefix, by: areEquivalent) } + } + + @inlinable + public func parse(_ input: inout Input) throws { + guard self.startsWith(input) else { + throw ParsingError.expectedInput(formatValue(self.possiblePrefix), at: input) + } + input.removeFirst(self.count) + } +} + +extension Parsers.StartsWith where Input.Element: Equatable { + /// Initializes a parser that successfully returns `Void` when the initial elements of its input + /// are equivalent to the elements in another sequence. + /// + /// - Parameter possiblePrefix: A sequence to compare to the start of an input sequence. + @inlinable + public init(_ possiblePrefix: PossiblePrefix) + where + PossiblePrefix: Collection, + PossiblePrefix.Element == Input.Element + { + self.init(possiblePrefix, by: ==) + } +} + +extension Parsers { + public typealias StartsWith = Parsing.StartsWith // NB: Convenience type alias for discovery +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Stream.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Stream.swift new file mode 100644 index 00000000..5c0e062c --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Stream.swift @@ -0,0 +1,55 @@ +/// A parser that can parse streams of input. +/// +/// For example, the following parser can parse an integer followed by a newline from a collection +/// of UTF8 bytes: +/// +/// ```swift +/// Parse { +/// Int.parser(of: ArraySlice.self) +/// StartsWith("\n".utf8) +/// } +/// ``` +/// +/// This parser can be transformed into one that processes an incoming stream of UTF8 bytes: +/// +/// ```swift +/// Stream { +/// Parse { +/// Int.parser(of: ArraySlice.self) +/// StartsWith("\n".utf8) +/// } +/// } +/// ``` +/// +/// And then it can be used on a stream, such as values coming from standard in: +/// +/// ```swift +/// var stdin = AnyIterator { +/// readLine().map { ArraySlice($0.utf8) } +/// } +/// +/// try newlineSeparatedIntegers.parse(&stdin) +/// ``` +public struct Stream: Parser where Parsers.Input: RangeReplaceableCollection { + public let parsers: Parsers + + @inlinable + public init(@ParserBuilder build: () -> Parsers) { + self.parsers = build() + } + + @inlinable + public func parse(_ input: inout AnyIterator) rethrows -> [Parsers.Output] { + var buffer = Parsers.Input() + var outputs: Output = [] + while let chunk = input.next() { + buffer.append(contentsOf: chunk) + outputs.append(try self.parsers.parse(&buffer)) + } + return outputs + } +} + +extension Parsers { + public typealias Stream = Parsing.Stream // NB: Convenience type alias for discovery +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/UUID.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/UUID.swift new file mode 100644 index 00000000..bebe3193 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/UUID.swift @@ -0,0 +1,137 @@ +import Foundation + +extension UUID { + /// A parser that consumes a hexadecimal UUID from the beginning of a collection of UTF-8 code + /// units. + /// + /// ```swift + /// var input = "deadbeef-dead-beef-dead-beefdeadbeef,"[...] + /// try UUID.parser().parse(&input) // DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF + /// input // "," + /// ``` + /// + /// - Parameter inputType: The collection type of UTF-8 code units to parse. + /// - Returns: A parser that consumes a hexadecimal UUID from the beginning of a collection of + /// UTF-8 code units. + @inlinable + public static func parser( + of inputType: Input.Type = Input.self + ) -> Parsers.UUIDParser { + .init() + } + + /// A parser that consumes a hexadecimal UUID from the beginning of a substring's UTF-8 view. + /// + /// This overload is provided to allow the `Input` generic to be inferred when it is + /// `Substring.UTF8View`. + /// + /// - Parameter inputType: The `Substring` type. This parameter is included to mirror the + /// interface that parses any collection of UTF-8 code units. + /// - Returns: A parser that consumes a hexadecimal UUID from the beginning of a substring's UTF-8 + /// view. + @_disfavoredOverload + @inlinable + public static func parser( + of inputType: Substring.UTF8View.Type = Substring.UTF8View.self + ) -> Parsers.UUIDParser { + .init() + } + + /// A parser that consumes a hexadecimal UUID from the beginning of a substring. + /// + /// This overload is provided to allow the `Input` generic to be inferred when it is `Substring`. + /// + /// - Parameter inputType: The `Substring` type. This parameter is included to mirror the + /// interface that parses any collection of UTF-8 code units. + /// - Returns: A parser that consumes a hexadecimal UUID from the beginning of a substring. + @_disfavoredOverload + @inlinable + public static func parser( + of inputType: Substring.Type = Substring.self + ) -> FromUTF8View> { + .init { Parsers.UUIDParser() } + } +} + +extension Parsers { + /// A parser that consumes a UUID from the beginning of a collection of UTF8 code units. + /// + /// You will not typically need to interact with this type directly. Instead you will usually use + /// `UUID.parser()`, which constructs this type. + public struct UUIDParser: Parser + where + Input.SubSequence == Input, + Input.Element == UTF8.CodeUnit + { + @inlinable + public init() {} + + @inlinable + public func parse(_ input: inout Input) throws -> UUID { + func parseHelp(_ bytes: C) throws -> UUID where C: Collection, C.Element == UTF8.CodeUnit { + var prefix = bytes.prefix(36) + guard prefix.count == 36 + else { throw ParsingError.expectedInput("UUID", at: input) } + + @inline(__always) + func digit(for n: UTF8.CodeUnit) throws -> UTF8.CodeUnit { + switch n { + case .init(ascii: "0") ... .init(ascii: "9"): + return UTF8.CodeUnit(n - .init(ascii: "0")) + case .init(ascii: "A") ... .init(ascii: "F"): + return UTF8.CodeUnit(n - .init(ascii: "A") + 10) + case .init(ascii: "a") ... .init(ascii: "f"): + return UTF8.CodeUnit(n - .init(ascii: "a") + 10) + default: + throw ParsingError.expectedInput("UUID", at: input) + } + } + + @inline(__always) + func nextByte() throws -> UInt8 { + try digit(for: prefix.removeFirst()) * 16 + digit(for: prefix.removeFirst()) + } + + @inline(__always) + func chompHyphen() throws { + guard prefix.removeFirst() == .init(ascii: "-") + else { throw ParsingError.expectedInput("UUID", at: input) } + } + + let _00 = try nextByte() + let _01 = try nextByte() + let _02 = try nextByte() + let _03 = try nextByte() + try chompHyphen() + let _04 = try nextByte() + let _05 = try nextByte() + try chompHyphen() + let _06 = try nextByte() + let _07 = try nextByte() + try chompHyphen() + let _08 = try nextByte() + let _09 = try nextByte() + try chompHyphen() + let _10 = try nextByte() + let _11 = try nextByte() + let _12 = try nextByte() + let _13 = try nextByte() + let _14 = try nextByte() + let _15 = try nextByte() + + input.removeFirst(36) + return UUID( + uuid: ( + _00, _01, _02, _03, + _04, _05, + _06, _07, + _08, _09, + _10, _11, _12, _13, _14, _15 + ) + ) + } + + return try input.withContiguousStorageIfAvailable(parseHelp) ?? parseHelp(input) + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Whitespace.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Whitespace.swift new file mode 100644 index 00000000..76a3d137 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/Parsers/Whitespace.swift @@ -0,0 +1,66 @@ +/// A parser that consumes all ASCII whitespace from the beginning of the input. +/// +/// - Note: This parser only consumes ASCII spaces (`" "`), newlines (`"\n"` and `"\r"`), and tabs +/// (`"\t"`). If you need richer support that covers all unicode whitespace, use a ``Prefix`` +/// parser that operates on the `Substring` level with a predicate that consumes whitespace: +/// +/// ```swift +/// Prefix { $0.isWhitespace } +/// ``` +public struct Whitespace: Parser +where + Input.SubSequence == Input, + Bytes.SubSequence == Bytes, + Bytes.Element == UTF8.CodeUnit +{ + @usableFromInline + let toBytes: (Input) -> Bytes + + @usableFromInline + let fromBytes: (Bytes) -> Input + + @inlinable + public func parse(_ input: inout Input) -> Input { + let output = self.toBytes(input).prefix(while: { (byte: UTF8.CodeUnit) in + byte == .init(ascii: " ") + || byte == .init(ascii: "\n") + || byte == .init(ascii: "\r") + || byte == .init(ascii: "\t") + }) + input.removeFirst(output.count) + return self.fromBytes(output) + } +} + +extension Whitespace { + @inlinable + public init() where Bytes == Input { + self.toBytes = { $0 } + self.fromBytes = { $0 } + } +} + +extension Whitespace where Input == Substring, Bytes == Substring.UTF8View { + @_disfavoredOverload + @inlinable + public init() { + self.toBytes = { $0.utf8 } + self.fromBytes = Substring.init + } +} + +extension Whitespace where Input == Substring.UTF8View, Bytes == Input { + @_disfavoredOverload + @inlinable + public init() { self.init() } +} + +extension Whitespace where Input == ArraySlice, Bytes == Input { + @_disfavoredOverload + @inlinable + public init() { self.init() } +} + +extension Parsers { + public typealias Whitespace = Parsing.Whitespace // NB: Convenience type alias for discovery +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/ParsingError.swift b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/ParsingError.swift new file mode 100644 index 00000000..25385775 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/Parsing/ParsingError.swift @@ -0,0 +1,481 @@ +import Foundation + +@usableFromInline +enum ParsingError: Error { + case failed(String, Context) + case manyFailed([Error], Context) + + @usableFromInline + static func expectedInput(_ description: String, at remainingInput: Any) -> Self { + .failed( + summary: "unexpected input", + label: "expected \(description)", + at: remainingInput + ) + } + + @usableFromInline + static func expectedInput( + _ description: String, + from originalInput: Any, + to remainingInput: Any + ) -> Self { + .failed( + summary: "unexpected input", + label: "expected \(description)", + from: originalInput, + to: remainingInput + ) + } + + @usableFromInline + static func failed(summary: String, label: String = "", at remainingInput: Any) -> Self { + .failed(label, .init(remainingInput: remainingInput, debugDescription: summary)) + } + + @usableFromInline + static func failed( + summary: String, label: String = "", from originalInput: Any, to remainingInput: Any + ) -> Self { + .failed( + label, + .init( + originalInput: originalInput, + remainingInput: remainingInput, + debugDescription: summary + ) + ) + } + + @usableFromInline + static func manyFailed(_ errors: [Error], at remainingInput: Any) -> Self { + .manyFailed(errors, .init(remainingInput: remainingInput, debugDescription: "")) + } + + @usableFromInline + static func wrap(_ error: Error, at remainingInput: Any) -> Self { + error as? ParsingError + ?? .failed( + "", + .init( + remainingInput: remainingInput, + debugDescription: formatError(error), + underlyingError: error + ) + ) + } + + @usableFromInline + func flattened() -> Self { + func flatten(_ depth: Int = 0) -> (Error) -> [(depth: Int, error: Error)] { + { error in + switch error { + case let ParsingError.manyFailed(errors, _): + return errors.flatMap(flatten(depth + 1)) + default: + return [(depth, error)] + } + } + } + + switch self { + case .failed: + return self + case let .manyFailed(errors, context): + return .manyFailed( + errors.flatMap(flatten()) + .sorted { + switch ($0.error, $1.error) { + case let (lhs as ParsingError, rhs as ParsingError): + return lhs.context > rhs.context + default: + return $0.depth > $1.depth + } + } + .map { $0.error }, + context + ) + } + } + + @usableFromInline + var context: Context { + switch self { + case let .failed(_, context), let .manyFailed(_, context): + return context + } + } + + @usableFromInline + struct Context { + @usableFromInline + var debugDescription: String + + @usableFromInline + var originalInput: Any + + @usableFromInline + var remainingInput: Any + + @usableFromInline + var underlyingError: Error? + + @usableFromInline + init( + originalInput: Any, + remainingInput: Any, + debugDescription: String, + underlyingError: Error? = nil + ) { + self.originalInput = originalInput + self.remainingInput = remainingInput + self.debugDescription = debugDescription + self.underlyingError = underlyingError + } + + @usableFromInline + init( + remainingInput: Any, + debugDescription: String, + underlyingError: Error? = nil + ) { + self.originalInput = remainingInput + self.remainingInput = remainingInput + self.debugDescription = debugDescription + self.underlyingError = underlyingError + } + } +} + +extension ParsingError: CustomDebugStringConvertible { + @usableFromInline + var debugDescription: String { + switch self.flattened() { + case let .failed(label, context): + return format(labels: [label], context: context) + + case let .manyFailed(errors, context) where errors.isEmpty: + return format(labels: [""], context: context) + + case let .manyFailed(errors, _): + return debugDescription(for: errors) + } + } + + fileprivate func debugDescription(for errors: [Error]) -> String { + func failed(_ error: Error) -> (String, Context)? { + guard + let error = error as? ParsingError, + case .failed(let label, let context) = error + else { return nil } + return (label, context) + } + + var count = 0 + var description = "" + + func append(_ s: String) { + count += 1 + if !description.isEmpty { + description.append("\n\n") + } + description.append(s) + } + + var errors = errors[...] + while let error = errors.popFirst() { + guard case .some((let firstLabel, let firstContext)) = failed(error) else { + append(formatError(error)) + continue + } + + var labels = [firstLabel] + while case .some((let label, let context)) = errors.first.flatMap({ failed($0) }), + firstContext.canGroup(with: context) + { + errors.removeFirst() + labels.append(label) + } + + append(format(labels: labels, context: firstContext)) + } + + if count != 1 { + description = """ + error: multiple failures occurred + + \(description) + """ + } + + return description + } +} + +extension ParsingError.Context { + fileprivate func canGroup(with other: Self) -> Bool { + func areSame(_ lhs: Any, _ rhs: Any) -> Bool { + switch (normalize(lhs), normalize(rhs)) { + case let (lhs as Substring, rhs as Substring): + return lhs.startIndex == rhs.startIndex && lhs.endIndex == rhs.endIndex + case let (lhs as Slice<[Substring]>, rhs as Slice<[Substring]>): + return zip(lhs, rhs).allSatisfy { l, r in + l.startIndex == r.startIndex && l.endIndex == r.endIndex + } + default: + return false + } + } + + return + (areSame(self.remainingInput, other.remainingInput) + && areSame(self.originalInput, other.originalInput) + && self.underlyingError == nil && other.underlyingError == nil) + } +} + +extension Array where Element == (label: String, context: ParsingError.Context) { + fileprivate func allSame(_ keyPath: KeyPath) -> Bool { + guard let first = self.first else { return true } + guard let firstValue = first.context[keyPath: keyPath] as? AnyHashable else { return false } + return self.dropFirst().allSatisfy { + guard let value = $0.context[keyPath: keyPath] as? AnyHashable else { return false } + return value == firstValue + } + } +} + +@usableFromInline +func format(labels: [String], context: ParsingError.Context) -> String { + func formatHelp(from originalInput: Input, to remainingInput: Input) -> String { + switch (normalize(originalInput), normalize(remainingInput)) { + case let (originalInput as Substring, remainingInput as Substring): + let substring = + originalInput.startIndex == remainingInput.startIndex + ? originalInput + : originalInput.base[originalInput.startIndex.., remainingInput as Slice<[Substring]>): + let slice = + originalInput.startIndex == remainingInput.startIndex + ? originalInput + : Slice( + base: originalInput.base, + bounds: originalInput.startIndex.. String { + switch error { + case let error as ParsingError: + return error.debugDescription + + case let error as LocalizedError: + return error.localizedDescription + + default: + return "\(error)" + } +} + +@usableFromInline +func formatValue( + _ input: Input +) -> String { + switch input { + case let input as String: + return input.debugDescription + + case let input as String.UnicodeScalarView: + return String(input).debugDescription + + case let input as String.UTF8View: + return String(input).debugDescription + + case let input as Substring: + return input.debugDescription + + case let input as Substring.UnicodeScalarView: + return Substring(input).debugDescription + + case let input as Substring.UTF8View: + return Substring(input).debugDescription + + default: + return "\(input)" + } +} + +private func formatError( + summary: String, + location: String, + prefix: String, + diagnostic: String +) -> String { + let indent = String(repeating: " ", count: prefix.count) + var diagnostic = + diagnostic + .split(separator: "\n", omittingEmptySubsequences: false) + .map { "\(indent) |\($0.isEmpty ? "" : " \($0)")" } + .joined(separator: "\n") + diagnostic.replaceSubrange(.. \(location) + \(diagnostic) + """ +} + +extension ParsingError.Context { + fileprivate static func > (lhs: Self, rhs: Self) -> Bool { + switch (normalize(lhs.remainingInput), normalize(rhs.remainingInput)) { + case let (lhsInput as Substring, rhsInput as Substring): + return lhsInput.endIndex > rhsInput.endIndex + + case let (lhsInput as Slice<[Substring]>, rhsInput as Slice<[Substring]>): + guard lhsInput.endIndex != rhsInput.endIndex else { + switch (lhs.underlyingError, rhs.underlyingError) { + case let (lhs as ParsingError, rhs as ParsingError): + return lhs.context > rhs.context + case (is ParsingError, _): + return true + default: + return false + } + } + return lhsInput.endIndex > rhsInput.endIndex + + default: + return false + } + } +} + +private func normalize(_ input: Any) -> Any { + // TODO: Use `_openExistential` for `C: Collection where C == C.SubSequence` for index juggling? + switch input { + case let input as Substring: + // NB: We want to ensure we are sliced at a character boundary and not a scalar boundary. + let startIndex = + input.startIndex == input.base.endIndex + ? input.startIndex + : input.base.indices.last { $0 <= input.startIndex } ?? input.startIndex + let endIndex = input.endIndex == input.base.endIndex ? startIndex : input.endIndex + + return input.base[startIndex..: + return input.endIndex == input.base.endIndex ? input[.. Double { + try InfixOperator(associativity: .left) { + OneOf { + "+".utf8.map { (+) } + "-".utf8.map { (-) } + } + } lowerThan: { + MultiplicationAndDivision() + } + .parse(&input) + } + } + + struct MultiplicationAndDivision: Parser { + func parse(_ input: inout Substring.UTF8View) throws -> Double { + try InfixOperator(associativity: .left) { + OneOf { + "*".utf8.map { (*) } + "/".utf8.map { (/) } + } + } lowerThan: { + Exponent() + } + .parse(&input) + } + } + + struct Exponent: Parser { + func parse(_ input: inout Substring.UTF8View) throws -> Double { + try InfixOperator(associativity: .left) { + "^".utf8.map { pow } + } lowerThan: { + Factor() + } + .parse(&input) + } + } + + struct Factor: Parser { + func parse(_ input: inout Substring.UTF8View) throws -> Double { + try OneOf { + Parse { + "(".utf8 + AdditionAndSubtraction() + ")".utf8 + } + + Double.parser() + } + .parse(&input) + } + } + + let input = "1+2*3/4-5^2" + var output: Double! + suite.benchmark("Parser") { + var input = input[...].utf8 + output = try AdditionAndSubtraction().parse(&input) + } tearDown: { + precondition(output == -22.5) + } +} + +public struct InfixOperator: Parser +where + Operator: Parser, + Operand: Parser, + Operator.Input == Operand.Input, + Operator.Output == (Operand.Output, Operand.Output) -> Operand.Output +{ + public let `associativity`: Associativity + public let operand: Operand + public let `operator`: Operator + + @inlinable + public init( + associativity: Associativity, + @ParserBuilder _ operator: () -> Operator, + @ParserBuilder lowerThan operand: () -> Operand // Should this be called `precedes operand:`? + ) { + self.associativity = `associativity` + self.operand = operand() + self.operator = `operator`() + } + + @inlinable + public func parse(_ input: inout Operand.Input) rethrows -> Operand.Output { + switch associativity { + case .left: + var lhs = try self.operand.parse(&input) + var rest = input + while true { + do { + let operation = try self.operator.parse(&input) + let rhs = try self.operand.parse(&input) + rest = input + lhs = operation(lhs, rhs) + } catch { + input = rest + return lhs + } + } + case .right: + var lhs: [(Operand.Output, Operator.Output)] = [] + while true { + let rhs = try self.operand.parse(&input) + do { + let operation = try self.operator.parse(&input) + lhs.append((rhs, operation)) + } catch { + return lhs.reversed().reduce(rhs) { rhs, pair in + let (lhs, operation) = pair + return operation(lhs, rhs) + } + } + } + } + } +} + +public enum Associativity { + case left + case right +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/BinaryData.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/BinaryData.swift new file mode 100644 index 00000000..20ba2128 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/BinaryData.swift @@ -0,0 +1,200 @@ +import Benchmark +import Foundation +import Parsing + +/// This benchmark demonstrates how to parse raw data, which is just a collection of `UInt8` values +/// (bytes). +/// +/// The data format we parse is the header for DNS packets, as specified +/// [here](https://tools.ietf.org/html/rfc1035#page-26). It consists of 12 bytes, and contains +/// information for 13 fields: +/// +/// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +/// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +/// | ID | +/// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +/// |QR| Opcode |AA|TC|RD|RA| Z | RCODE | +/// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +/// | QDCOUNT | +/// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +/// | ANCOUNT | +/// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +/// | NSCOUNT | +/// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +/// | ARCOUNT | +/// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +let binaryDataSuite = BenchmarkSuite(name: "BinaryData") { suite in + struct Word16Parser: Parser { + func parse(_ input: inout ArraySlice) throws -> UInt16 { + guard input.count >= 2 + else { + struct ParsingError: Error {} + throw ParsingError() + } + let output = UInt16(input[input.startIndex]) + UInt16(input[input.startIndex + 1]) << 8 + input.removeFirst(2) + return output + } + } + + let id = Word16Parser() + + let fields1 = First>().map { (byte: UInt8) in + ( + qr: Bit(rawValue: byte & 0b00000001)!, + opcode: Opcode(rawValue: (byte & 0b00011110) >> 1), + aa: Bit(rawValue: (byte & 0b00100000) >> 5)!, + tc: Bit(rawValue: (byte & 0b01000000) >> 6)!, + rd: Bit(rawValue: (byte & 0b10000000) >> 7)! + ) + } + + let fields2 = First>().map { byte in + ( + ra: Bit(rawValue: byte & 0b00000001)!, + z: UInt3(uint8: (byte & 0b00001110) >> 1)!, + rcode: Rcode(rawValue: (byte & 0b11110000) >> 4) + ) + } + + let counts = Parse { + (qd: $0, an: $1, ns: $2, ar: $3) + } with: { + Word16Parser() + Word16Parser() + Word16Parser() + Word16Parser() + } + + let header = Parse { id, fields1, fields2, counts in + DnsHeader( + id: id, + qr: fields1.qr, + opcode: fields1.opcode, + aa: fields1.aa, + tc: fields1.tc, + rd: fields1.rd, + ra: fields2.ra, + z: fields2.z, + rcode: fields2.rcode, + qdcount: counts.qd, + ancount: counts.an, + nscount: counts.ns, + arcount: counts.ar + ) + } with: { + id + fields1 + fields2 + counts + } + + let input: [UInt8] = [ + // header + 42, 142, + 0b10100011, 0b00110000, + 128, 0, + 100, 200, + 254, 1, + 128, 128, + + // rest of packet + 0xDE, 0xAD, 0xBE, 0xEF, + ] + var output: DnsHeader! + var rest: ArraySlice! + + suite.benchmark("Parser") { + var input = input[...] + output = try header.parse(&input) + rest = input + } tearDown: { + precondition( + output + == DnsHeader( + id: 36_394, + qr: .one, + opcode: .inverseQuery, + aa: .one, + tc: .zero, + rd: .one, + ra: .zero, + z: UInt3(uint8: 0)!, + rcode: .nameError, + qdcount: 128, + ancount: 51_300, + nscount: 510, + arcount: 32_896 + ) + ) + precondition(rest == [0xDE, 0xAD, 0xBE, 0xEF]) + } + + struct DnsHeader: Equatable { + let id: UInt16 + let qr: Bit + let opcode: Opcode + let aa: Bit + let tc: Bit + let rd: Bit + let ra: Bit + let z: UInt3 + let rcode: Rcode + let qdcount: UInt16 + let ancount: UInt16 + let nscount: UInt16 + let arcount: UInt16 + } + + enum Bit: Equatable { + case zero, one + + init?(rawValue: UInt8) { + if rawValue == 0 { + self = .zero + } else if rawValue == 1 { + self = .one + } else { + return nil + } + } + } + + struct UInt3: Equatable { + let bit0: Bit + let bit1: Bit + let bit2: Bit + + init?(uint8: UInt8) { + guard + uint8 & 0b11111000 == 0, + let bit0 = Bit(rawValue: uint8 & 0b001), + let bit1 = Bit(rawValue: uint8 & 0b010), + let bit2 = Bit(rawValue: uint8 & 0b100) + else { return nil } + + self.bit0 = bit0 + self.bit1 = bit1 + self.bit2 = bit2 + } + } + + struct Rcode: Equatable, RawRepresentable { + let rawValue: UInt8 + + static let noError = Self(rawValue: 0) + static let formatError = Self(rawValue: 1) + static let serverFailure = Self(rawValue: 2) + static let nameError = Self(rawValue: 3) + static let notImplemented = Self(rawValue: 4) + static let refused = Self(rawValue: 5) + } + + struct Opcode: Equatable, RawRepresentable { + let rawValue: UInt8 + + static let standardQuery = Self(rawValue: 0) + static let inverseQuery = Self(rawValue: 1) + static let status = Self(rawValue: 2) + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Bool.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Bool.swift new file mode 100644 index 00000000..2de9f2d2 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Bool.swift @@ -0,0 +1,50 @@ +import Benchmark +import Foundation +import Parsing + +/// This benchmark demonstrates how to parse a boolean from the front of an input and compares its +/// performance against `Bool.init`, which does not incrementally parse, and Foundation's `Scanner` +/// type. `Scanner` does not have a `scanBool` method, but we can emulate this functionality by calling +/// `scanString` twice and mapping each result to a boolean. +let boolSuite = BenchmarkSuite(name: "Bool") { suite in + var input = "true" + var expected = true + var output: Bool! + + suite.benchmark("Bool.init") { + output = Bool(input) + } tearDown: { + tearDown() + } + + suite.benchmark("Bool.parser") { + var input = input[...].utf8 + output = try Bool.parser().parse(&input) + } tearDown: { + tearDown() + } + + if #available(macOS 10.15, *) { + var scanner: Scanner! + suite.benchmark("Scanner.scanBool") { + output = scanner.scanBool() + } setUp: { + scanner = Scanner(string: input) + } tearDown: { + tearDown() + } + } + + func tearDown() { + precondition(output == expected) + (input, expected) = expected ? ("false", false) : ("true", true) + } +} + +extension Scanner { + @available(macOS 10.15, *) + func scanBool() -> Bool? { + self.scanString("true").map { _ in true } + ?? self.scanString("false").map { _ in false } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/CSV.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/CSV.swift new file mode 100644 index 00000000..f167afde --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/CSV.swift @@ -0,0 +1,106 @@ +import Benchmark +import Foundation +import Parsing + +/// This benchmark demonstrates how to define a simple CSV parser with quoted fields and measures its +/// performance against more a more ad hoc approach at the same level of abstraction. +let csvSuite = BenchmarkSuite(name: "CSV") { suite in + let plainField = Prefix { $0 != .init(ascii: ",") && $0 != .init(ascii: "\n") } + + let quotedField = Parse { + "\"".utf8 + Prefix { $0 != .init(ascii: "\"") } + "\"".utf8 + } + + let field = OneOf { + quotedField + plainField + } + .map { String(Substring($0)) } + + let line = Many { + field + } separator: { + ",".utf8 + } + + let csv = Many { + line + } separator: { + "\n".utf8 + } terminator: { + End() + } + + let expectedRowCount = 1_000 + let expectedColumnCount = 5 + var output: [[String]] = [] + + suite.benchmark("Parser") { + output = try csv.parse(csvInput) + } tearDown: { + precondition(output.count == expectedRowCount) + precondition(output.allSatisfy { $0.count == expectedColumnCount }) + } + + suite.benchmark("Ad hoc mutating methods") { + var input = csvInput[...].utf8 + output = input.parseCsv() + } tearDown: { + precondition(output.count == expectedRowCount) + precondition(output.allSatisfy { $0.count == expectedColumnCount }) + } +} + +extension Substring.UTF8View { + fileprivate mutating func parseCsv() -> [[String]] { + var results: [[String]] = [] + while !self.isEmpty { + results.append(self.parseLine()) + } + return results + } + + fileprivate mutating func parseLine() -> [String] { + var row: [String] = [] + while !self.isEmpty { + row.append(self.parseField()) + + if self.first == UTF8.CodeUnit(ascii: "\n") { + self.removeFirst() + break + } else if self.first == UTF8.CodeUnit(ascii: ",") { + self.removeFirst() + } + } + return row + } + + fileprivate mutating func parseField() -> String { + if self.first == UTF8.CodeUnit(ascii: "\"") { + return String(Substring(self.parseQuotedField())) + } else { + return String(Substring(self.parsePlainField())) + } + } + + fileprivate mutating func parseQuotedField() -> Substring.UTF8View { + self.removeFirst() + let field = self.remove(while: { $0 != UTF8.CodeUnit(ascii: "\"") }) + self.removeFirst() + return field + } + + fileprivate mutating func parsePlainField() -> Substring.UTF8View { + self.remove(while: { $0 != UTF8.CodeUnit(ascii: "\n") && $0 != UTF8.CodeUnit(ascii: ",") }) + } + + fileprivate mutating func remove( + while condition: (Substring.UTF8View.Element) -> Bool + ) -> Substring.UTF8View { + let prefix = self.prefix(while: condition) + self.removeFirst(prefix.count) + return prefix + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Color.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Color.swift new file mode 100644 index 00000000..bf674c05 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Color.swift @@ -0,0 +1,34 @@ +import Benchmark +import Parsing + +/// This benchmark demonstrates how to parse a hexadecimal color. +/// +/// Compare to the Rust [example using nom](https://github.com/Geal/nom#example). +let colorSuite = BenchmarkSuite(name: "Color") { suite in + struct Color: Equatable { + let red, green, blue: UInt8 + } + + let hexPrimary = Prefix(2).pipe { + UInt8.parser(isSigned: false, radix: 16) + End() + } + + let hexColor = Parse(Color.init(red:green:blue:)) { + "#".utf8 + hexPrimary + hexPrimary + hexPrimary + } + + let input = "#FF0000" + let expected = Color(red: 0xFF, green: 0x00, blue: 0x00) + var output: Color! + + suite.benchmark("Parser") { + var input = input[...].utf8 + output = try hexColor.parse(&input) + } tearDown: { + precondition(output == expected) + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Common/Benchmarking.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Common/Benchmarking.swift new file mode 100644 index 00000000..52dbdc1a --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Common/Benchmarking.swift @@ -0,0 +1,46 @@ +import Benchmark + +extension BenchmarkSuite { + func benchmark( + _ name: String, + run: @escaping () throws -> Void, + setUp: @escaping () -> Void = {}, + tearDown: @escaping () -> Void + ) { + self.register( + benchmark: Benchmarking(name: name, run: run, setUp: setUp, tearDown: tearDown) + ) + } +} + +struct Benchmarking: AnyBenchmark { + let name: String + let settings: [BenchmarkSetting] = [] + private let _run: () throws -> Void + private let _setUp: () -> Void + private let _tearDown: () -> Void + + init( + name: String, + run: @escaping () throws -> Void, + setUp: @escaping () -> Void = {}, + tearDown: @escaping () -> Void = {} + ) { + self.name = name + self._run = run + self._setUp = setUp + self._tearDown = tearDown + } + + func setUp() { + self._setUp() + } + + func run(_ state: inout BenchmarkState) throws { + try self._run() + } + + func tearDown() { + self._tearDown() + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Common/ParsingError.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Common/ParsingError.swift new file mode 100644 index 00000000..f51a7383 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Common/ParsingError.swift @@ -0,0 +1 @@ +struct ParsingError: Error {} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Date.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Date.swift new file mode 100644 index 00000000..bf61fc1c --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Date.swift @@ -0,0 +1,156 @@ +import Benchmark +import Foundation +import Parsing + +/// This benchmarks implements an [RFC-3339-compliant](https://www.ietf.org/rfc/rfc3339.txt) date +/// parser in a relatively naive way and pits it against `DateFormatter` and `ISO8601DateFormatter`. +/// +/// Not only is the parser faster than both formatters, it is more flexible and accurate: it will parse +/// parse fractional seconds and time zone offsets automatically, and it will parse to the nanosecond, +/// while the formatters do not parse beyond the millisecond. +let dateSuite = BenchmarkSuite(name: "Date") { suite in + let digits = { (n: Int) in + Prefix(n).pipe { + Int.parser(isSigned: false) + End() + } + } + + let dateFullyear = digits(4) + let dateMonth = digits(2) + let dateMday = digits(2) + + let timeDelim = OneOf { + "T".utf8 + "t".utf8 + " ".utf8 + } + + let timeHour = digits(2) + let timeMinute = digits(2) + let timeSecond = digits(2) + + let nanoSecfrac = Prefix(while: (.init(ascii: "0") ... .init(ascii: "9")).contains) + .map { $0.prefix(9) } + + let timeSecfrac = Parse { + ".".utf8 + nanoSecfrac + } + .compactMap { n in + Int(String(decoding: n, as: UTF8.self)) + .map { $0 * Int(pow(10, 9 - Double(n.count))) } + } + + let timeNumoffset = Parse { + OneOf { + "+".utf8.map { 1 } + "-".utf8.map { -1 } + } + timeHour + ":".utf8 + timeMinute + } + + let timeOffset = OneOf { + "Z".utf8.map { ( /*sign: */1, /*minute: */ 0, /*second: */ 0) } + timeNumoffset + } + .compactMap { TimeZone(secondsFromGMT: $0 * ($1 * 60 + $2)) } + + let partialTime = Parse { + timeHour + ":".utf8 + timeMinute + ":".utf8 + timeSecond + Optionally { + timeSecfrac + } + } + + let fullDate = Parse { + dateFullyear + "-".utf8 + dateMonth + "-".utf8 + dateMday + } + + let offsetDateTime = Parse { + fullDate + timeDelim + partialTime + timeOffset + } + .map { date, time, timeZone -> DateComponents in + let (year, month, day) = date + let (hour, minute, second, nanosecond) = time + return DateComponents( + timeZone: timeZone, + year: year, month: month, day: day, + hour: hour, minute: minute, second: second, nanosecond: nanosecond + ) + } + + let localDateTime = Parse { + fullDate + timeDelim + partialTime + } + .map { date, time -> DateComponents in + let (year, month, day) = date + let (hour, minute, second, nanosecond) = time + return DateComponents( + year: year, month: month, day: day, + hour: hour, minute: minute, second: second, nanosecond: nanosecond + ) + } + + let localDate = + fullDate + .map { DateComponents(year: $0, month: $1, day: $2) } + + let localTime = + partialTime + .map { DateComponents(hour: $0, minute: $1, second: $2, nanosecond: $3) } + + let dateTime = OneOf { + offsetDateTime + localDateTime + localDate + localTime + } + + let input = "1979-05-27T00:32:00Z" + let expected = Date(timeIntervalSince1970: 296_613_120) + var output: Date! + + let dateTimeParser = dateTime.compactMap(Calendar.current.date(from:)) + suite.benchmark("Parser") { + var input = input[...].utf8 + output = try dateTimeParser.parse(&input) + } tearDown: { + precondition(output == expected) + } + + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'" + dateFormatter.locale = Locale(identifier: "en_US_POSIX") + dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)! + suite.benchmark("DateFormatter") { + output = dateFormatter.date(from: input) + } tearDown: { + precondition(output == expected) + } + + if #available(macOS 10.12, *) { + let iso8601DateFormatter = ISO8601DateFormatter() + iso8601DateFormatter.timeZone = TimeZone(secondsFromGMT: 0) + suite.benchmark("ISO8601DateFormatter") { + output = iso8601DateFormatter.date(from: input) + } tearDown: { + precondition(output == expected) + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/HTTP.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/HTTP.swift new file mode 100644 index 00000000..4c2e128c --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/HTTP.swift @@ -0,0 +1,142 @@ +import Benchmark +import Parsing + +/// This benchmark reproduces an HTTP parser from [a Rust parser benchmark suite][rust-parser]. +/// +/// [rust-parser]: https://github.com/rust-bakery/parser_benchmarks/tree/master/http +/// +/// In particular, it benchmarks the same HTTP header as that defined in `one_test`. +let httpSuite = BenchmarkSuite(name: "HTTP") { suite in + let method = Prefix { $0.isToken } + .map(Substring.init) + + let uri = Prefix { $0 != .init(ascii: " ") } + .map(Substring.init) + + let httpVersion = Parse { + "HTTP/".utf8 + Prefix { $0.isVersion }.map(Substring.init) + } + + let requestLine = Parse(Request.init(method:uri:version:)) { + method + " ".utf8 + uri + " ".utf8 + httpVersion + Newline() + } + + let headerValue = Parse { + Skip { + Prefix(1...) { $0 == .init(ascii: " ") || $0 == .init(ascii: "\t") } + } + Prefix { $0 != .init(ascii: "\r") && $0 != .init(ascii: "\n") } + .map(Substring.init) + Skip { + Newline() + } + } + + let header = Parse(Header.init(name:value:)) { + Prefix { $0.isToken }.map(Substring.init) + ":".utf8 + Many { + headerValue + } + } + + let request = Parse { + requestLine + Many { + header + } + } + + let input = """ + GET / HTTP/1.1 + Host: www.reddit.com + User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1 + Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + Accept-Language: en-us,en;q=0.5 + Accept-Encoding: gzip, deflate + Connection: keep-alive + + """ + let expected = ( + Request( + method: "GET", + uri: "/", + version: "1.1" + ), + headers: [ + Header(name: "Host", value: ["www.reddit.com"]), + Header( + name: "User-Agent", + value: [ + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1" + ] + ), + Header( + name: "Accept", + value: ["text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"] + ), + Header(name: "Accept-Language", value: ["en-us,en;q=0.5"]), + Header(name: "Accept-Encoding", value: ["gzip, deflate"]), + Header(name: "Connection", value: ["keep-alive"]), + ] + ) + var output: (Request, [Header])! + + suite.benchmark("HTTP") { + var input = input[...].utf8 + output = try request.parse(&input) + } tearDown: { + precondition(output == expected) + } +} + +private struct Request: Equatable { + let method: Substring + let uri: Substring + let version: Substring +} + +private struct Header: Equatable { + let name: Substring + let value: [Substring] +} + +extension UTF8.CodeUnit { + fileprivate var isToken: Bool { + switch self { + case 128..., + ...31, + .init(ascii: "("), + .init(ascii: ")"), + .init(ascii: "<"), + .init(ascii: ">"), + .init(ascii: "@"), + .init(ascii: ","), + .init(ascii: ";"), + .init(ascii: ":"), + .init(ascii: "\\"), + .init(ascii: "'"), + .init(ascii: "/"), + .init(ascii: "["), + .init(ascii: "]"), + .init(ascii: "?"), + .init(ascii: "="), + .init(ascii: "{"), + .init(ascii: "}"), + .init(ascii: " "): + return false + default: + return true + } + } + + fileprivate var isVersion: Bool { + (.init(ascii: "0") ... .init(ascii: "9")).contains(self) || self == .init(ascii: ".") + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/JSON.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/JSON.swift new file mode 100644 index 00000000..f444374c --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/JSON.swift @@ -0,0 +1,157 @@ +import Benchmark +import Foundation +import Parsing + +/// This benchmark shows how to create a naive JSON parser with combinators. +/// +/// It is mostly implemented according to the [spec](https://www.json.org/json-en.html) (we take a +/// shortcut and use `Double.parser()`, which behaves accordingly). +let jsonSuite = BenchmarkSuite(name: "JSON") { suite in + enum JSONValue: Equatable { + case array([Self]) + case boolean(Bool) + case null + case number(Double) + case object([String: Self]) + case string(String) + } + + var json: AnyParser! + + let unicode = Prefix(4) { + (.init(ascii: "0") ... .init(ascii: "9")).contains($0) + || (.init(ascii: "A") ... .init(ascii: "F")).contains($0) + || (.init(ascii: "a") ... .init(ascii: "f")).contains($0) + } + .compactMap { + UInt32(Substring($0), radix: 16) + .flatMap(UnicodeScalar.init) + .map(String.init) + } + + let string = Parse { + "\"".utf8 + Many(into: "") { string, fragment in + string.append(contentsOf: fragment) + } element: { + OneOf { + Prefix(1...) { + $0 != .init(ascii: "\"") && $0 != .init(ascii: "\\") && $0 >= .init(ascii: " ") + } + .map { String(Substring($0)) } + + Parse { + "\\".utf8 + + OneOf { + "\"".utf8.map { "\"" } + "\\".utf8.map { "\\" } + "/".utf8.map { "/" } + "b".utf8.map { "\u{8}" } + "f".utf8.map { "\u{c}" } + "n".utf8.map { "\n" } + "r".utf8.map { "\r" } + "t".utf8.map { "\t" } + unicode + } + } + } + } terminator: { + "\"".utf8 + } + } + + let object = Parse { + "{".utf8 + Many(into: [String: JSONValue]()) { object, pair in + let (name, value) = pair + object[name] = value + } element: { + Skip { Whitespace() } + string + Skip { Whitespace() } + ":".utf8 + Lazy { json! } + } separator: { + ",".utf8 + } terminator: { + "}".utf8 + } + } + + let array = Parse { + "[".utf8 + Many { + Lazy { json! } + } separator: { + ",".utf8 + } terminator: { + "]".utf8 + } + } + + json = Parse { + Skip { Whitespace() } + OneOf { + object.map(JSONValue.object) + array.map(JSONValue.array) + string.map(JSONValue.string) + Double.parser().map(JSONValue.number) + Bool.parser().map(JSONValue.boolean) + "null".utf8.map { JSONValue.null } + } + Skip { Whitespace() } + } + .eraseToAnyParser() + + let input = #""" + { + "hello": true, + "goodbye": 42.42, + "whatever": null, + "xs": [1, "hello", null, false], + "ys": { + "0": 2, + "1": "goodbye" + } + } + """# + var jsonOutput: JSONValue! + suite.benchmark("Parser") { + var input = input[...].utf8 + jsonOutput = try json.parse(&input) + } tearDown: { + precondition( + jsonOutput + == .object([ + "hello": .boolean(true), + "goodbye": .number(42.42), + "whatever": .null, + "xs": .array([.number(1), .string("hello"), .null, .boolean(false)]), + "ys": .object([ + "0": .number(2), + "1": .string("goodbye"), + ]), + ]) + ) + } + + let dataInput = Data(input.utf8) + var objectOutput: Any! + suite.benchmark("JSONSerialization") { + objectOutput = try JSONSerialization.jsonObject(with: dataInput, options: []) + } tearDown: { + precondition( + (objectOutput as! NSDictionary) == [ + "hello": true, + "goodbye": 42.42, + "whatever": NSNull(), + "xs": [1, "hello", nil, false], + "ys": [ + "0": 2, + "1": "goodbye", + ], + ] + ) + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Numerics.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Numerics.swift new file mode 100644 index 00000000..d62f0e42 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Numerics.swift @@ -0,0 +1,153 @@ +import Benchmark +import Foundation +import Parsing + +/// This benchmark demonstrates how the numeric parsers in the library compare to Apple's tools, such +/// as initializers and `Scanner`. +let numericsSuite = BenchmarkSuite(name: "Numerics") { suite in + do { + let input = "123" + let expected = 123 + var output: Int! + + suite.benchmark("Int.init") { + output = Int(input) + } tearDown: { + precondition(output == expected) + } + + suite.benchmark("Int.parser") { + var input = input[...].utf8 + output = try Int.parser().parse(&input) + } tearDown: { + precondition(output == expected) + } + + if #available(macOS 10.15, *) { + let scanner = Scanner(string: input) + suite.benchmark("Scanner.scanInt") { + output = scanner.scanInt() + } setUp: { + scanner.currentIndex = input.startIndex + } tearDown: { + precondition(output == expected) + } + } + } + + do { + let input = (1...100_000).map(String.init).joined(separator: ",") + let expected = Array(1...100_000) + var output: [Int]! + + suite.benchmark("Comma separated: Int.parser") { + var input = input[...].utf8 + output = try Many { + Int.parser() + } separator: { + ",".utf8 + } + .parse(&input) + } tearDown: { + precondition(output == expected) + } + + if #available(macOS 10.15, *) { + let scanner = Scanner(string: input) + suite.benchmark("Comma separated: Scanner.scanInt") { + output = [] + while let n = scanner.scanInt() { + output.append(n) + guard let separator = scanner.scanCharacter() else { break } + guard separator == "," else { + scanner.string.formIndex(before: &scanner.currentIndex) + break + } + } + } setUp: { + scanner.currentIndex = input.startIndex + } tearDown: { + precondition(output == expected) + } + } + + suite.benchmark("Comma separated: String.split") { + output = input.split(separator: ",").compactMap { Int($0) } + } tearDown: { + precondition(output == expected) + } + } + + do { + let input = "123.45" + let expected = 123.45 + var output: Double! + + suite.benchmark("Double.init") { + output = Double(input) + } tearDown: { + precondition(output == expected) + } + + suite.benchmark("Double.parser") { + var input = input[...].utf8 + output = try Double.parser().parse(&input) + } tearDown: { + precondition(output == expected) + } + + if #available(macOS 10.15, *) { + let scanner = Scanner(string: input) + suite.benchmark("Scanner.scanDouble") { + output = scanner.scanDouble() + } setUp: { + scanner.currentIndex = input.startIndex + } tearDown: { + precondition(output == expected) + } + } + } + + do { + let input = (1...100_000).map(String.init).joined(separator: ",") + let expected = (1...100_000).map(Double.init) + var output: [Double]! + + suite.benchmark("Comma separated: Double.parser") { + var input = input[...].utf8 + output = try Many { + Double.parser() + } separator: { + ",".utf8 + } + .parse(&input) + } tearDown: { + precondition(output == expected) + } + + if #available(macOS 10.15, *) { + let scanner = Scanner(string: input) + suite.benchmark("Comma separated: Scanner.scanDouble") { + output = [] + while let n = scanner.scanDouble() { + output.append(n) + guard let separator = scanner.scanCharacter() else { break } + guard separator == "," else { + scanner.string.formIndex(before: &scanner.currentIndex) + break + } + } + } setUp: { + scanner.currentIndex = input.startIndex + } tearDown: { + precondition(output == expected) + } + } + + suite.benchmark("Comma separated: String.split") { + output = input.split(separator: ",").compactMap { Double($0) } + } tearDown: { + precondition(output == expected) + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/PrefixUpTo.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/PrefixUpTo.swift new file mode 100644 index 00000000..94bba3a0 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/PrefixUpTo.swift @@ -0,0 +1,49 @@ +import Benchmark +import Foundation +import Parsing + +/// This benchmarks the performance of `PrefixUpTo` against Apple's tools. +let prefixUpToSuite = BenchmarkSuite(name: "PrefixUpTo") { suite in + let input = String(repeating: ".", count: 10_000) + "Hello, world!" + + do { + var output: Substring! + suite.benchmark("Parser: Substring") { + var input = input[...] + output = try PrefixUpTo("Hello").parse(&input) + } tearDown: { + precondition(output.count == 10_000) + } + } + + do { + var output: Substring.UTF8View! + suite.benchmark("Parser: UTF8") { + var input = input[...].utf8 + output = try PrefixUpTo("Hello".utf8).parse(&input) + } tearDown: { + precondition(output.count == 10_000) + } + } + + do { + var output: Substring! + suite.benchmark("String.range(of:)") { + output = input.range(of: "Hello").map { input.prefix(upTo: $0.lowerBound) } + } tearDown: { + precondition(output.count == 10_000) + } + } + + if #available(macOS 10.15, *) { + var output: String! + let scanner = Scanner(string: input) + suite.benchmark("Scanner.scanUpToString") { + output = scanner.scanUpToString("Hello") + } setUp: { + scanner.currentIndex = input.startIndex + } tearDown: { + precondition(output.count == 10_000) + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Race.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Race.swift new file mode 100644 index 00000000..839d7f09 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Race.swift @@ -0,0 +1,175 @@ +import Benchmark +import Parsing + +/// This benchmark implements a parser for a custom format covered in +/// [a collection of episodes][parsing] on +/// Point-Free. +/// +/// [parsing]: https://www.pointfree.co/collections/parsing +let raceSuite = BenchmarkSuite(name: "Race") { suite in + struct Coordinate { + let latitude: Double + let longitude: Double + } + + enum Currency { case eur, gbp, usd } + + struct Money { + let currency: Currency + let dollars: Int + } + + struct Race { + let location: String + let entranceFee: Money + let path: [Coordinate] + } + + let northSouthSign = OneOf { + "N".utf8.map { 1.0 } + "S".utf8.map { -1.0 } + } + + let eastWestSign = OneOf { + "E".utf8.map { 1.0 } + "W".utf8.map { -1.0 } + } + + let latitude = Parse(*) { + Double.parser() + "° ".utf8 + northSouthSign + } + + let longitude = Parse(*) { + Double.parser() + "° ".utf8 + eastWestSign + } + + let zeroOrMoreSpaces = Prefix { $0 == .init(ascii: " ") } + + let coord = Parse(Coordinate.init(latitude:longitude:)) { + latitude + Skip { + ",".utf8 + zeroOrMoreSpaces + } + longitude + } + + let currency = OneOf { + "€".utf8.map { Currency.eur } + "£".utf8.map { Currency.gbp } + "$".utf8.map { Currency.usd } + } + + let money = Parse(Money.init(currency:dollars:)) { + currency + Int.parser() + } + + let locationName = Prefix { $0 != .init(ascii: ",") } + + let race = Parse(Race.init(location:entranceFee:path:)) { + locationName.map { String(Substring($0)) } + Skip { + ",".utf8 + zeroOrMoreSpaces + } + money + "\n".utf8 + Many { + coord + } separator: { + "\n".utf8 + } + } + + let races = Many { + race + } separator: { + "\n---\n".utf8 + } + + let input = """ + New York City, $300 + 40.60248° N, 74.06433° W + 40.61807° N, 74.02966° W + 40.64953° N, 74.00929° W + 40.67884° N, 73.98198° W + 40.69894° N, 73.95701° W + 40.72791° N, 73.95314° W + 40.74882° N, 73.94221° W + 40.7574° N, 73.95309° W + 40.76149° N, 73.96142° W + 40.77111° N, 73.95362° W + 40.8026° N, 73.93061° W + 40.80409° N, 73.92893° W + 40.81432° N, 73.93292° W + 40.80325° N, 73.94472° W + 40.77392° N, 73.96917° W + 40.77293° N, 73.97671° W + --- + Berlin, €100 + 13.36015° N, 52.51516° E + 13.33999° N, 52.51381° E + 13.32539° N, 52.51797° E + 13.33696° N, 52.52507° E + 13.36454° N, 52.52278° E + 13.38152° N, 52.52295° E + 13.40072° N, 52.52969° E + 13.42555° N, 52.51508° E + 13.41858° N, 52.49862° E + 13.40929° N, 52.48882° E + 13.37968° N, 52.49247° E + 13.34898° N, 52.48942° E + 13.34103° N, 52.47626° E + 13.32851° N, 52.47122° E + 13.30852° N, 52.46797° E + 13.28742° N, 52.47214° E + 13.29091° N, 52.4827° E + 13.31084° N, 52.49275° E + 13.32052° N, 52.5019° E + 13.34577° N, 52.50134° E + 13.36903° N, 52.50701° E + 13.39155° N, 52.51046° E + 13.37256° N, 52.51598° E + --- + London, £500 + 51.48205° N, 0.04283° E + 51.47439° N, 0.0217° E + 51.47618° N, 0.02199° E + 51.49295° N, 0.05658° E + 51.47542° N, 0.03019° E + 51.47537° N, 0.03015° E + 51.47435° N, 0.03733° E + 51.47954° N, 0.04866° E + 51.48604° N, 0.06293° E + 51.49314° N, 0.06104° E + 51.49248° N, 0.0474° E + 51.48888° N, 0.03564° E + 51.48655° N, 0.0183° E + 51.48085° N, 0.02223° W + 51.4921° N, 0.0451° W + 51.49324° N, 0.04699° W + 51.50959° N, 0.05491° W + 51.50961° N, 0.0539° W + 51.4995° N, 0.01356° W + 51.50898° N, 0.02341° W + 51.51069° N, 0.04225° W + 51.51056° N, 0.04353° W + 51.50946° N, 0.0781° W + 51.51121° N, 0.09786° W + 51.50964° N, 0.1187° W + 51.50273° N, 0.1385° W + 51.50095° N, 0.12411° W + """ + var output: [Race]! + + suite.benchmark("Parser") { + output = try races.parse(input) + } tearDown: { + precondition(output.count == 3) + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/ReadmeExample.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/ReadmeExample.swift new file mode 100644 index 00000000..82ae802e --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/ReadmeExample.swift @@ -0,0 +1,113 @@ +import Benchmark +import Foundation +import Parsing + +/// This benchmark measures the performance of the examples given in the library's README. +let readmeExampleSuite = BenchmarkSuite(name: "README Example") { suite in + let input = """ + 1,Blob,true + 2,Blob Jr.,false + 3,Blob Sr.,true + """ + let expectedOutput = [ + User(id: 1, name: "Blob", isAdmin: true), + User(id: 2, name: "Blob Jr.", isAdmin: false), + User(id: 3, name: "Blob Sr.", isAdmin: true), + ] + var output: [User]! + + struct User: Equatable { + var id: Int + var name: String + var isAdmin: Bool + } + + do { + let user = Parse(User.init(id:name:isAdmin:)) { + Int.parser() + "," + Prefix { $0 != "," }.map(String.init) + "," + Bool.parser() + } + let users = Many { + user + } separator: { + "\n" + } terminator: { + End() + } + + suite.benchmark("Parser: Substring") { + var input = input[...] + output = try users.parse(&input) + } tearDown: { + precondition(output == expectedOutput) + } + } + + do { + let user = Parse(User.init(id:name:isAdmin:)) { + Int.parser() + ",".utf8 + Prefix { $0 != .init(ascii: ",") }.map { String(Substring($0)) } + ",".utf8 + Bool.parser() + } + let users = Many { + user + } separator: { + "\n".utf8 + } terminator: { + End() + } + + suite.benchmark("Parser: UTF8") { + var input = input[...].utf8 + output = try users.parse(&input) + } tearDown: { + precondition(output == expectedOutput) + } + } + + suite.benchmark("Ad hoc") { + output = + input + .split(separator: "\n") + .compactMap { row -> User? in + let fields = row.split(separator: ",") + guard + fields.count == 3, + let id = Int(fields[0]), + let isAdmin = Bool(String(fields[2])) + else { return nil } + + return User(id: id, name: String(fields[1]), isAdmin: isAdmin) + } + } tearDown: { + precondition(output == expectedOutput) + } + + if #available(macOS 10.15, *) { + let scanner = Scanner(string: input) + suite.benchmark("Scanner") { + output = [] + while scanner.currentIndex != input.endIndex { + guard + let id = scanner.scanInt(), + let _ = scanner.scanString(","), + let name = scanner.scanUpToString(","), + let _ = scanner.scanString(","), + let isAdmin = scanner.scanBool() + else { break } + + output.append(User(id: id, name: name, isAdmin: isAdmin)) + _ = scanner.scanString("\n") + } + } setUp: { + scanner.currentIndex = input.startIndex + } tearDown: { + precondition(output == expectedOutput) + } + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Routing.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Routing.swift new file mode 100644 index 00000000..4232fbd2 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Routing.swift @@ -0,0 +1,143 @@ +import Benchmark +import Foundation +import Parsing + +#if canImport(FoundationNetworking) + import FoundationNetworking +#endif + +/// This benchmark demonstrates how you can build a URL request router that can transform an input +/// request into a more well-structured data type, such as an enum. We build a router that can +/// recognize one of 5 routes for a website. +let routingSuite = BenchmarkSuite(name: "Routing") { suite in + #if compiler(>=5.5) + + /* + Rails.application.routes.draw do + get "/users/:user_id/books/:book_id" => "books#fetch" + end + + users_books_path true, "123" + + + app.get('/users/:userId/books/:bookId', function (req, res) { + ... + }) + + + app.get("users", ":userID", "books", ":bookID") { req in + ... + } + + + Blob Autobiography + Blobbed around the world + ... + + "/users/\(user.id)/books/\(book.id)" + + + router.print(.user(id: user.id, .book(id: book.id))) // "/users/42/books/123" + */ + + + enum AppRoute: Equatable { + case home + case contactUs + case episodes(Episodes) + } + enum Episodes: Equatable { + case index + case episode(id: Int, route: Episode) + } + enum Episode: Equatable { + case show + case comments(Comments) + } + enum Comments: Equatable { + case post(Comment) + case show(count: Int) + } + struct Comment: Decodable, Equatable { + let commenter: String + let message: String + } + + let router = OneOf { + Route(AppRoute.home) + + Route(AppRoute.contactUs) { + Path(FromUTF8View { "contact-us".utf8 }) + } + + Route(AppRoute.episodes) { + Path(FromUTF8View { "episodes".utf8 }) + + OneOf { + Route(Episodes.index) + + Route(Episodes.episode) { + Path(Int.parser()) + + OneOf { + Route(Episode.show) + + Route(Episode.comments) { + Path(FromUTF8View { "comments".utf8 }) + + OneOf { + Route(Comments.post) { + Method.post + Body { + JSON(Comment.self) + } + } + + Route(Comments.show) { + Query("count", Int.parser(), default: 10) + } + } + } + } + } + } + } + } + + var postRequest = URLRequest(url: URL(string: "/episodes/1/comments")!) + postRequest.httpMethod = "POST" + postRequest.httpBody = Data( + """ + {"commenter": "Blob", "message": "Hi!"} + """.utf8) + let requests = [ + URLRequest(url: URL(string: "/")!), + URLRequest(url: URL(string: "/contact-us")!), + URLRequest(url: URL(string: "/episodes")!), + URLRequest(url: URL(string: "/episodes/1")!), + URLRequest(url: URL(string: "/episodes/1/comments")!), + URLRequest(url: URL(string: "/episodes/1/comments?count=20")!), + postRequest, + ] + .map { URLRequestData(request: $0)! } + + var output: [AppRoute]! + var expectedOutput: [AppRoute] = [ + .home, + .contactUs, + .episodes(.index), + .episodes(.episode(id: 1, route: .show)), + .episodes(.episode(id: 1, route: .comments(.show(count: 10)))), + .episodes(.episode(id: 1, route: .comments(.show(count: 20)))), + .episodes(.episode(id: 1, route: .comments(.post(.init(commenter: "Blob", message: "Hi!"))))), + ] + suite.benchmark("Parser") { + output = try requests.map { + var input = $0 + return try router.parse(&input) + } + } tearDown: { + precondition(output == expectedOutput) + } + #endif +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Samples/CSVSample.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Samples/CSVSample.swift new file mode 100644 index 00000000..c7cadcb9 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Samples/CSVSample.swift @@ -0,0 +1,1002 @@ +let csvInput = """ + Serial Number,Company Name,Employee Markme,Description,Leave + 9788189999599,TALES OF SHIVA,Mark,mark,0 + 9780099578079,1Q84 THE COMPLETE TRILOGY,HARUKI MURAKAMI,Mark,0 + 9780198082897,MY KUMAN,Mark,Mark,0 + 9780007880331,THE GOD OF SMAAL THINGS,ARUNDHATI ROY,4TH HARPER COLLINS,2 + 9780545060455,THE BLACK CIRCLE,Mark,4TH HARPER COLLINS,0 + 9788126525072,THE THREE LAWS OF PERFORMANCE,Mark,4TH HARPER COLLINS,0 + 9789381626610,CHAMarkKYA MANTRA,Mark,4TH HARPER COLLINS,0 + 9788184513523,59.FLAGS,Mark,4TH HARPER COLLINS,0 + 9780743234801,THE POWER OF POSITIVE THINKING FROM,Mark,A & A PUBLISHER,0 + 9789381529621,YOU CAN IF YO THINK YO CAN,PEALE,A & A PUBLISHER,0 + 9788183223966,DONGRI SE DUBAI TAK (MPH),Mark,A & A PUBLISHER,0 + 9788187776005,MarkLANDA ADYTAN KOSH,Mark,AADISH BOOK DEPOT,0 + 9788187776013,MarkLANDA VISHAL SHABD SAGAR,-,AADISH BOOK DEPOT,1 + 8187776021,MarkLANDA CONCISE DICT(ENG TO HINDI),Mark,AADISH BOOK DEPOT,0 + 9789384716165,LIEUTEMarkMarkT GENERAL BHAGAT: A SAGA OF BRAVERY AND LEADERSHIP,Mark,AAM COMICS,2 + 9789384716233,LN. MarkIK SUNDER SINGH,N.A,AAN COMICS,0 + 9789384850319,I AM KRISHMark,DEEP TRIVEDI,AATMAN INNOVATIONS PVT LTD,1 + 9789384850357,DON'T TEACH ME TOLERANCE INDIA,DEEP TRIVEDI,AATMAN INNOVATIONS PVT LTD,0 + 9789384850364,MUJHE SAHISHNUTA MAT SIKHAO BHARAT,DEEP TRIVEDI,AATMAN INNOVATIONS PVT LTD,0 + 9789384850746,SECRETS OF DESTINY,DEEP TRIVEDI,AATMAN INNOVATIONS PVT LTD,1 + 9789384850753,BHAGYA KE RAHASYA (HINDI) SECRET OF DESTINY,DEEP TRIVEDI,AATMAN INNOVATIONS PVT LTD,1 + 9788192669038,MEIN MANN HOON,DEEP TRIVEDI,AATMAN INNOVATIONS PVT LTD,0 + 9789384850098,I AM THE MIND,DEEP TRIVEDI,AATMARAM & SONS,0 + 9780349121420,THE ART OF CHOOSING,SHEEMark IYENGAR,ABACUS,0 + 9780349123462,IN SPITE OF THE GODS,EDWARD LUCE,ABACUS,1 + 9788188440061,QUESTIONS & ANWERS ABOUT THE GREAT BIBLE,Mark,ABC PUBLISHERS DISTRIBUTORS,4 + 9789382088189,NIBANDH EVAM KAHANI LEKHAN { HINDI },Mark,ABHI BOOKS,1 + 9789332703759,INDIAN ECONOMY SINCE INDEPENDENCE 27TH /E,UMA KAPILA,ACADEMIC FOUNDATION,1 + 9788171888016,ECONOMIC DEVELOPMENT AND POLICY IN INDIA,UMA KAPILA,ACADEMIC FOUNDATION,1 + 9789332704343,INDIAN ECONOMY PERFORMANCE 18TH/E 2017-2018,UMA KAPILA,ACADEMIC FOUNDATION,2 + 9789332703735,INDIAN ECONOMIC DEVELOPMENTSINCE 1947 (NO RETURMarkBLE),UMA KAPILA,ACADEMIC FOUNDATION,1 + 9789383454143,PRELIMS SPECIAL READING COMPREHENSION PAPER II CSAT,MarkGENDRA PRATAP,ACCESS PUBLISHING INDIA PVT.LTD,0 + 9789383454204,THE CONSTITUTION OF INDIA 2ND / E,AR KHAN,ACCESS PUBLISHING INDIA PVT.LTD,10 + 9789386361011,"INDIAN HERITAGE ,ART & CULTURE",MADHUKAR,ACCESS PUBLISHING INDIA PVT.LTD,10 + 9789383454303,BHARAT KA SAMVIDHAN,AR KHAN,ACCESS PUBLISHING INDIA PVT.LTD,4 + 9789383454471,"ETHICS, INTEGRITY & APTITUDE ( 3RD/E)","P N ROY ,G SUBBA RAO",ACCESS PUBLISHING INDIA PVT.LTD,10 + 9789383454563,GENERAL STUDIES PAPER -- I (2016),Mark,ACCESS PUBLISHING INDIA PVT.LTD,0 + 9789383454570,GENERAL STUDIES PAPER - II (2016),Mark,ACCESS PUBLISHING INDIA PVT.LTD,0 + 9789383454693,INDIAN AND WORLD GEOGRAPHY 2E,D R KHULLAR,ACCESS PUBLISHING INDIA PVT.LTD,10 + 9789383454709,VASTUNISTHA PRASHN SANGRAHA: BHARAT KA ITIHAS,MEEMarkKSHI KANT,ACCESS PUBLISHING INDIA PVT.LTD,0 + 9789383454723,"PHYSICAL, HUMAN AND ECONOMIC GEOGRAPHY",D R KHULLAR,ACCESS PUBLISHING INDIA PVT.LTD,4 + 9789383454730,WORLD GEOGRAPHY,DR KHULLAR,ACCESS PUBLISHING INDIA PVT.LTD,5 + 9789383454822,INDIA: MAP ENTRIES IN GEOGRAPHY,MAJID HUSAIN,ACCESS PUBLISHING INDIA PVT.LTD,5 + 9789383454853,GOOD GOVERMarkNCE IN INDIA 2/ED.,G SUBBA RAO,ACCESS PUBLISHING INDIA PVT.LTD,1 + 9789383454884,KAMYABI KE SUTRA-CIVIL SEWA PARIKSHA AAP KI MUTTHI MEIN,ASHOK KUMAR,ACCESS PUBLISHING INDIA PVT.LTD,0 + 9789383454891,GENERAL SCIENCE PRELIRY EXAM,Mark,ACCESS PUBLISHING INDIA PVT.LTD,0 + 9781742860190,SUCCESS AND DYSLEXIA,SUCCESS AND DYSLEXIA,ACER PRESS,0 + 9781742860114,AN EXTRAORDIMarkRY SCHOOL,SARA JAMES,ACER PRESS,0 + 9781742861463,POWERFUL PRACTICES FOR READING IMPROVEMENT,GLASSWELL,ACER PRESS,0 + 9781742862859,EARLY CHILDHOOD PLAY MATTERS,SHOMark BASS,ACER PRESS,0 + 9781742863641,LEADING LEARNING AND TEACHING,STEPHEN DINHAM,ACER PRESS,0 + 9781742863658,READING AND LEARNING DIFFICULTIES,PETER WESTWOOD,ACER PRESS,0 + 9781742863665,NUMERACY AND LEARNING DIFFICULTIES,PETER WOODLAND],ACER PRESS,0 + 9781742863771,TEACHING AND LEARNING DIFFICULTIES,PETER WOODLAND,ACER PRESS,0 + 9781742861678,USING DATA TO IMPROVE LEARNING,ANTHONY SHADDOCK,ACER PRESS,0 + 9781742862484,PATHWAYS TO SCHOOL SYSTEM IMPROVEMENT,MICHAEL GAFFNEY,ACER PRESS,0 + 9781742860176,FOR THOSE WHO TEACH,PHIL RIDDEN,ACER PRESS,0 + 9781742860213,KEYS TO SCHOOL LEADERSHIP,PHIL RIDDEN & JOHN DE NOBILE,ACER PRESS,0 + 9781742860220,DIVERSE LITERACIES IN EARLY CHILDHOOD,LEONIE ARTHUR,ACER PRESS,0 + 9781742860237,CREATIVE ARTS IN THE LIVESOF YOUNG CHILDREN,ROBYN EWING,ACER PRESS,0 + 9781742860336,SOCIAL AND EMOTIOMarkL DEVELOPMENT,ROS LEYDEN AND ERIN SHALE,ACER PRESS,0 + 9781742860343,DISCUSSIONS IN SCIENCE,TIM SPROD,ACER PRESS,0 + 9781742860404,YOUNG CHILDREN LEARNING MATHEMATICS,ROBERT HUNTING,ACER PRESS,0 + 9781742860626,COACHING CHILDREN,KELLY SUMICH,ACER PRESS,1 + 9781742860923,TEACHING PHYSICAL EDUCATIOMarkL IN PRIMARY SCHOOL,JANET L CURRIE,ACER PRESS,0 + 9781742861111,ASSESSMENT AND REPORTING,PHIL RIDDEN AND SANDY,ACER PRESS,0 + 9781742861302,COLLABORATION IN LEARNING,MAL LEE AND LORRAE WARD,ACER PRESS,0 + 9780864315250,RE-IMAGINING EDUCATIMarkL LEADERSHIP,BRIAN J.CALDWELL,ACER PRESS,0 + 9780864317025,TOWARDS A MOVING SCHOOL,FLEMING & KLEINHENZ,ACER PRESS,0 + 9780864317230,DESINGNING A THINKING A CURRICULAM,SUSAN WILKS,ACER PRESS,0 + 9780864318961,LEADING A DIGITAL SCHOOL,MAL LEE AND MICHEAL GAFFNEY,ACER PRESS,0 + 9780864319043,NUMERACY,WESTWOOD,ACER PRESS,0 + 9780864319203,TEACHING ORAL LANGUAGE,JOHN MUNRO,ACER PRESS,0 + 9780864319449,SPELLING,WESTWOOD,ACER PRESS,0 + 9788189999803,STORIES OF SHIVA,Mark,ACK,0 + 9788189999988,JAMSET JI TATA: THE MAN WHO SAW TOMORROW,,ACK,0 + 9788184820355,HEROES FROM THE MAHABHARTA { 5-IN-1 },Mark,ACK,0 + 9788184820553,SURYA,,ACK,0 + 9788184820645,TALES OF THE MOTHER GODDESS,-,ACK,0 + 9788184820652,ADVENTURES OF KRISHMark,Mark,ACK,0 + 9788184822113,MAHATMA GANDHI,Mark,ACK,1 + 9788184822120,TALES FROM THE PANCHATANTRA 3-IN-1,-,ACK,0 + 9788184821482,YET MORE TALES FROM THE JATAKAS { 3-IN-1 },AMarkNT PAI,ACK,0 + 9788184825763,LEGENDARY RULERS OF INDIA,-,ACK,0 + 9788184825862,GREAT INDIAN CLASSIC,Mark,ACK,0 + 9788184823219,TULSIDAS ' RAMAYAMark,Mark,ACK,0 + 9788184820782,TALES OF HANUMAN,-,ACK,0 + 9788184820089,VALMIKI'S RAMAYAMark,A C K,ACK,1 + 9788184825213,THE BEST OF INIDAN WIT AND WISDOM,Mark,ACK,0 + 9788184820997,MORE TALES FROM THE PANCHTANTRA,AMarkNT PAL,ACK,0 + 9788184824018,THE GREAT MUGHALS {5-IN-1},AMarkNT.,ACK,0 + 9788184824049,FAMOUS SCIENTISTS,Mark,ACK,0 + 9788184825978,KOMarkRK,Mark,ACK,0 + 9788184826098,THE MUGHAL COURT,REEMark,ACK,0 + 9788184821536,MORE STORIES FROM THE JATAKAS,Mark,ACK,0 + 9788184821543,MORE TALES OF BIRBAL,-,ACK,0 + 9788184821550,TALES FROM THE JATAKAS,-,ACK,0 + 9788184821567,RAMarkS OF MEWAR,-,ACK,0 + 9788184821574,THE SONS OF THE PANDAVAS,-,ACK,0 + 9788184821741,JAGADIS CHANDRA BOSE (699),Mark,ACK,1 + 9788184821833,VISHNU THE SAVIOUR,-,ACK,0 + 9788184822137,FURTHR TALES FROM THE JATAKAS,AMarkNT PAL,ACK,0 + 9788184822601,TRAVELLERS OF INDIA,-,ACK,0 + 9788184821338,FUNNY FOLKTALES,AMarkNT PAL,ACK,0 + 9788184821345,BUDDHIST TALES,"Che Guevara",ACK,0 + 9788184820669,TALES OF KRISHMark,-,ACK,0 + 9788184820676,GREAT INDIAN EMPERORS,-,ACK,0 + 9788184820713,THE COMPLETE MYTHOLOGY COLLECTION,-,ACK,0 + 9788184820638,THE SONS OF SHIVA,-,ACK,0 + 9788184820348,MORE BUDDHIST TALES,Mark,ACK,0 + 9788189999810,GREAT RULERS OF INDIA,AMarkNT,ACK,0 + 9788189999841,TALES OF BIRBAL (10007),AMarkNT PAL,ACK,0 + 9788189999858,TALES FROM THE HITOPADESHA,-,ACK,0 + 9788189999520,THE JACKAL AND THE WARDRUM,Mark,ACK,0 + 9788189999322,BUDDHA[502],s k rama,ACK,0 + 9788190599085,TALES OF HUMOUR,Mark,ACK,0 + 9789350850749,ANCIENT KINGS OF INDIA 5 IN 1,REEMark GUPTA,ACK,0 + 9789385874000,SAPTARSHI-THE SEVEN SUPREME SAGES,Mark,ACK,0 + 9789385874154,AMAR CHITRA KATHA (VOL1)MYTHOLOGY THE SACRED LEGEND OF INDIA,AMarknt Pai,ACK,1 + 9789385874796,AMAR CHITRA KATHA (VOL. 3) THE ULTIMATE COLLECTION FABLES A TREASURY OF WIT AND WISDOM VISIOMarkRIES,Mark,ACK,0 + 9789384439897,HARP,Mark,ADARSH BOOKS,0 + 9789386050236,GULBADAN : PORTRAIT OF A PRINCESSAT THE MUGHAL COURT,Mark,ADARSH BOOKS,0 + 9789386050458,JOURNEY AFTER MID NIGHT,Mark,ADARSH BOOKS,0 + 9788183631273,KINGSTONE`S ENCYCLOPEDIA OF QUESTION&ANSWER,Mark,ADARSH BOOKS,0 + 9789385854491,STARING AT THE SQUARE MOON,ATIMA,Adarsh Enterprises,2 + 9789385854460,HOUSE OF DISCORD,Mark,Adarsh Enterprises,0 + 9789385854576,OUT WITH LANTERNS,Mark,Adarsh Enterprises,2 + 9789385854590,KAILASH MAMarkSAROVAR,ANITA,Adarsh Enterprises,1 + 9789374735428,BE AN EFFECTIVE MAMarkGER,DR.V.K.MarkRULA,AITBS,0 + 9788174732057,DICTIOMarkRY OF BIOLOGY,Mark,AITBS,0 + 9788174732347,DICTOMarkRY OF CHEMISTRY,Mark,AITBS,0 + 9788174734358,DICTIOMarkRY OF MATHEMATICS,RAKESH KUMAR,AITBS,0 + 9788174734471,DICTIOMarkRY OF BUSINESS,N.C.JAIN,AITBS,0 + 9788174732774,DICTIOMarkRY OF ECONOMICS 3/ED.,Mark,AITBS,0 + 9788174733627,A CHAVVI BHARAL-DICTIOMarkRY OF ENVIRONMENTAL SCIENCE,Mark,AITBS,0 + 9788174733658,BANSAL- BANSAL'S CONCISE MEDICAL BOOM (E.E.H.)(PPB),Mark,AITBS,0 + 9788174733825,DICTIOMarkRY OF ELECTRONICS,DARSHMark SINGH,AITBS,0 + 9788174733832,DICTIOMarkRY OF COMMERCE,N.C.JAIN,AITBS,0 + 9788174730435,A PASSAGE TO INDIA,Mark,AITBS,2 + 9788174731197,AN INTRODUCTION TO THE STUDY OF ENGLISH LITERATURE,Mark,AITBS,0 + 9788174731326,AN OUTLINE HISTORY OF ENGLISH LETERATURE,W. H. HUDSON,AITBS,1 + 9788174731555,ICD- CLASSIFICATION DESCRIPTIONS,Mark,AITBS,0 + 8174730257,ENGLISH LITERATURE,WILLIAM J. LONG,AITBS,0 + 9789374735435,DICTIOMarkRY OF PSYCHOLOGY,MOHAN KUMAR,AITBS,0 + 9789374735848,DICTIOMarkRY OF SOCIOLOGY,ANTHONY COMTE,AITBS,0 + 9789374735909,POCKET MEDIACL DICTIOMarkRY,SANJAY GUPTA,AITBS,0 + 9789374735107,GANDHI: AN AUTOBIOGRAPHY THE STORY OF MY EXPERIMENTS WITH TRUTH,Mark,AITBS,1 + 9789374735114,MEIN KAMPF: WITH RARE PHOTOGRAPHS,ADOLF HITLER,AITBS,0 + 9788174733276,DICTIOMarkRY OF ZOOLOGY,Mark,AITBS PUBLISHERS AND DISTRIBUTORS-DELHI,0 + 9788174730251,ENGLISH LITERATURE,-,AITBS PUBLISHERS AND DISTRIBUTORS-DELHI,0 + 9788190307888,AJNTA CHINESE IN TOW MONTHS,DINESH CHANDER KAPOOR,AJANTA SCHOOL OF FOREIGN LENGUAGES,0 + 9788190307819,AJANTA PORTUGESE IN TWO MONTHS,DINESH CHANDER KAPOOR,AJANTA SCHOOL OF FOREIGN LENGUAGES,0 + 9788190307864,AJANTA RUSSIAN IN TWO MONTHS,DINESH CHANDER KAPOOR,AJANTA SCHOOL OF FOREIGN LENGUAGES,0 + 9788192482477,AJANTA GERMAN IN TWO MONTH,DINESH CHANDER KAPOOR,AJANTA SCHOOL OF FOREIGN LENGUAGES,0 + 9788192749181,DOPPELGANGER SHORT STORIES,MADHAVI S. MAHADEVAN,ALCHEMY,0 + 9788192749198,50 THINGS YOU DID NOT KNOW ABOUT CHIMark,Mark,ALCHEMY,1 + 9789383938025,THE FACELESS SALDIRGAN,Mark,ALCHEMY,1 + 9789384067458,THE SECRET LIFE OF FAT,SYLVIA TARA PHD,ALEPH,0 + 9789384067571,THE BOOK OF INDIAN DOGS,S. THEODORE BASKARAN,ALEPH,0 + 9789384067335,MAID IN INDIA,TRIPTI LAHIRI,ALEPH,0 + 9789383064038,MAGIC OF THE SOUL,VENKAT RAMAN SINGH SHYAM,ALEPH,1 + 9789383064106,THE CRISIS WITHIN,G.N DEVY,ALEPH,0 + 9789383064137,PEOPLE.,RAGHU RAI,ALEPH,0 + 9789383064229,THE DASHING LADIES OF SHIV SEMark,TARINI BEDI,ALEPH,0 + 9789383064250,SUBCONTINENTAL DRIFT,MURRAY LAURANCE,ALEPH,0 + 9789382277415,SPELL OF THE TIGER,SY MONTGOMERY,ALEPH,0 + 9789382277965,TALKING OF JUSTICE,LEILA SETH,ALEPH,0 + 9789386021090,THE DEMON HUNTER OF CHOTTANIKKARA,S V SUJATHA,ALEPH,0 + 9789386021106,WHY I AM A HINDU,SHASHI THAROOR,ALEPH,1 + 9789386021052,INDIAN MarkTIOMarkLISM,S. IRFAN HABIB,ALEPH,2 + 9789386021076,ZELALDINUS,IRWIN ALLAN SEALY,ALEPH,0 + 9789386021083,THE LIFE OF HINDIISM,JOHN STEPHENS,ALEPH,0 + 9789386021007,THE LOVERS,AMITAVA KUMAR,ALEPH,0 + 9789386021618,UNFORGETTABLE : KHUSHWANT SINGH,KHUSHAWANT SINGH,ALEPH,0 + 9789386021878,DO WE NOT BLEED?,MEHR TARAR,ALEPH,0 + 9789386021915,THE ARTS OF SEDUCTION,SEEMA AMarkND,ALEPH,0 + 9789387561250,JUGAAD YATRA: EXPLORING THE INDIAN ART OF PROBLEM SOLVING,DEAN NELSON,ALEPH,0 + 9789387561328,THE MULBERRY COURTESAN,SIKEEMark KARMALI,ALEPH,0 + 9789387561335,THE HIPPIE TRAIL,SHARIF,ALEPH,0 + 9789387561342,THE STORM,ARIF ANWAR,ALEPH,0 + 9789382277972,1962 THE WAR THAT WASN'T,KUMarkL VERMA,ALEPH,1 + 9789382277620,INDIA IN LOVE,Trivedi Ira,ALEPH,1 + 9789382277668,"UN BOUND 2,000 YEARS OF INDIAN WOMEN'S WRITING",ANNIE ZAIDI,ALEPH,0 + 9789382277743,THE GREATEST BENGALI STORIES EVER TOLD,ARUMarkVA SINHA,ALEPH,0 + 9789382277750,KALIDASA FOR THE 21ST CENTURY,MANI RAO,ALEPH,0 + 9789382277446,HOW I BECAME A TREE,SumaMark Roy,ALEPH,0 + 9789382277149,KORMA KHEER AND KISMET,PAMELA TIM,ALEPH,0 + 9789382277187,THE COLONEL WHO WOULD NOT REPENT,Mark,ALEPH,0 + 9789382277231,THE BLACK HILL,Mark,ALEPH,0 + 9789383064274,THE TALENT SUTRA,Mark,ALEPH,0 + 9789383064656,AN ERA OF DARKNESS,SASHI THAROOR,ALEPH,4 + 9789383064779,THE PATMark MANUAL OF STYLE STORIES,Mark,ALEPH,0 + 9789383064793,A GATHERING OF FRIENDS,RUSKIN BOND,ALEPH,0 + 9789383064168,UNBOUND -2000 YEARS OF INDIAN WOMEN,ANNIE ZAIDI,ALEPH,0 + 9789383064243,UNDERSTANDING THE FOUNDING FATHERS,RAJMOHAN GANDHI,ALEPH,0 + 9789383064113,ON MarkTIOMarkLISM,ROMILA THAPER,ALEPH,1 + 9789383064069,PRINCE OF GUJARAT,Mark,ALEPH,0 + 9789383064076,THE GREATEST URDU STORIES EVER TOLD,MUHAMMAD UMAR MEMON,ALEPH,1 + 9789383064083,PUNJAB A HISTORY FROM AUR,RAJMOHAN GANDHI,ALEPH,0 + 9789384067229,BEING THE OTHER,SAEED MarkQVI,ALEPH,0 + 9789384067540,BUSINESS SUTRA-PB,DEV DUTT PATTAMarkIK,ALEPH,0 + 9789384067465,THE LEADERSHIP SUTRA,DEVDUTT PATTAMarkIK,ALEPH,2 + 9789384067496,HEROINES,IRA MUKHOTY,ALEPH,0 + 9789384067410,THE SUCCESS SUTRA,DEVDUTTA PATTAMarkIK,ALEPH,2 + 9789386021885,UNHARRIED TALES,RUSKIN BOND,ALEPH,0 + 9789386021922,THE CANE GROVES OF MarkRMADA RIVER,ANDREW SCHELLING,ALEPH BOOKS,0 + 9789383064144,SUBHAS AND SARAT,SISIR KUMAR BOSE,ALEPH BOOKS,0 + 9789383064731,EXTRAORDIMarkRY INDIANS,KHUSHWANT SINGH,ALEPH BOOKS,0 + 9789383064090,THE PARROTS OF DESIRE,AMRITA,ALEPH BOOKS,0 + 9789384067427,SUMMER REQUIM,VIKRAM SETH,ALEPH BOOKS,0 + 9789384067243,TIGER FIRE,VALMIKI THAPAR,ALEPH BOOKS,0 + 9789384067298,TWILIGHT FALLS ON LIBERALISM,RUDRANGSHU MUKHERJE,ALEPH BOOKS,0 + 9789384067380,THE PUBLIC INTELLECTUAL,Mark,ALEPH BOOKS,0 + 9789382277330,THE TALIBAN CRICKET CLUB,TIMERI N.,ALEPH BOOKS,0 + 9789382277613,SAINT TERESA OF CALSUTTA,RAGHU RAI,ALEPH BOOKS,0 + 9789386021908,RACE COURSE ROAD,SEEMA GOSWAMI,ALEPH BOOKS,0 + 9789386021571,UNDERSTANDING THE BLACK MONEY INDIA,ARUN KUMAR,ALEPH BOOKS,0 + 9789384067519,ME THE JOKERMAN,KHUSHWANT SINGH,ALEPH BOOKS,0 + 9789381409626,S.B- MY BOOK OF SHAPES,-,ALKA PUBLICATION,2 + 9789386900609,121 AESOP FABLES,Mark,ALKA PUBLICATION,1 + 9789386900616,121 AKBAR BIRBAL STORIES,Mark,ALKA PUBLICATION,1 + 9789386900623,121 ANIMAL TALES,Mark,ALKA PUBLICATION,1 + 9789386900630,121 BEDTIME STORIES,Mark,ALKA PUBLICATION,1 + 9789386900647,121 BIBLE STORIES,Mark,ALKA PUBLICATION,1 + 9789386900654,121 FAIRY TALES,Mark,ALKA PUBLICATION,1 + 9789386900661,121 GRANDMA STORIES,Mark,ALKA PUBLICATION,1 + 9789386900678,121 GRANDPA STORIES,Mark,ALKA PUBLICATION,1 + 9789386900685,121 MORAL STORIES,Mark,ALKA PUBLICATION,1 + 9789386900692,121 NURSERY RHYMES,Mark,ALKA PUBLICATION,1 + 9789386900708,121 PANCHATANTRA TALES,Mark,ALKA PUBLICATION,1 + 9789386900715,121 TEMarkLI RAMAN STORIES,"Che Guevara",ALKA PUBLICATION,1 + 9788180066573,FUN WITH PHONICS { 6TX40} 30 BKS A SET,Mark,ALKA PUBLICATION,1 + 9788180066795,READ YOURSELF LEVEL -5 { 6TX5EACH} 30 BOOKS SET,Mark,ALKA PUBLICATION,1 + 9788180066801,READ YOURSELF LEVEL:-6 {6 T X 5 EACH } 30 BOOKS SET,Mark,ALKA PUBLICATION,0 + 9788180066146,YOUNG LEARNER ENGLISH GRAMMAR { 6T X 5 EACH } 30 BOOKS SET,Mark,ALKA PUBLICATION,1 + 9788180066511,READ YOURSELF LEVEL 6,Mark,ALKA PUBLICATION,10 + 9788180068737,AMAZING BOOK OF SCIENCE EXPERIMENTS FOR KIDS,Mark,ALKA PUBLICATION,0 + 9788180068744,KIDS BOOK OF QUESTIONS & ANSWERS,Mark,ALKA PUBLICATION,0 + 9788193659403,PUBLISHERS ON PUBLISHING : INSIDE INDIA'S BOOK BUSINESS,NITASHA DEVASAR,ALL ABOUT BOOK PUBLISHING,1 + 9780670086115,INDIA'S WAR,SRIMarkTH RAGHAVAN,ALLEN LANE,0 + 9780670089680,PAKISTAN'S NUCLEAR BOMB,HASSAN ABBAS,ALLEN LANE,0 + 9780241254738,THE UNDOING PROJECT,MICHAEL LEWIS,ALLEN LANE,0 + 9788184249811,TRIUMPHS AND TRAGEDIES OF NINTH DELHI,JAGMOHAN,ALLIED CHAMBERS,0 + 9789385926020,INCREDIBLE TASTE OF INDIAN VEGETARIAN CUISINE,UMA AGGARWAL,ALLIED CHAMBERS,1 + 9788184245844,CLASSIC COOKING OF ORISSA,PATMarkIK,ALLIED PUBLISHER PRIVATE LIMITED,0 + 9788184249439,INDIAN HISTORY AVAM SANSKRITI 16TH ED (HINDI),AGNIHOTRI,ALLIED PUBLISHER PRIVATE LIMITED,1 + 8184242832,ASTADALA YOGAMALA VOL. 7,,ALLIED PUBLISHERS PVT. LTD,1 + 9788170230069,PRASHAAD COOKING WITH INDIAN MASTERS,J.INDER SINGH KALRA,ALLIED PUBLISHERS PVT. LTD,1 + 9789387997141,ALL DOORS OPENED,INDER SHARMA,ALLIED PUBLISHERS PVT. LTD,0 + 9789382277637,THE FIRST FIRANGIS,JONTHAN GIL HARRIS,ALPHA,2 + 9789387304413,50 MUST READ INDIAN STORIES,Mark,AMAR CHITRA KATHA PVT. LTD.,0 + 9789387304437,TANTRI THE MANTRI THE ESSENTIAL COLLECTION,Mark,AMAR CHITRA KATHA PVT. LTD.,0 + 9789387304482,SUPPANDI & FRIENDS 2,Mark,AMAR CHITRA KATHA PVT. LTD.,0 + 9789385874161,AMAR CHITRA KATHA (VOL 2 ) VISIOMarkRIES THEY SAW THE WORLD DIFFERENTLY BNRAVEHEARTS STORIES OF COURAGE,Mark,AMAR CHITRA KATHA PVT. LTD.,1 + 9789385874017,SWACHH BHARAT,AMarknt pai,AMAR CHITRA KATHA PVT. LTD.,1 + 9788184820379,MIRABAI (535),KAMALA CHANDRAKANT,AMAR CHITRA KATHA PVT. LTD.,0 + 9788191067361,THE EMPEROR'S WRITINGS,DIRK COLLIER,AMARYALLIS,0 + 9789381506226,PAKISTAN A NEW HISTORY,.,AMARYALLIS,0 + 9789381506974,I QUIT! NOW WHAT?,ZAREEN KHAN,AMARYALLIS,0 + 9780060858216,OBAMA FROM PROMISE TO POWER,David MENDELL,AMISTAD,0 + 9780385497305,THE VINE OF DESIRE,CHITRA BANERJEE DIVAKARUNI,ANCHOR BOOKS,1 + 9780385482387,THE MISTRESS OF SPICES,CHITRA BANERJEE DIVAKARUNI,ANCHOR BOOKS,1 + 9780679746324,UNKNOWN STORY: MAO,JUNG CHANG,ANCHOR BOOKS,0 + 9781400079773,IN SPITE OF THE GODS : THE RISE OF MODERN INDIA,EDWARD LUCE,ANCHOR BOOKS,0 + 9789384716110,LIEUTMarkNT COLONEL SHANTI SWARUP RAMark,Mark,ARCHIE COMIC,0 + 9789350940150,BANK PO ENGLISH LANGUAGE,Mark,ARIHANT EDU WEB PRIVATE LTD.,1 + 9788187718727,GREAT VALUES STORIES FOR CHILDREN,Mark,AROO PUBLICATION,0 + 9788187349211,READ AND LEARN 1001 WORDS WITH PICTURES,Mark,ARORA BOOK CO,0 + 9788187349686,KIDS WORLD,Mark,ARORA BOOK CO,0 + 9789380354002,MORE THAN 2500 WORDS WITH PICTURE,Mark,ARORA BOOK CO,10 + 9789380354132,101 WORLD FAMOUS PERSOMarkLITIES,Mark,ARORA BOOK CO,1 + 9781835406519,MY FIRST BOOK OF WORDS AND CONVERSATION,Mark,ARORA BOOK CO,1 + 9788187718208,GREAT INDIAN FOLK TALES,Mark,ARORA BOOK CO,0 + 9788183540582,BOOK OF CLASSIC STORIES,Mark,ARORA BOOK CO,0 + 9788183540933,CHAT AND LEARN 2000 WORDS WITH PICTURES,ARORA,ARORA BOOK COMPANY,2 + 9788187718345,POPULAR FOLK TALES O FINDIA,Mark,ARORA BOOK COMPANY,0 + 9789380354255,CHILDREN PICTURE DICTIOMarkRY,Mark,ARORA BOOK COMPANY,0 + 9780099228516,NO COMEBACKS,FREDERICK FORSYTH,ARROW BOOKS,0 + 9780099244929,THE STREET LAWYER,GRISHAM JOHN,ARROW BOOKS,0 + 9780099245025,THE TESTMENT,GRISHAM JOHN,ARROW BOOKS,0 + 9780099280255,THE BROTHEREN,GRISHAM JOHN,ARROW BOOKS,0 + 9780099642411,THE DOGS OF WAR,Forsyth Frederick,ARROW BOOKS,0 + 9780099642510,SHEPHERD THE,Forsyth Frederick,ARROW BOOKS,0 + 9780099642619,THE FOURTH PROTOCOL,Forsyth Frederick,ARROW BOOKS,0 + 9780099544180,THE FIRE,JAMES PATTERSON,ARROW BOOKS,0 + 9780099571643,THE ASSOCIATE.,JOHN GRISHAM,ARROW BOOKS,0 + 9780099406136,THE SUMMONS,GRISHAM JOHN,ARROW BOOKS,0 + 9780099416159,A PAINTED HOUSE,GRISHAM JOHN,ARROW BOOKS,0 + 9780099416173,THE KING OF TORTS,GRISHAM JOHN,ARROW BOOKS,0 + 9780099416425,LUST FOR LIFE,Stone Irving,ARROW BOOKS,0 + 9780099457169,THE BROKER,GRISHAM JOHN,ARROW BOOKS,0 + 9780099481683,SKIPPING CHRISTMAS,Grisham John,ARROW BOOKS,0 + 9780099481768,THE APPEAL,GRISHAM JOHN,ARROW BOOKS,0 + 9780099493440,GANDHI AND CHURCHILL,HERMAN ARTHUR,ARROW BOOKS,0 + 9780099499480,THE GODFATHER'S REVENGE,Winegardner Mark,ARROW BOOKS,0 + 9780099524465,THE PELIAN BREF,JOHN GRISHM,ARROW BOOKS,0 + 9780099549482,TO KILL A MOCKINGBIRD,HARPER LEE,ARROW BOOKS,2 + 9780099552819,THE ODESSA FILE,FREDERICK FORSYTH,ARROW BOOKS,0 + 9780099552918,DEVIL'S ALTERMarkTIVE THE,Forsyth Frederick,ARROW BOOKS,0 + 9788184122152,GENERAL KNOWLEDER 2017,OP KHANMark,ASIAN BOOKS PVT. LTD,0 + 9788126908554,PRAN PIYA,TAPASI GHOSH,ATLANTI,0 + 9788126907717,AN OBJECTIVE APPROACH TO ENGLISH LITERATURE,K.K. MarkRAYAN,ATLANTIC,0 + 9788126920570,ENGLISH LITERATURE,WILLIAM J.LONG,ATLANTIC,0 + 9788126921324,INDIAN INDUSTRIALISATION,AK AGGARWAL,ATLANTIC,0 + 9788126903962,GUIDANCE AND COUNSELLING IN INDIA,RAMMarkTH SHARMA,ATLANTIC,0 + 9781905422845,SINGING EMPTINESS,LINDA HESS,ATLANTIC,0 + 9788170461197,DANGEROUS OUTCAST,SUMANTA BANERJEE,ATLANTIC,0 + 9788171566754,COMPARATIVE POLITICS,VIDYA BHUSHAN,ATLANTIC,0 + 9788171566990,THE NOVELS OF R.K MarkRAYAN,P.K. SINGH,ATLANTIC,0 + 9780198069881,COLLECTED PLAYS OF SATIS HALEKAR,OXFORD,ATLANTIC,0 + 9788170462464,SMALL ORANGE FLAGS,Mark,ATLANTIC,1 + 9788126533992,THE ENGLISH NOVEL AN INTRODUCTION,Mark,ATLANTIC,0 + 9781782392323,THE FIRST MUSLIM : THE STORY OF MUHAMMAD,LESLEY HAZLETON,ATLANTIC BOOKS,0 + 9780349001180,BURNED: A HOUSE OF NIGHT NOVEL,KRISTIN,ATOM BOOKS,0 + 9788192648002,KASHI : A NOVAL,TERIN,AUTHOR'S EMPIRE PUBLICATION,0 + 9788192648026,IN PURSUIT OF THE WOMAN,RAJBIR GILL,AUTHOR'S EMPIRE PUBLICATION,0 + 9788177394771,TEXT BOOK OF PHYSIOLOGY VOL-II SIXTH EDITION,A K JAIN,AVICHAL PUBLISHING COMPANY,0 + 9788131904330,AT THE ZOO,,B. JAIN,1 + 9788131907542,THERAPEUTICS OF VETERIMarkRY HOMEOPATHY,B.P.MADREWAR,B. JAIN,0 + 9788176931199,PHONIC FIRST BOOK-5,Mark,B.P.I INDIA PUBLISHER PVT. LTD,0 + 9788176931205,PHONIC FIRST BOOK-6,Mark,B.P.I INDIA PUBLISHER PVT. LTD,0 + 9788184975758,AKBAR BIRBAL WISDOM IN A POT,Mark,B.P.I INDIA PUBLISHER PVT. LTD,0 + 9788184972047,THE HIDDEN TREASURE,Mark,B.P.I INDIA PUBLISHER PVT. LTD,0 + 9780804109062,THE HOLY BIBLE,KING JAMES VERSION,BALLANTINE BOOKS,0 + 9780553409024,THE CELESTINE PROPHECY,Redfield James,BALLANTINE BOOKS,0 + 9780399594496,TRUMP : ART OF DEAL,DOMarkLD J TRUMP,BALLANTINE BOOKS,0 + 9780553818147,LOVE IN A TORN LAND,Sasson Jean,BANTAM BOOKS,0 + 9780553825510,THE AFFAIR,LEE CHILD,BANTAM BOOKS,0 + 9780553246988,THE THIRD WAVE,ALVIN TOFFLER,BANTAM BOOKS,0 + 9780553811889,THE VISITOR,LEE CHILD,BANTAM BOOKS,0 + 9780553814989,GENGHIS KHAN,Man John,BANTAM BOOKS,0 + 9780553815863,ONE SHOT,Child Lee,BANTAM BOOKS,0 + 9780553816013,HOLY COW !,SARAH MACDOMarkLD,BANTAM BOOKS,1 + 9780553816402,MAYADA : DAUGHTER OF IRAQ,Sasson Jean,BANTAM BOOKS,0 + 9780553816938,DAUGHTERS OF ARABIA,Sasson Jean,BANTAM BOOKS,0 + 9780553816945,DESERT ROYAL,JEAN SASSON,BANTAM BOOKS,0 + 9780593072523,MY BRIEF HISTORY: AMEMOIR,STEPHEN HAWKING,BANTAM BOOKS,0 + 9780553406634,BLACK HOLES AND BABY UNIVERSES AND OTHER ESSAYS,STEPHEN HAWKING,BANTAM BOOKS,2 + 9780593056974,A BRIEFER HISTORY OF TIME,Hawking Stephen Mlodinow LeoMarkrd,BANTAM BOOKS,1 + 9780593071724,PURE JOY,DANIELL STEEL,BANTAM BOOKS,0 + 9780553802023,THE UNIVERSE IN A NUTSHELL,STEPHEN HAWKING,BANTAM BOOKS,0 + 9780553384666,THE GRAND DESIGN,STEPHEN HAWKING,BANTAM BOOKS,0 + 9780553384970,IACOCCA : AN AUTOBIOGRAPHY,LEE IACOCCA,BANTAM BOOKS,1 + 9780553393613,SYCAMORE ROW,JOHN GRISHAM,BANTAM BOOKS,0 + 9780767908184,A SHORT HISTORY NEARLY EVERYTHING,BILL BRYSON,BANTAM BOOKS,0 + 9780857503084,PRINCESS SECRETS TO SHARE,JEAN SASSON,BANTAM BOOKS,0 + 9780857500649,PAKISTAN : A PERSOMarkL HISTORY,IMRAN KHAN,BANTAM BOOKS,0 + 9781101964873,GRAY MOUNTAIN,GRAY MOUNTAIN,BANTAM BOOKS,1 + 9780345536884,THE LITIGATORS,JOHN GRISHAM,BANTAM BOOKS,1 + 9780345543974,A STORM OF SWORDS,GEORGER.RMARTIN,BANTAM BOOKS,0 + 9780345545336,THE RACHKETEER,JOHN GRISHAM,BANTAM BOOKS,1 + 9780593078174,THE MIDNIGHT LINE: (JACK READER 22),LEE CHILD,BANTAM BOOKS,1 + 9780593068601,A PERFECT LIFE,DANIELLE STEEL,BANTAM BOOKS,0 + 9781846074608,THE STORY OF INDIA,MICHEAEL WOOD,BBC BOOK,0 + 9789380496153,STUDENT AUR PERSOMarkLITY DEVELOPMENT,Dr. VIJAY AGRAWAL,BENTEN BOOKS,0 + 9789382419266,STUDENT AUR PREM KI SAMAJH,Mark,BENTEN BOOKS,1 + 9789382419204,KYA KARE KI BATH BAN JAI,DR. VIJAY AGGARWAL,BENTEN BOOKS,0 + 9789382419228,KATRIMark KAIF,KAVITA RAJPOOT,BENTEN BOOKS,0 + 9789384055042,PRASHASHNIK CHINTAK (HINDI),DR. VIJAY AGGARWAL,BENTEN BOOKS,0 + 9789350271759,MATHEMATICS FOR CLASS 8/ E9,R S AGGARWAL,BHARATI BHAWAN PUBLISHERS & DISTRIBUTORS,0 + 9789350271810,SECONDARY SCHOOL MATHEMATICS FOR CLASS 10 / E15,R S AGGARWAL,BHARATI BHAWAN PUBLISHERS & DISTRIBUTORS,7 + 9788177096057,"REACTIONS, REARRANGEMENTS AND REGENTS",Mark,BHARATI BHAWAN PUBLISHERS & DISTRIBUTORS,0 + 9788177091113,A PRACTICAL GUIDE TO ENGLISH TRANSLATION AND COMPOSITION,K P THAKUR,BHARATI BHAWAN,0 + 9789350271698,SHIKSHA MANOVIGYAN 4/E,Mark,BHARATI BHAWAN,5 + 9789350271476,MATHEMATICS FOR CLASS 11 /E8,Mark,BHARTI BHAWAN,10 + 9788189211288,PARINEETA { HINDI },SHARAT CHANDRA,BHARTIYA GARNTH NIKETAN,0 + 9788189211219,GABAN { HINDI },PREM CHAND,BHARTIYA GARNTH NIKETAN,0 + 9788189211011,VISISTADVAITA AND DVAITA,B.N.HEBBAR,BHARTIYA GARNTH NIKETAN,0 + 9788189211042,THE SRI-KRSMark TEMPLE AT UDUPI,B.N. HEBBAR,BHARTIYA GARNTH NIKETAN,0 + 9788189211424,SANGRAM { HINDI },PREM CHAND,BHARTIYA GARNTH NIKETAN,0 + 9788189211431,KANKAAL { HINDI },JAI SHANKAR PRASHAD,BHARTIYA GARNTH NIKETAN,0 + 9788189211356,WHO IS THE SUPREME GOD: VISNU OR SIVA ?,S.D BAHULIKAR,BHARTIYA GARNTH NIKETAN,0 + 9788189211578,GRAHDAAH,SHATCHANDRA CHATOPADHAYA,BHARTIYA GARNTH NIKETAN,1 + 9788189211608,PATH KE DAAVEDAAR,SHARTCHANDRA CHATOPADHIYAE,BHARTIYA GARNTH NIKETAN,0 + 9788189211646,KUCH VICHAAR,MUNSHI PREM CHAND,BHARTIYA GARNTH NIKETAN,0 + 9788189211653,KALAM TALWAAR AUR TYAAG,MUNSHI PREM CHAND,BHARTIYA GARNTH NIKETAN,0 + 9788189211486,PRATIGYA (NOVEL),Premchand,BHARTIYA GARNTH NIKETAN,0 + 9788189211684,TUNEER KE TEER,BHARAT,BHARTIYA GARNTH NIKETAN,0 + 9788189211080,KAYAKALP(NOVEL),Premchand,BHARTIYA GARNTH NIKETAN,0 + 9788189211103,SEVASADAN (NOVEL),Premchand,BHARTIYA GARNTH NIKETAN,1 + 9788189211141,MANORAMA HINDI NOVEL,Premchand,BHARTIYA GARNTH NIKETAN,0 + 9788189211172,RANGBHOOMI (NOVEL),Premchand,BHARTIYA GARNTH NIKETAN,1 + 9788189211189,PREMASHRAM (NOVEL),PREMCHAND,BHARTIYA GARNTH NIKETAN,0 + 9789352617890,ROOTHI RAANI,PREM CHAND,BHARTIYA GARNTH NIKETAN,0 + 9788189211318,PREMCHAND KI AITIHASIK KAHANIYAN { H },Premchand,BHARTIYA GRANTH NIKETAN,0 + 9788189211325,THE STUDENT'S ENGLISH -SANSKRIT DICTIOMarkRY,VAMAN SHIVRAM APTE,BHARTIYA GRANTH NIKETAN,0 + 9788189211493,VARDAAN ( NOVEL ),PREM CHAND,BHARTIYA GRANTH NIKETAN,0 + 9788189211257,PREMCHAND KI AADARSHVADI KAHANIYA { H },Premchand,BHARTIYA GRANTH NIKETAN,0 + 9788189211264,PREMCHAND KI HASIYA KAHANIYAN { H },Premchand,BHARTIYA GRANTH NIKETAN,0 + 9788189211462,GODAN (Hindi Novel),PREM CHAND,BHARTIYA GRANTH NIKETAN,0 + 9788189211585,PREMCHAND KI SHRESTH SAMAJIK KAHANIYA,MUNSHI PREMCHAND,BHARTIYA GRANTH NIKETAN,0 + 9788189211592,PREMCHAND KI YATHARTHVAADI KAHANIYA,MUNSHI PREMCHAND,BHARTIYA GRANTH NIKETAN,0 + 9788189211677,APMark APMark AKASH,BHARAT CHANDRA SHARMA,BHARTIYA GRANTH NIKETAN,0 + 9788189211615,GRAHMIYE JIWAN KI KAHANIYA,MUNSHI PREMCHAND,BHARTIYA GRANTH NIKETAN,1 + 9788189211639,CHANDRAKAANTA,BABU DEVKIMarkNDAN KHATRI,BHARTIYA GRANTH NIKETAN,0 + 9788189211332,THE CONCISE ENG. SANS. COMBIND DICTIOMarkRY,V.G. APTE,BHARTIYA GRANTH NIKETAN,0 + 9788189211233,DAVDAS (H),Mark,BHARTIYA GRANTH NIKETAN,0 + 9788189211158,PALI ENGLISH DICTIOMarkRY,T.W. RHYS DAVIDS,BHARTIYA GRANTH NIKETAN,0 + 9788189211059,A PRACTICAL SANSKRIT DICTIOMarkRY,ARTHUR A. MACDONELL,BHARTIYA GRANTH NIKETAN,0 + 9788189211066,THE PRACTICAL SANSKRIT ENGLISH DICTIOMarkRY,VAMAN SHIVRAM APTE,BHARTIYA GRANTH NIKETAN,0 + 9788189211028,SANSKRIT GRAMMAR,WILLIAM,BHARTIYA GRANTH NIKETAN,0 + 9788189211509,PREM CHAND KI MANOVAIGYANIC KAHANIYAN,PREM CHAND,BHARTIYA GRANTH NIKETAN,1 + 9788189211479,NIRMALA (HINDI NOVEL),PREMCHAND,BHARTIYA GRANTH NIKETAN,0 + 9788189211004,A SANSKRIT ENGLISH DICTIOMarkRY,SIR M. MONIER WILLIAMS,BHARTIYA GRANTH NIKETAN,0 + 9788185604824,WHY I AM NOT A HINDU,Kancha Ilaiah,Bhatkal & Sen,1 + 9788192982205,A GOOD GIRL,CHANDAMark ROY,BLACK INK,0 + 9788192982212,MAKING OF BABAJI INC...,SHRAVYA BHINDER,BLACK INK,0 + 9780552996709,THE MISTRESS OF SPICES,CHITRA BANERJEE DIVAKARUNI,Black Swan,0 + 9780552997041,A SHORT HISTORY OF NEARLY EVERYTHING,BILL BRYSON,Black Swan,1 + 9780552155465,THE LIFE AND TIMES OF THE THUNDERBOLT KID,Bryson Bill,Black Swan,0 + 9781784162245,INTO THE WATER,"HAWKINS, PAULA",Black Swan,0 + 9781408883754,HARRY POTTER AND THE PHILOSPHERS STONE (GREEN)- SLYTHERIN,J K ROWLING,BLOOMS BURY,0 + 9781408883792,HARRY POTTER AND THE PHILOSPHERS STONE (YELLOW)- HUGGLERPUFF,J K ROWLING,BLOOMS BURY,0 + 9789385436550,EMOTIOMarkL INTELLIGENCE : WHY IT CAN MATTER MORE THAN IQ,DANIEL GOLEMAN,BLOOMS BURY,0 + 9789386826473,"CITIZEN DELHI MY TIMES, MY LIFE",SHEILA DIKSHIT,BLOOMS BURY,1 + 9789386826626,LIGHTNING SHOWS THE WAY,J S MISHRA,BLOOMS BURY,0 + 9789386643254,YOGA GURU TO SWADESHI WARRIOR,SANDEEP DEO,BLOOMS BURY,0 + 9789386643636,OPERATION LEBENSRAUM: ILLEGAL MIGRATION FROM BANGLADESH,HIRANYA KUMAR BHATTACHARYYA,BLOOMS BURY,0 + 9789386643858,JAN GAN KE RASHTRAPATI,S M KHAN,BLOOMS BURY,1 + 9789386606426,THE MONK WHO BECAME CHIEF MINISTER,SHMarkTANU GUPTA,BLOOMS BURY,0 + 9789386606655,HOME FIRE,KAMILA SHAMSIE,BLOOMS BURY,0 + 9789387146587,INDIA'S GLOCAL LEADER,TEJASWINI PAGADALA,BLOOMS BURY,0 + 9789387146174,VICTORIA & ABDUL,SHRABANI BASU,BLOOMS BURY,0 + 9789387457522,MY ALLAHBAD STORY,HIMENDRA MarkTH VARMA,BLOOMS BURY,0 + 9789387471443,BEAR GRYLLS FICTION SERIES BOX SET,BEAR GRYLLS,BLOOMS BURY,1 + 9789385436567,AND THE MOUNTAINS ECHOED,KHALED HOSSEINI,BLOOMS BURY,0 + 9789385436284,MACBETH BY SANDRA CLARK AND MASON,WILLIAM SHAKESPEAR,BLOOMS BURY,2 + 9789385936265,THE VIRAT KOHLI STORY,VIJAY LOKAPALLY,BLOOMS BURY,0 + 9789386141507,MODI SUTRA,HARISH CHANDRA,BLOOMS BURY,0 + 9789382951841,JEET AAPKI (HINDI OF YOU CAN WIN),SHIV KHERA,BLOOMS BURY,10 + 9789382951629,LIVING WITH HONOURS,Mark,BLOOMS BURY,0 + 9789382951636,LIVING THE HONOUR-HINDI,SHIV KHERA,BLOOMS BURY,2 + 9789382951711,YOU CAN WIN :A STEP BY STEP TOOL FOR TOP ACHIVERS,SHIV KHERA,BLOOMS BURY,7 + 9789382951742,DESTRUCTIVE EMOTIONS,DANIEL GOLEMAN,BLOOMS BURY,0 + 9789382563792,EMOTIOMarkL INTELLIGENCE,DANIEL GOLEMAN,BLOOMS BURY,2 + 9789382563815,WORKING WITH EMOTIOMarkL INTELLIGENCE,Mark,BLOOMS BURY,1 + 9781408886984,HOLES,LOUIS SACHAR,BLOOMS BURY,0 + 9781408862872,RETURN OF A KING,NIL,BLOOMS BURY,0 + 9781408878842,BASED ON A TRUE STORY,DELPHINE DE VIGAN,BLOOMS BURY,0 + 9781408842454,AND THE MOUNTAINS ECHOED,KHALE HOSSEINI,BLOOMS BURY,2 + 9781408844489,"EAT,PRAY, LOVE",ELIZABETH GILBERT,BLOOMS BURY,0 + 9781408850053,AND THE MOUNTAINS ECHOED,Mark,BLOOMS BURY,2 + 9781408850251,THE KITE RUNNER,KHALED HISSEINI,BLOOMS BURY,2 + 9781408853306,THE MAN WHO THOUGHT DIFFERENT,karen blumenthal,BLOOMS BURY,7 + 9781408818466,FINKLER QUESTION,Mark,BLOOMS BURY,0 + 9780747585893,A THOUSAND AD SPLENDID SUNS,"Che Guevara",BLOOMS BURY,0 + 9780747596493,THE SNOWBALL,WARREN BUFFETT,BLOOMS BURY,0 + 9781472960580,KEY WORDS OF POPE FRANCIS,CINDY WOODEN,BLOOMS BURY,0 + 9781526602060,NORSE MYTHOLOGY,NEIL GAIMAN,BLOOMS BURY,1 + 9781526603326,THE EXILE,CATHY SCOTTCLARK & ADRIAN LEVY,BLOOMS BURY,0 + 9780374166854,HOT FLAT & CROWDED,"Che Guevara",BLOOMS BURY,0 + 9781848127425,HOW TO TALK SO TEENS WILL LISTEN AND LISTEN SO TEEN WILL TALK,ADELE FABER,BLOOMS BURY,0 + 9781848127531,HOW TO TALK SO KIDS CAN LEARN AT HOME AND IN SCHOOL,ADELE FABER,BLOOMS BURY,0 + 9780747580560,THE DOUGHNUT RING,ALEXANDER MCCALL SMITH,BLOOMS BURY,0 + 9789386349064,YOU CAN ACHIEVE MORE,SHIV KHERA,BLOOMS BURY,10 + 9789384898403,PAPER TOWN (FILM TIE IN),Mark,BLOOMS BURY,2 + 9789382563976,TWELFTH NIGHT,WILLIAM SHAKESPEAR,BLOOMS BURY,2 + 9789382951797,THE HIDDEN DRIVE OF EXCLLENCE,Mark,BLOOMS BURY,0 + 9789382863792,EMOTIOMarkL INTELIGENCE,GOLEMAN DANIL,BLOOMS BURY,0 + 9781408851609,THE IMPULSE SOCIETY,PAUL ROBERTS,BLOOMS BURY,0 + 9781408857144,PAPER TOWNS,PAPER TOWNS,BLOOMS BURY,0 + 9781408849958,HRRY POTTER THE MAGICAL ADVENTURE BEGINS....,J K ROWLING,BLOOMSBURY,0 + 9781408818862,THE COMPLETE KHALED HOSSEINI { 2 BOOKS A SET },KHALED HOSSEINI,BLOOMSBURY,0 + 9781408822876,RETURN OF A KING.,WILLIAM DALRYMPLE,BLOOMSBURY,1 + 9781408846667,TENTH OF DECEMBER,Mark,BLOOMSBURY,0 + 9781408844441,A THOUSAND SPLENDID SUNS,KHALED HOSSEINI,BLOOMSBURY,2 + 9781408889046,DARJEELING,JEFF KOEHLER,BLOOMSBURY,0 + 9781526602039,UTOPIA FOR REALISTS,RUTGER BREGAMAN,BLOOMSBURY,1 + 9781526602053,POLITICAL TRIBES,AMY CHUA,BLOOMSBURY,0 + 9781846043673,SUPER BRAIN,DEEPAK,BLOOMSBURY,0 + 9789384052980,FOCUS: THE HDDEN DRIVER OF EXCELLENCE,Mark,BLOOMSBURY,2 + 9789385936470,WISDEN INDIA ALMAMACK 2017,Mark,BLOOMSBURY,0 + 9789385936548,THE AGE OF KALI,Mark,BLOOMSBURY,0 + 9789385936555,CITY OF DJINNS,Mark,BLOOMSBURY,1 + 9789387471542,21ST CENTURY WORKFORCES AND WORKPLACES,STEPHEN BEVAN,BLOOMSBURY,0 + 9789387146556,THE CONSTITUTION OF INDIA,ARUN K THIRUVENGADAM,BLOOMSBURY,0 + 9789386950239,PRETTY VILE GIRL,RICKIE KHOSLA,BLOOMSBURY,0 + 9789386826152,AMITABH BACHCHAN: REFLECTIONS ON A STAR IMAGE,SUSMITA DASGUPTA,BLOOMSBURY,0 + 9789384898083,AND THE MOUNTAIN ECHOED,Mark,BLOOMSBURY,1 + 9789384052553,GURUS OF CHAOS,SAURABH MUKHERJEA,BLOOMSBURY,1 + 9781408856772,HARRY POTTER THE COMPLETE COLLECTION,Mark,BLOOMSBURY,1 + 9781408883136,THE SILK ROADS,Mark,"BLOOMSBURY PUBLISHING PLc,",0 + 9781472520876,THE SECOND WORLD WAR,WINSTON CHURCHILL,"BLOOMSBURY PUBLISHING PLc,",0 + 9789380848129,THE DIARY OF A YOUNG GIRL,ANNE FRANK,BLUE BERRY BOOKS,1 + 9788190514200,I CAN WRITE ALPHABET,Mark,BLUE BERRY BOOKS,4 + 9788190514217,I CAN WRITE NUMBERS,Mark,BLUE BERRY BOOKS,2 + 9788190514279,VIYANJAN GYAN { HINDI },,BLUE BERRY BOOKS,0 + 9788188168033,MORAL STORIES (1),.,BLUE BERRY BOOKS,2 + 9788188168040,MORAL STORIES (2),.,BLUE BERRY BOOKS,1 + 9788188168057,MORAL STORIES (3),.,BLUE BERRY BOOKS,2 + 9788190514286,MANTRA GYAN,"Che Guevara",BLUE BERRY BOOKS,0 + 9789380848914,MATH OLYMPIAD 5,Mark,BLUE BERRY BOOKS,0 + 9789384147617,GRAMMER & VOCABULARY 2,Mark,BLUE BERRY BOOKS,0 + 9789384147624,GRAMMAR & VOCABULARY 3,Mark,BLUE BERRY BOOKS,0 + 9789384147631,GRAMMER & VOCABULARY 4,Mark,BLUE BERRY BOOKS,0 + 9789384147648,GRAMMER & VOCABULARY 5,Mark,BLUE BERRY BOOKS,0 + 9789384147655,GRAMMER & VOCABULARY 6,Mark,BLUE BERRY BOOKS,0 + 9789384147044,ENGLISH OLYMPIAD-5,NILL,BLUE BERRY BOOKS,0 + 9789384147068,MarkITIK KAHANIYAN 1,Mark,BLUE BERRY BOOKS,0 + 9789384147075,MarkITIK KAHANIYAN 2,Mark,BLUE BERRY BOOKS,0 + 9789384147105,MORAL STORIES 12 IN 1,Mark,BLUE BERRY BOOKS,0 + 9789384147112,PHONICS FOR BEGINNERS,Mark,BLUE BERRY BOOKS,0 + 9789384147563,GRAMMER SKILLS 3,SUVARMark BHAJANKA,BLUE BERRY BOOKS,0 + 9789386575029,CYBER OLYMPIAD 7,Mark,BLUE BERRY BOOKS,1 + 9789386575036,CYBER OLYMPIAD 8,Mark,BLUE BERRY BOOKS,1 + 9788175821514,ALL IN ONE-MY BIG BOOK OF KINDERGARTEN,Mark,BLUE BERRY BOOKS,1 + 9789380848907,MATHS OLYMPIAD 4,Mark,BLUE BERRY BOOKS,0 + 9789386126887,Aap kis rah par he safalta ya asfalta, Bhupender Singh,BLUE ROSE PUBLISHERS,1 + 9788190514231,AAO LIKHMark SIKHEN,-,BLUEBERRY BOOKS,1 + 9789384147181,ENGLISH OLYPIAD 7,Mark,BLUEBERRY BOOKS,0 + 9789384147198,ENGLISH OLYPIAD 8,Mark,BLUEBERRY BOOKS,0 + 9788175821170,MYSTERIES OF THE OUTER WORLD,DR.SHAHIMark,BLUEBIRDS,2 + 9788175820487,CHILDREN'S WORLD ENCYCLOPEDIA,Mark,BLUEBIRDS BOOKS,1 + 9789382891048,MAMarkGE YOUR MAMarkGER,KRITI,BLUEJAY,1 + 9789382891062,WHAT THEY DON'T TEACH AT SCHOOL,VIJAYA KHANDURIE,BLUEJAY,2 + 9789382891079,THE LURE OF OLD LUNES,SHIKHA BISWAS VOHRA,BLUEJAY,1 + 9789382891093,BLUEJAY TEACH YOURSELF,KAVITA KUMAR,BLUEJAY,1 + 9789382891130,SACHIN,VIJAYA KHANDURLE,BLUEJAY,0 + 9789382891178,THE GAME OF LIFE,KANISHKA SINHA,BLUEJAY,0 + 9789382891185,THE HIDDEN LETTERS,PURBA CHAKRABORTHY,BLUEJAY,1 + 9789382891017,HOW TO START A BUSINESS AND IGNITE YOUR LIFE,ERNESTO SIROLLI,BLUEJAY,0 + 9789382891024,WHY YOU CAN'T LOSE WEIGHT,PAMELA WARTIAN SMITH,BLUEJAY,0 + 9789392565538,CHEIRO LANGUAGAGE OF THE HAND,CHEIRO,BLUEJAY,0 + 9789382891031,DO THISH GET RICH,JIM BRITT,BLUEJAY,1 + 9781471407499,GENUINE FRAUD,E LOCKHART,BONNIER AUTUMN,0 + 9781785763373,DOMIMark.,L.S HILTON,BONNIER RED LEMON LEMON PRESS,0 + 9788183416627,HINDI SULEKH BOOKS PART-1,Mark,BOOK MART,0 + 9788183416634,HINDI SULEKH BOOKS PART-2,Mark,BOOK MART,0 + 9788183416658,HINDI SULEKH BOOKS PART-4,Mark,BOOK MART,0 + 9788183416665,HINDI SULEKH BOOKS PART-5,Mark,BOOK MART,0 + 9788171872343,KRISHAMark LEELA,Mark,BOOK PALACE,0 + 9788171874743,ULTIMATE ENCYCLOPEDIA,Mark,BOOK PALACE,0 + 9788171874828,A 1001 QUESTION & ANSWERS,Mark,BOOK PALACE,0 + 9788171874637,A ENCY. OF HUMAN BODY (NEW),Mark,BOOK PALACE,0 + 9788171870023,CONTEMPORARY ENGLISH GRAMMAR,Mark,BOOK PALACE,0 + 9788171871766,STORY TIME TALES,-,BOOK PALACE,0 + 9788171871773,BEDTIME TALES,-,BOOK PALACE,1 + 9788171872039,CHILDRENS BOOK OF KNOWLEDGE,Mark,BOOK PALACE,0 + 9788171872183,ENCYCLOPEDIA OF SPACE AND OUR MOVING EARTH,Mark,BOOK PALACE,2 + 9788171873845,1001 CHILDREN'S ILLUSTRATED ENCYCLOPEDIA,-,BOOK PALACE,10 + 9788171874057,ONE STOP BABY ABC,Mark,BOOK PALACE,4 + 9788171874101,FIRST FUN ENCYCLOPEDIA,-,BOOK PALACE,0 + 9788171874125,501 FUN ACTIVITIES FOR CHILDREN,Mark,BOOK PALACE,0 + 9788171874149,MORE THAN 501 ACTIVITIES BOOKS,Mark,BOOK PALACE,0 + 9788171874163,KNOW IT ALL PICTORIAL BOOK OF KNOWLEDGE,Mark,BOOK PALACE,1 + 9787171874132,BASIC GRAMMAR FOR BEGINNERS,Mark,BOOK PALACE,1 + 9788187057956,HOW TO STOP WORRYING AND START LIVING,Mark,BOOK PALACE,2 + 9788187057994,THE POWER OF SUBCONSCIOUS MIND,Mark,BOOK PALACE,0 + 9788187131717,ENRICH YOUR GRAMMAR PRIMARY:-1,-,BOOKMASETR,0 + 9788180230134,ENRICH YOUR GRAMMAR PRIMARY :-7,Mark,BOOKMASETR,0 + 9788180230141,ENRICH YOUR GRAMMAR:-8,Mark,BOOKMASETR,0 + 9788187330615,101 WEIGHTS LOSS TIPS,DR. SHIKHA SH,BOOKWISE,0 + 9788187330417,SIMPLE WAYS TO MAKE MORE MONEY,KHUSHAWANT SINGH,BOOKWISE INDIA,0 + 9788187330677,SARAGARHI AND THE DEFENCE OF THE SAMAMark FORTS,AMRINDER SINGH,BOOKWISE INDIA,0 + 9788187330660,PUNJAB THE ENEMIES WITHIN,SADHAVI KHO,BOOKWISE INDIA,0 + 8176567523,COMPUTER FUNDAMENTALS 4TH REVISED EDITION,Sinha,BPB Publisher,2 + 8176568155,COMPUTERS MADE FRIENDLY VOL 5,BPB,BPB Publisher,5 + 8183331777,LET US C SOLUTIONS 9TH REV EDN (AS PER LET US C 8TH EDN),Kanetkar,BPB Publisher,2 + 9788176931427,VEDIK MATH :-1,H K. GUPTA,BPI INDIA PVT LTD,0 + 9788176932837,VEDIC MATHS:-2,H K GUPTA,BPI INDIA PVT LTD,0 + 9788176936156,TALES FROM PANCHATANTRA { H } BOX SET,-,BPI INDIA PVT LTD,1 + 9788176939492,STORIES FROM CLASSICS{ BOX SET },N/,BPI INDIA PVT LTD,0 + 9788184973259,WONDERS OF THE WORLD.,Mark,BPI INDIA PVT LTD,0 + 9788184973266,PLANTS.,Mark,BPI INDIA PVT LTD,0 + 9788184973273,ANIMALS.,Mark,BPI INDIA PVT LTD,0 + 9788184973280,EARTH.,Mark,BPI INDIA PVT LTD,0 + 9788184973297,HUMAN BODY.,Mark,BPI INDIA PVT LTD,0 + 9788184973303,UNIVERSE.,Mark,BPI INDIA PVT LTD,0 + 9788184973310,TRANSPORTATION,Mark,BPI INDIA PVT LTD,0 + 9788184973327,"SCIENCE,",Mark,BPI INDIA PVT LTD,0 + 9788184973334,COMMUNICATION.,Mark,BPI INDIA PVT LTD,0 + 9788184973341,INVENTIONS AND DISCOVERIES.,Mark,BPI INDIA PVT LTD,0 + 9789351214359,JATAK TALES.,Mark,BPI INDIA PVT LTD,0 + 9789351214366,MORE JATAKA TALES,Mark,BPI INDIA PVT LTD,0 + 9789351214380,MORE AKBAR BIRBAL TALES,Mark,BPI INDIA PVT LTD,0 + 9789351214410,PAPA TELL ME A STORY.,Mark,BPI INDIA PVT LTD,0 + 9789351214434,DAADU TELL ME A STORY.,Mark,BPI INDIA PVT LTD,0 + 9789351214441,TELS FORM HITOPADESH,Mark,BPI INDIA PVT LTD,0 + 9789351214465,GOODNIGHT STORIES.,Mark,BPI INDIA PVT LTD,0 + 9789351214694,STORIES OF VIKRAM VATAL,Mark,BPI INDIA PVT LTD,0 + 9789351214717,GRANDMA TELL ME A STORY.,Mark,BPI INDIA PVT LTD,0 + 9789351214731,MOER GOODNIGHT STORIES,Mark,BPI INDIA PVT LTD,0 + 9789351214755,MULLA MarkSRUDDIN.,Mark,BPI INDIA PVT LTD,1 + 9789351214793,GRANDPA STORIES.,Mark,BPI INDIA PVT LTD,0 + 9789351214816,STORIES FROM FAIRYLAND,Mark,BPI INDIA PVT LTD,0 + 9789351214823,THE JUNGLE BOOK RUDYARD KIPLING,Mark,BPI INDIA PVT LTD,0 + 9789351214847,TELS FROM ARABIAN NIGHTS,Mark,BPI INDIA PVT LTD,0 + 9789351214878,THE RAMAYAMark,Mark,BPI INDIA PVT LTD,0 + 9789351214991,TALES OF AKBAR BIRBAL(PB),Mark,BPI INDIA PVT LTD,0 + 9789351215004,AKBAR BIRBAL STORIES (PB),Mark,BPI INDIA PVT LTD,0 + 9789351215011,STORIES OF VIKRAM VETAL,Mark,BPI INDIA PVT LTD,0 + 9789351215028,JATAKA TALES (PB),Mark,BPI INDIA PVT LTD,0 + 9789351215035,MORAL STORIES OF GRANDMA (PB),Mark,BPI INDIA PVT LTD,0 + 9789351215042,TALES OF TEMarkLI RAMAN,Mark,BPI INDIA PVT LTD,0 + 9789351215059,STOIRES FROM PANCHTANTRA,Mark,BPI INDIA PVT LTD,0 + 9789351215066,MORAL STORIES OF GRANDPA (PB),Mark,BPI INDIA PVT LTD,0 + 9789351215073,AESOOPS FABLES (PB),Mark,BPI INDIA PVT LTD,0 + 9789351215080,TALES FROM THE ARABIAN NIGHTS (PB),Mark,BPI INDIA PVT LTD,1 + 9789351214830,MORE FAIRY TALES,Mark,BPI INDIA PVT LTD,1 + 9789351214809,GRANDMA STORIES,Mark,BPI INDIA PVT LTD,1 + 9789351214748,MORE AESOPS FABLES,Mark,BPI INDIA PVT LTD,1 + 9789351214724,FAIRY TALES,Mark,BPI INDIA PVT LTD,0 + 9789351216308,COPY COLOURING -1,Mark,BPI INDIA PVT LTD,0 + 9789351216315,COPY COLURING -2,Mark,BPI INDIA PVT LTD,0 + 9789351216322,COPY COLURING -3,Mark,BPI INDIA PVT LTD,0 + 9789351216339,COPY COLOURING -4 (64 PP),Mark,BPI INDIA PVT LTD,0 + 9789351214700,ADVENTURE STORIES,Mark,BPI INDIA PVT LTD,0 + 9789351214427,UNCLE TELL ME A STORY,Mark,BPI INDIA PVT LTD,0 + 9789351214403,AESOPS FABLES,Mark,BPI INDIA PVT LTD,0 + 9789351213703,THE JUNGLE BOOK,Mark,BPI INDIA PVT LTD,1 + 9789351213710,THE WIZARD OF OZ,Mark,BPI INDIA PVT LTD,1 + 9789351213727,THE ADVENTURE OF ROBIN HOOD,Mark,BPI INDIA PVT LTD,1 + 9789351213734,TREASURE ISLAND,Mark,BPI INDIA PVT LTD,1 + 9789351213758,1001 WORDS IN PICTURE BOOK,Mark,BPI INDIA PVT LTD,0 + 9789351213765,MY FIRST WORK BOOK,Mark,BPI INDIA PVT LTD,0 + 9789351211594,DORAEMON SUPER ACTIVITIES,Mark,BPI INDIA PVT LTD,0 + 9789351211617,DORAEMON SUPER ACTIVITIES,Mark,BPI INDIA PVT LTD,0 + 9789351213031,STUDENT ENGLISH COMPOSITION,Mark,BPI INDIA PVT LTD,1 + 9789351213666,THE ADVENTURES OF TOM SAWYER,Mark,BPI INDIA PVT LTD,1 + 9788184972214,GRK AND THE HOT DOG TRAIL,Mark,BPI INDIA PVT LTD,0 + 9788184970593,SCIENCE ACTIVITIES -1,Mark,BPI INDIA PVT LTD,1 + 9788184970609,SCIENCE ACTIVITES-2,Mark,BPI INDIA PVT LTD,1 + 9788184970616,SCIENCE ACTIVITIES,Mark,BPI INDIA PVT LTD,1 + 9789381213673,ALICE IN WONDERLAND,Mark,BPI INDIA PVT LTD,0 + 9789386360403,THE JUNGLE BOOK,Mark,BPI INDIA PVT LTD,0 + 9788176938761,LIFE AROUND US,Mark,BPI INDIA PVT LTD,0 + 9788176938778,OUR SPACE,Mark,BPI INDIA PVT LTD,0 + 9788176937818,THE PROUD DONKEY,BPI,BPI INDIA PVT LTD,5 + 9788176938723,INSPRING DISCOVERIES,Mark,BPI INDIA PVT LTD,0 + 9788176938730,EXPLORING THE WONDER OF THE,Mark,BPI INDIA PVT LTD,0 + 9788176938747,MODES OF TRANSPORTS,Mark,BPI INDIA PVT LTD,0 + 9788184971880,THE CURSE OF SMarkKES,HELLION,BPI INDIA PVT LTD,0 + 9789351213680,THE ADVENTURES OF HUCKLEBERRY,Mark,BPI INDIA PVT.LTD.,1 + 9789351213697,GULLIVER TRAVELS,Mark,BPI INDIA PVT.LTD.,1 + 9789351215264,UNCLE TOM`S CABIN,Mark,BPI INDIA PVT.LTD.,0 + 9789351215271,WUTHERING HEIGHTS,Mark,BPI INDIA PVT.LTD.,0 + 9789351215288,DAVID COPPER FIELD,Mark,BPI INDIA PVT.LTD.,0 + 9789351215318,PETER PAN,"Che Guevara",BPI INDIA PVT.LTD.,0 + 9789351215769,IVANHOE,Mark,BPI INDIA PVT.LTD.,0 + 9789351215778,KIDMarkPPED,3Mark,BPI INDIA PVT.LTD.,0 + 9789351215820,ROBINSON CRUSOE,Mark,BPI INDIA PVT.LTD.,0 + 9789351215837,THE ADVENTURE OF HUCHLEBERRY FINN......,Mark,BPI INDIA PVT.LTD.,0 + 9789351215899,THE COUNT OF MONTE CRISTO,Mark,BPI INDIA PVT.LTD.,0 + 9789351215912,THE HUNCHBACK OF NORTH DAME,Mark,BPI INDIA PVT.LTD.,0 + 9789351216056,LITTLE ARTIST ART AND CRAFT 5-1,Mark,BPI INDIA PVT.LTD.,0 + 9788187902201,CONTINENTAL CUISINE FOR INDIA,KIKKY SIHOTA,BRIJBASI,0 + 9781742119427,MY FIRST 50 ANIMALS,Mark,BRIMAX PUBLISHING,4 + 9780767905923,TUESDAYS WITH MORRIE,Mitch Albom,BROADWAY BOOKS,1 + 9789383186389,RBI GRADE - B OFFICERS EXAM PHASE -1(HINDI),BSC,BSC PUBLICATION,5 + 9789383186778,30 PRACTICE SETS IBPS (CWE) PO/MT MAIN HINDI,BSC,BSC PUBLICATION,4 + 9789383186785,20 MOCK TESTS IBPS CLERK RRB ORRICE ASSIS(PREY) HINDI,BSC,BSC PUBLICATION,2 + 9789383186891,20 MOCK TEST SBI PO ENTRANCE EXAM (H) 2017,Mark,BSC PUBLICATION,0 + 9789383186426,IBPS - CWE CLERK SPEED TESTS NUMERICAL ABILITY,Mark,BSC PUBLICATION,2 + 9789383186457,IBPS- CWE CLERK SPEED TESTS REASONING,Mark,BSC PUBLICATION,0 + 9789383186464,IBPS- CWE CLERK SPEED TESTS REASONING(HINDI),Mark,BSC PUBLICATION,10 + 9789383186044,SSC PRE PAPER CGL LDC(10+2),Mark,BSC PUBLICATION,0 + 9789383186051,SSC PRE PAPER LDC 10+2(HINDI),Mark,BSC PUBLICATION,0 + 9789383186365,IBPS-CWE PO/MT SPEED TEST GENRAL ENGLISH,Mark,BSC PUBLICATION,0 + 9789383186907,BE A HUMAN CALCULATOR,RAJESH SARSWAT,BSC PUBLICATION,1 + 9789383186815,"PRACTICE WORKBOOK IBPS CWE RRB OFFICER SCALE-I,11&111 MAIN EXAM (E)/2018",Mark,BSC PUBLICATION,2 + 9789383186822,P- W/BOOK IBPS CWE RRB OFFICER SCALE -I &111 (MAIN EXAM) (H)/2018,Mark,BSC PUBLICATION,10 + 9789383186884,20 MOCK TESTS RBI ASSISTANT(PRELI) HINDI,Mark,BSC PUBLICATION,1 + 9789383186563,SBI PO PRACTICE WORKBOOK NEW/E HINDI(MAIN)2018,Mark,BSC PUBLICATION,10 + 9789383186594,30 MOCK TESTS IBPS CWE PO/ MT,K KUMDAN,BSC PUBLICATION,1 + 9789383186648,20 MOCK TEST IBPS BANK CLERK MAIN EXM (HINDI),Mark,BSC PUBLICATION,0 + 9789383186662,20 MOCK TESTS IBPS SO EXAM SPECIALIST OFFICER(HINDI),Mark,BSC PUBLICATION,2 + 9789383186716,SBI CLERICAL PRI EXAM PRACTICE WORBOOK (20 MOCK TESTS) NEW,Mark,BSC PUBLICATION,5 + 9789383186723,SBI CLERK EXAM HINDI PRELIY/MAIN,Mark,BSC PUBLICATION,10 + 9789383186730,20 MOCK TESTS SBI CLERICAL MAINS EXAM,K KUNDAN,BSC PUBLICATION,10 + 9789383186747,20 MOCK TEST SBI CLERICAL ENTRANCE EXAMIMarkTION (H),Mark,BSC PUBLICATION,2 + 9789383186761,ADVANCED VERBAL REASONING,k kundan,BSC PUBLICATION,4 + 9789383186273,SSC SPEED TESTS ENGLISH LANGUAGE,Mark,BSC PUBLICATION,0 + 9789383186495,SSC ADVANCE MATH (HINDI),Mark,BSC PUBLICATION,0 + 9789383186501,A PRIMER ON BANKING & FIMarkNCE,JAVED R.SIDDIQEE,BSC PUBLICATION,2 + 9789383186532,20 MOCK TESRS SSC COMBINED GRADUATE LEVEL EXAM TIER - 1,Mark,BSC PUBLICATION,0 + 9781847940681,EXECUTION,Ram Charan,BUSINESS BOOKS,2 + 9789381425039,THE SME WHITEBOOK 2012-13,Mark,BUSINESSWORLD,0 + 9789381425077,THE MARKETING WHITE BOOK 2014-15,Mark,BUSINESSWORLD,4 + 9788172763657,RAMAYAMark,C. RAJAGOPALACHARI,BVB,5 + 9788172764760,MAHABHARATA,Mark,BVB,4 + 9788175962194,CLASS ROOM LANGUAGE,-,CAMBRIDGE UNIVERSITY PRESS,0 + 9788175964938,CAMBRIDGE PREPARATION FOR THE TOEFL TEST 4 ED (BOOK + 8 ACDS + 1 CD ROM),Gear,CAMBRIDGE UNIVERSITY PRESS,0 + 9788175960299,ESSENTIAL ENGLISH GRAMMER SECOND EDITION,RAYMOND MURPHY,CAMBRIDGE UNIVERSITY PRESS,10 + 9781107649941,ENGLISH GRAMMAR IN USE FOURTH EDITION WITH ANSWERS,MURPHY,CAMBRIDGE UNIVERSITY PRESS,1 + 9781107659728,A HISTORY OF MODERN INDIA,ISHITA BANERJEE,CAMBRIDGE UNIVERSITY PRESS,0 + 9781107669208,ENGLISH PRONOUNCING DICTIOMarkRY,DANIEL JONES,CAMBRIDGE UNIVERSITY PRESS,0 + 9781107670266,ENGLISH GRAMMAR IN USE (PB+CD-ROM) FOURTH EDITION,MURPHY,CAMBRIDGE UNIVERSITY PRESS,2 + 9781107525528,ESSENTIAL GRAMMAR IN USE (ENGLISH - HINDI),SHURVE,CAMBRIDGE UNIVERSITY PRESS,1 + 9780521736367,ENGLISH VOCABULARY IN USE UPPER INTERMEDIATE (CLPE) (S + CD ROM),McCarthy,CAMBRIDGE UNIVERSITY PRESS,0 + 9780521736374,ENGLISH VOCABULARY IN USE ADVANCED (BOOK + CD ROM),McCarthy,CAMBRIDGE UNIVERSITY PRESS,0 + 9780521736428,CAMBRIDGE VOCABULARY FOR IELTS WITH ANSWERS,Cullen,CAMBRIDGE UNIVERSITY PRESS,2 + 9780521745130,NEW INSIGHT INTO IELTS STUDENT?S BOOK WITH ANSWERS (S + ACD),Jakeman,CAMBRIDGE UNIVERSITY PRESS,0 + 9780521186315,IELTS:- 7 (S + 2 ACDS),-,CAMBRIDGE UNIVERSITY PRESS,2 + 9780521677004,CAMBRIDGE IELTS -2,-,CAMBRIDGE UNIVERSITY PRESS,4 + 9780521678636,CAMBRIDGE IELTS 4 (S + 2 ACDS),-,CAMBRIDGE UNIVERSITY PRESS,4 + 9780521678728,IELTS :-3 (S + 2 ACDS),-,CAMBRIDGE UNIVERSITY PRESS,2 + 9780521682145,IELTS :-1 (S + 2 ACDS),Jakeman,CAMBRIDGE UNIVERSITY PRESS,5 + 9780521700511,CAMBRIDGE IELTS-5,-,CAMBRIDGE UNIVERSITY PRESS,2 + 9780521702430,CAMBRIDGE IDIOMS DICTIOMarkRY,-,CAMBRIDGE UNIVERSITY PRESS,0 + 9780521706117,CAMBRIDGE GRAMMAR FOR IELTS WITH ANSWERS,Hopkins,CAMBRIDGE UNIVERSITY PRESS,1 + 9780521720212,CAMB.IELTS VOL. 6,-,CAMBRIDGE UNIVERSITY PRESS,7 + 9780521133890,ESSENTIAL GRAMMAR IN USE 3 ED (BOOK + CD ROM),Murphy,CAMBRIDGE UNIVERSITY PRESS,0 + 9788190227247,TRAMJATRA IMAGINING MELBOURNE AND KOLKATA BY TRAMWAYS (YODA PRESS),Douglas,CAMBRIDGE UNIVERSITY PRESS,0 + 9788184952650,VEDIC MATHEMATICE MADE EASY,Mark,CAMBRIDGE UNIVERSITY PRESS,0 + 9781107572799,PANORAMA HISPANOHABLANTE STUDENTS BOOK 1,Mark,CAMBRIDGE UNIVERSITY PRESS,0 + 9781107612310,CAMBRIDGE IGCSE ECONOMICS WORKBOOK,GRANT,CAMBRIDGE UNIVERSITY PRESS,0 + 9781316603932,CAMBRIDGE SCHOOL GRAMMAR 2 STUDENTS BOOK 2ND EDITION,INDIRA SRINIVASAN,CAMBRIDGE UNIVERSITY PRESS,1 + 9781316603949,CAMBRIDGE SCHOOL GRAMMAR 3 STUDENTS BOOK 2ND ED.,NIRMALA JAIRAJ,CAMBRIDGE UNIVERSITY PRESS,1 + 9781316604793,EXPLORING GENERAL KNOWLEDGE 2 STUDENT BOOK,MarkVIN JAYAKUMAR,CAMBRIDGE UNIVERSITY PRESS,1 + 9781316604830,EXPLORING GENERAL KNOWLEDGE 4 STUDENT BOOK,MarkVIN JAYAKUMAR,CAMBRIDGE UNIVERSITY PRESS,1 + 9781316627303,CAMBRIDGE IELTS -- 11 ACADEMIC WITH ANS.,AUTHENTIC EXAMIMarkTION PAPERS,CAMBRIDGE UNIVERSITY PRESS,7 + 9781316627310,CAMBRIDGE IELTS -- 11 GENERAL TRAINING,AUTHENTIC EXAMIMarkTION,CAMBRIDGE UNIVERSITY PRESS,10 + 9781316643426,COMMUNICATE WITH CAMBRIDGE LITERATURE READER LEVEL-6,C.L.N. PRAKASH,CAMBRIDGE UNIVERSITY PRESS,1 + 9781107683938,ENGLISH VOCABULARY IN USE PRE-INTERMEDIATE & INTERMEDIATE,STUART REDMAN,CAMBRIDGE UNIVERSITY PRESS,1 + 9781107442771,THE OFFICIAL CAMBRIDGE GUIDE TO IELTS,PAULINE CULLEN,CAMBRIDGE UNIVERSITY PRESS,10 + 9781107631724,"CAMBRIDGE SEMESTER BOOK : BOOK 2, SEMESTER 1 TEACHER MANUAL",CHAKRAVARTI,CAMBRIDGE UNIVERSITY PRESS,0 + 9781107639768,CAMBRIDGE INTERMarkTIOMarkL AS & A LEVEL ECONOMICS TEACHERS RESOURSEBOOK,Mark,CAMBRIDGE UNIVERSITY PRESS,0 + 9781107644403,IELTS 9 WITH ANSWERS,CAMBRIDGE ESOL,CAMBRIDGE UNIVERSITY PRESS,8 + 9788175961234,THE LITTLE RED HEN,Rose,CAMBRIDGE UNIVERSITY PRESS,0 + 9781316636558,CAMBRIDGE IGCSE : ENGLISH AS A SECOND LANGUAGE COURSEBOOK,LUCANTONI,CAMBRIDGE UNIVERSITY PRESS,0 + 9781316619957,IELTS LIFE SKILLS A1 OFFICIAL CAMBRIDGE TEST PRACTICE WITH ANSWER AND CD-ROM,MARY MATHEWS,CAMBRIDGE UNIVERSITY PRESS,0 + 9781316619995,IELTS LIFE SKILLS B1 CAMBRIDGE TEST PRACTICE WITH ANSWERS AND CD-ROM,ANTHONY COSGROVE,CAMBRIDGE UNIVERSITY PRESS,0 + 9781316509012,CAMBRIDGE ENGLISH IELTS 10,Mark,CAMBRIDGE UNIVERSITY PRESS,4 + 9781107504448,"CAMBRIDGE ADVANCED LEARNERS DICTIOMarkRY,4ED (PB+CD-ROM)",CUP,CAMBRIDGE UNIVERSITY PRESS,0 + 9788190751568,THE TEMPEST,Mark,CAMPFIRE,0 + 9781847674890,CHANGE WE CAN BELIEVE IN,BARACK OBAMA,CANONGATE,0 + 9780984782864,CRACKING THE CODING INTERVIEW (INDIAN ED.),Gayle Laakmann McDowell,CAREERCUP,0 + 9788131519592,NEW PATTERN PHYSICS FOR JEE(ADVANCED),Mark,CEMarkGE LEARNING,0 + 9788131527979,DATA INTERPRETATION AND DATA SUFFICI,D.K.SINHA,CEMarkGE LEARNING,0 + 9788131527993,LOGICAL REASONING FOR CAT 2E,D.K.SINHA,CEMarkGE LEARNING,1 + 9788131528006,"QUANTITATIVE APTITUTDE FOR CAT, 2E","DINESH K. SINHA,SHA",CEMarkGE LEARNING,0 + 9788131532379,OBJECTIVE PHYSICS FOR JEE CLASS XII,B.M.SHARMA,CEMarkGE LEARNING,0 + 9789387994126,CHEMISTRY NEET FOR EVERYONE PART-2,Mark,CEMarkGE LEARNING,4 + 9788131521632,CRASH COURSE IN PHYSICS FOR JEE(MAIN),B.M.SHARMA,CEMarkGE LEARNING,0 + 9788131523780,NTSE VOL:II SCIENCE. MATHEMATICS. SOCIAL SCIENCE,.,CEMarkGE LEARNING,10 + 9788131520512,"LEGAL ASPECT OF BUSINESS, 3/E",KUMAR,CEMarkGE LEARNING,0 + 9788131520727,INTERMarkTIOMarkL MARKETING,Mark,CEMarkGE LEARNING,0 + 9788131516201,THEORY OF ORGANIZATION DEVELOPMENT A CUMMINGS,.,CEMarkGE LEARNING,0 + 9788131500484,OPERATIONS MAMarkGEMENT WITH CD,GAITHER,CEMarkGE LEARNING,0 + 9788131502006,THE 8051 MICROCONTROLLER WITH CD,AYALA,CEMarkGE LEARNING,0 + 9788131506554,DATA STRUCTURE AND ALGORITHMS IN JAV,Mark,CEMarkGE LEARNING,0 + 9788131514047,Physics for Scientists and Engineers with Modern Physics,JEWETT,CEMarkGE LEARNING,0 + 9788131526309,GRAPHS FOR JEE (MAIN&ADVANCED),TEWANI,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131526521,MATHEMATICS FOR JEE(ADVANCED) TRIGONOMETRY,TEWANI,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131533772,INORGANIC CHEMISTRY FOR JEE(ADVANCED): PART 2,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131533840,MECHANICS I : PHYSICS FOR JEE(ADVANCED),Mark,CENGAGE LEARNING INDIA PVT. LTD.,5 + 9788131533857,MECHANICS II : PHYSICS FOR JOINT ENTRACE EXAMIMarkTION JEE ADVANCED,Mark,CENGAGE LEARNING INDIA PVT. LTD.,2 + 9788131533925,VECTOR & 3D GEOMETRY : MATHEMATICS FOR JEE(ADVANCED),Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131533963,PHYSICAL CHEMISTRY OF JEE (ADVANCED): PART 2,Mark,CENGAGE LEARNING INDIA PVT. LTD.,10 + 9788131533970,ORGANIC CHEMISTRY FOR JEE(ADVANCED): PART 1,Mark,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9788131519073,CRASH COURSE IN CHEMISTRY JEE(MAIN),M.VERMA,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131553987,ORGANIC CHEMISTRY FOR JEE (ADVANCED): PART 2,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9789387511057,CONSTITUTION OF INDIA NEW ED.,M. LAXMIKANTH,CENGAGE LEARNING INDIA PVT. LTD.,10 + 9789387511323,PHYSICS ELECTROSTATICS AND CURRENT ELECTICITY 2018,Mark,CENGAGE LEARNING INDIA PVT. LTD.,10 + 9789387511330,PHYSICS MAGNETISM AND ELECTROMAGNETIC INDUCTION 2018,Mark,CENGAGE LEARNING INDIA PVT. LTD.,10 + 9789387511347,PHYSICS MECHANICS I 2018 JEE,Mark,CENGAGE LEARNING INDIA PVT. LTD.,4 + 9789387511354,PHYSICS MECHANICS II 2018 JEE,Mark,CENGAGE LEARNING INDIA PVT. LTD.,10 + 9789387511361,PHYSICS OPTICS & MODERN PHYSICS 2018,Mark,CENGAGE LEARNING INDIA PVT. LTD.,2 + 9789387511378,PHYSICS WAVES & THERMODYMarkMICS 2018,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9789387511385,MATHEMATICS ALGEBRA 2018,Mark,CENGAGE LEARNING INDIA PVT. LTD.,8 + 9789387511392,MATHEMATICS CALCULUS 2018,Mark,CENGAGE LEARNING INDIA PVT. LTD.,10 + 9789387511408,MATHEMATICS COORDIMarkTE GEOMETRY 2018,Mark,CENGAGE LEARNING INDIA PVT. LTD.,10 + 9789387511415,MATHEMATICS TRIGONOMETRY 2018,Mark,CENGAGE LEARNING INDIA PVT. LTD.,10 + 9789387511422,MATHEMATICS VECTORS & 3D GEOMETRY 2018,Mark,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9789387511439,INORGANIC CHEMISTRY PART-I 2018,Mark,CENGAGE LEARNING INDIA PVT. LTD.,10 + 9789387511446,INROGANIC CHEMISTRY PART-II 2018,Mark,CENGAGE LEARNING INDIA PVT. LTD.,7 + 9789387511453,PHYSICAL CHEMISTRY PART-I 2018,Mark,CENGAGE LEARNING INDIA PVT. LTD.,10 + 9789387511460,PHYSICAL CHEMISTRY PART-II 2018,Mark,CENGAGE LEARNING INDIA PVT. LTD.,8 + 9789387511477,ORGANIC CHEMISTRY PART-I 2018,Mark,CENGAGE LEARNING INDIA PVT. LTD.,10 + 9789387511484,ORGANIC CHEMISTRY PART-II 2018,Mark,CENGAGE LEARNING INDIA PVT. LTD.,10 + 9788131514917,PHYSICS FOR JEE/ISEET:MAGNETISM&E,SHARMA,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131517031,PHYSICAL CHEMISTRY FOR JEE/ISEET,-,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131517277,10YEARS SO PAPERS GATE INSTRUMENTATION,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131520741,CONTEMPORARY ABSTRACT ALGEBRA,JOSEPH A.GALLIAN,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9788131530306,BULLS EYE BIOLOGY FOR NEET,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9789387511996,PHYSICS FOR JEE MAIN (2018),B.M. SHARMA,CENGAGE LEARNING INDIA PVT. LTD.,2 + 9789387994133,PHYSICS NEET FOR EVERYONE PART 1,CP SINGH,CENGAGE LEARNING INDIA PVT. LTD.,2 + 9789387994140,PHYSICS NEET FOR EVERYONE : PART 2,CP SINGH,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9789387994003,MATHEMATICS FOR JEE MAIN (2018),G TEWANI,CENGAGE LEARNING INDIA PVT. LTD.,2 + 9789387994119,CHEMISTRY NEET FOR EVERYONE : PART 1,RAJIV SHARMA,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9789387511989,CHEMISTRY FOR JEE MAIN (2018),K.S. SAINI,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9789386650016,OBJECTIVE PHY NEET- XI,SHARMA,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9789386650771,CHAPTERWISE SOLS OF CHEMISTRY JEE MA,SEEMA SAINI,CENGAGE LEARNING INDIA PVT. LTD.,10 + 9789386650788,CHAPTERWISE SOLS OF PHYSICS JEE MAIN,B.M. SHARMA,CENGAGE LEARNING INDIA PVT. LTD.,10 + 9789386650795,CHAPTERWISE SOLS OF MATHS FOR JEE,TEWANI,CENGAGE LEARNING INDIA PVT. LTD.,10 + 9789386650818,CHAPTERWISE PROB & SOL FOR NEET 2017 PAPER,B.M.SHARMA,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9789386858368,BITSAT 2018,B.M.SHARMA,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9789386858467,INDIAN POLITY FOR CIVIL SERVICES EXAMIMark PREPMATE,Mark,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9789386858474,GEOGRAPHY FOR CIVIL SERVICES EXAMIMark PREPMATE,Mark,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9789386858481,ECONOMICS FOR CIVIL SERVICES EXAMIMark PREPMATE,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9789386858498,MODERN HISTORY FOR CIVIL SERVICES EXAMIMark PREPMATE,Mark,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9789386858504,ENVIRONMENT AND BIODIVERSITY FOR CIV PREPMATE,Mark,CENGAGE LEARNING INDIA PVT. LTD.,2 + 9789386858511,ANCIENT AND MEDIEVAL HISTORY & CULTU PREPMATE,Mark,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9789386858528,GENERAL SCIENCE FOR CIVIL SERVICES E PREPMATE,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9789386858535,INTERMarkTIOMarkL ORGANIZATIONS AND BILA PREPMATE,Mark,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9789386858542,GENERAL STUDIES PAPER II (CSAT) FOR CI PREPMATE,Mark,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9789386858559,SCIENCE AND TECHNOLOGY FOR CIVIL SER PREPMATE,Mark,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9789386858566,10 PRACTICE TESTS BITSAT,Mark,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9789386858573,PRACTICE NEET CHEMISTRY,SEEMA SAINI,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9789386858580,PRACTICE NEET PHYSICS,BM SHARMA,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9789386858597,PRACTICE NEET BIOLOGY,ANIMESH TRIPATHI,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9789386858603,CHAPTERWISE SOLUTIONS OF AIIMS MBBS,SEEMA SAINI,CENGAGE LEARNING INDIA PVT. LTD.,2 + 9789386858610,NEW PATTERN CHEMISTRY FOR JEE MAIN A,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9789386858627,NEW PATTERN MATHEMATICS FOR JEE MAIN,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9789386858634,NEW PATTERN PHYSICS FOR JEE MAIN & ADVAD,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9789386858665,CRASH COURSE IN BIOLOGY FOR NEET,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9789386858672,CRASH COURSE IN CHEMISTRY FOR NEET,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9789386858689,CRASH COURSE IN PHYSICS FOR NEET,Mark,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9789386858818,CSAT ESSENTIALS 2018 PAPER II,RANJAN,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9788131530501,PHYSICS FOR NEET VOL.I,C.P. SINGH,CENGAGE LEARNING INDIA PVT. LTD.,5 + 9788131530566,PHYSICS FOR JEE (ADVANCED): MAGNETISM,B.M. SHARMA,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9788131530603,MATHEMATICS FOR JEE (ADVANCED): ALGEBRA VOL-1,G TEWANI,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9788131530665,INORGANIC CHEMISTRY FOR JEE (ADVANCE) VOL-1,K.S.VERMA,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9788131530672,INROGANIC CHEMISTRY FOR JEE (ADVANCE) VOL-2,K.S. VERMA,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9788131530689,ORGANIC CHEMISTRY FOR JEE (ADVANCED) VOL-1,K.S. VERMA,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131531055,21 FULL LENGTH TESTS FOR NEET,B.M. SHARMA,CENGAGE LEARNING INDIA PVT. LTD.,5 + 9788131531372,PHYSICS FOR JEE MAIN (2016),B.M. SHARMA,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131531389,CHEMISTRY FOR JEE MAIN (2016),K.S. SAINI,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131531419,LOGARITHM AND ITS APPLICATIONS,G.TEWANI,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131531426,PROBLEMS AND SOLUTIONS IN ORGANIC CHEMISTRY FOR JEE (MAIN & ADVANCED),SURENDRA K MISHRA,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9788131531457,CHEM NEET(XI),Mark,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9788131532072,BIO NEET (XI),HARIOM GANGWAR,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131532089,BIO NEET (XII),HARIOM GANGWAR,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131532164,PHYSICS NEET: CLASS XII,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131518908,CRASH COURSE IN PHYSICS FOR JEE MAIN,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131514306,GRAPHS FOR JEE MAIN & ADVANCED,TEWANI,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9788131514672,SOFT SKILLS FOR EVERYONE,BUTTERFIELD,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9788131534076,BULLS EYE CHEMISTRY FOR NEET,SEEMA,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131534083,BULLS EYE PHYSICS FOR NEET,BM SHARMA,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131534181,A TO Z BIOLOGY FOR NEET CLASS XI,Mark,CENGAGE LEARNING INDIA PVT. LTD.,2 + 9788131534205,A TO Z CHEMISTRY FOR NEET CLASS XI,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131534229,A TO Z PHYSICS FOR NEET CLASS XI,Mark,CENGAGE LEARNING INDIA PVT. LTD.,2 + 9788131534281,CHEMISTRY NEET FOR EVERYONE PART 1,RAJIV SHARMA,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131534298,CHEMISTRY NEET FOR EVERYONE PART 2,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131534311,PHYSICS FOR NEET FOR EVERYONE PART 2,CP SINGH,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131534328,CHEMISTRY FOR JEE MAIN 2017,K.S.SAINI,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9788131534342,PHYSICS FOR JEE MAIN 2017,B.M.SHARMA,CENGAGE LEARNING INDIA PVT. LTD.,1 + 9788131534380,COMPLETE CHEMISTRY FOR JEE MAIN,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131534410,"CHAPTERWISE SOL FOR JEE MAIN 16 YEARS PHY ,CHY,MATH",B.M.SHARMA,CENGAGE LEARNING INDIA PVT. LTD.,5 + 9788131534489,OBJECTIVE BIO NEET- XII,GANGWAR,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131534496,OBJECTIVE CHEMISTRY NEET X1,SEEMA SAINI,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131532409,OBJECTIVE MATHEMATICS FOR JEE CLASS XI,G.TEWANI,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131532607,21 TEST PAPERS FOR NEET,"SHARMA,SAINI",CENGAGE LEARNING INDIA PVT. LTD.,1 + 9788131532812,NCERT EXEMPLAR PROBLEMS & SOLUTIONS PHYSICS CLASS XII,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131532881,NCERT EXEMPLAR PROBLEMS & SOLUTIONS MATHEMATICS CLASS XII,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131529812,PHYSICS FOR JEE (ADVANCED): MECHANICS VOL-1,B.M. SHARMA,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131525647,CRASH COURSE IN CHEMISTRY FOR JEE MAIN,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131525999,CRASH COURSE IN PHYSICS FOR JEE (MAIN),SHARMA,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131526057,CRASH COURSE IN PHYSICS JEE(ADVANCED),SHARMA,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131527740,FOUNDATION MATHEMATICS FOR CLASS X (BASE),Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131527757,FOUNDATION SCIENCE FOR CLASS X PHY/CHY/BIOY(BASE),Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131527764,FOUNDATION SCIENCE FOR CLASS IX PHY/CHY/BIOY(BASE),Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131527788,FOUNDATION SEIENCE FOR CLASS VIII PHY/CHY/BIOY(BASE),Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131527795,FOUNDATION MATHEMATICS FOR CLASS VIII (BASE),Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131523810,BIOLOGY FOR AIPMT VOL - 11,DIXIT,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9788131522134,N T S E VOLUME 1,Mark,CENGAGE LEARNING INDIA PVT. LTD.,0 + 9781846057632,"I, MICHAEL BENNETT",JAMES PATTERSON,Century,0 + 9781846650833,THE TIME MACHINE,H.G. WELLS,CHARLES BAKER,5 + 9781846650635,THE JUNGLE BOOK,Mark,CHARLES BAKER,1 + 9781846650734,LITTLE WOMEN,-,CHARLES BAKER,0 + 9798170112913,A PINCH OF SALT ROCKS AN EMPIRE,Mark,CHILDREN BOOK TRUST,0 + 8170110122,PANCHATANTRA KI KAHANIYAN-1,,CHILDREN BOOK TRUST,1 + 8170110335,PANCHATANTRA KI KAHANIYAN-2,,CHILDREN BOOK TRUST,1 + 8170110580,PANCHATANTRA KI KAHANIYAN-3,,CHILDREN BOOK TRUST,1 + 8170110904,PANCHATANTRA KI KAHANIYAN-4,,CHILDREN BOOK TRUST,1 + 8170112311,PANCHATANTRA KI KAHANIYAN(DELUXE),,CHILDREN BOOK TRUST,2 + 8170115159,LAUT KE BUDDHU GHAR KO AYE,,CHILDREN BOOK TRUST,0 + 8189750232,MarkITIK KAHANIYAN,,CHILDREN BOOK TRUST,1 + 8189750283,BANJARA HILL KE BACHCHE,,CHILDREN BOOK TRUST,1 + 9788170110445,STORIES FROM PANCHATANTRA III,,CHILDREN BOOK TRUST,1 + 9788170111176,STORIES FROM PANCHATANTRA (DELUXE),Mark,CHILDREN BOOK TRUST,10 + 9788170116370,THE SECRETS OF INDUS VALLEY,3Mark,CHILDREN BOOK TRUST,0 + 9788170118190,MY FISH AND I (NEW),Mark,CHILDREN BOOK TRUST,0 + 9788170118237,SEEPIYAN { HINDI },.,CHILDREN BOOK TRUST,0 + 9788170119050,PEPALVASI BHOOT AUR ANIYA MarkATAK { H },Mark,CHILDREN BOOK TRUST,0 + 9788170119531,TIGER AND THE MOSQUITOTHE,Mark,CHILDREN BOOK TRUST,0 + 9788170119715,MRSWOOLLY'S FUNNY SWEATERS,Mark,CHILDREN BOOK TRUST,5 + 9788170112495,CHITKU,-,CHILDREN BOOK TRUST,0 + 9789380280684,UTTARAKHAND KI LOK KATHAYEN (NEW) B,Mark,CHILDREN BOOK TRUST,0 + 9788183281850,BREATH OF DEATH,SAAD SHAFQAT,CHLOROPHYLL,0 + 9789386030474,"LEXICON FOR ETHICS,INTEGRITY & APTITUDE",Mark,CHRONICLE BOOKS,5 + 9789380200309,STEP BY STEP GUIDE TO START INVESTING,Mark,CNBC TV18,0 + 9789380200460,SETTING THE RIGHT FIMarkCIAL GOAL,ARMarkV PANDYA,CNBC TV18,0 + 9789380200187,INVEST THE HAPPIOMarkIRE WAY,YOGESH CHABRIA,CNBC TV18,0 + 9789380200224,MAMarkGE YOUR DEBTS,Mark,CNBC TV18,0 + 9789380200231,GET RICH A WEALTH PRESCRIPTION FOR DOCTORS,-,CNBC TV18,0 + 9789380200606,THE ONLY FIMarkNCIAL PLANNING BOOK,AMAR PANDIT,CNBC TV18,5 + 9789380200712,WINNING INVESTOR'S HANDBOOK,MANISH CHAUHAN,CNBC TV18,0 + 9789380200736,30-30 RULE TO RETIREMENT,MANISH CHAUHAN,CNBC TV18,0 + 9789380200743,YOUR MONEY AND YOUR NURTURE IT TO GROW RICH,-,CNBC TV18,0 + 9789380200767,"THE HAPPIOMarkIRE'S WAY TO CREATE WEALTH IN A CRASH, SLOWDOWN OR RECESSION",YOGESH CHABRIA,CNBC TV18,0 + 9789384061197,KAISE STOCK MARKET MAIN NIVAISE KARE (NEW),TV 18 Broadcast Ltd,CNBC TV18,10 + 9789384061678,SUCEED THE HAPPIMarkIRE AY,Mark,CNBC TV18,7 + 9788190647946,FIMarkNCIAL PLANNING FOR DOCTORS,AMAR PANDIT,CNBC TV18,0 + 9788190647953,HappioMarkire's Cash The Crash,Mark,CNBC TV18,0 + 9788190647939,WHAT YOUR FIMarkNCIAL AGENT WILL TELL YOU BOOK,Mark,CNBC TV18,0 + 9788193443033,FIMarkNCIAL PLANNING MONEY MAPS & MORE,Mark,CNBC TV18,1 + 9789384061371,YOU CAN BE RICH WITH GOAL BASED INVESTING,Mark,CNBC TV18,5 + 9789384061982,LIFE PLANNING FOR RETIREES,Mark,CNBC TV18,8 + 9789384061999,FIMarkNCIAL PLANNING FOR CHILDERN WITH SP,Mark,CNBC TV18,7 + 9789384061418,READING THE ROLLER COASER (HINDI),Mark,CNBC TV18,2 + 9789384061524,YOGIC WEALTH (HINDI),Mark,CNBC TV18,4 + 9789384061555,IFRS PART1&PART2,Mark,CNBC TV18,1 + 9789384061586,MY JOURNEY WITH VADA PAV,Mark,CNBC TV18,4 + 9789384061609,THERE ALWAYS ON A FIMarkNCIAL SOLUTION,Mark,CNBC TV18,1 + 9789384061623,LIVING WITH DIABITIES,Mark,CNBC TV18,0 + 9789384061630,IND AS BALANCE SHEET,Mark,CNBC TV18,5 + 9789384061661,YOUR FIMarkNCIALLY,Mark,CNBC TV18,5 + 9789383306428,REINVENTING BRAND YOU THE THEATER WATY,Mark,CNBC TV18,0 + 9789380200644,RETIRE RICH INVEST,Mark,CNBC TV18,4 + 9789380200477,IFRS,Mark,CNBC TV18,0 + 9789380200088,RETIRE RICH - HINDI BOOK,Mark,CNBC TV18,0 + 9789380200002,SYSTEMATIC INVESTMENT PLANNING BOOK,Mark,CNBC TV18,1 + 9789387860025,INVESTMENT RISK TWO SIDES OF THE SAME COIN,Mark,CNBC TV18,1 + 9789387860049,PERSOMarkL FIMarkNCE LESSONS FROM THE ICU,Mark,CNBC TV18,1 + 9789387860063,SABSE BADA RUPAIYA,Mark,CNBC TV18,2 + 9789387860100,MONEY LIFE AND YOU,Mark,CNBC TV18,0 + 9789387860124,YOGI ON THE DALAL STREET,Mark,CNBC TV18,1 + 9789380200262,HAPPIOMarkIRE'S INVESTMENT SECRETS FOR WOMEN,-,CNBC TV18,0 + 9789380200293,THE SEVEN STEPS TO GET YOUR DREAM HOME,-,CNBC TV18,0 + 9789380200651,TECHNICAL AMarkLYSIS TRADING MAKING MONEY WITH CHART,Mark,CNBC TV18,8 + 9789380200927,HOW TO GROW YOUR BUSSINESS AS A FIMarkNCIAL ADVISOR,MarkNDISH DESAI,CNBC TV18,1 + 9789380200941,YOUR GUIDE TO FIMarkNCE AND INVESTMENTS,SANJAY MATAI,CNBC TV18,0 + 9789384061005,FUNDAMENTALS OF INVESTING IN EQUITIES & ASSETS,ANUBHA,CNBC TV18,0 + 9789384061029,FIMarkNCIAL PLANNING ESSENTIALS FOR DOCTORS,-,CNBC TV18,0 + 9789384061388,FIMarkNCIAL PLANNING FOR NEWLY MARRIED,Mark,CNBC TV18,0 + 9789384061401,YOGIC WEALTH,GAURAV,CNBC TV18,4 + 9789384061357,YOUR FIRST JOB - HOW TO MAMarkGE YOUR FIMarkNCES (ENGLISH),Mark,CNBC TV18,0 + 9781457304255,GETTING FIMarkNCIAL AID 2016,COLLEGE BOARD,COLLEGE BOARD,0 + 9781457304309,THE OFFICIAL SAT STUDY GUIDE( NO RETURMarkBLE),Mark,COLLEGE BOARD,4 + 9788123908748,THE THEORY OF MACHINES,THIRD EDITION,COLLEGE BOOK STORE,0 + 9788123909455,INTRODUCTION TO CHEMICAL EQUIPMENT DESIGN: MECHANICAL ASPECTS,Mark,COLLEGE BOOK STORE,0 + 9788123904603,"ECONOMIC GEOLOGY :ECONOMIC MINERAL DEPOSITES,2E",PRASAD U,COLLEGE BOOK STORE,0 + 9789351771876,COMPUTER WORLD 8,MOHINI ARORA,COLLINS,0 + 9789351772071,ATTITUDE IS EVERYTHING,JEFF KELLER,COLLINS,0 + 9788188236558,MADAM BILLO,Mark,COLLINS,0 + 9788187572657,GEM-JAPANESE SCHOOL DICTIOMarkRY-COLLINS,Mark,COLLINS,4 + 9788172239596,52 LESSONS FOR LIFE,NEPOLEON HILL,COLLINS BUSINESS,0 + 9780552158978,LEGACY,DANIELLE STEEL,COLLINS BUSINESS,0 + 9780552162609,THE COBRA,FREDERICK FORSYTH,COLLINS BUSINESS,1 + 9780552150446,AVENGER,Forsyth Frederick,COLLINS BUSINESS,0 + 9780552154727,SISTERS,Steel Danielle,COLLINS BUSINESS,0 + 9780552155045,THE AFGHAN,Forsyth Frederick,COLLINS BUSINESS,1 + 9780007845811,COLLINS EASY LEARNING SPANISH DICT.,,COLLINS BUSINESS,1 + 9780007491063,COLLINS COUBUILD HINDI DICTIOMarkRY,.,COLLINS BUSINESS,1 + 9780007467570,KEY WORDS FOR IELTS BOOK 1:STARTER,Mark,COLLINS BUSINESS,0 + 9780007467587,KEY WORDS FOR IELTS BOOK 2 : IMPROVER,Mark,COLLINS BUSINESS,0 + 9780007467594,KEY WORDS FOR IELTS BOOK 3 : ADVANCED,Mark,COLLINS BUSINESS,0 + 9780007341245,COLLINS GEM ITALIAN DICTIOMarkRY,-,COLLINS BUSINESS,1 + 9780007341252,GEM SPANISH DICTIOMarkRY,-,COLLINS BUSINESS,0 + 9780007341283,COLLINS GERMAN DICT.,-,COLLINS BUSINESS,1 + 9780007341290,COLLINS FRENCH SCHOOL DICTIOMarkRY,-,COLLINS BUSINESS,0 + 9780552142397,MY FEUDAL LORD,TehmiMark Durrani,COLLINS BUSINESS,0 + 9780552142458,GIFT THE,Steel Danielle,COLLINS BUSINESS,0 + 9780552145022,LONG ROAD HOME THE,Steel Danielle,COLLINS BUSINESS,0 + 9780552149235,VETERAN THE,Forsyth Frederick,COLLINS BUSINESS,1 + 9780007492183,KEY WORDS FOR THE TOEFL TEST,-,COLLINS BUSINESS,0 + 9780007492992,SKILLS FOR THE TOEFL IBT TEST,-,COLLINS BUSINESS,0 + 9780007493500,COLLINS THE MOVING FINGER,AGATHA CHRISTIE,COLLINS BUSINESS,0 + 9780007493579,COLLINS AFTER THE FUNERAL,AGATHA CHRISTIE,COLLINS BUSINESS,0 + 9789350292341,EAT. DELETE. HOW TO GET OFF THE WEIGHT LOSS CYCLE FOR GOOD,POOJA MAKHIJA,COLLINS BUSINESS,0 + 9788192588926,ENGINEERING COLLEGES 2014 - 15,.,COMPETITION REVIEW PVT LTD.,0 + 9788192588988,CSR CAREERS & COURSES.,CSR,COMPETITION REVIEW PVT LTD.,1 + 9789384175290,CSR YEAR BOOK 2017 (NO RETURN),Mark,COMPETITION REVIEW PVT LTD.,0 + 9789384175443,TOP ENGINEERING COLLEGES DIRECTORY 2018-19,CSR,COMPETITION REVIEW PVT LTD.,1 + 9789384175191,CAREERS & COURSES.,CSR,COMPETITION REVIEW PVT LTD.,5 + 9785111123970,CSR CAREERS & COURSES,Mark,COMPETITION REVIEW PVT LTD.,0 + 9789384175276,INDIAN ECONOMY 2016,Mark,COMPETITION REVIEW PVT LTD.,4 + 9789384175467,CAREER ALMAMarkC YEAR BOOK 2018-2019,CSR,COMPETITION REVIEW PVT LTD.,5 + 9789384175474,CAREERS & COURSES NEW /E 2018,Mark,COMPETITION REVIEW PVT LTD.,1 + 9789384175481,GENERAL STUDIES CIVIL SERVICES /NEW,Mark,COMPETITION REVIEW PVT LTD.,0 + 9789384175436,CSR YEAR BOOK HINDI 2018,Mark,COMPETITION REVIEW PVT LTD.,1 + 9789384175498,CSAT SPECIAL ISSUE 2018,CSR,COMPETITION SUCCESS (N),1 + 9789384175306,CSR YEAR BOOK 2017 (HINDI),Mark,COMPETITION SUCCESS REVIEW,1 + 9780552152167,NOT WITHOUT NY DAUGHTER,BETTY MAHMOODY,Corgi Children,0 + 9780552137492,LIGHTNING,Steel Danielle,Corgi Children,0 + 9780552139915,ICON,Forsyth Frederick,Corgi Children,0 + 9780552562966,A REALLY SHORT HISTORY OF NEARLY EVERYTHING,BILL BRYSON,Corgi Children,0 + 9780552166188,THE AWARD .,DANIELLE STEEL,Corgi Children,0 + 9780552553209,ERAGON,Paolini,Corgi Children,1 + 9780552554107,ELDEST,Paolini,Corgi Children,0 + 9780552559621,GEORGE AND THE BIG BANG,Mark,Corgi Children,0 + 9780552154796,FRIENDS FOREVER,DANIEL STEEL,Corgi Children,0 + 9780552165822,ROGUE,DANIELLE STEEL,Corgi Children,0 + 9780552155700,SPEICAL DELIVERY,DANIELLE STEEL,Corgi Children,0 + 9780552168243,FAMILY TIES,DANIELLE STEEL,Corgi Children,0 + 9780552150040,THE KLONE AND I,DANIELLE STEEL,Corgi Children,0 + 9788190817431,BHUGOL EK SANCHIPT VIBRAN,MAHESH KUMAR,COSMOS PUBLICATION,0 + 9788190817424,AAPDA EVAM AAPDA PRABANDAN,VARMarkVAL,COSMOS PUBLICATION,10 + 9780609608395,WHAT THE CEO WANTS YOU TO KNOW,Ram Charan,CROWN BUSINESS,0 + 9781405329163,CHINESE ENGLISH VISUAL BILINGUAL DICT.,Mark,D.K,0 + 9788193026182,INDUSTRIAL AND INFRASTRUCTURE SECURITY PART-II,COL NN BHATIA,DEEP & DEEP,0 + 9788193026175,INDUSTRIAL AND INFRASTRUCTURE SECURITY PART-I,COL NN BHATIA,DEEP & DEEP PUBLICATIONS,0 + 9788192778785,OBJECTIVE GENERAL KNOWLEDGE WITH CURRENT AFFAIRS.,Mark,DEEPAK SERIES FOR TEST PREPARATION,0 + 9788192778792,CURRENT AFFAIRS 49 PRACTICE SETS,Mark,DEEPAK SERIES FOR TEST PREPARATION,0 + 9781862305274,BOY IN THE STRIPED PYJAMAS THE,Boyne John,Definitions,0 + 9781730155116,SHRI KRISHMark LEELA,Mark,DEREAMLAND,0 + 9789350891896,MENTAL MATHEMATICS,Mark,DEREAMLAND,0 + 9789383182008,MATHEMATICS CLASS 10th,R.D. SHARMA,DHANPAT RAI &CO,5 + """ diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Samples/XCTestLogsSample.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Samples/XCTestLogsSample.swift new file mode 100644 index 00000000..317a199e --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/Samples/XCTestLogsSample.swift @@ -0,0 +1,5143 @@ +let xcodeLogs = #""" + 2020-11-15T22:46:57.8892230Z ##[section]Starting: Request a runner to run this job + 2020-11-15T22:46:58.4371787Z Can't find any online and idle self-hosted runner in current repository that matches the required labels: 'macOS-latest' + 2020-11-15T22:46:58.4371897Z Can't find any online and idle self-hosted runner in current repository's account/organization that matches the required labels: 'macOS-latest' + 2020-11-15T22:46:58.4590432Z Found online and idle hosted runner in current repository's account/organization that matches the required labels: 'macOS-latest' + 2020-11-15T22:46:58.5535983Z ##[section]Finishing: Request a runner to run this job + 2020-11-15T22:47:10.2467410Z Current runner version: '2.274.1' + 2020-11-15T22:47:10.2562610Z ##[group]Operating System + 2020-11-15T22:47:10.2563470Z Mac OS X + 2020-11-15T22:47:10.2563780Z 10.15.7 + 2020-11-15T22:47:10.2564140Z 19H15 + 2020-11-15T22:47:10.2564450Z ##[endgroup] + 2020-11-15T22:47:10.2564770Z ##[group]Virtual Environment + 2020-11-15T22:47:10.2565210Z Environment: macos-10.15 + 2020-11-15T22:47:10.2565570Z Version: 20201107.1 + 2020-11-15T22:47:10.2566290Z Included Software: https://github.com/actions/virtual-environments/blob/macos-10.15/20201107.1/images/macos/macos-10.15-Readme.md + 2020-11-15T22:47:10.2567020Z ##[endgroup] + 2020-11-15T22:47:10.2570610Z Prepare workflow directory + 2020-11-15T22:47:10.3324730Z Prepare all required actions + 2020-11-15T22:47:10.3336840Z Getting action download info + 2020-11-15T22:47:10.6532190Z Download action repository 'actions/checkout@v2' + 2020-11-15T22:47:11.6939740Z ##[group]Run actions/checkout@v2 + 2020-11-15T22:47:11.6940360Z with: + 2020-11-15T22:47:11.6940970Z repository: pointfreeco/pointfreeco + 2020-11-15T22:47:11.6941660Z token: *** + 2020-11-15T22:47:11.6942000Z ssh-strict: true + 2020-11-15T22:47:11.6942390Z persist-credentials: true + 2020-11-15T22:47:11.6942760Z clean: true + 2020-11-15T22:47:11.6943020Z fetch-depth: 1 + 2020-11-15T22:47:11.6943460Z lfs: false + 2020-11-15T22:47:11.6943790Z submodules: false + 2020-11-15T22:47:11.6944110Z ##[endgroup] + 2020-11-15T22:47:12.8756040Z Syncing repository: pointfreeco/pointfreeco + 2020-11-15T22:47:12.8757130Z ##[group]Getting Git version info + 2020-11-15T22:47:12.8759110Z Working directory is '/Users/runner/work/pointfreeco/pointfreeco' + 2020-11-15T22:47:12.8760110Z [command]/usr/local/bin/git version + 2020-11-15T22:47:12.8760600Z git version 2.29.2 + 2020-11-15T22:47:12.8762150Z ##[endgroup] + 2020-11-15T22:47:12.8763110Z Deleting the contents of '/Users/runner/work/pointfreeco/pointfreeco' + 2020-11-15T22:47:12.8765710Z ##[group]Initializing the repository + 2020-11-15T22:47:12.8766590Z [command]/usr/local/bin/git init /Users/runner/work/pointfreeco/pointfreeco + 2020-11-15T22:47:12.8767630Z Initialized empty Git repository in /Users/runner/work/pointfreeco/pointfreeco/.git/ + 2020-11-15T22:47:12.8768740Z [command]/usr/local/bin/git remote add origin https://github.com/pointfreeco/pointfreeco + 2020-11-15T22:47:12.8769620Z ##[endgroup] + 2020-11-15T22:47:12.8770330Z ##[group]Disabling automatic garbage collection + 2020-11-15T22:47:12.8771490Z [command]/usr/local/bin/git config --local gc.auto 0 + 2020-11-15T22:47:12.8772220Z ##[endgroup] + 2020-11-15T22:47:12.8819080Z ##[group]Setting up auth + 2020-11-15T22:47:12.8820380Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand + 2020-11-15T22:47:12.8822030Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || : + 2020-11-15T22:47:12.8823720Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader + 2020-11-15T22:47:12.8825670Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || : + 2020-11-15T22:47:12.8827620Z [command]/usr/local/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic *** + 2020-11-15T22:47:12.8828580Z ##[endgroup] + 2020-11-15T22:47:12.8829220Z ##[group]Fetching the repository + 2020-11-15T22:47:12.8830870Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --progress --no-recurse-submodules --depth=1 origin +fab6d0cc57614314d79e4bd2307f4273a474b5b5:refs/remotes/origin/main + 2020-11-15T22:47:13.0924270Z remote: Enumerating objects: 1032, done. + 2020-11-15T22:47:13.0925130Z remote: Counting objects: 0% (1/1032) + 2020-11-15T22:47:13.0925790Z remote: Counting objects: 1% (11/1032) + 2020-11-15T22:47:13.0964550Z remote: Counting objects: 2% (21/1032) + 2020-11-15T22:47:13.0966120Z remote: Counting objects: 3% (31/1032) + 2020-11-15T22:47:13.0967800Z remote: Counting objects: 4% (42/1032) + 2020-11-15T22:47:13.0968390Z remote: Counting objects: 5% (52/1032) + 2020-11-15T22:47:13.0969120Z remote: Counting objects: 6% (62/1032) + 2020-11-15T22:47:13.0970130Z remote: Counting objects: 7% (73/1032) + 2020-11-15T22:47:13.0971030Z remote: Counting objects: 8% (83/1032) + 2020-11-15T22:47:13.0971750Z remote: Counting objects: 9% (93/1032) + 2020-11-15T22:47:13.0972360Z remote: Counting objects: 10% (104/1032) + 2020-11-15T22:47:13.0972980Z remote: Counting objects: 11% (114/1032) + 2020-11-15T22:47:13.0973620Z remote: Counting objects: 12% (124/1032) + 2020-11-15T22:47:13.0974730Z remote: Counting objects: 13% (135/1032) + 2020-11-15T22:47:13.0976240Z remote: Counting objects: 14% (145/1032) + 2020-11-15T22:47:13.0976980Z remote: Counting objects: 15% (155/1032) + 2020-11-15T22:47:13.0977920Z remote: Counting objects: 16% (166/1032) + 2020-11-15T22:47:13.0978680Z remote: Counting objects: 17% (176/1032) + 2020-11-15T22:47:13.0979340Z remote: Counting objects: 18% (186/1032) + 2020-11-15T22:47:13.0980100Z remote: Counting objects: 19% (197/1032) + 2020-11-15T22:47:13.0980490Z remote: Counting objects: 20% (207/1032) + 2020-11-15T22:47:13.0980910Z remote: Counting objects: 21% (217/1032) + 2020-11-15T22:47:13.0981310Z remote: Counting objects: 22% (228/1032) + 2020-11-15T22:47:13.0981700Z remote: Counting objects: 23% (238/1032) + 2020-11-15T22:47:13.0982100Z remote: Counting objects: 24% (248/1032) + 2020-11-15T22:47:13.0982500Z remote: Counting objects: 25% (258/1032) + 2020-11-15T22:47:13.0982860Z remote: Counting objects: 26% (269/1032) + 2020-11-15T22:47:13.0983290Z remote: Counting objects: 27% (279/1032) + 2020-11-15T22:47:13.0983700Z remote: Counting objects: 28% (289/1032) + 2020-11-15T22:47:13.0984110Z remote: Counting objects: 29% (300/1032) + 2020-11-15T22:47:13.0984530Z remote: Counting objects: 30% (310/1032) + 2020-11-15T22:47:13.0984930Z remote: Counting objects: 31% (320/1032) + 2020-11-15T22:47:13.0986030Z remote: Counting objects: 32% (331/1032) + 2020-11-15T22:47:13.0986440Z remote: Counting objects: 33% (341/1032) + 2020-11-15T22:47:13.0986820Z remote: Counting objects: 34% (351/1032) + 2020-11-15T22:47:13.0987220Z remote: Counting objects: 35% (362/1032) + 2020-11-15T22:47:13.0987580Z remote: Counting objects: 36% (372/1032) + 2020-11-15T22:47:13.0987990Z remote: Counting objects: 37% (382/1032) + 2020-11-15T22:47:13.0988400Z remote: Counting objects: 38% (393/1032) + 2020-11-15T22:47:13.0989220Z remote: Counting objects: 39% (403/1032) + 2020-11-15T22:47:13.0989680Z remote: Counting objects: 40% (413/1032) + 2020-11-15T22:47:13.0990330Z remote: Counting objects: 41% (424/1032) + 2020-11-15T22:47:13.0990930Z remote: Counting objects: 42% (434/1032) + 2020-11-15T22:47:13.0991560Z remote: Counting objects: 43% (444/1032) + 2020-11-15T22:47:13.0992160Z remote: Counting objects: 44% (455/1032) + 2020-11-15T22:47:13.0992800Z remote: Counting objects: 45% (465/1032) + 2020-11-15T22:47:13.0993410Z remote: Counting objects: 46% (475/1032) + 2020-11-15T22:47:13.0994040Z remote: Counting objects: 47% (486/1032) + 2020-11-15T22:47:13.0994650Z remote: Counting objects: 48% (496/1032) + 2020-11-15T22:47:13.0995240Z remote: Counting objects: 49% (506/1032) + 2020-11-15T22:47:13.0995850Z remote: Counting objects: 50% (516/1032) + 2020-11-15T22:47:13.0996450Z remote: Counting objects: 51% (527/1032) + 2020-11-15T22:47:13.0997090Z remote: Counting objects: 52% (537/1032) + 2020-11-15T22:47:13.0997830Z remote: Counting objects: 53% (547/1032) + 2020-11-15T22:47:13.0998500Z remote: Counting objects: 54% (558/1032) + 2020-11-15T22:47:13.0999150Z remote: Counting objects: 55% (568/1032) + 2020-11-15T22:47:13.1000180Z remote: Counting objects: 56% (578/1032) + 2020-11-15T22:47:13.1000840Z remote: Counting objects: 57% (589/1032) + 2020-11-15T22:47:13.1001450Z remote: Counting objects: 58% (599/1032) + 2020-11-15T22:47:13.1002090Z remote: Counting objects: 59% (609/1032) + 2020-11-15T22:47:13.1002680Z remote: Counting objects: 60% (620/1032) + 2020-11-15T22:47:13.1003100Z remote: Counting objects: 61% (630/1032) + 2020-11-15T22:47:13.1003490Z remote: Counting objects: 62% (640/1032) + 2020-11-15T22:47:13.1003860Z remote: Counting objects: 63% (651/1032) + 2020-11-15T22:47:13.1004260Z remote: Counting objects: 64% (661/1032) + 2020-11-15T22:47:13.1004660Z remote: Counting objects: 65% (671/1032) + 2020-11-15T22:47:13.1005330Z remote: Counting objects: 66% (682/1032) + 2020-11-15T22:47:13.1005770Z remote: Counting objects: 67% (692/1032) + 2020-11-15T22:47:13.1006490Z remote: Counting objects: 68% (702/1032) + 2020-11-15T22:47:13.1007160Z remote: Counting objects: 69% (713/1032) + 2020-11-15T22:47:13.1007850Z remote: Counting objects: 70% (723/1032) + 2020-11-15T22:47:13.1008590Z remote: Counting objects: 71% (733/1032) + 2020-11-15T22:47:13.1009210Z remote: Counting objects: 72% (744/1032) + 2020-11-15T22:47:13.1009830Z remote: Counting objects: 73% (754/1032) + 2020-11-15T22:47:13.1010470Z remote: Counting objects: 74% (764/1032) + 2020-11-15T22:47:13.1011090Z remote: Counting objects: 75% (774/1032) + 2020-11-15T22:47:13.1011810Z remote: Counting objects: 76% (785/1032) + 2020-11-15T22:47:13.1012360Z remote: Counting objects: 77% (795/1032) + 2020-11-15T22:47:13.1013250Z remote: Counting objects: 78% (805/1032) + 2020-11-15T22:47:13.1014070Z remote: Counting objects: 79% (816/1032) + 2020-11-15T22:47:13.1014540Z remote: Counting objects: 80% (826/1032) + 2020-11-15T22:47:13.1014960Z remote: Counting objects: 81% (836/1032) + 2020-11-15T22:47:13.1015330Z remote: Counting objects: 82% (847/1032) + 2020-11-15T22:47:13.1015700Z remote: Counting objects: 83% (857/1032) + 2020-11-15T22:47:13.1016080Z remote: Counting objects: 84% (867/1032) + 2020-11-15T22:47:13.1016430Z remote: Counting objects: 85% (878/1032) + 2020-11-15T22:47:13.1016810Z remote: Counting objects: 86% (888/1032) + 2020-11-15T22:47:13.1017180Z remote: Counting objects: 87% (898/1032) + 2020-11-15T22:47:13.1017550Z remote: Counting objects: 88% (909/1032) + 2020-11-15T22:47:13.1017930Z remote: Counting objects: 89% (919/1032) + 2020-11-15T22:47:13.1018300Z remote: Counting objects: 90% (929/1032) + 2020-11-15T22:47:13.1018680Z remote: Counting objects: 91% (940/1032) + 2020-11-15T22:47:13.1019490Z remote: Counting objects: 92% (950/1032) + 2020-11-15T22:47:13.1020180Z remote: Counting objects: 93% (960/1032) + 2020-11-15T22:47:13.1020830Z remote: Counting objects: 94% (971/1032) + 2020-11-15T22:47:13.1021420Z remote: Counting objects: 95% (981/1032) + 2020-11-15T22:47:13.1023790Z remote: Counting objects: 96% (991/1032) + 2020-11-15T22:47:13.1025070Z remote: Counting objects: 97% (1002/1032) + 2020-11-15T22:47:13.1025650Z remote: Counting objects: 98% (1012/1032) + 2020-11-15T22:47:13.1026050Z remote: Counting objects: 99% (1022/1032) + 2020-11-15T22:47:13.1026430Z remote: Counting objects: 100% (1032/1032) + 2020-11-15T22:47:13.1026820Z remote: Counting objects: 100% (1032/1032), done. + 2020-11-15T22:47:13.1027270Z remote: Compressing objects: 0% (1/903) + 2020-11-15T22:47:13.1027710Z remote: Compressing objects: 1% (10/903) + 2020-11-15T22:47:13.1028130Z remote: Compressing objects: 2% (19/903) + 2020-11-15T22:47:13.1123950Z remote: Compressing objects: 3% (28/903) + 2020-11-15T22:47:13.1302710Z remote: Compressing objects: 4% (37/903) + 2020-11-15T22:47:13.1448100Z remote: Compressing objects: 5% (46/903) + 2020-11-15T22:47:13.1508560Z remote: Compressing objects: 6% (55/903) + 2020-11-15T22:47:13.1558430Z remote: Compressing objects: 7% (64/903) + 2020-11-15T22:47:13.1678440Z remote: Compressing objects: 8% (73/903) + 2020-11-15T22:47:13.1703420Z remote: Compressing objects: 9% (82/903) + 2020-11-15T22:47:13.1704820Z remote: Compressing objects: 10% (91/903) + 2020-11-15T22:47:13.1733170Z remote: Compressing objects: 11% (100/903) + 2020-11-15T22:47:13.1745890Z remote: Compressing objects: 12% (109/903) + 2020-11-15T22:47:13.1899800Z remote: Compressing objects: 13% (118/903) + 2020-11-15T22:47:13.1932490Z remote: Compressing objects: 14% (127/903) + 2020-11-15T22:47:13.1953350Z remote: Compressing objects: 15% (136/903) + 2020-11-15T22:47:13.1953990Z remote: Compressing objects: 16% (145/903) + 2020-11-15T22:47:13.1961900Z remote: Compressing objects: 17% (154/903) + 2020-11-15T22:47:13.1999210Z remote: Compressing objects: 18% (163/903) + 2020-11-15T22:47:13.2020270Z remote: Compressing objects: 19% (172/903) + 2020-11-15T22:47:13.2039600Z remote: Compressing objects: 20% (181/903) + 2020-11-15T22:47:13.2061260Z remote: Compressing objects: 21% (190/903) + 2020-11-15T22:47:13.2061800Z remote: Compressing objects: 22% (199/903) + 2020-11-15T22:47:13.2088600Z remote: Compressing objects: 23% (208/903) + 2020-11-15T22:47:13.2089170Z remote: Compressing objects: 24% (217/903) + 2020-11-15T22:47:13.2104410Z remote: Compressing objects: 25% (226/903) + 2020-11-15T22:47:13.2129930Z remote: Compressing objects: 26% (235/903) + 2020-11-15T22:47:13.2150720Z remote: Compressing objects: 27% (244/903) + 2020-11-15T22:47:13.2171760Z remote: Compressing objects: 28% (253/903) + 2020-11-15T22:47:13.2175590Z remote: Compressing objects: 29% (262/903) + 2020-11-15T22:47:13.2192120Z remote: Compressing objects: 30% (271/903) + 2020-11-15T22:47:13.2214660Z remote: Compressing objects: 31% (280/903) + 2020-11-15T22:47:13.2268470Z remote: Compressing objects: 32% (289/903) + 2020-11-15T22:47:13.2286290Z remote: Compressing objects: 33% (298/903) + 2020-11-15T22:47:13.2332860Z remote: Compressing objects: 34% (308/903) + 2020-11-15T22:47:13.2360700Z remote: Compressing objects: 35% (317/903) + 2020-11-15T22:47:13.2379090Z remote: Compressing objects: 36% (326/903) + 2020-11-15T22:47:13.2410330Z remote: Compressing objects: 37% (335/903) + 2020-11-15T22:47:13.2421720Z remote: Compressing objects: 38% (344/903) + 2020-11-15T22:47:13.2427930Z remote: Compressing objects: 39% (353/903) + 2020-11-15T22:47:13.2453820Z remote: Compressing objects: 40% (362/903) + 2020-11-15T22:47:13.2470270Z remote: Compressing objects: 41% (371/903) + 2020-11-15T22:47:13.2498940Z remote: Compressing objects: 42% (380/903) + 2020-11-15T22:47:13.2537000Z remote: Compressing objects: 43% (389/903) + 2020-11-15T22:47:13.2561150Z remote: Compressing objects: 44% (398/903) + 2020-11-15T22:47:13.2580730Z remote: Compressing objects: 45% (407/903) + 2020-11-15T22:47:13.2597460Z remote: Compressing objects: 46% (416/903) + 2020-11-15T22:47:13.2610910Z remote: Compressing objects: 47% (425/903) + 2020-11-15T22:47:13.2631960Z remote: Compressing objects: 48% (434/903) + 2020-11-15T22:47:13.2654860Z remote: Compressing objects: 49% (443/903) + 2020-11-15T22:47:13.2691420Z remote: Compressing objects: 50% (452/903) + 2020-11-15T22:47:13.2743660Z remote: Compressing objects: 51% (461/903) + 2020-11-15T22:47:13.2747590Z remote: Compressing objects: 52% (470/903) + 2020-11-15T22:47:13.2759960Z remote: Compressing objects: 53% (479/903) + 2020-11-15T22:47:13.2795110Z remote: Compressing objects: 54% (488/903) + 2020-11-15T22:47:13.2808780Z remote: Compressing objects: 55% (497/903) + 2020-11-15T22:47:13.2828520Z remote: Compressing objects: 56% (506/903) + 2020-11-15T22:47:13.2837570Z remote: Compressing objects: 57% (515/903) + 2020-11-15T22:47:13.2850480Z remote: Compressing objects: 58% (524/903) + 2020-11-15T22:47:13.2890310Z remote: Compressing objects: 59% (533/903) + 2020-11-15T22:47:13.2924270Z remote: Compressing objects: 60% (542/903) + 2020-11-15T22:47:13.2988920Z remote: Compressing objects: 61% (551/903) + 2020-11-15T22:47:13.3013720Z remote: Compressing objects: 62% (560/903) + 2020-11-15T22:47:13.3058570Z remote: Compressing objects: 63% (569/903) + 2020-11-15T22:47:13.3103240Z remote: Compressing objects: 64% (578/903) + 2020-11-15T22:47:13.3137510Z remote: Compressing objects: 65% (587/903) + 2020-11-15T22:47:13.3175460Z remote: Compressing objects: 66% (596/903) + 2020-11-15T22:47:13.3196110Z remote: Compressing objects: 67% (606/903) + 2020-11-15T22:47:13.3197040Z remote: Compressing objects: 68% (615/903) + 2020-11-15T22:47:13.3197600Z remote: Compressing objects: 69% (624/903) + 2020-11-15T22:47:13.3198160Z remote: Compressing objects: 70% (633/903) + 2020-11-15T22:47:13.3198660Z remote: Compressing objects: 71% (642/903) + 2020-11-15T22:47:13.3199070Z remote: Compressing objects: 72% (651/903) + 2020-11-15T22:47:13.3199480Z remote: Compressing objects: 73% (660/903) + 2020-11-15T22:47:13.3200190Z remote: Compressing objects: 74% (669/903) + 2020-11-15T22:47:13.3200650Z remote: Compressing objects: 75% (678/903) + 2020-11-15T22:47:13.3201350Z remote: Compressing objects: 76% (687/903) + 2020-11-15T22:47:13.3202010Z remote: Compressing objects: 77% (696/903) + 2020-11-15T22:47:13.3202670Z remote: Compressing objects: 78% (705/903) + 2020-11-15T22:47:13.3203320Z remote: Compressing objects: 79% (714/903) + 2020-11-15T22:47:13.3204000Z remote: Compressing objects: 80% (723/903) + 2020-11-15T22:47:13.3204700Z remote: Compressing objects: 81% (732/903) + 2020-11-15T22:47:13.3205350Z remote: Compressing objects: 82% (741/903) + 2020-11-15T22:47:13.3205970Z remote: Compressing objects: 83% (750/903) + 2020-11-15T22:47:13.3206620Z remote: Compressing objects: 84% (759/903) + 2020-11-15T22:47:13.3207270Z remote: Compressing objects: 85% (768/903) + 2020-11-15T22:47:13.3207910Z remote: Compressing objects: 86% (777/903) + 2020-11-15T22:47:13.3208560Z remote: Compressing objects: 87% (786/903) + 2020-11-15T22:47:13.3209200Z remote: Compressing objects: 88% (795/903) + 2020-11-15T22:47:13.3231090Z remote: Compressing objects: 89% (804/903) + 2020-11-15T22:47:13.3231650Z remote: Compressing objects: 90% (813/903) + 2020-11-15T22:47:13.3232090Z remote: Compressing objects: 91% (822/903) + 2020-11-15T22:47:13.3232780Z remote: Compressing objects: 92% (831/903) + 2020-11-15T22:47:13.3233360Z remote: Compressing objects: 93% (840/903) + 2020-11-15T22:47:13.3235200Z remote: Compressing objects: 94% (849/903) + 2020-11-15T22:47:13.3238480Z remote: Compressing objects: 95% (858/903) + 2020-11-15T22:47:13.3239070Z remote: Compressing objects: 96% (867/903) + 2020-11-15T22:47:13.3239620Z remote: Compressing objects: 97% (876/903) + 2020-11-15T22:47:13.3240020Z remote: Compressing objects: 98% (885/903) + 2020-11-15T22:47:13.3240430Z remote: Compressing objects: 99% (894/903) + 2020-11-15T22:47:13.3240840Z remote: Compressing objects: 100% (903/903) + 2020-11-15T22:47:13.3241340Z remote: Compressing objects: 100% (903/903), done. + 2020-11-15T22:47:13.3318500Z Receiving objects: 0% (1/1032) + 2020-11-15T22:47:13.9577890Z Receiving objects: 1% (11/1032) + 2020-11-15T22:47:13.9582170Z Receiving objects: 2% (21/1032) + 2020-11-15T22:47:13.9584370Z Receiving objects: 3% (31/1032) + 2020-11-15T22:47:13.9590290Z Receiving objects: 4% (42/1032) + 2020-11-15T22:47:13.9593470Z Receiving objects: 5% (52/1032) + 2020-11-15T22:47:13.9596000Z Receiving objects: 6% (62/1032) + 2020-11-15T22:47:13.9598590Z Receiving objects: 7% (73/1032) + 2020-11-15T22:47:13.9600740Z Receiving objects: 8% (83/1032) + 2020-11-15T22:47:13.9602390Z Receiving objects: 9% (93/1032) + 2020-11-15T22:47:13.9603960Z Receiving objects: 10% (104/1032) + 2020-11-15T22:47:13.9639250Z Receiving objects: 11% (114/1032) + 2020-11-15T22:47:13.9641650Z Receiving objects: 12% (124/1032) + 2020-11-15T22:47:14.0145610Z Receiving objects: 13% (135/1032) + 2020-11-15T22:47:14.0202120Z Receiving objects: 14% (145/1032) + 2020-11-15T22:47:14.0203940Z Receiving objects: 15% (155/1032) + 2020-11-15T22:47:14.0206250Z Receiving objects: 16% (166/1032) + 2020-11-15T22:47:14.0208500Z Receiving objects: 17% (176/1032) + 2020-11-15T22:47:14.0210870Z Receiving objects: 18% (186/1032) + 2020-11-15T22:47:14.0212330Z Receiving objects: 19% (197/1032) + 2020-11-15T22:47:14.0213170Z Receiving objects: 20% (207/1032) + 2020-11-15T22:47:14.0213880Z Receiving objects: 21% (217/1032) + 2020-11-15T22:47:14.0215620Z Receiving objects: 22% (228/1032) + 2020-11-15T22:47:14.0216690Z Receiving objects: 23% (238/1032) + 2020-11-15T22:47:14.0217930Z Receiving objects: 24% (248/1032) + 2020-11-15T22:47:14.0219580Z Receiving objects: 25% (258/1032) + 2020-11-15T22:47:14.0220720Z Receiving objects: 26% (269/1032) + 2020-11-15T22:47:14.0222300Z Receiving objects: 27% (279/1032) + 2020-11-15T22:47:14.0223600Z Receiving objects: 28% (289/1032) + 2020-11-15T22:47:14.0226080Z Receiving objects: 29% (300/1032) + 2020-11-15T22:47:14.0227210Z Receiving objects: 30% (310/1032) + 2020-11-15T22:47:14.0229450Z Receiving objects: 31% (320/1032) + 2020-11-15T22:47:14.0230110Z Receiving objects: 32% (331/1032) + 2020-11-15T22:47:14.0230950Z Receiving objects: 33% (341/1032) + 2020-11-15T22:47:14.0231710Z Receiving objects: 34% (351/1032) + 2020-11-15T22:47:14.0232350Z Receiving objects: 35% (362/1032) + 2020-11-15T22:47:14.0232990Z Receiving objects: 36% (372/1032) + 2020-11-15T22:47:14.0233590Z Receiving objects: 37% (382/1032) + 2020-11-15T22:47:14.0234290Z Receiving objects: 38% (393/1032) + 2020-11-15T22:47:14.0234920Z Receiving objects: 39% (403/1032) + 2020-11-15T22:47:14.0235510Z Receiving objects: 40% (413/1032) + 2020-11-15T22:47:14.0236400Z Receiving objects: 41% (424/1032) + 2020-11-15T22:47:14.0237000Z Receiving objects: 42% (434/1032) + 2020-11-15T22:47:14.0237600Z Receiving objects: 43% (444/1032) + 2020-11-15T22:47:14.0238190Z Receiving objects: 44% (455/1032) + 2020-11-15T22:47:14.0238830Z Receiving objects: 45% (465/1032) + 2020-11-15T22:47:14.0239370Z Receiving objects: 46% (475/1032) + 2020-11-15T22:47:14.0239950Z Receiving objects: 47% (486/1032) + 2020-11-15T22:47:14.0240630Z Receiving objects: 48% (496/1032) + 2020-11-15T22:47:14.0241220Z Receiving objects: 49% (506/1032) + 2020-11-15T22:47:14.0242060Z Receiving objects: 50% (516/1032) + 2020-11-15T22:47:14.0243150Z Receiving objects: 51% (527/1032) + 2020-11-15T22:47:14.0245420Z Receiving objects: 52% (537/1032) + 2020-11-15T22:47:14.0247140Z Receiving objects: 53% (547/1032) + 2020-11-15T22:47:14.0250290Z Receiving objects: 54% (558/1032) + 2020-11-15T22:47:14.0251720Z Receiving objects: 55% (568/1032) + 2020-11-15T22:47:14.0255230Z Receiving objects: 56% (578/1032) + 2020-11-15T22:47:14.0255740Z Receiving objects: 57% (589/1032) + 2020-11-15T22:47:14.0256110Z Receiving objects: 58% (599/1032) + 2020-11-15T22:47:14.0256440Z Receiving objects: 59% (609/1032) + 2020-11-15T22:47:14.0256800Z Receiving objects: 60% (620/1032) + 2020-11-15T22:47:14.0257250Z Receiving objects: 61% (630/1032) + 2020-11-15T22:47:14.0258190Z Receiving objects: 62% (640/1032) + 2020-11-15T22:47:14.0259580Z Receiving objects: 63% (651/1032) + 2020-11-15T22:47:14.0266210Z Receiving objects: 64% (661/1032) + 2020-11-15T22:47:14.0266890Z Receiving objects: 65% (671/1032) + 2020-11-15T22:47:14.0267920Z Receiving objects: 66% (682/1032) + 2020-11-15T22:47:14.0268650Z Receiving objects: 67% (692/1032) + 2020-11-15T22:47:14.0269480Z Receiving objects: 68% (702/1032) + 2020-11-15T22:47:14.0270210Z Receiving objects: 69% (713/1032) + 2020-11-15T22:47:14.0271510Z Receiving objects: 70% (723/1032) + 2020-11-15T22:47:14.0272220Z Receiving objects: 71% (733/1032) + 2020-11-15T22:47:14.0272910Z Receiving objects: 72% (744/1032) + 2020-11-15T22:47:14.0273590Z Receiving objects: 73% (754/1032) + 2020-11-15T22:47:14.0274310Z Receiving objects: 74% (764/1032) + 2020-11-15T22:47:14.0274990Z Receiving objects: 75% (774/1032) + 2020-11-15T22:47:14.0275710Z Receiving objects: 76% (785/1032) + 2020-11-15T22:47:14.0276400Z Receiving objects: 77% (795/1032) + 2020-11-15T22:47:14.0277070Z Receiving objects: 78% (805/1032) + 2020-11-15T22:47:14.0277740Z Receiving objects: 79% (816/1032) + 2020-11-15T22:47:14.0278470Z Receiving objects: 80% (826/1032) + 2020-11-15T22:47:14.0279140Z Receiving objects: 81% (836/1032) + 2020-11-15T22:47:14.0280230Z Receiving objects: 82% (847/1032) + 2020-11-15T22:47:14.0281000Z Receiving objects: 83% (857/1032) + 2020-11-15T22:47:14.0282470Z Receiving objects: 84% (867/1032) + 2020-11-15T22:47:14.0282940Z Receiving objects: 85% (878/1032) + 2020-11-15T22:47:14.0284310Z Receiving objects: 86% (888/1032) + 2020-11-15T22:47:14.0284630Z Receiving objects: 87% (898/1032) + 2020-11-15T22:47:14.0284990Z Receiving objects: 88% (909/1032) + 2020-11-15T22:47:14.0285340Z Receiving objects: 89% (919/1032) + 2020-11-15T22:47:14.0285680Z Receiving objects: 90% (929/1032) + 2020-11-15T22:47:14.0286010Z Receiving objects: 91% (940/1032) + 2020-11-15T22:47:14.0286350Z Receiving objects: 92% (950/1032) + 2020-11-15T22:47:14.0286680Z Receiving objects: 93% (960/1032) + 2020-11-15T22:47:14.0286990Z Receiving objects: 94% (971/1032) + 2020-11-15T22:47:14.0287340Z Receiving objects: 95% (981/1032) + 2020-11-15T22:47:14.0287650Z Receiving objects: 96% (991/1032) + 2020-11-15T22:47:14.0288000Z Receiving objects: 97% (1002/1032) + 2020-11-15T22:47:14.0288420Z Receiving objects: 98% (1012/1032) + 2020-11-15T22:47:14.0288780Z Receiving objects: 99% (1022/1032) + 2020-11-15T22:47:14.0290040Z remote: Total 1032 (delta 262), reused 422 (delta 104), pack-reused 0 + 2020-11-15T22:47:14.0290590Z Receiving objects: 100% (1032/1032) + 2020-11-15T22:47:14.0290990Z Receiving objects: 100% (1032/1032), 1.27 MiB | 10.13 MiB/s, done. + 2020-11-15T22:47:14.0291340Z Resolving deltas: 0% (0/262) + 2020-11-15T22:47:14.0291680Z Resolving deltas: 1% (3/262) + 2020-11-15T22:47:14.0292000Z Resolving deltas: 2% (6/262) + 2020-11-15T22:47:14.0292330Z Resolving deltas: 3% (8/262) + 2020-11-15T22:47:14.0292750Z Resolving deltas: 4% (11/262) + 2020-11-15T22:47:14.0293120Z Resolving deltas: 5% (14/262) + 2020-11-15T22:47:14.0293460Z Resolving deltas: 6% (16/262) + 2020-11-15T22:47:14.0293800Z Resolving deltas: 7% (19/262) + 2020-11-15T22:47:14.0294100Z Resolving deltas: 8% (21/262) + 2020-11-15T22:47:14.0294440Z Resolving deltas: 9% (24/262) + 2020-11-15T22:47:14.0294780Z Resolving deltas: 10% (27/262) + 2020-11-15T22:47:14.0295200Z Resolving deltas: 11% (29/262) + 2020-11-15T22:47:14.0295560Z Resolving deltas: 12% (32/262) + 2020-11-15T22:47:14.0295900Z Resolving deltas: 13% (35/262) + 2020-11-15T22:47:14.0296360Z Resolving deltas: 14% (37/262) + 2020-11-15T22:47:14.0296660Z Resolving deltas: 15% (40/262) + 2020-11-15T22:47:14.0297070Z Resolving deltas: 16% (42/262) + 2020-11-15T22:47:14.0297370Z Resolving deltas: 17% (45/262) + 2020-11-15T22:47:14.0297670Z Resolving deltas: 18% (48/262) + 2020-11-15T22:47:14.0298020Z Resolving deltas: 19% (50/262) + 2020-11-15T22:47:14.0298320Z Resolving deltas: 20% (53/262) + 2020-11-15T22:47:14.0298660Z Resolving deltas: 21% (56/262) + 2020-11-15T22:47:14.0298990Z Resolving deltas: 22% (58/262) + 2020-11-15T22:47:14.0299320Z Resolving deltas: 23% (61/262) + 2020-11-15T22:47:14.0299660Z Resolving deltas: 24% (63/262) + 2020-11-15T22:47:14.0299950Z Resolving deltas: 25% (66/262) + 2020-11-15T22:47:14.0300290Z Resolving deltas: 26% (69/262) + 2020-11-15T22:47:14.0300700Z Resolving deltas: 27% (71/262) + 2020-11-15T22:47:14.0301060Z Resolving deltas: 28% (74/262) + 2020-11-15T22:47:14.0301400Z Resolving deltas: 29% (76/262) + 2020-11-15T22:47:14.0301720Z Resolving deltas: 30% (79/262) + 2020-11-15T22:47:14.0302530Z Resolving deltas: 31% (82/262) + 2020-11-15T22:47:14.0302830Z Resolving deltas: 32% (84/262) + 2020-11-15T22:47:14.0303170Z Resolving deltas: 33% (87/262) + 2020-11-15T22:47:14.0303510Z Resolving deltas: 34% (90/262) + 2020-11-15T22:47:14.0303840Z Resolving deltas: 35% (92/262) + 2020-11-15T22:47:14.0304230Z Resolving deltas: 36% (95/262) + 2020-11-15T22:47:14.0304650Z Resolving deltas: 37% (97/262) + 2020-11-15T22:47:14.0304990Z Resolving deltas: 38% (100/262) + 2020-11-15T22:47:14.0305320Z Resolving deltas: 39% (103/262) + 2020-11-15T22:47:14.0305790Z Resolving deltas: 40% (105/262) + 2020-11-15T22:47:14.0307500Z Resolving deltas: 41% (108/262) + 2020-11-15T22:47:14.0307830Z Resolving deltas: 42% (111/262) + 2020-11-15T22:47:14.0308140Z Resolving deltas: 43% (113/262) + 2020-11-15T22:47:14.0308920Z Resolving deltas: 44% (116/262) + 2020-11-15T22:47:14.0309290Z Resolving deltas: 45% (118/262) + 2020-11-15T22:47:14.0309600Z Resolving deltas: 46% (121/262) + 2020-11-15T22:47:14.0310390Z Resolving deltas: 47% (124/262) + 2020-11-15T22:47:14.0310710Z Resolving deltas: 48% (126/262) + 2020-11-15T22:47:14.0311060Z Resolving deltas: 49% (129/262) + 2020-11-15T22:47:14.0311410Z Resolving deltas: 50% (132/262) + 2020-11-15T22:47:14.0311710Z Resolving deltas: 51% (134/262) + 2020-11-15T22:47:14.0312040Z Resolving deltas: 52% (137/262) + 2020-11-15T22:47:14.0312370Z Resolving deltas: 53% (139/262) + 2020-11-15T22:47:14.0312700Z Resolving deltas: 54% (142/262) + 2020-11-15T22:47:14.0313050Z Resolving deltas: 55% (145/262) + 2020-11-15T22:47:14.0313380Z Resolving deltas: 56% (147/262) + 2020-11-15T22:47:14.0313720Z Resolving deltas: 57% (150/262) + 2020-11-15T22:47:14.0314050Z Resolving deltas: 58% (152/262) + 2020-11-15T22:47:14.0314350Z Resolving deltas: 59% (155/262) + 2020-11-15T22:47:14.0314690Z Resolving deltas: 60% (158/262) + 2020-11-15T22:47:14.0315380Z Resolving deltas: 61% (160/262) + 2020-11-15T22:47:14.0315780Z Resolving deltas: 62% (163/262) + 2020-11-15T22:47:14.0316120Z Resolving deltas: 63% (166/262) + 2020-11-15T22:47:14.0316520Z Resolving deltas: 64% (168/262) + 2020-11-15T22:47:14.0316850Z Resolving deltas: 65% (171/262) + 2020-11-15T22:47:14.0317140Z Resolving deltas: 66% (173/262) + 2020-11-15T22:47:14.0317450Z Resolving deltas: 67% (176/262) + 2020-11-15T22:47:14.0317760Z Resolving deltas: 68% (179/262) + 2020-11-15T22:47:14.0318060Z Resolving deltas: 69% (181/262) + 2020-11-15T22:47:14.0318370Z Resolving deltas: 70% (184/262) + 2020-11-15T22:47:14.0318670Z Resolving deltas: 71% (187/262) + 2020-11-15T22:47:14.0319050Z Resolving deltas: 72% (189/262) + 2020-11-15T22:47:14.0319360Z Resolving deltas: 73% (192/262) + 2020-11-15T22:47:14.0319650Z Resolving deltas: 74% (194/262) + 2020-11-15T22:47:14.0319950Z Resolving deltas: 75% (197/262) + 2020-11-15T22:47:14.0320260Z Resolving deltas: 76% (200/262) + 2020-11-15T22:47:14.0320630Z Resolving deltas: 77% (202/262) + 2020-11-15T22:47:14.0320940Z Resolving deltas: 78% (205/262) + 2020-11-15T22:47:14.0321270Z Resolving deltas: 79% (207/262) + 2020-11-15T22:47:14.0321700Z Resolving deltas: 80% (210/262) + 2020-11-15T22:47:14.0321990Z Resolving deltas: 81% (213/262) + 2020-11-15T22:47:14.0322330Z Resolving deltas: 82% (215/262) + 2020-11-15T22:47:14.0322660Z Resolving deltas: 83% (218/262) + 2020-11-15T22:47:14.0322960Z Resolving deltas: 84% (221/262) + 2020-11-15T22:47:14.0323260Z Resolving deltas: 85% (223/262) + 2020-11-15T22:47:14.0323560Z Resolving deltas: 86% (226/262) + 2020-11-15T22:47:14.0323860Z Resolving deltas: 87% (228/262) + 2020-11-15T22:47:14.0324160Z Resolving deltas: 88% (231/262) + 2020-11-15T22:47:14.0324450Z Resolving deltas: 89% (234/262) + 2020-11-15T22:47:14.0324750Z Resolving deltas: 90% (236/262) + 2020-11-15T22:47:14.0325050Z Resolving deltas: 91% (239/262) + 2020-11-15T22:47:14.0325360Z Resolving deltas: 92% (242/262) + 2020-11-15T22:47:14.0325690Z Resolving deltas: 93% (244/262) + 2020-11-15T22:47:14.0326090Z Resolving deltas: 94% (247/262) + 2020-11-15T22:47:14.0326420Z Resolving deltas: 95% (249/262) + 2020-11-15T22:47:14.0326710Z Resolving deltas: 96% (252/262) + 2020-11-15T22:47:14.0327460Z Resolving deltas: 97% (255/262) + 2020-11-15T22:47:14.0327800Z Resolving deltas: 98% (257/262) + 2020-11-15T22:47:14.0328130Z Resolving deltas: 99% (260/262) + 2020-11-15T22:47:14.0328460Z Resolving deltas: 100% (262/262) + 2020-11-15T22:47:14.0328780Z Resolving deltas: 100% (262/262), done. + 2020-11-15T22:47:14.0329280Z From https://github.com/pointfreeco/pointfreeco + 2020-11-15T22:47:14.0330660Z * [new ref] fab6d0cc57614314d79e4bd2307f4273a474b5b5 -> origin/main + 2020-11-15T22:47:14.0331510Z ##[endgroup] + 2020-11-15T22:47:14.0332010Z ##[group]Determining the checkout info + 2020-11-15T22:47:14.0332680Z ##[endgroup] + 2020-11-15T22:47:14.0333140Z ##[group]Checking out the ref + 2020-11-15T22:47:14.0334100Z [command]/usr/local/bin/git checkout --progress --force -B main refs/remotes/origin/main + 2020-11-15T22:47:14.0335380Z Switched to a new branch 'main' + 2020-11-15T22:47:14.0336270Z Branch 'main' set up to track remote branch 'main' from 'origin'. + 2020-11-15T22:47:14.1131060Z ##[endgroup] + 2020-11-15T22:47:14.1222050Z [command]/usr/local/bin/git log -1 --format='%H' + 2020-11-15T22:47:14.1289980Z 'fab6d0cc57614314d79e4bd2307f4273a474b5b5' + 2020-11-15T22:47:29.8333940Z ##[endgroup] + 2020-11-15T22:47:36.0836990Z createuser --superuser pointfreeco || true + 2020-11-15T22:47:36.2586900Z createdb --owner pointfreeco pointfreeco_development || true + 2020-11-15T22:47:36.6354900Z createdb --owner pointfreeco pointfreeco_test || true + 2020-11-15T22:48:51.4921290Z Fetching https://github.com/pointfreeco/Ccmark.git + 2020-11-15T22:49:02.4312250Z Fetching https://github.com/pointfreeco/swift-html.git + 2020-11-15T22:49:12.4267310Z Fetching https://github.com/pointfreeco/swift-prelude.git + 2020-11-15T22:49:15.6810050Z Fetching https://github.com/pointfreeco/swift-tagged.git + 2020-11-15T22:49:18.0842000Z Fetching https://github.com/pointfreeco/swift-web.git + 2020-11-15T22:49:19.7171070Z Fetching https://github.com/apple/swift-nio-extras.git + 2020-11-15T22:49:22.1611360Z Fetching https://github.com/IBM-Swift/BlueCryptor.git + 2020-11-15T22:49:24.6106990Z Fetching https://github.com/apple/swift-nio.git + 2020-11-15T22:49:30.1830010Z Fetching https://github.com/pointfreeco/swift-snapshot-testing.git + 2020-11-15T22:49:34.5350090Z Fetching https://github.com/vapor-community/postgresql.git + 2020-11-15T22:49:36.5919150Z Fetching https://github.com/ianpartridge/swift-backtrace.git + 2020-11-15T22:49:37.2866500Z Fetching https://github.com/apple/swift-log.git + 2020-11-15T22:49:42.7992130Z Fetching https://github.com/vapor/core.git + 2020-11-15T22:49:45.7032650Z Fetching https://github.com/vapor/node.git + 2020-11-15T22:49:47.4587710Z Fetching https://github.com/vapor-community/cpostgresql.git + 2020-11-15T22:49:53.7857470Z Fetching https://github.com/vapor/debugging.git + 2020-11-15T22:49:56.0633730Z Fetching https://github.com/vapor/bits.git + 2020-11-15T22:50:12.2453830Z Cloning https://github.com/pointfreeco/swift-web.git + 2020-11-15T22:50:18.7218050Z Resolving https://github.com/pointfreeco/swift-web.git at 148acf4 + 2020-11-15T22:50:19.8626910Z Cloning https://github.com/vapor/core.git + 2020-11-15T22:50:25.4328920Z Resolving https://github.com/vapor/core.git at 2.2.1 + 2020-11-15T22:50:28.9098080Z Cloning https://github.com/apple/swift-log.git + 2020-11-15T22:50:32.6443710Z Resolving https://github.com/apple/swift-log.git at 1.4.0 + 2020-11-15T22:50:34.2068150Z Cloning https://github.com/vapor/node.git + 2020-11-15T22:50:38.0626410Z Resolving https://github.com/vapor/node.git at 2.1.5 + 2020-11-15T22:50:38.4546210Z Cloning https://github.com/ianpartridge/swift-backtrace.git + 2020-11-15T22:50:42.9248190Z Resolving https://github.com/ianpartridge/swift-backtrace.git at 1.1.0 + 2020-11-15T22:50:45.3436370Z Cloning https://github.com/IBM-Swift/BlueCryptor.git + 2020-11-15T22:50:48.7101610Z Resolving https://github.com/IBM-Swift/BlueCryptor.git at 1.0.32 + 2020-11-15T22:50:48.9487290Z Cloning https://github.com/vapor-community/cpostgresql.git + 2020-11-15T22:50:51.5191900Z Resolving https://github.com/vapor-community/cpostgresql.git at 2.1.0 + 2020-11-15T22:50:51.9480540Z Cloning https://github.com/pointfreeco/Ccmark.git + 2020-11-15T22:50:54.5262910Z Resolving https://github.com/pointfreeco/Ccmark.git at main + 2020-11-15T22:50:54.9377860Z Cloning https://github.com/vapor/bits.git + 2020-11-15T22:50:57.4338740Z Resolving https://github.com/vapor/bits.git at 1.1.1 + 2020-11-15T22:50:57.6449720Z Cloning https://github.com/vapor/debugging.git + 2020-11-15T22:51:00.5019060Z Resolving https://github.com/vapor/debugging.git at 1.1.1 + 2020-11-15T22:51:00.9192370Z Cloning https://github.com/apple/swift-nio-extras.git + 2020-11-15T22:51:04.9736690Z Resolving https://github.com/apple/swift-nio-extras.git at 1.7.0 + 2020-11-15T22:51:05.3796360Z Cloning https://github.com/pointfreeco/swift-html.git + 2020-11-15T22:51:06.7127410Z Resolving https://github.com/pointfreeco/swift-html.git at 3a1b7e4 + 2020-11-15T22:51:14.5874490Z Cloning https://github.com/pointfreeco/swift-snapshot-testing.git + 2020-11-15T22:51:16.0235630Z Resolving https://github.com/pointfreeco/swift-snapshot-testing.git at 1.8.2 + 2020-11-15T22:51:16.3919950Z Cloning https://github.com/apple/swift-nio.git + 2020-11-15T22:51:19.2571280Z Resolving https://github.com/apple/swift-nio.git at 2.23.0 + 2020-11-15T22:51:19.7620250Z Cloning https://github.com/vapor-community/postgresql.git + 2020-11-15T22:51:20.3838410Z Resolving https://github.com/vapor-community/postgresql.git at 2.1.2 + 2020-11-15T22:51:20.5805900Z Cloning https://github.com/pointfreeco/swift-tagged.git + 2020-11-15T22:51:20.8778500Z Resolving https://github.com/pointfreeco/swift-tagged.git at fde36b6 + 2020-11-15T22:51:21.0452490Z Cloning https://github.com/pointfreeco/swift-prelude.git + 2020-11-15T22:51:21.1219070Z Resolving https://github.com/pointfreeco/swift-prelude.git at 9240a1f + 2020-11-15T22:51:28.1668700Z 'CPostgreSQL' /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/cpostgresql: warning: ignoring declared target(s) 'CPostgreSQL' in the system package + 2020-11-15T22:51:29.0227280Z [1/13] Compiling CNIOWindows WSAStartup.c + 2020-11-15T22:51:29.0289230Z [2/13] Compiling CNIOWindows shim.c + 2020-11-15T22:51:29.0511240Z [3/15] Compiling CNIOLinux shim.c + 2020-11-15T22:51:29.8569010Z [4/48] Compiling CNIOSHA1 c_nio_sha1.c + 2020-11-15T22:51:32.3769290Z [5/84] Compiling Prelude Alt.swift + 2020-11-15T22:51:32.4404480Z [6/85] Merging module libc + 2020-11-15T22:51:32.5982090Z [7/87] Compiling PathIndexable PathIndexable+Subscripting.swift + 2020-11-15T22:51:32.7110410Z [8/87] Compiling PathIndexable PathIndexable.swift + 2020-11-15T22:51:32.7538450Z [9/88] Merging module PathIndexable + 2020-11-15T22:51:32.8692700Z [10/91] Compiling Logging LogHandler.swift + 2020-11-15T22:51:33.0667500Z [11/91] Compiling Logging Locks.swift + 2020-11-15T22:51:33.4358610Z [12/91] Compiling Logging Logging.swift + 2020-11-15T22:51:33.5975240Z [13/92] Merging module Logging + 2020-11-15T22:51:34.9355270Z [14/105] Compiling Html Node.swift + 2020-11-15T22:51:34.9455770Z [15/105] Compiling Html Tag.swift + 2020-11-15T22:51:34.9456700Z [16/105] Compiling Html XmlRender.swift + 2020-11-15T22:51:34.9774160Z [17/105] Compiling Html Html4.swift + 2020-11-15T22:51:34.9774840Z [18/105] Compiling Html HtmlRender.swift + 2020-11-15T22:51:34.9776820Z [19/105] Compiling Html MediaType.swift + 2020-11-15T22:51:35.1894860Z [20/105] Compiling Html DebugXmlRender.swift + 2020-11-15T22:51:35.1896190Z [21/105] Compiling Html Elements.swift + 2020-11-15T22:51:35.1896610Z [22/105] Compiling Html Events.swift + 2020-11-15T22:51:37.4943680Z [23/105] Compiling Html Aria.swift + 2020-11-15T22:51:37.5044370Z [24/105] Compiling Html Attributes.swift + 2020-11-15T22:51:37.5094470Z [25/105] Compiling Html ChildOf.swift + 2020-11-15T22:51:37.5224120Z [26/105] Compiling Html DebugRender.swift + 2020-11-15T22:51:37.6428540Z [32/105] Compiling Prelude KeyPath.swift + 2020-11-15T22:51:37.6529910Z [33/105] Compiling Prelude Monoid.swift + 2020-11-15T22:51:37.6572340Z [34/105] Compiling Prelude NearSemiring.swift + 2020-11-15T22:51:37.6595630Z [35/105] Compiling Prelude Never.swift + 2020-11-15T22:51:37.6599080Z [36/105] Compiling Prelude Operators.swift + 2020-11-15T22:51:37.6599870Z [37/105] Compiling Prelude Optional.swift + 2020-11-15T22:51:37.6602860Z [38/105] Compiling Prelude Parallel.swift + 2020-11-15T22:51:37.6610400Z [39/105] Compiling Prelude Plus.swift + 2020-11-15T22:51:37.6611200Z [40/105] Compiling Prelude PrecedenceGroups.swift + 2020-11-15T22:51:37.6611890Z [41/105] Compiling Prelude Ring.swift + 2020-11-15T22:51:37.6612520Z [42/105] Compiling Prelude Semigroup.swift + 2020-11-15T22:51:37.6613170Z [43/105] Compiling Prelude Semiring.swift + 2020-11-15T22:51:37.6613810Z [44/105] Compiling Prelude Sequence.swift + 2020-11-15T22:51:37.6614410Z [45/105] Compiling Prelude Set.swift + 2020-11-15T22:51:37.6626050Z [46/105] Compiling Prelude String.swift + 2020-11-15T22:51:37.6627250Z [47/105] Compiling Prelude Strong.swift + 2020-11-15T22:51:37.6628570Z [48/105] Compiling Prelude Tuple.swift + 2020-11-15T22:51:37.6631960Z [49/105] Compiling Prelude Unit.swift + 2020-11-15T22:51:38.2831000Z [55/106] Compiling Prelude Func.swift + 2020-11-15T22:51:38.2929040Z [56/106] Compiling Prelude Function.swift + 2020-11-15T22:51:38.2930030Z [57/106] Compiling Prelude HeytingAlgebra.swift + 2020-11-15T22:51:38.2930720Z [58/106] Compiling Prelude Hole.swift + 2020-11-15T22:51:38.2931290Z [59/106] Compiling Prelude IO.swift + 2020-11-15T22:51:38.4901330Z [60/107] Merging module Prelude + 2020-11-15T22:51:38.4918750Z [61/107] Merging module Tagged + 2020-11-15T22:51:38.7383780Z [62/109] Compiling TaggedTime TaggedTime.swift + 2020-11-15T22:51:38.7763010Z [63/110] Merging module Debugging + 2020-11-15T22:51:39.0638030Z [68/112] Compiling Tuple Tuple.swift + 2020-11-15T22:51:39.0979480Z [69/113] Merging module Html + 2020-11-15T22:51:39.2361580Z [70/114] Merging module TaggedTime + 2020-11-15T22:51:39.3346420Z [71/115] Compiling EmailAddress EmailAddress.swift + 2020-11-15T22:51:39.4942020Z [73/117] Merging module Tuple + 2020-11-15T22:51:39.5655840Z [74/118] Merging module TaggedMoney + 2020-11-15T22:51:44.7753530Z [99/119] Compiling HtmlPlainTextPrint HtmlPlainTextPrint.swift + 2020-11-15T22:51:44.9378410Z [110/122] Merging module EmailAddress + 2020-11-15T22:51:45.1407120Z [111/126] Merging module View + 2020-11-15T22:51:45.2274120Z [112/127] Compiling DecodableRequest DecodableRequest.swift + 2020-11-15T22:51:45.3515790Z [114/128] Compiling Either Nested.swift + 2020-11-15T22:51:45.3955450Z [115/128] Merging module SnapshotTesting + 2020-11-15T22:51:45.5566620Z [116/139] Merging module DecodableRequest + 2020-11-15T22:51:46.0923060Z [117/140] Compiling Cryptor Digest.swift + 2020-11-15T22:51:46.1702830Z [118/140] Compiling HtmlSnapshotTesting HtmlSnapshotTesting.swift + 2020-11-15T22:51:46.1817240Z [119/141] Compiling Cryptor Cryptor.swift + 2020-11-15T22:51:46.5731270Z [120/142] Merging module Either + 2020-11-15T22:51:46.7837900Z [121/152] Merging module HtmlSnapshotTesting + 2020-11-15T22:51:47.3077560Z [122/173] Compiling Css Appearance.swift + 2020-11-15T22:51:47.3178980Z [123/173] Compiling Css Background.swift + 2020-11-15T22:51:47.3280440Z [124/173] Compiling Css Border.swift + 2020-11-15T22:51:47.4084060Z [125/173] Compiling Css Display.swift + 2020-11-15T22:51:47.4159600Z [126/173] Compiling Css Elements.swift + 2020-11-15T22:51:47.5041860Z [128/174] Compiling Css Config.swift + 2020-11-15T22:51:47.5147960Z [129/174] Compiling Css CssSelector.swift + 2020-11-15T22:51:48.0860990Z [130/174] Compiling Css Box.swift + 2020-11-15T22:51:48.0861470Z [131/174] Compiling Css Color.swift + 2020-11-15T22:51:48.0962710Z [132/174] Compiling Css Common.swift + 2020-11-15T22:51:48.1068580Z [136/175] Merging module HtmlPlainTextPrint + 2020-11-15T22:51:48.1169850Z [137/194] Compiling Bits Aliases.swift + 2020-11-15T22:51:48.1271180Z [138/194] Compiling Bits Base64Encoder.swift + 2020-11-15T22:51:48.1372600Z [139/194] Compiling Bits Byte+Alphabet.swift + 2020-11-15T22:51:48.1440050Z [140/194] Compiling Bits Bytes+Base64.swift + 2020-11-15T22:51:48.1441730Z [141/194] Compiling Bits Bytes+Hex.swift + 2020-11-15T22:51:48.1442350Z [142/194] Merging module Optics + 2020-11-15T22:51:48.1443670Z [143/196] Compiling Bits Byte+Random.swift + 2020-11-15T22:51:48.1445650Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/BlueCryptor/Sources/Cryptor/StreamCryptor.swift:188:21: warning: static property 'none' produces an empty option set + 2020-11-15T22:51:48.1446690Z public static let none = Options(rawValue: 0) + 2020-11-15T22:51:48.1447730Z ^ + 2020-11-15T22:51:48.1448600Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/BlueCryptor/Sources/Cryptor/StreamCryptor.swift:188:21: note: use [] to silence this warning + 2020-11-15T22:51:48.1449490Z public static let none = Options(rawValue: 0) + 2020-11-15T22:51:48.1449840Z ^ ~~~~~~~~~~~~~ + 2020-11-15T22:51:48.1450350Z ([]) + 2020-11-15T22:51:48.1450940Z [144/196] Compiling Bits Byte+UTF8Numbers.swift + 2020-11-15T22:51:48.1453370Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/BlueCryptor/Sources/Cryptor/StreamCryptor.swift:188:21: warning: static property 'none' produces an empty option set + 2020-11-15T22:51:48.1456760Z public static let none = Options(rawValue: 0) + 2020-11-15T22:51:48.1457320Z ^ + 2020-11-15T22:51:48.1458210Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/BlueCryptor/Sources/Cryptor/StreamCryptor.swift:188:21: note: use [] to silence this warning + 2020-11-15T22:51:48.1461770Z public static let none = Options(rawValue: 0) + 2020-11-15T22:51:48.1462440Z ^ ~~~~~~~~~~~~~ + 2020-11-15T22:51:48.1462930Z ([]) + 2020-11-15T22:51:48.1464180Z [145/196] Compiling Bits ByteSequence+Conversions.swift + 2020-11-15T22:51:48.1466070Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/BlueCryptor/Sources/Cryptor/StreamCryptor.swift:188:21: warning: static property 'none' produces an empty option set + 2020-11-15T22:51:48.1472400Z public static let none = Options(rawValue: 0) + 2020-11-15T22:51:48.1473090Z ^ + 2020-11-15T22:51:48.1473990Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/BlueCryptor/Sources/Cryptor/StreamCryptor.swift:188:21: note: use [] to silence this warning + 2020-11-15T22:51:48.1475120Z public static let none = Options(rawValue: 0) + 2020-11-15T22:51:48.1475740Z ^ ~~~~~~~~~~~~~ + 2020-11-15T22:51:48.1508730Z ([]) + 2020-11-15T22:51:48.1512350Z [146/197] Compiling Backtrace Backtrace.swift + 2020-11-15T22:51:48.3066010Z [147/197] Compiling Bits Bytes+Percent.swift + 2020-11-15T22:51:48.3167740Z [148/197] Compiling Bits BytesConvertible.swift + 2020-11-15T22:51:48.3168520Z [149/197] Compiling Bits Data+BytesConvertible.swift + 2020-11-15T22:51:48.3268670Z [150/197] Compiling Bits HexEncoder.swift + 2020-11-15T22:51:48.3370130Z [151/197] Compiling Bits Operators.swift + 2020-11-15T22:51:48.3557330Z [152/197] Compiling Backtrace Demangle.swift + 2020-11-15T22:51:48.4336080Z [153/198] Merging module Backtrace + 2020-11-15T22:51:48.5779940Z [154/200] Merging module Cryptor + 2020-11-15T22:51:48.6104100Z [155/200] Compiling CNIOLinux ifaddrs-android.c + 2020-11-15T22:51:48.8315570Z [156/200] Compiling CNIOHTTPParser c_nio_http_parser.c + 2020-11-15T22:51:48.8599220Z [157/200] Compiling CNIOExtrasZlib empty.c + 2020-11-15T22:51:48.9323970Z [158/200] Compiling CNIODarwin shim.c + 2020-11-15T22:51:49.3163210Z [164/200] Compiling UrlFormEncoding UrlFormEncoding.swift + 2020-11-15T22:51:49.6988210Z [165/200] Compiling Bits String+BytesConvertible.swift + 2020-11-15T22:51:49.7062000Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/swift-web/Sources/Css/Render.swift:293:20: warning: the enum case has a single tuple as an associated value, but there are several patterns here, implicitly tupling the patterns and trying to match that instead + 2020-11-15T22:51:49.7063470Z case let .right(k, v): + 2020-11-15T22:51:49.7063930Z ^ + 2020-11-15T22:51:49.7064870Z [166/200] Compiling Bits UnsignedInteger+BytesConvertible.swift + 2020-11-15T22:51:49.7067000Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/swift-web/Sources/Css/Render.swift:293:20: warning: the enum case has a single tuple as an associated value, but there are several patterns here, implicitly tupling the patterns and trying to match that instead + 2020-11-15T22:51:49.7068250Z case let .right(k, v): + 2020-11-15T22:51:49.7068710Z ^ + 2020-11-15T22:51:49.7069390Z [167/200] Compiling Bits UnsignedInteger+Shifting.swift + 2020-11-15T22:51:49.7071360Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/swift-web/Sources/Css/Render.swift:293:20: warning: the enum case has a single tuple as an associated value, but there are several patterns here, implicitly tupling the patterns and trying to match that instead + 2020-11-15T22:51:49.7072630Z case let .right(k, v): + 2020-11-15T22:51:49.7073080Z ^ + 2020-11-15T22:51:49.7074250Z [168/200] Compiling Css Stylesheet.swift + 2020-11-15T22:51:49.7076190Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/swift-web/Sources/Css/Render.swift:293:20: warning: the enum case has a single tuple as an associated value, but there are several patterns here, implicitly tupling the patterns and trying to match that instead + 2020-11-15T22:51:49.7077530Z case let .right(k, v): + 2020-11-15T22:51:49.7077980Z ^ + 2020-11-15T22:51:49.7078460Z [169/200] Compiling Css Text.swift + 2020-11-15T22:51:49.7080230Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/swift-web/Sources/Css/Render.swift:293:20: warning: the enum case has a single tuple as an associated value, but there are several patterns here, implicitly tupling the patterns and trying to match that instead + 2020-11-15T22:51:49.7082110Z case let .right(k, v): + 2020-11-15T22:51:49.7082570Z ^ + 2020-11-15T22:51:49.7216910Z [170/200] Compiling UrlFormEncoding UrlFormDecoder.swift + 2020-11-15T22:51:49.7258920Z [173/200] Compiling Bits Byte+ControlCharacters.swift + 2020-11-15T22:51:49.7259910Z [174/200] Compiling Bits Byte+Convenience.swift + 2020-11-15T22:51:49.7260700Z [175/200] Compiling Bits Byte+PatternMatching.swift + 2020-11-15T22:51:49.9205210Z [176/201] Merging module Css + 2020-11-15T22:51:51.0993170Z [178/202] Merging module UrlFormEncoding + 2020-11-15T22:51:51.2992290Z [179/203] Compiling HtmlCssSupport Support.swift + 2020-11-15T22:51:51.4663950Z [180/204] Merging module HtmlCssSupport + 2020-11-15T22:51:52.5418180Z [181/221] Compiling FunctionalCss Align.swift + 2020-11-15T22:51:52.5454840Z [182/221] Compiling FunctionalCss Border.swift + 2020-11-15T22:51:52.5508870Z [183/221] Compiling FunctionalCss Breakpoint.swift + 2020-11-15T22:51:52.5522020Z [184/221] Compiling FunctionalCss Cursor.swift + 2020-11-15T22:51:52.5611700Z [185/221] Compiling FunctionalCss DesignSystems.swift + 2020-11-15T22:51:52.6983610Z [186/221] Compiling FunctionalCss Hide.swift + 2020-11-15T22:51:52.7034880Z [187/221] Compiling FunctionalCss Layout.swift + 2020-11-15T22:51:52.7035850Z [188/221] Compiling FunctionalCss Position.swift + 2020-11-15T22:51:52.7036650Z [189/221] Compiling FunctionalCss Size.swift + 2020-11-15T22:51:52.9611420Z [190/221] Compiling FunctionalCss Spacing.swift + 2020-11-15T22:51:52.9612940Z [191/221] Compiling FunctionalCss TODO.swift + 2020-11-15T22:51:52.9613810Z [192/221] Compiling FunctionalCss TypeScale.swift + 2020-11-15T22:51:52.9614910Z [193/221] Compiling FunctionalCss Typography.swift + 2020-11-15T22:51:52.9980560Z [194/221] Compiling FunctionalCss Display.swift + 2020-11-15T22:51:52.9981430Z [195/221] Compiling FunctionalCss Flex.swift + 2020-11-15T22:51:53.0082860Z [196/221] Compiling FunctionalCss FlexGrid.swift + 2020-11-15T22:51:53.0120360Z [197/221] Compiling FunctionalCss GridHelpers.swift + 2020-11-15T22:51:53.3046210Z [198/222] Merging module FunctionalCss + 2020-11-15T22:51:53.5238480Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/bits/Sources/Bits/Data+BytesConvertible.swift:6:22: warning: initialization of 'UnsafeMutableBufferPointer' (aka 'UnsafeMutableBufferPointer') results in a dangling buffer pointer + 2020-11-15T22:51:53.5250590Z let buffer = UnsafeMutableBufferPointer(start: &array, count: count) + 2020-11-15T22:51:53.5251350Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:51:53.5255330Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/bits/Sources/Bits/Data+BytesConvertible.swift:6:56: note: implicit argument conversion from 'Bytes' (aka 'Array') to 'UnsafeMutablePointer?' (aka 'Optional>') produces a pointer valid only for the duration of the call to 'init(start:count:)' + 2020-11-15T22:51:53.5259530Z let buffer = UnsafeMutableBufferPointer(start: &array, count: count) + 2020-11-15T22:51:53.5260320Z ^~~~~~ + 2020-11-15T22:51:53.5263470Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/bits/Sources/Bits/Data+BytesConvertible.swift:6:56: note: use the 'withUnsafeMutableBufferPointer' method on Array in order to explicitly convert argument to buffer pointer valid for a defined scope + 2020-11-15T22:51:53.5265300Z let buffer = UnsafeMutableBufferPointer(start: &array, count: count) + 2020-11-15T22:51:53.5266050Z ^ + 2020-11-15T22:51:53.5268210Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/bits/Sources/Bits/Data+BytesConvertible.swift:6:22: warning: initialization of 'UnsafeMutableBufferPointer' (aka 'UnsafeMutableBufferPointer') results in a dangling buffer pointer + 2020-11-15T22:51:53.5270010Z let buffer = UnsafeMutableBufferPointer(start: &array, count: count) + 2020-11-15T22:51:53.5271190Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:51:53.5273620Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/bits/Sources/Bits/Data+BytesConvertible.swift:6:56: note: implicit argument conversion from 'Bytes' (aka 'Array') to 'UnsafeMutablePointer?' (aka 'Optional>') produces a pointer valid only for the duration of the call to 'init(start:count:)' + 2020-11-15T22:51:53.5275500Z let buffer = UnsafeMutableBufferPointer(start: &array, count: count) + 2020-11-15T22:51:53.5276250Z ^~~~~~ + 2020-11-15T22:51:53.5278210Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/bits/Sources/Bits/Data+BytesConvertible.swift:6:56: note: use the 'withUnsafeMutableBufferPointer' method on Array in order to explicitly convert argument to buffer pointer valid for a defined scope + 2020-11-15T22:51:53.5279950Z let buffer = UnsafeMutableBufferPointer(start: &array, count: count) + 2020-11-15T22:51:53.5281100Z ^ + 2020-11-15T22:51:53.5283180Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/bits/Sources/Bits/Data+BytesConvertible.swift:6:22: warning: initialization of 'UnsafeMutableBufferPointer' (aka 'UnsafeMutableBufferPointer') results in a dangling buffer pointer + 2020-11-15T22:51:53.5285330Z let buffer = UnsafeMutableBufferPointer(start: &array, count: count) + 2020-11-15T22:51:53.5286070Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:51:53.5288250Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/bits/Sources/Bits/Data+BytesConvertible.swift:6:56: note: implicit argument conversion from 'Bytes' (aka 'Array') to 'UnsafeMutablePointer?' (aka 'Optional>') produces a pointer valid only for the duration of the call to 'init(start:count:)' + 2020-11-15T22:51:53.5290130Z let buffer = UnsafeMutableBufferPointer(start: &array, count: count) + 2020-11-15T22:51:53.5290870Z ^~~~~~ + 2020-11-15T22:51:53.5293000Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/bits/Sources/Bits/Data+BytesConvertible.swift:6:56: note: use the 'withUnsafeMutableBufferPointer' method on Array in order to explicitly convert argument to buffer pointer valid for a defined scope + 2020-11-15T22:51:53.5294830Z let buffer = UnsafeMutableBufferPointer(start: &array, count: count) + 2020-11-15T22:51:53.5295570Z ^ + 2020-11-15T22:51:53.5297580Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/bits/Sources/Bits/Data+BytesConvertible.swift:6:22: warning: initialization of 'UnsafeMutableBufferPointer' (aka 'UnsafeMutableBufferPointer') results in a dangling buffer pointer + 2020-11-15T22:51:53.5299750Z let buffer = UnsafeMutableBufferPointer(start: &array, count: count) + 2020-11-15T22:51:53.5300510Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:51:53.5303460Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/bits/Sources/Bits/Data+BytesConvertible.swift:6:56: note: implicit argument conversion from 'Bytes' (aka 'Array') to 'UnsafeMutablePointer?' (aka 'Optional>') produces a pointer valid only for the duration of the call to 'init(start:count:)' + 2020-11-15T22:51:53.5305670Z let buffer = UnsafeMutableBufferPointer(start: &array, count: count) + 2020-11-15T22:51:53.5306420Z ^~~~~~ + 2020-11-15T22:51:53.5308400Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/bits/Sources/Bits/Data+BytesConvertible.swift:6:56: note: use the 'withUnsafeMutableBufferPointer' method on Array in order to explicitly convert argument to buffer pointer valid for a defined scope + 2020-11-15T22:51:53.5310490Z let buffer = UnsafeMutableBufferPointer(start: &array, count: count) + 2020-11-15T22:51:53.5311240Z ^ + 2020-11-15T22:51:53.5313870Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/bits/Sources/Bits/Data+BytesConvertible.swift:6:22: warning: initialization of 'UnsafeMutableBufferPointer' (aka 'UnsafeMutableBufferPointer') results in a dangling buffer pointer + 2020-11-15T22:51:53.5315690Z let buffer = UnsafeMutableBufferPointer(start: &array, count: count) + 2020-11-15T22:51:53.5316430Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:51:53.5318600Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/bits/Sources/Bits/Data+BytesConvertible.swift:6:56: note: implicit argument conversion from 'Bytes' (aka 'Array') to 'UnsafeMutablePointer?' (aka 'Optional>') produces a pointer valid only for the duration of the call to 'init(start:count:)' + 2020-11-15T22:51:53.5320480Z let buffer = UnsafeMutableBufferPointer(start: &array, count: count) + 2020-11-15T22:51:53.5321220Z ^~~~~~ + 2020-11-15T22:51:53.5323420Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/bits/Sources/Bits/Data+BytesConvertible.swift:6:56: note: use the 'withUnsafeMutableBufferPointer' method on Array in order to explicitly convert argument to buffer pointer valid for a defined scope + 2020-11-15T22:51:53.5325160Z let buffer = UnsafeMutableBufferPointer(start: &array, count: count) + 2020-11-15T22:51:53.5325900Z ^ + 2020-11-15T22:51:54.0149370Z [204/223] Compiling FoundationPrelude URLRequest.swift + 2020-11-15T22:51:54.1805390Z [205/224] Merging module FoundationPrelude + 2020-11-15T22:51:54.5330580Z [206/229] Compiling Styleguide Styleguide.swift + 2020-11-15T22:51:54.6167080Z [207/229] Compiling Styleguide TODO.swift + 2020-11-15T22:51:55.4137340Z [212/229] Compiling Styleguide Components.swift + 2020-11-15T22:51:55.4237810Z [213/229] Compiling Styleguide Normalize.swift + 2020-11-15T22:51:55.4239310Z [216/229] Compiling Styleguide PointFreeBaseStyles.swift + 2020-11-15T22:51:55.8203760Z [225/231] Merging module Bits + 2020-11-15T22:51:55.9062000Z [226/232] Merging module Styleguide + 2020-11-15T22:51:56.9444500Z [227/234] Compiling c-nioatomics.c + 2020-11-15T22:51:57.2228120Z [228/244] Compiling PointFreePrelude Concat.swift + 2020-11-15T22:51:57.2757080Z [229/244] Compiling PointFreePrelude Zip.swift + 2020-11-15T22:51:57.2809700Z [230/244] Compiling PointFreePrelude Zurry.swift + 2020-11-15T22:51:57.6583320Z [232/244] Compiling PointFreePrelude Dispatch.swift + 2020-11-15T22:51:57.6584430Z [233/244] Compiling PointFreePrelude Either.swift + 2020-11-15T22:51:57.6848820Z [234/244] Compiling PointFreePrelude URLRequest.swift + 2020-11-15T22:51:57.6850210Z [235/244] Compiling PointFreePrelude Update.swift + 2020-11-15T22:51:58.0831180Z [236/244] Compiling PointFreePrelude FileLineLogging.swift + 2020-11-15T22:51:58.0842200Z [237/244] Compiling PointFreePrelude Parallel.swift + 2020-11-15T22:51:58.0843120Z [238/244] Compiling PointFreePrelude Tuple.swift + 2020-11-15T22:51:58.2631330Z [239/245] Merging module PointFreePrelude + 2020-11-15T22:51:58.8407010Z [240/247] Compiling GitHub Client.swift + 2020-11-15T22:51:58.9463460Z [241/247] Compiling GitHub Model.swift + 2020-11-15T22:51:59.1887030Z [242/248] Merging module GitHub + 2020-11-15T22:51:59.5556860Z [244/250] Compiling CssReset Reset.swift + 2020-11-15T22:51:59.7146390Z [245/251] Merging module CssReset + 2020-11-15T22:51:59.7785470Z [246/252] Merging module Stripe + 2020-11-15T22:51:59.9892380Z [247/253] Compiling StripeTestSupport Mocks.swift + 2020-11-15T22:52:00.0541650Z [248/254] Compiling c-atomics.c + 2020-11-15T22:52:00.1782490Z [249/314] Merging module GitHubTestSupport + 2020-11-15T22:52:00.7228930Z [250/349] Compiling NIOConcurrencyHelpers NIOAtomic.swift + 2020-11-15T22:52:00.9722400Z [251/350] Merging module StripeTestSupport + 2020-11-15T22:52:01.2914010Z [252/351] Compiling StripeTests StripeTests.swift + 2020-11-15T22:52:01.4411970Z [253/351] Compiling NIOConcurrencyHelpers lock.swift + 2020-11-15T22:52:01.7582190Z [254/351] Compiling NIOConcurrencyHelpers atomics.swift + 2020-11-15T22:52:01.8594600Z [255/352] Merging module NIOConcurrencyHelpers + 2020-11-15T22:52:01.9909000Z [256/353] Compiling Models BlogPost0023_OpenSourcingSnapshotTesting.swift + 2020-11-15T22:52:02.0009360Z [257/353] Compiling Models BlogPost0024_holidayDiscount.swift + 2020-11-15T22:52:02.0211360Z [258/353] Compiling Models BlogPost0025_yearInReview.swift + 2020-11-15T22:52:02.0313030Z [259/353] Compiling Models BlogPost0026_html020.swift + 2020-11-15T22:52:02.0414760Z [260/353] Compiling Models BlogPost0027_OpenSourcingGen.swift + 2020-11-15T22:52:02.0480650Z [261/353] Compiling Models BlogPost0028_OpenSourcingEnumProperties.swift + 2020-11-15T22:52:02.0482650Z [262/353] Compiling Models BlogPost0029_EnterpriseSubscriptions.swift + 2020-11-15T22:52:02.0483730Z [263/353] Compiling Models BlogPost0030_SwiftUIAndStateManagementCorrections.swift + 2020-11-15T22:52:02.0484820Z [264/353] Compiling Models BlogPost0031_HigherOrderSnapshotStrategies.swift + 2020-11-15T22:52:02.0485690Z [265/353] Compiling Models BlogPost0032_AFreeOverviewOfCombine.swift + 2020-11-15T22:52:02.0486370Z [266/353] Compiling Models BlogPost0033_CyberMonday2019.swift + 2020-11-15T22:52:02.0486960Z [267/353] Compiling Models BlogPost0034_TestingSwiftUI.swift + 2020-11-15T22:52:02.0487640Z [268/353] Compiling Models BlogPost0035_SnapshotTestingSwiftUI.swift + 2020-11-15T22:52:02.0488330Z [269/353] Compiling Models BlogPost0036_HolidayDiscount.swift + 2020-11-15T22:52:02.0488910Z [270/353] Compiling Models BlogPost0037_2019YearInReview.swift + 2020-11-15T22:52:02.0489550Z [271/353] Compiling Models BlogPost0038_OpenSourcingCasePaths.swift + 2020-11-15T22:52:02.0490260Z [272/353] Compiling Models BlogPost0039_AnnouncingReferrals.swift + 2020-11-15T22:52:02.0490970Z [273/353] Compiling Models BlogPost0040_AnnouncingCollections.swift + 2020-11-15T22:52:02.0491920Z [274/353] Compiling Models BlogPost0041_AnnouncingTheComposableArchitecture.swift + 2020-11-15T22:52:02.0492830Z [275/353] Compiling Models BlogPost0042_RegionalDiscounts.swift + 2020-11-15T22:52:02.0493680Z [276/353] Compiling Models BlogPost0043_AnnouncingComposableCoreLocation.swift + 2020-11-15T22:52:02.0494470Z [277/353] Compiling Models BlogPost0044_Signposts.swift + 2020-11-15T22:52:02.0495200Z [278/353] Compiling Models BlogPost0045_OpenSourcingCombineSchedulers.swift + 2020-11-15T22:52:02.3060170Z [279/376] Compiling GitHubTests GitHubTests.swift + 2020-11-15T22:52:02.6066850Z [280/377] Merging module CssTestSupport + 2020-11-15T22:52:03.4180820Z [281/448] Compiling NIO AddressedEnvelope.swift + 2020-11-15T22:52:03.4281320Z [282/448] Compiling NIO BSDSocketAPI.swift + 2020-11-15T22:52:03.4382820Z [283/448] Compiling NIO BSDSocketAPIPosix.swift + 2020-11-15T22:52:03.4483870Z [284/448] Compiling NIO BSDSocketAPIWindows.swift + 2020-11-15T22:52:03.4489460Z [285/448] Compiling NIO BaseSocket.swift + 2020-11-15T22:52:03.4591560Z [286/448] Compiling NIO BaseSocketChannel.swift + 2020-11-15T22:52:03.4693070Z [287/448] Compiling NIO BaseStreamSocketChannel.swift + 2020-11-15T22:52:03.4794540Z [288/448] Compiling NIO Bootstrap.swift + 2020-11-15T22:52:03.4896600Z [289/448] Compiling NIO ByteBuffer-aux.swift + 2020-11-15T22:52:03.4999500Z [290/448] Compiling NIO ByteBuffer-conversions.swift + 2020-11-15T22:52:03.5102600Z [291/448] Compiling NIO ByteBuffer-core.swift + 2020-11-15T22:52:03.5204750Z [292/448] Compiling NIO ByteBuffer-int.swift + 2020-11-15T22:52:03.5307040Z [293/448] Compiling NIO ByteBuffer-views.swift + 2020-11-15T22:52:03.5408600Z [294/448] Compiling NIO Channel.swift + 2020-11-15T22:52:03.5510080Z [295/448] Compiling NIO ChannelHandler.swift + 2020-11-15T22:52:03.5611610Z [296/448] Compiling NIO ChannelHandlers.swift + 2020-11-15T22:52:03.5713060Z [297/448] Compiling NIO ChannelInvoker.swift + 2020-11-15T22:52:03.5814570Z [298/448] Compiling NIO ChannelOption.swift + 2020-11-15T22:52:03.5916130Z [299/448] Compiling NIO ChannelPipeline.swift + 2020-11-15T22:52:03.6018460Z [300/448] Compiling NIO CircularBuffer.swift + 2020-11-15T22:52:03.6119920Z [301/448] Compiling NIO Codec.swift + 2020-11-15T22:52:03.6276090Z [302/448] Compiling NIO ControlMessage.swift + 2020-11-15T22:52:03.6378230Z [303/448] Compiling NIO ConvenienceOptionSupport.swift + 2020-11-15T22:52:05.1765730Z [304/471] Compiling NIO UniversalBootstrapSupport.swift + 2020-11-15T22:52:05.1866310Z [305/471] Compiling NIO Utilities.swift + 2020-11-15T22:52:05.1968460Z [306/471] Compiling Models 0006-Setters.swift + 2020-11-15T22:52:05.2068750Z [307/471] Compiling Models 0007-SettersAndKeyPaths.swift + 2020-11-15T22:52:05.2171200Z [308/471] Compiling Models 0008-GettersAndKeyPaths.swift + 2020-11-15T22:52:05.2271400Z [309/471] Compiling Models 0009-AlgebraicDataTypesPt2.swift + 2020-11-15T22:52:05.2374130Z [310/471] Compiling Models 0010-ATaleOfTwoFlatMaps.swift + 2020-11-15T22:52:05.2477310Z [311/471] Compiling Models 0011-CompositionWithoutOperators.swift + 2020-11-15T22:52:05.2578250Z [312/471] Compiling Models 0012-Tagged.swift + 2020-11-15T22:52:05.2680060Z [313/471] Compiling Models 0013-Map.swift + 2020-11-15T22:52:05.2756610Z [314/471] Compiling Models 0014-Contravariance.swift + 2020-11-15T22:52:05.2858820Z [315/471] Compiling Models 0015-SettersPt3.swift + 2020-11-15T22:52:05.2961090Z [316/471] Compiling Models 0016-DependencyInjection.swift + 2020-11-15T22:52:05.3064140Z [317/471] Compiling Models 0017-StylingWithFunctionsPt2.swift + 2020-11-15T22:52:05.3166640Z [318/471] Compiling Models 0018-EnvironmentPt2.swift + 2020-11-15T22:52:05.3268950Z [319/471] Compiling Models 0019-ADT-Pt3.swift + 2020-11-15T22:52:05.3371330Z [320/471] Compiling Models 0020-NonEmpty.swift + 2020-11-15T22:52:05.3473990Z [321/471] Compiling Models 0021-PlaygroundDrivenDevelopment.swift + 2020-11-15T22:52:05.3576610Z [322/471] Compiling Models 0022-ATourOfPointFreeCo.swift + 2020-11-15T22:52:05.3679090Z [323/471] Compiling Models 0023-Zip-pt1.swift + 2020-11-15T22:52:05.3782270Z [324/471] Compiling Models 0024-Zip-pt2.swift + 2020-11-15T22:52:05.3883590Z [325/471] Compiling Models 0025-Zip-pt3.swift + 2020-11-15T22:52:05.3985510Z [326/471] Compiling Models 0026-DSL-pt1.swift + 2020-11-15T22:52:06.6731510Z [327/494] Compiling Models 0027-DSL-pt2.swift + 2020-11-15T22:52:06.6833630Z [328/494] Compiling Models 0028-HTML-DSL.swift + 2020-11-15T22:52:06.6936020Z [329/494] Compiling Models 0029-DSL-vs-TemplatingLanguages.swift + 2020-11-15T22:52:06.7038410Z [330/494] Compiling Models 0030-Randomness.swift + 2020-11-15T22:52:06.7140620Z [331/494] Compiling Models 0031-ArbitraryPt1.swift + 2020-11-15T22:52:06.7242950Z [332/494] Compiling Models 0032-ArbitraryPt2.swift + 2020-11-15T22:52:06.7345290Z [333/494] Compiling Models 0033-ProtocolWitnessesPt1.swift + 2020-11-15T22:52:06.7447860Z [334/494] Compiling Models 0034-ProtocolWitnessesPt2.swift + 2020-11-15T22:52:06.7550670Z [335/494] Compiling Models 0035-AdvancedProtocolWitnessesPt1.swift + 2020-11-15T22:52:06.7651610Z [336/494] Compiling Models 0036-AdvancedProtocolWitnessesPt2.swift + 2020-11-15T22:52:06.7753840Z [337/494] Compiling Models 0037-ProtocolOrientedLibraryDesignPt1.swift + 2020-11-15T22:52:06.7790520Z [338/494] Compiling Models 0038-ProtocolOrientedLibraryDesignPt2.swift + 2020-11-15T22:52:06.7893090Z [339/494] Compiling Models 0039-WitnessOrientedLibraryDesign.swift + 2020-11-15T22:52:06.7995580Z [340/494] Compiling Models 0040-AsyncSnapshot.swift + 2020-11-15T22:52:06.8098430Z [341/494] Compiling Models 0041-TourOfSnapshotTesting.swift + 2020-11-15T22:52:06.8157010Z [342/494] Compiling Models 0042-TheManyFacesOfFlatMapPt1.swift + 2020-11-15T22:52:06.8259560Z [343/494] Compiling Models 0043-TheManyFacesOfFlatMapPt2.swift + 2020-11-15T22:52:06.8332980Z [344/494] Compiling Models 0044-TheManyFacesOfFlatMapPt3.swift + 2020-11-15T22:52:06.8435660Z [345/494] Compiling Models 0045-TheManyFacesOfFlatMapPt4.swift + 2020-11-15T22:52:06.8464210Z [346/494] Compiling Models 0046-TheManyFacesOfFlatMapPt5.swift + 2020-11-15T22:52:06.8566640Z [347/494] Compiling Models 0047-PredictableRandomnessPt1.swift + 2020-11-15T22:52:06.8669440Z [348/494] Compiling Models 0048-PredictableRandomnessPt2.swift + 2020-11-15T22:52:06.8762800Z [349/494] Compiling Models 0049-GenerativeArtPt1.swift + 2020-11-15T22:52:08.8474060Z [350/517] Compiling Models 0050-GenerativeArtPt2.swift + 2020-11-15T22:52:08.8574330Z [351/517] Compiling Models 0051-StructsVsEnums.swift + 2020-11-15T22:52:08.8615500Z [352/517] Compiling Models 0052-EnumProperties.swift + 2020-11-15T22:52:08.8717860Z [353/517] Compiling Models 0053-SwiftSyntaxEnumProperties.swift + 2020-11-15T22:52:08.8820510Z [354/517] Compiling Models 0054-AdvancedSwiftSyntaxEnumProperties.swift + 2020-11-15T22:52:08.8923140Z [355/517] Compiling Models 0055-SwiftSyntaxCommandLineTool.swift + 2020-11-15T22:52:08.9023190Z [356/517] Compiling Models 0056-WhatIsAParserPt1.swift + 2020-11-15T22:52:08.9125440Z [357/517] Compiling Models 0057-WhatIsAParserPt2.swift + 2020-11-15T22:52:08.9226120Z [358/517] Compiling Models 0058-WhatIsAParserPt3.swift + 2020-11-15T22:52:08.9328250Z [359/517] Compiling Models 0059-ComposableParsingMap.swift + 2020-11-15T22:52:08.9428990Z [360/517] Compiling Models 0060-ComposableParsingFlatMap.swift + 2020-11-15T22:52:08.9531070Z [361/517] Compiling Models 0061-ComposableParsingZip.swift + 2020-11-15T22:52:08.9631690Z [362/517] Compiling Models 0062-ParserCombinatorsPt1.swift + 2020-11-15T22:52:08.9729540Z [363/517] Compiling Models 0063-ParserCombinatorsPt2.swift + 2020-11-15T22:52:08.9832210Z [364/517] Compiling Models 0064-ParserCombinatorsPt3.swift + 2020-11-15T22:52:08.9934900Z [365/517] Compiling Models 0065-SwiftUIAndStateManagementPt1.swift + 2020-11-15T22:52:09.0036960Z [366/517] Compiling Models 0066-SwiftUIAndStateManagementPt2.swift + 2020-11-15T22:52:09.0054930Z [367/517] Compiling Models 0067-SwiftUIAndStateManagementPt3.swift + 2020-11-15T22:52:09.0157880Z [368/517] Compiling Models 0068-ComposableStateManagementReducers.swift + 2020-11-15T22:52:09.0224080Z [369/517] Compiling Models 0069-ComposableStateManagementStatePullbacks.swift + 2020-11-15T22:52:09.0287030Z [370/517] Compiling Models 0070-ComposableStateManagementActionPullbacks.swift + 2020-11-15T22:52:09.0390000Z [371/517] Compiling Models 0071-ComposableStateManagementHigherOrderReducers.swift + 2020-11-15T22:52:09.0492760Z [372/517] Compiling Models 0072-ModularStateManagementReducers.swift + 2020-11-15T22:52:09.1329780Z [373/539] Compiling NIO IOData.swift + 2020-11-15T22:52:09.1330950Z [374/539] Compiling NIO IntegerTypes.swift + 2020-11-15T22:52:09.1331780Z [375/539] Compiling NIO Interfaces.swift + 2020-11-15T22:52:09.1332710Z [376/539] Compiling NIO Linux.swift + 2020-11-15T22:52:09.1333460Z [377/539] Compiling NIO LinuxCPUSet.swift + 2020-11-15T22:52:09.1334330Z [378/539] Compiling NIO MarkedCircularBuffer.swift + 2020-11-15T22:52:09.1335250Z [379/539] Compiling NIO MulticastChannel.swift + 2020-11-15T22:52:09.1336030Z [380/539] Compiling NIO NIOAny.swift + 2020-11-15T22:52:09.1336880Z [381/539] Compiling NIO NIOCloseOnErrorHandler.swift + 2020-11-15T22:52:09.1338060Z [382/539] Compiling NIO NIOThreadPool.swift + 2020-11-15T22:52:09.1338930Z [383/539] Compiling NIO NonBlockingFileIO.swift + 2020-11-15T22:52:09.1339980Z [384/539] Compiling NIO PendingDatagramWritesManager.swift + 2020-11-15T22:52:09.1341060Z [385/539] Compiling NIO PendingWritesManager.swift + 2020-11-15T22:52:09.1341920Z [386/539] Compiling NIO PipeChannel.swift + 2020-11-15T22:52:09.1342660Z [387/539] Compiling NIO PipePair.swift + 2020-11-15T22:52:09.1343810Z [388/539] Compiling NIO PriorityQueue.swift + 2020-11-15T22:52:09.1344830Z [389/539] Compiling NIO RecvByteBufferAllocator.swift + 2020-11-15T22:52:09.1345710Z [390/539] Compiling NIO Resolver.swift + 2020-11-15T22:52:09.9104260Z [392/540] Merging module GitHubTests + 2020-11-15T22:52:10.4541770Z [394/542] Merging module StripeTests + 2020-11-15T22:52:11.0620070Z [395/543] Compiling FunctionalCssTests FunctionalCssTests.swift + 2020-11-15T22:52:11.2555780Z [396/544] Compiling Models 0073-ModularStateManagementViewState.swift + 2020-11-15T22:52:11.2599580Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.2669480Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.2771040Z ^~~~~~~~ + 2020-11-15T22:52:11.2873540Z [397/544] Compiling Models 0074-ModularStateManagementViewActions.swift + 2020-11-15T22:52:11.2976890Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.3079450Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.3178530Z ^~~~~~~~ + 2020-11-15T22:52:11.3239190Z [398/544] Compiling Models 0075-ModularStateManagementWhatsThePoint.swift + 2020-11-15T22:52:11.3342370Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.3443540Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.3545060Z ^~~~~~~~ + 2020-11-15T22:52:11.3651840Z [399/544] Compiling Models 0076-EffectfulStateManagementSynchronousEffects.swift + 2020-11-15T22:52:11.3730090Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.3815130Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.3955070Z ^~~~~~~~ + 2020-11-15T22:52:11.4057910Z [400/544] Compiling Models 0077-EffectfulStateManagementUnidirectionalEffects.swift + 2020-11-15T22:52:11.4162460Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.4262440Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.4364540Z ^~~~~~~~ + 2020-11-15T22:52:11.4436470Z [401/544] Compiling Models 0078-EffectfulStateManagementAsynchronousEffects.swift + 2020-11-15T22:52:11.4540120Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.4639070Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.4672900Z ^~~~~~~~ + 2020-11-15T22:52:11.4775310Z [402/544] Compiling Models 0079-EffectfulStateManagementThePoint.swift + 2020-11-15T22:52:11.4878880Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.4946400Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.5055310Z ^~~~~~~~ + 2020-11-15T22:52:11.5157400Z [403/544] Compiling Models 0080-CombineAndEffectsPt1.swift + 2020-11-15T22:52:11.5260900Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.5362960Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.5464370Z ^~~~~~~~ + 2020-11-15T22:52:11.5566540Z [404/544] Compiling Models 0081-CombineAndEffectsPt2.swift + 2020-11-15T22:52:11.5669430Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.5771590Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.5873100Z ^~~~~~~~ + 2020-11-15T22:52:11.5975790Z [405/544] Compiling Models 0082-TestableStateManagementReducers.swift + 2020-11-15T22:52:11.6079070Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.6085870Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.6187010Z ^~~~~~~~ + 2020-11-15T22:52:11.6287930Z [406/544] Compiling Models 0083-TestableStateManagementEffects.swift + 2020-11-15T22:52:11.6391200Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.6490300Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.6494100Z ^~~~~~~~ + 2020-11-15T22:52:11.6596310Z [407/544] Compiling Models 0084-TestableStateManagementErgonomics.swift + 2020-11-15T22:52:11.6699410Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.6801590Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.6896980Z ^~~~~~~~ + 2020-11-15T22:52:11.6999620Z [408/544] Compiling Models 0085-TestableStateManagementSnapshotThePoint.swift + 2020-11-15T22:52:11.7105330Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.7204770Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.7271340Z ^~~~~~~~ + 2020-11-15T22:52:11.7373500Z [409/544] Compiling Models 0086-SwiftUISnapshotTesting.swift + 2020-11-15T22:52:11.7476710Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.7578940Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.7808970Z ^~~~~~~~ + 2020-11-15T22:52:11.7943580Z [410/544] Compiling Models 0087-TheCaseForCasePathsPt1.swift + 2020-11-15T22:52:11.7947270Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.8143380Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.8144110Z ^~~~~~~~ + 2020-11-15T22:52:11.8345340Z [411/544] Compiling Models 0088-TheCaseForCasePathsPt2.swift + 2020-11-15T22:52:11.8447630Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.8484020Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.8549560Z ^~~~~~~~ + 2020-11-15T22:52:11.8640010Z [412/544] Compiling Models 0089-TheCaseForCasePathsPt3.swift + 2020-11-15T22:52:11.8743120Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.8842950Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.8944430Z ^~~~~~~~ + 2020-11-15T22:52:11.9047080Z [413/544] Compiling Models 0090-ComposingArchitectureWithCasePaths.swift + 2020-11-15T22:52:11.9067680Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.9151930Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.9253350Z ^~~~~~~~ + 2020-11-15T22:52:11.9355670Z [414/544] Compiling Models 0091-ModularDependencyInjectionPt1.swift + 2020-11-15T22:52:11.9445400Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.9547630Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.9649210Z ^~~~~~~~ + 2020-11-15T22:52:11.9681390Z [415/544] Compiling Models 0092-ModularDependencyInjectionPt2.swift + 2020-11-15T22:52:11.9775450Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:11.9877570Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:11.9958180Z ^~~~~~~~ + 2020-11-15T22:52:12.0061290Z [416/544] Compiling Models 0093-ModularDependencyInjectionPt3.swift + 2020-11-15T22:52:12.0164570Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.0266740Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:12.0368220Z ^~~~~~~~ + 2020-11-15T22:52:12.0470660Z [417/544] Compiling Models 0094-AdaptiveStateManagementPt1.swift + 2020-11-15T22:52:12.0573910Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.0676300Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:12.0708390Z ^~~~~~~~ + 2020-11-15T22:52:12.0778930Z [418/544] Compiling Models 0095-AdaptiveStateManagementPt2.swift + 2020-11-15T22:52:12.0882140Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0073-ModularStateManagementViewState.swift:4:54: warning: expression took 247ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.0968160Z static let ep73_modularStateManagement_viewState = Episode( + 2020-11-15T22:52:12.0983750Z ^~~~~~~~ + 2020-11-15T22:52:12.1077090Z [419/544] Compiling NIO Selectable.swift + 2020-11-15T22:52:12.1096190Z [420/544] Compiling NIO SelectableEventLoop.swift + 2020-11-15T22:52:12.1203950Z [421/544] Compiling NIO Selector.swift + 2020-11-15T22:52:12.1384370Z [422/544] Compiling NIO ServerSocket.swift + 2020-11-15T22:52:12.1470820Z [423/544] Compiling NIO SingleStepByteToMessageDecoder.swift + 2020-11-15T22:52:12.1518040Z [424/544] Compiling NIO Socket.swift + 2020-11-15T22:52:12.1619500Z [425/544] Compiling NIO SocketAddresses.swift + 2020-11-15T22:52:12.1721060Z [426/544] Compiling NIO SocketChannel.swift + 2020-11-15T22:52:12.1822740Z [427/544] Compiling NIO SocketOptionProvider.swift + 2020-11-15T22:52:12.1917420Z [428/544] Compiling NIO SocketProtocols.swift + 2020-11-15T22:52:12.2018830Z [429/544] Compiling NIO System.swift + 2020-11-15T22:52:12.2120160Z [430/544] Compiling NIO Thread.swift + 2020-11-15T22:52:12.2220950Z [431/544] Compiling NIO ThreadPosix.swift + 2020-11-15T22:52:12.2288900Z [432/544] Compiling NIO ThreadWindows.swift + 2020-11-15T22:52:12.2348290Z [433/544] Compiling NIO TypeAssistedChannelHandler.swift + 2020-11-15T22:52:12.2399470Z [436/544] Merging module FunctionalCssTests + 2020-11-15T22:52:12.2472200Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.2513540Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:12.2574950Z ^~~~~ + 2020-11-15T22:52:12.2658330Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.2757910Z public static let randomness = Self( + 2020-11-15T22:52:12.2775290Z ^~~~~ + 2020-11-15T22:52:12.2830880Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.2859930Z public static let combine = Self( + 2020-11-15T22:52:12.2936540Z ^~~~~ + 2020-11-15T22:52:12.2953990Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.2960900Z public static let composableArchitecture = Self( + 2020-11-15T22:52:12.3007090Z ^~~~~ + 2020-11-15T22:52:12.3099890Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.3201570Z public static let dependencies = Self( + 2020-11-15T22:52:12.3212220Z ^~~~~ + 2020-11-15T22:52:12.3246370Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.3347060Z public static let all: [Self] = [ + 2020-11-15T22:52:12.3353810Z ^ + 2020-11-15T22:52:12.3363810Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.3402110Z Self( + 2020-11-15T22:52:12.3454550Z ^~~~~ + 2020-11-15T22:52:12.3458280Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.3459420Z public static var parsing: Self { + 2020-11-15T22:52:12.3460010Z ^ + 2020-11-15T22:52:12.3461470Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.3462630Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:12.3463250Z ^~~~~ + 2020-11-15T22:52:12.3464660Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.3475290Z public static let randomness = Self( + 2020-11-15T22:52:12.3541360Z ^~~~~ + 2020-11-15T22:52:12.3551950Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.3578850Z public static let combine = Self( + 2020-11-15T22:52:12.3679340Z ^~~~~ + 2020-11-15T22:52:12.3728500Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.3760050Z public static let composableArchitecture = Self( + 2020-11-15T22:52:12.3860440Z ^~~~~ + 2020-11-15T22:52:12.3963310Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.4061950Z public static let dependencies = Self( + 2020-11-15T22:52:12.4162180Z ^~~~~ + 2020-11-15T22:52:12.4264600Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.4364180Z public static let all: [Self] = [ + 2020-11-15T22:52:12.4388220Z ^ + 2020-11-15T22:52:12.4490720Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.4589530Z Self( + 2020-11-15T22:52:12.4720300Z ^~~~~ + 2020-11-15T22:52:12.4751130Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.4852780Z public static var parsing: Self { + 2020-11-15T22:52:12.4954060Z ^ + 2020-11-15T22:52:12.5063010Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.5164900Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:12.5314430Z ^~~~~ + 2020-11-15T22:52:12.5417080Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.5518900Z public static let randomness = Self( + 2020-11-15T22:52:12.5564350Z ^~~~~ + 2020-11-15T22:52:12.5666970Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.5691810Z public static let combine = Self( + 2020-11-15T22:52:12.5771590Z ^~~~~ + 2020-11-15T22:52:12.5871690Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.5953070Z public static let composableArchitecture = Self( + 2020-11-15T22:52:12.6054480Z ^~~~~ + 2020-11-15T22:52:12.6157230Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.6191010Z public static let dependencies = Self( + 2020-11-15T22:52:12.6292240Z ^~~~~ + 2020-11-15T22:52:12.6411940Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.6513710Z public static let all: [Self] = [ + 2020-11-15T22:52:12.6599770Z ^ + 2020-11-15T22:52:12.6702300Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.6823650Z Self( + 2020-11-15T22:52:12.6924970Z ^~~~~ + 2020-11-15T22:52:12.6960560Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.7062280Z public static var parsing: Self { + 2020-11-15T22:52:12.7179650Z ^ + 2020-11-15T22:52:12.7250840Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.7330550Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:12.7455050Z ^~~~~ + 2020-11-15T22:52:12.7557690Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.7627620Z public static let randomness = Self( + 2020-11-15T22:52:12.7735980Z ^~~~~ + 2020-11-15T22:52:12.7780870Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.7848640Z public static let combine = Self( + 2020-11-15T22:52:12.7948390Z ^~~~~ + 2020-11-15T22:52:12.8036130Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.8088040Z public static let composableArchitecture = Self( + 2020-11-15T22:52:12.8108440Z ^~~~~ + 2020-11-15T22:52:12.8110170Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.8110950Z public static let dependencies = Self( + 2020-11-15T22:52:12.8111560Z ^~~~~ + 2020-11-15T22:52:12.8170370Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.8254220Z public static let all: [Self] = [ + 2020-11-15T22:52:12.8263380Z ^ + 2020-11-15T22:52:12.8265950Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.8282340Z Self( + 2020-11-15T22:52:12.8282810Z ^~~~~ + 2020-11-15T22:52:12.8284430Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.8285590Z public static var parsing: Self { + 2020-11-15T22:52:12.8286120Z ^ + 2020-11-15T22:52:12.8287530Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.8288630Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:12.8289190Z ^~~~~ + 2020-11-15T22:52:12.8290540Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.8291600Z public static let randomness = Self( + 2020-11-15T22:52:12.8292130Z ^~~~~ + 2020-11-15T22:52:12.8293450Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.8294460Z public static let combine = Self( + 2020-11-15T22:52:12.8294980Z ^~~~~ + 2020-11-15T22:52:12.8296460Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.8298020Z public static let composableArchitecture = Self( + 2020-11-15T22:52:12.8310010Z ^~~~~ + 2020-11-15T22:52:12.8353100Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.8354780Z public static let dependencies = Self( + 2020-11-15T22:52:12.8478200Z ^~~~~ + 2020-11-15T22:52:12.8581450Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.8684710Z public static let all: [Self] = [ + 2020-11-15T22:52:12.8785950Z ^ + 2020-11-15T22:52:12.8872860Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.8975020Z Self( + 2020-11-15T22:52:12.9063340Z ^~~~~ + 2020-11-15T22:52:12.9103000Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9144020Z public static var parsing: Self { + 2020-11-15T22:52:12.9144700Z ^ + 2020-11-15T22:52:12.9146520Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9147870Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:12.9148450Z ^~~~~ + 2020-11-15T22:52:12.9149840Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9150880Z public static let randomness = Self( + 2020-11-15T22:52:12.9151390Z ^~~~~ + 2020-11-15T22:52:12.9152690Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9153680Z public static let combine = Self( + 2020-11-15T22:52:12.9154170Z ^~~~~ + 2020-11-15T22:52:12.9155630Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9156870Z public static let composableArchitecture = Self( + 2020-11-15T22:52:12.9157490Z ^~~~~ + 2020-11-15T22:52:12.9210500Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9254720Z public static let dependencies = Self( + 2020-11-15T22:52:12.9318060Z ^~~~~ + 2020-11-15T22:52:12.9326270Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9327340Z public static let all: [Self] = [ + 2020-11-15T22:52:12.9327820Z ^ + 2020-11-15T22:52:12.9329190Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9330100Z Self( + 2020-11-15T22:52:12.9330520Z ^~~~~ + 2020-11-15T22:52:12.9331830Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9332820Z public static var parsing: Self { + 2020-11-15T22:52:12.9333300Z ^ + 2020-11-15T22:52:12.9334650Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9335720Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:12.9336240Z ^~~~~ + 2020-11-15T22:52:12.9337550Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9338710Z public static let randomness = Self( + 2020-11-15T22:52:12.9339220Z ^~~~~ + 2020-11-15T22:52:12.9340950Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9341980Z public static let combine = Self( + 2020-11-15T22:52:12.9342450Z ^~~~~ + 2020-11-15T22:52:12.9343920Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9345190Z public static let composableArchitecture = Self( + 2020-11-15T22:52:12.9345810Z ^~~~~ + 2020-11-15T22:52:12.9347360Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9363140Z public static let dependencies = Self( + 2020-11-15T22:52:12.9462050Z ^~~~~ + 2020-11-15T22:52:12.9514420Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9564660Z public static let all: [Self] = [ + 2020-11-15T22:52:12.9587540Z ^ + 2020-11-15T22:52:12.9589410Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9590350Z Self( + 2020-11-15T22:52:12.9590770Z ^~~~~ + 2020-11-15T22:52:12.9592090Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9593090Z public static var parsing: Self { + 2020-11-15T22:52:12.9593580Z ^ + 2020-11-15T22:52:12.9594970Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9596040Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:12.9596560Z ^~~~~ + 2020-11-15T22:52:12.9597880Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9598900Z public static let randomness = Self( + 2020-11-15T22:52:12.9599400Z ^~~~~ + 2020-11-15T22:52:12.9600690Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9601680Z public static let combine = Self( + 2020-11-15T22:52:12.9602180Z ^~~~~ + 2020-11-15T22:52:12.9603640Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9604900Z public static let composableArchitecture = Self( + 2020-11-15T22:52:12.9605520Z ^~~~~ + 2020-11-15T22:52:12.9606870Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9608020Z public static let dependencies = Self( + 2020-11-15T22:52:12.9608540Z ^~~~~ + 2020-11-15T22:52:12.9609910Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9610950Z public static let all: [Self] = [ + 2020-11-15T22:52:12.9611430Z ^ + 2020-11-15T22:52:12.9612740Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9613660Z Self( + 2020-11-15T22:52:12.9614060Z ^~~~~ + 2020-11-15T22:52:12.9615350Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9616790Z public static var parsing: Self { + 2020-11-15T22:52:12.9617420Z ^ + 2020-11-15T22:52:12.9619040Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9620150Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:12.9620690Z ^~~~~ + 2020-11-15T22:52:12.9622060Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9623380Z public static let randomness = Self( + 2020-11-15T22:52:12.9623890Z ^~~~~ + 2020-11-15T22:52:12.9625210Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9626200Z public static let combine = Self( + 2020-11-15T22:52:12.9626690Z ^~~~~ + 2020-11-15T22:52:12.9628290Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9629540Z public static let composableArchitecture = Self( + 2020-11-15T22:52:12.9630150Z ^~~~~ + 2020-11-15T22:52:12.9631500Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9632550Z public static let dependencies = Self( + 2020-11-15T22:52:12.9633070Z ^~~~~ + 2020-11-15T22:52:12.9634440Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9635470Z public static let all: [Self] = [ + 2020-11-15T22:52:12.9635960Z ^ + 2020-11-15T22:52:12.9637340Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9638270Z Self( + 2020-11-15T22:52:12.9638680Z ^~~~~ + 2020-11-15T22:52:12.9639980Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9640970Z public static var parsing: Self { + 2020-11-15T22:52:12.9641460Z ^ + 2020-11-15T22:52:12.9642820Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9643900Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:12.9644440Z ^~~~~ + 2020-11-15T22:52:12.9645780Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9646800Z public static let randomness = Self( + 2020-11-15T22:52:12.9647410Z ^~~~~ + 2020-11-15T22:52:12.9648700Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9649690Z public static let combine = Self( + 2020-11-15T22:52:12.9650180Z ^~~~~ + 2020-11-15T22:52:12.9651630Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9652900Z public static let composableArchitecture = Self( + 2020-11-15T22:52:12.9653510Z ^~~~~ + 2020-11-15T22:52:12.9655150Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9656240Z public static let dependencies = Self( + 2020-11-15T22:52:12.9656760Z ^~~~~ + 2020-11-15T22:52:12.9658140Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9659180Z public static let all: [Self] = [ + 2020-11-15T22:52:12.9659650Z ^ + 2020-11-15T22:52:12.9660950Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9662070Z Self( + 2020-11-15T22:52:12.9662480Z ^~~~~ + 2020-11-15T22:52:12.9663790Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9664770Z public static var parsing: Self { + 2020-11-15T22:52:12.9665260Z ^ + 2020-11-15T22:52:12.9666620Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9667690Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:12.9668220Z ^~~~~ + 2020-11-15T22:52:12.9669530Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9670550Z public static let randomness = Self( + 2020-11-15T22:52:12.9671070Z ^~~~~ + 2020-11-15T22:52:12.9672370Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9673350Z public static let combine = Self( + 2020-11-15T22:52:12.9673850Z ^~~~~ + 2020-11-15T22:52:12.9675310Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9676570Z public static let composableArchitecture = Self( + 2020-11-15T22:52:12.9677270Z ^~~~~ + 2020-11-15T22:52:12.9678630Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9679670Z public static let dependencies = Self( + 2020-11-15T22:52:12.9680190Z ^~~~~ + 2020-11-15T22:52:12.9681680Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9682710Z public static let all: [Self] = [ + 2020-11-15T22:52:12.9683170Z ^ + 2020-11-15T22:52:12.9684470Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9685390Z Self( + 2020-11-15T22:52:12.9685810Z ^~~~~ + 2020-11-15T22:52:12.9687100Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9688080Z public static var parsing: Self { + 2020-11-15T22:52:12.9688570Z ^ + 2020-11-15T22:52:12.9689930Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9691000Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:12.9691530Z ^~~~~ + 2020-11-15T22:52:12.9693050Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9694110Z public static let randomness = Self( + 2020-11-15T22:52:12.9694610Z ^~~~~ + 2020-11-15T22:52:12.9695920Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9696900Z public static let combine = Self( + 2020-11-15T22:52:12.9697390Z ^~~~~ + 2020-11-15T22:52:12.9698850Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9700300Z public static let composableArchitecture = Self( + 2020-11-15T22:52:12.9700900Z ^~~~~ + 2020-11-15T22:52:12.9702260Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9717760Z public static let dependencies = Self( + 2020-11-15T22:52:12.9766040Z ^~~~~ + 2020-11-15T22:52:12.9800790Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9801990Z public static let all: [Self] = [ + 2020-11-15T22:52:12.9802490Z ^ + 2020-11-15T22:52:12.9805260Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9822400Z Self( + 2020-11-15T22:52:12.9875090Z ^~~~~ + 2020-11-15T22:52:12.9877130Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9878160Z public static var parsing: Self { + 2020-11-15T22:52:12.9878660Z ^ + 2020-11-15T22:52:12.9880070Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9881150Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:12.9881690Z ^~~~~ + 2020-11-15T22:52:12.9883000Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9884030Z public static let randomness = Self( + 2020-11-15T22:52:12.9884540Z ^~~~~ + 2020-11-15T22:52:12.9885840Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9886850Z public static let combine = Self( + 2020-11-15T22:52:12.9887340Z ^~~~~ + 2020-11-15T22:52:12.9888810Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9890070Z public static let composableArchitecture = Self( + 2020-11-15T22:52:12.9890690Z ^~~~~ + 2020-11-15T22:52:12.9892040Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9893090Z public static let dependencies = Self( + 2020-11-15T22:52:12.9893610Z ^~~~~ + 2020-11-15T22:52:12.9894980Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9896020Z public static let all: [Self] = [ + 2020-11-15T22:52:12.9896490Z ^ + 2020-11-15T22:52:12.9898120Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9899070Z Self( + 2020-11-15T22:52:12.9899490Z ^~~~~ + 2020-11-15T22:52:12.9900900Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9901890Z public static var parsing: Self { + 2020-11-15T22:52:12.9902380Z ^ + 2020-11-15T22:52:12.9903760Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9905050Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:12.9905580Z ^~~~~ + 2020-11-15T22:52:12.9906920Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9908020Z public static let randomness = Self( + 2020-11-15T22:52:12.9908540Z ^~~~~ + 2020-11-15T22:52:12.9909840Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9910830Z public static let combine = Self( + 2020-11-15T22:52:12.9911310Z ^~~~~ + 2020-11-15T22:52:12.9912760Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9914010Z public static let composableArchitecture = Self( + 2020-11-15T22:52:12.9914630Z ^~~~~ + 2020-11-15T22:52:12.9915990Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9917040Z public static let dependencies = Self( + 2020-11-15T22:52:12.9917560Z ^~~~~ + 2020-11-15T22:52:12.9918920Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9919950Z public static let all: [Self] = [ + 2020-11-15T22:52:12.9920430Z ^ + 2020-11-15T22:52:12.9921730Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9922640Z Self( + 2020-11-15T22:52:12.9923050Z ^~~~~ + 2020-11-15T22:52:12.9924590Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9925640Z public static var parsing: Self { + 2020-11-15T22:52:12.9926150Z ^ + 2020-11-15T22:52:12.9927530Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9929000Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:12.9929770Z ^~~~~ + 2020-11-15T22:52:12.9931220Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9932250Z public static let randomness = Self( + 2020-11-15T22:52:12.9933000Z ^~~~~ + 2020-11-15T22:52:12.9934340Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9935470Z public static let combine = Self( + 2020-11-15T22:52:12.9935940Z ^~~~~ + 2020-11-15T22:52:12.9938200Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9939510Z public static let composableArchitecture = Self( + 2020-11-15T22:52:12.9940130Z ^~~~~ + 2020-11-15T22:52:12.9941490Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9942540Z public static let dependencies = Self( + 2020-11-15T22:52:12.9943070Z ^~~~~ + 2020-11-15T22:52:12.9944420Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9945660Z public static let all: [Self] = [ + 2020-11-15T22:52:12.9946150Z ^ + 2020-11-15T22:52:12.9947510Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9948440Z Self( + 2020-11-15T22:52:12.9948860Z ^~~~~ + 2020-11-15T22:52:12.9950160Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9951140Z public static var parsing: Self { + 2020-11-15T22:52:12.9951630Z ^ + 2020-11-15T22:52:12.9952980Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9954040Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:12.9954550Z ^~~~~ + 2020-11-15T22:52:12.9955990Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9957010Z public static let randomness = Self( + 2020-11-15T22:52:12.9957520Z ^~~~~ + 2020-11-15T22:52:12.9959520Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9960520Z public static let combine = Self( + 2020-11-15T22:52:12.9961020Z ^~~~~ + 2020-11-15T22:52:12.9962480Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9963740Z public static let composableArchitecture = Self( + 2020-11-15T22:52:12.9964350Z ^~~~~ + 2020-11-15T22:52:12.9965710Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9966760Z public static let dependencies = Self( + 2020-11-15T22:52:12.9967280Z ^~~~~ + 2020-11-15T22:52:12.9968660Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9969690Z public static let all: [Self] = [ + 2020-11-15T22:52:12.9970160Z ^ + 2020-11-15T22:52:12.9971450Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9972360Z Self( + 2020-11-15T22:52:12.9972770Z ^~~~~ + 2020-11-15T22:52:12.9974050Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9975040Z public static var parsing: Self { + 2020-11-15T22:52:12.9975530Z ^ + 2020-11-15T22:52:12.9976870Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9978160Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:12.9978750Z ^~~~~ + 2020-11-15T22:52:12.9980080Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9981100Z public static let randomness = Self( + 2020-11-15T22:52:12.9981610Z ^~~~~ + 2020-11-15T22:52:12.9982890Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9984070Z public static let combine = Self( + 2020-11-15T22:52:12.9984560Z ^~~~~ + 2020-11-15T22:52:12.9986020Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9987270Z public static let composableArchitecture = Self( + 2020-11-15T22:52:12.9987880Z ^~~~~ + 2020-11-15T22:52:12.9989220Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9990260Z public static let dependencies = Self( + 2020-11-15T22:52:12.9990790Z ^~~~~ + 2020-11-15T22:52:12.9992140Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9993160Z public static let all: [Self] = [ + 2020-11-15T22:52:12.9993650Z ^ + 2020-11-15T22:52:12.9994940Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9995840Z Self( + 2020-11-15T22:52:12.9996240Z ^~~~~ + 2020-11-15T22:52:12.9997540Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:12.9998520Z public static var parsing: Self { + 2020-11-15T22:52:12.9999010Z ^ + 2020-11-15T22:52:13.0000370Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0001440Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:13.0001970Z ^~~~~ + 2020-11-15T22:52:13.0003280Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0004300Z public static let randomness = Self( + 2020-11-15T22:52:13.0004810Z ^~~~~ + 2020-11-15T22:52:13.0006090Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0007070Z public static let combine = Self( + 2020-11-15T22:52:13.0007560Z ^~~~~ + 2020-11-15T22:52:13.0009080Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0010320Z public static let composableArchitecture = Self( + 2020-11-15T22:52:13.0010940Z ^~~~~ + 2020-11-15T22:52:13.0012270Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0013310Z public static let dependencies = Self( + 2020-11-15T22:52:13.0013830Z ^~~~~ + 2020-11-15T22:52:13.0015330Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0016400Z public static let all: [Self] = [ + 2020-11-15T22:52:13.0016880Z ^ + 2020-11-15T22:52:13.0018170Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0019080Z Self( + 2020-11-15T22:52:13.0019500Z ^~~~~ + 2020-11-15T22:52:13.0020780Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0022150Z public static var parsing: Self { + 2020-11-15T22:52:13.0022650Z ^ + 2020-11-15T22:52:13.0024010Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0024850Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:13.0025420Z ^~~~~ + 2020-11-15T22:52:13.0026750Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0027760Z public static let randomness = Self( + 2020-11-15T22:52:13.0028270Z ^~~~~ + 2020-11-15T22:52:13.0029560Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0030540Z public static let combine = Self( + 2020-11-15T22:52:13.0031020Z ^~~~~ + 2020-11-15T22:52:13.0032490Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0033730Z public static let composableArchitecture = Self( + 2020-11-15T22:52:13.0034350Z ^~~~~ + 2020-11-15T22:52:13.0036310Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0135730Z public static let dependencies = Self( + 2020-11-15T22:52:13.0136950Z ^~~~~ + 2020-11-15T22:52:13.0239060Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0240010Z public static let all: [Self] = [ + 2020-11-15T22:52:13.0240250Z ^ + 2020-11-15T22:52:13.0241380Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0242010Z Self( + 2020-11-15T22:52:13.0242190Z ^~~~~ + 2020-11-15T22:52:13.0243250Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0243950Z public static var parsing: Self { + 2020-11-15T22:52:13.0244210Z ^ + 2020-11-15T22:52:13.0245300Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0246080Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:13.0246370Z ^~~~~ + 2020-11-15T22:52:13.0247510Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0248250Z public static let randomness = Self( + 2020-11-15T22:52:13.0248520Z ^~~~~ + 2020-11-15T22:52:13.0249570Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0250550Z public static let combine = Self( + 2020-11-15T22:52:13.0250850Z ^~~~~ + 2020-11-15T22:52:13.0252090Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0253040Z public static let composableArchitecture = Self( + 2020-11-15T22:52:13.0253420Z ^~~~~ + 2020-11-15T22:52:13.0254480Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0255450Z public static let dependencies = Self( + 2020-11-15T22:52:13.0255740Z ^~~~~ + 2020-11-15T22:52:13.0256880Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0257630Z public static let all: [Self] = [ + 2020-11-15T22:52:13.0257880Z ^ + 2020-11-15T22:52:13.0258910Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0259530Z Self( + 2020-11-15T22:52:13.0259710Z ^~~~~ + 2020-11-15T22:52:13.0260720Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0261410Z public static var parsing: Self { + 2020-11-15T22:52:13.0261670Z ^ + 2020-11-15T22:52:13.0262760Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0263540Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:13.0263830Z ^~~~~ + 2020-11-15T22:52:13.0264890Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0265620Z public static let randomness = Self( + 2020-11-15T22:52:13.0265890Z ^~~~~ + 2020-11-15T22:52:13.0266920Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0267590Z public static let combine = Self( + 2020-11-15T22:52:13.0267850Z ^~~~~ + 2020-11-15T22:52:13.0269040Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0270000Z public static let composableArchitecture = Self( + 2020-11-15T22:52:13.0270380Z ^~~~~ + 2020-11-15T22:52:13.0271460Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0272210Z public static let dependencies = Self( + 2020-11-15T22:52:13.0272500Z ^~~~~ + 2020-11-15T22:52:13.0273590Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0274320Z public static let all: [Self] = [ + 2020-11-15T22:52:13.0274550Z ^ + 2020-11-15T22:52:13.0275570Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0276200Z Self( + 2020-11-15T22:52:13.0276390Z ^~~~~ + 2020-11-15T22:52:13.0277500Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0278420Z public static var parsing: Self { + 2020-11-15T22:52:13.0278710Z ^ + 2020-11-15T22:52:13.0279840Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0280620Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:13.0280900Z ^~~~~ + 2020-11-15T22:52:13.0281950Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0282870Z public static let randomness = Self( + 2020-11-15T22:52:13.0283150Z ^~~~~ + 2020-11-15T22:52:13.0284210Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0284910Z public static let combine = Self( + 2020-11-15T22:52:13.0285170Z ^~~~~ + 2020-11-15T22:52:13.0286360Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0287310Z public static let composableArchitecture = Self( + 2020-11-15T22:52:13.0287690Z ^~~~~ + 2020-11-15T22:52:13.0288760Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0289520Z public static let dependencies = Self( + 2020-11-15T22:52:13.0289820Z ^~~~~ + 2020-11-15T22:52:13.0290910Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0291650Z public static let all: [Self] = [ + 2020-11-15T22:52:13.0291900Z ^ + 2020-11-15T22:52:13.0292930Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0293550Z Self( + 2020-11-15T22:52:13.0293730Z ^~~~~ + 2020-11-15T22:52:13.0294740Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0295430Z public static var parsing: Self { + 2020-11-15T22:52:13.0295690Z ^ + 2020-11-15T22:52:13.0296950Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/MapZipFlatMap.swift:2:37: warning: expression took 469ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0299420Z public static let mapZipFlatMap = Self( + 2020-11-15T22:52:13.0299740Z ^~~~~ + 2020-11-15T22:52:13.0301030Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Randomness.swift:2:34: warning: expression took 584ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0301760Z public static let randomness = Self( + 2020-11-15T22:52:13.0302040Z ^~~~~ + 2020-11-15T22:52:13.0303080Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Combine.swift:2:31: warning: expression took 208ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0303760Z public static let combine = Self( + 2020-11-15T22:52:13.0304020Z ^~~~~ + 2020-11-15T22:52:13.0305210Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/ComposableArchitecture.swift:2:46: warning: expression took 794ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0306180Z public static let composableArchitecture = Self( + 2020-11-15T22:52:13.0306560Z ^~~~~ + 2020-11-15T22:52:13.0307970Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Dependencies.swift:2:36: warning: expression took 939ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0308760Z public static let dependencies = Self( + 2020-11-15T22:52:13.0309050Z ^~~~~ + 2020-11-15T22:52:13.0310190Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/AllCollections.swift:2:35: warning: expression took 2090ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0310920Z public static let all: [Self] = [ + 2020-11-15T22:52:13.0311150Z ^ + 2020-11-15T22:52:13.0312180Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:3:5: warning: expression took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0312980Z Self( + 2020-11-15T22:52:13.0313160Z ^~~~~ + 2020-11-15T22:52:13.0314230Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Collections/Parsing.swift:2:35: warning: getter 'parsing' took 203ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0314920Z public static var parsing: Self { + 2020-11-15T22:52:13.0315190Z ^ + 2020-11-15T22:52:13.0315610Z [460/567] Compiling Core DispatchTime+Utilities.swift + 2020-11-15T22:52:13.0316200Z [461/567] Compiling Core EmptyInitializable.swift + 2020-11-15T22:52:13.0316660Z [462/567] Compiling Core Exports.swift + 2020-11-15T22:52:13.0317040Z [463/567] Compiling Core Extendable.swift + 2020-11-15T22:52:13.0317470Z [464/567] Compiling Core FileProtocol.swift + 2020-11-15T22:52:13.0317860Z [465/567] Compiling Core Int+Hex.swift + 2020-11-15T22:52:13.0318810Z [466/567] Compiling Models 0096-AdaptiveStateManagementPt3.swift + 2020-11-15T22:52:13.0320270Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0321230Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0321630Z ^~~~~~~~ + 2020-11-15T22:52:13.0322470Z [467/567] Compiling Models 0097-AdaptiveStateManagementPt4.swift + 2020-11-15T22:52:13.0323930Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0324880Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0325280Z ^~~~~~~~ + 2020-11-15T22:52:13.0326130Z [468/567] Compiling Models 0098-ErgonomicStateManagementPt1.swift + 2020-11-15T22:52:13.0327610Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0328560Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0328960Z ^~~~~~~~ + 2020-11-15T22:52:13.0329830Z [469/567] Compiling Models 0099-ErgonomicStateManagementPt2.swift + 2020-11-15T22:52:13.0331300Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0332240Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0332630Z ^~~~~~~~ + 2020-11-15T22:52:13.0333630Z [470/567] Compiling Models 0100-ATourOfTheComposableArchitecturePt1.swift + 2020-11-15T22:52:13.0335240Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0336190Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0336590Z ^~~~~~~~ + 2020-11-15T22:52:13.0337700Z [471/567] Compiling Models 0101-ATourOfTheComposableArchitecturePt2.swift + 2020-11-15T22:52:13.0339680Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0340650Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0341050Z ^~~~~~~~ + 2020-11-15T22:52:13.0342090Z [472/567] Compiling Models 0102-ATourOfTheComposableArchitecturePt3.swift + 2020-11-15T22:52:13.0343690Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0344620Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0345210Z ^~~~~~~~ + 2020-11-15T22:52:13.0346240Z [473/567] Compiling Models 0103-ATourOfTheComposableArchitecturePt4.swift + 2020-11-15T22:52:13.0347960Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0348910Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0349310Z ^~~~~~~~ + 2020-11-15T22:52:13.0350190Z [474/567] Compiling Models 0104-CombineSchedulersTestingTime.swift + 2020-11-15T22:52:13.0351680Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0352620Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0353020Z ^~~~~~~~ + 2020-11-15T22:52:13.0353980Z [475/567] Compiling Models 0105-CombineSchedulersControllingTime.swift + 2020-11-15T22:52:13.0355540Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0356490Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0356890Z ^~~~~~~~ + 2020-11-15T22:52:13.0357780Z [476/567] Compiling Models 0106-CombineSchedulersErasingTime.swift + 2020-11-15T22:52:13.0359270Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0360210Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0360610Z ^~~~~~~~ + 2020-11-15T22:52:13.0361450Z [477/567] Compiling Models 0107-ComposableSwiftUIBindings.swift + 2020-11-15T22:52:13.0362910Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0363860Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0364260Z ^~~~~~~~ + 2020-11-15T22:52:13.0365100Z [478/567] Compiling Models 0108-ComposableSwiftUIBindings.swift + 2020-11-15T22:52:13.0366550Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0367490Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0367890Z ^~~~~~~~ + 2020-11-15T22:52:13.0368730Z [479/567] Compiling Models 0109-ComposableSwiftUIBindings.swift + 2020-11-15T22:52:13.0370180Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0371120Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0371520Z ^~~~~~~~ + 2020-11-15T22:52:13.0372570Z [480/567] Compiling Models 0110-DesigningDependencies.swift + 2020-11-15T22:52:13.0374010Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0374960Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0375360Z ^~~~~~~~ + 2020-11-15T22:52:13.0376140Z [481/567] Compiling Models 0111-DesigningDependencies.swift + 2020-11-15T22:52:13.0377620Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0378780Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0379180Z ^~~~~~~~ + 2020-11-15T22:52:13.0380000Z [482/567] Compiling Models 0112-DesigningDependencies.swift + 2020-11-15T22:52:13.0381400Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0382340Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0382740Z ^~~~~~~~ + 2020-11-15T22:52:13.0383510Z [483/567] Compiling Models 0113-DesigningDependencies.swift + 2020-11-15T22:52:13.0384900Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0385850Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0386250Z ^~~~~~~~ + 2020-11-15T22:52:13.0387020Z [484/567] Compiling Models 0114-DesigningDependencies.swift + 2020-11-15T22:52:13.0388410Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0389350Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0389750Z ^~~~~~~~ + 2020-11-15T22:52:13.0390460Z [485/567] Compiling Models 0115-RedactedSwiftUI.swift + 2020-11-15T22:52:13.0391780Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0392720Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0393110Z ^~~~~~~~ + 2020-11-15T22:52:13.0393820Z [486/567] Compiling Models 0116-RedactedSwiftUI.swift + 2020-11-15T22:52:13.0395140Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0396090Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0396490Z ^~~~~~~~ + 2020-11-15T22:52:13.0397200Z [487/567] Compiling Models 0117-RedactedSwiftUI.swift + 2020-11-15T22:52:13.0398520Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0399460Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0399860Z ^~~~~~~~ + 2020-11-15T22:52:13.0400580Z [488/567] Compiling Models 0118-RedactedSwiftUI.swift + 2020-11-15T22:52:13.0401890Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0111-DesigningDependencies.swift:4:55: warning: expression took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:13.0402830Z public static let ep111_designingDependencies_pt2 = Episode( + 2020-11-15T22:52:13.0403420Z ^~~~~~~~ + 2020-11-15T22:52:13.0403730Z [489/567] Compiling Core Array.swift + 2020-11-15T22:52:13.0404070Z [490/567] Compiling Core Bits.swift + 2020-11-15T22:52:13.0404400Z [491/567] Compiling Core Cache.swift + 2020-11-15T22:52:13.0404810Z [492/567] Compiling Core Collection+Safe.swift + 2020-11-15T22:52:13.0405250Z [493/567] Compiling Core DataFile.swift + 2020-11-15T22:52:13.0405620Z [494/567] Compiling Core Dispatch.swift + 2020-11-15T22:52:13.0405970Z [501/567] Compiling Core Lock.swift + 2020-11-15T22:52:13.0406310Z [502/567] Compiling Core Portal.swift + 2020-11-15T22:52:13.0406640Z [503/567] Compiling Core RFC1123.swift + 2020-11-15T22:52:13.0407240Z [504/567] Compiling Core Result.swift + 2020-11-15T22:52:13.0407620Z [505/567] Compiling Core Semaphore.swift + 2020-11-15T22:52:13.0408000Z [506/567] Compiling Core Sequence.swift + 2020-11-15T22:52:13.0408450Z [519/567] Compiling Core StaticDataBuffer.swift + 2020-11-15T22:52:13.0409130Z [520/567] Compiling Core String+CaseInsensitiveCompare.swift + 2020-11-15T22:52:13.0409810Z [521/567] Compiling Core String+Polymorphic.swift + 2020-11-15T22:52:13.0410260Z [522/567] Compiling Core String.swift + 2020-11-15T22:52:13.0410690Z [523/567] Compiling Core WorkingDirectory.swift + 2020-11-15T22:52:13.2045090Z [529/568] Compiling NIO DatagramVectorReadManager.swift + 2020-11-15T22:52:13.2062690Z [530/568] Compiling NIO DeadChannel.swift + 2020-11-15T22:52:13.2063970Z [531/568] Compiling NIO DispathQueue+WithFuture.swift + 2020-11-15T22:52:13.2065110Z [532/568] Compiling NIO Embedded.swift + 2020-11-15T22:52:13.2166220Z [533/568] Compiling NIO EventLoop.swift + 2020-11-15T22:52:13.2218280Z [534/568] Compiling NIO EventLoopFuture.swift + 2020-11-15T22:52:13.2219360Z [535/568] Compiling NIO FileDescriptor.swift + 2020-11-15T22:52:13.2220210Z [536/568] Compiling NIO FileHandle.swift + 2020-11-15T22:52:13.2221000Z [537/568] Compiling NIO FileRegion.swift + 2020-11-15T22:52:13.2221880Z [538/568] Compiling NIO GetaddrinfoResolver.swift + 2020-11-15T22:52:13.2222790Z [539/568] Compiling NIO HappyEyeballs.swift + 2020-11-15T22:52:13.2223570Z [540/568] Compiling NIO Heap.swift + 2020-11-15T22:52:13.2224290Z [541/568] Compiling NIO IO.swift + 2020-11-15T22:52:13.2556730Z [542/569] Merging module Core + 2020-11-15T22:52:13.6274410Z [543/575] Compiling ApplicativeRouter Combinators.swift + 2020-11-15T22:52:14.0645200Z [544/576] Merging module StyleguideTests + 2020-11-15T22:52:14.6294830Z [545/614] Merging module NIO + 2020-11-15T22:52:14.7787240Z [546/623] Compiling NIOHTTP1 HTTPEncoder.swift + 2020-11-15T22:52:14.7887900Z [547/623] Compiling NIOHTTP1 HTTPPipelineSetup.swift + 2020-11-15T22:52:15.4611400Z [548/623] Compiling NIOHTTP1 ByteCollectionUtils.swift + 2020-11-15T22:52:15.4713040Z [549/623] Compiling NIOHTTP1 HTTPDecoder.swift + 2020-11-15T22:52:15.4814960Z [550/623] Compiling NIOHTTP1 HTTPServerProtocolErrorHandler.swift + 2020-11-15T22:52:15.9061200Z [551/623] Compiling NIOHTTP1 HTTPServerPipelineHandler.swift + 2020-11-15T22:52:16.1181960Z [555/624] Compiling NIOHTTP1 HTTPServerUpgradeHandler.swift + 2020-11-15T22:52:16.3069720Z [556/624] Compiling Node UnsignedInteger+Convertible.swift + 2020-11-15T22:52:16.3071010Z [557/624] Compiling Node Context.swift + 2020-11-15T22:52:16.3071670Z [558/624] Compiling Node Node.swift + 2020-11-15T22:52:16.3072400Z [559/624] Compiling Node NodeConvertible.swift + 2020-11-15T22:52:16.3073210Z [560/624] Compiling Node NodeInitializable.swift + 2020-11-15T22:52:16.3074040Z [561/624] Compiling Node NodeRepresentable.swift + 2020-11-15T22:52:16.3074870Z [562/624] Compiling Node Array+Convertible.swift + 2020-11-15T22:52:16.3075750Z [563/624] Compiling Node Dictionary+Convertible.swift + 2020-11-15T22:52:16.3076580Z [564/624] Compiling Node Fuzzy+Any.swift + 2020-11-15T22:52:16.3077410Z [565/624] Compiling Node FuzzyConverter.swift + 2020-11-15T22:52:16.3415550Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3528520Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3529260Z ^ + 2020-11-15T22:52:16.3531030Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3532090Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3532590Z ^~~~~~~ + 2020-11-15T22:52:16.3533040Z compactMap + 2020-11-15T22:52:16.3534840Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3536420Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3536910Z ^ + 2020-11-15T22:52:16.3590950Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3592200Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3592700Z ^~~~~~~ + 2020-11-15T22:52:16.3593140Z compactMap + 2020-11-15T22:52:16.3594850Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3596090Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3596580Z ^ + 2020-11-15T22:52:16.3598360Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3599480Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3600000Z ^~~~~~~ + 2020-11-15T22:52:16.3600470Z compactMap + 2020-11-15T22:52:16.3602180Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3603440Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3603930Z ^ + 2020-11-15T22:52:16.3605310Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3606370Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3606850Z ^~~~~~~ + 2020-11-15T22:52:16.3607300Z compactMap + 2020-11-15T22:52:16.3608980Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3610210Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3610530Z ^ + 2020-11-15T22:52:16.3611830Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3612590Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3612840Z ^~~~~~~ + 2020-11-15T22:52:16.3613060Z compactMap + 2020-11-15T22:52:16.3614500Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3615470Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3615720Z ^ + 2020-11-15T22:52:16.3622580Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3623410Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3623660Z ^~~~~~~ + 2020-11-15T22:52:16.3623870Z compactMap + 2020-11-15T22:52:16.3625410Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3664090Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3664790Z ^ + 2020-11-15T22:52:16.3666640Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3667490Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3667750Z ^~~~~~~ + 2020-11-15T22:52:16.3667970Z compactMap + 2020-11-15T22:52:16.3668310Z [573/624] Compiling NIOHTTP1 HTTPTypes.swift + 2020-11-15T22:52:16.3669870Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3670860Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3671100Z ^ + 2020-11-15T22:52:16.3672240Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3673000Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3673250Z ^~~~~~~ + 2020-11-15T22:52:16.3673470Z compactMap + 2020-11-15T22:52:16.3674030Z [574/624] Compiling NIOHTTP1 NIOHTTPClientUpgradeHandler.swift + 2020-11-15T22:52:16.3676200Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3677270Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3677520Z ^ + 2020-11-15T22:52:16.3678830Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3679600Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3679860Z ^~~~~~~ + 2020-11-15T22:52:16.3680070Z compactMap + 2020-11-15T22:52:16.3680450Z [575/624] Compiling Node UUID+Convertible.swift + 2020-11-15T22:52:16.3682030Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3683000Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3683250Z ^ + 2020-11-15T22:52:16.3684350Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/Convertibles/Date+Convertible.swift:71:22: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3685110Z .flatMap({ $0.date(from: string) }) + 2020-11-15T22:52:16.3685360Z ^~~~~~~ + 2020-11-15T22:52:16.3685580Z compactMap + 2020-11-15T22:52:16.3686190Z [576/624] Compiling Node StructuredDataWrapper+Convenience.swift + 2020-11-15T22:52:16.3688850Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/StructuredDataWrapper/StructuredDataWrapper+PathIndexable.swift:30:34: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3690300Z let context = array.lazy.flatMap { $0.context } .first + 2020-11-15T22:52:16.3690640Z ^ + 2020-11-15T22:52:16.3692290Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/StructuredDataWrapper/StructuredDataWrapper+PathIndexable.swift:30:34: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3693490Z let context = array.lazy.flatMap { $0.context } .first + 2020-11-15T22:52:16.3693830Z ^~~~~~~ + 2020-11-15T22:52:16.3694060Z compactMap + 2020-11-15T22:52:16.3694860Z [577/624] Compiling Node StructuredDataWrapper+Equatable.swift + 2020-11-15T22:52:16.3697380Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/StructuredDataWrapper/StructuredDataWrapper+PathIndexable.swift:30:34: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3699230Z let context = array.lazy.flatMap { $0.context } .first + 2020-11-15T22:52:16.3700200Z ^ + 2020-11-15T22:52:16.3701870Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/StructuredDataWrapper/StructuredDataWrapper+PathIndexable.swift:30:34: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3703070Z let context = array.lazy.flatMap { $0.context } .first + 2020-11-15T22:52:16.3703420Z ^~~~~~~ + 2020-11-15T22:52:16.3703650Z compactMap + 2020-11-15T22:52:16.3704220Z [578/624] Compiling Node StructuredDataWrapper+Literals.swift + 2020-11-15T22:52:16.3706340Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/StructuredDataWrapper/StructuredDataWrapper+PathIndexable.swift:30:34: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3707750Z let context = array.lazy.flatMap { $0.context } .first + 2020-11-15T22:52:16.3708090Z ^ + 2020-11-15T22:52:16.3709590Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/StructuredDataWrapper/StructuredDataWrapper+PathIndexable.swift:30:34: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3711400Z let context = array.lazy.flatMap { $0.context } .first + 2020-11-15T22:52:16.3712150Z ^~~~~~~ + 2020-11-15T22:52:16.3712380Z compactMap + 2020-11-15T22:52:16.3713810Z [579/624] Compiling Node StructuredDataWrapper+PathIndexable.swift + 2020-11-15T22:52:16.3716870Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/StructuredDataWrapper/StructuredDataWrapper+PathIndexable.swift:30:34: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3718300Z let context = array.lazy.flatMap { $0.context } .first + 2020-11-15T22:52:16.3718640Z ^ + 2020-11-15T22:52:16.3720160Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/StructuredDataWrapper/StructuredDataWrapper+PathIndexable.swift:30:34: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3721660Z let context = array.lazy.flatMap { $0.context } .first + 2020-11-15T22:52:16.3722010Z ^~~~~~~ + 2020-11-15T22:52:16.3722240Z compactMap + 2020-11-15T22:52:16.3722850Z [580/624] Compiling Node StructuredDataWrapper+Polymorphic.swift + 2020-11-15T22:52:16.3725440Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/StructuredDataWrapper/StructuredDataWrapper+PathIndexable.swift:30:34: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3727230Z let context = array.lazy.flatMap { $0.context } .first + 2020-11-15T22:52:16.3727610Z ^ + 2020-11-15T22:52:16.3729180Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/StructuredDataWrapper/StructuredDataWrapper+PathIndexable.swift:30:34: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3730370Z let context = array.lazy.flatMap { $0.context } .first + 2020-11-15T22:52:16.3730710Z ^~~~~~~ + 2020-11-15T22:52:16.3730930Z compactMap + 2020-11-15T22:52:16.3731380Z [581/624] Compiling Node StructuredDataWrapper.swift + 2020-11-15T22:52:16.3733580Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/StructuredDataWrapper/StructuredDataWrapper+PathIndexable.swift:30:34: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3734990Z let context = array.lazy.flatMap { $0.context } .first + 2020-11-15T22:52:16.3735330Z ^ + 2020-11-15T22:52:16.3736820Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/StructuredDataWrapper/StructuredDataWrapper+PathIndexable.swift:30:34: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3738420Z let context = array.lazy.flatMap { $0.context } .first + 2020-11-15T22:52:16.3738780Z ^~~~~~~ + 2020-11-15T22:52:16.3739000Z compactMap + 2020-11-15T22:52:16.3739310Z [582/624] Compiling Node Errors.swift + 2020-11-15T22:52:16.3741200Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/StructuredDataWrapper/StructuredDataWrapper+PathIndexable.swift:30:34: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3742610Z let context = array.lazy.flatMap { $0.context } .first + 2020-11-15T22:52:16.3742950Z ^ + 2020-11-15T22:52:16.3744450Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/StructuredDataWrapper/StructuredDataWrapper+PathIndexable.swift:30:34: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3745640Z let context = array.lazy.flatMap { $0.context } .first + 2020-11-15T22:52:16.3745990Z ^~~~~~~ + 2020-11-15T22:52:16.3746210Z compactMap + 2020-11-15T22:52:16.3746510Z [583/624] Compiling Node Exports.swift + 2020-11-15T22:52:16.3748530Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/StructuredDataWrapper/StructuredDataWrapper+PathIndexable.swift:30:34: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3750050Z let context = array.lazy.flatMap { $0.context } .first + 2020-11-15T22:52:16.3750390Z ^ + 2020-11-15T22:52:16.3751910Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/StructuredDataWrapper/StructuredDataWrapper+PathIndexable.swift:30:34: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3753110Z let context = array.lazy.flatMap { $0.context } .first + 2020-11-15T22:52:16.3753450Z ^~~~~~~ + 2020-11-15T22:52:16.3753680Z compactMap + 2020-11-15T22:52:16.3754010Z [584/624] Compiling Node Identifier.swift + 2020-11-15T22:52:16.3755870Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/StructuredDataWrapper/StructuredDataWrapper+PathIndexable.swift:30:34: warning: 'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value + 2020-11-15T22:52:16.3757280Z let context = array.lazy.flatMap { $0.context } .first + 2020-11-15T22:52:16.3757620Z ^ + 2020-11-15T22:52:16.3759360Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/node/Sources/Node/StructuredDataWrapper/StructuredDataWrapper+PathIndexable.swift:30:34: note: use 'compactMap(_:)' instead + 2020-11-15T22:52:16.3760580Z let context = array.lazy.flatMap { $0.context } .first + 2020-11-15T22:52:16.3760920Z ^~~~~~~ + 2020-11-15T22:52:16.3761150Z compactMap + 2020-11-15T22:52:16.3828520Z [585/624] Merging module ApplicativeRouter + 2020-11-15T22:52:16.5493250Z [586/624] Compiling Node Optional+Convertible.swift + 2020-11-15T22:52:16.5593600Z [587/624] Compiling Node Set+Convertible.swift + 2020-11-15T22:52:16.5694890Z [588/624] Compiling Node Number.swift + 2020-11-15T22:52:16.5795230Z [589/624] Compiling Node StructuredData+Equatable.swift + 2020-11-15T22:52:16.5896830Z [590/624] Compiling Node StructuredData+Init.swift + 2020-11-15T22:52:16.5897690Z [591/624] Compiling Node StructuredData+PathIndexable.swift + 2020-11-15T22:52:16.5998580Z [592/624] Compiling Node StructuredData+Polymorphic.swift + 2020-11-15T22:52:16.5999660Z [593/624] Compiling Node StructuredData.swift + 2020-11-15T22:52:16.6000570Z [594/624] Compiling Node StructuredDataWrapper+Cases.swift + 2020-11-15T22:52:16.7700070Z [595/625] Merging module Node + 2020-11-15T22:52:17.0700130Z [596/637] Compiling PostgreSQL Context.swift + 2020-11-15T22:52:17.0800870Z [597/637] Compiling PostgreSQL Database.swift + 2020-11-15T22:52:17.2257350Z [598/637] Compiling PostgreSQL ConnectionInfo.swift + 2020-11-15T22:52:17.3706650Z [601/637] Compiling PostgreSQL BinaryUtils.swift + 2020-11-15T22:52:17.3728270Z [602/637] Compiling PostgreSQL Bind+Node.swift + 2020-11-15T22:52:17.3729090Z [603/637] Compiling PostgreSQL Bind.swift + 2020-11-15T22:52:17.6070310Z [604/638] Merging module NIOHTTP1 + 2020-11-15T22:52:17.8146730Z [605/644] Compiling NIOHTTPCompression HTTPRequestDecompressor.swift + 2020-11-15T22:52:17.8207180Z [606/644] Compiling NIOHTTPCompression HTTPResponseCompressor.swift + 2020-11-15T22:52:17.8307540Z [607/644] Compiling NIOHTTPCompression HTTPResponseDecompressor.swift + 2020-11-15T22:52:18.1759780Z [608/644] Compiling PostgreSQL Error.swift + 2020-11-15T22:52:18.1760250Z [609/644] Compiling PostgreSQL Exports.swift + 2020-11-15T22:52:18.1760660Z [610/644] Compiling PostgreSQL Result.swift + 2020-11-15T22:52:18.4134970Z [612/644] Compiling NIOHTTPCompression HTTPRequestCompressor.swift + 2020-11-15T22:52:18.6068970Z [615/644] Compiling NIOHTTPCompression HTTPCompression.swift + 2020-11-15T22:52:18.6069770Z [616/644] Compiling NIOHTTPCompression HTTPDecompression.swift + 2020-11-15T22:52:18.6427660Z [617/645] Compiling Models 0119-ParsersRecap.swift + 2020-11-15T22:52:18.6432800Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6462640Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6463410Z ^~~~~~~~ + 2020-11-15T22:52:18.6465150Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6466160Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6466640Z ^ + 2020-11-15T22:52:18.6467720Z [618/645] Compiling Models 0120-ParsersRecap.swift + 2020-11-15T22:52:18.6469360Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6470610Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6471250Z ^~~~~~~~ + 2020-11-15T22:52:18.6472590Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6473580Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6474050Z ^ + 2020-11-15T22:52:18.6474990Z [619/645] Compiling Models 0121-ParsersRecap.swift + 2020-11-15T22:52:18.6477350Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6478650Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6479280Z ^~~~~~~~ + 2020-11-15T22:52:18.6480640Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6481620Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6482540Z ^ + 2020-11-15T22:52:18.6483510Z [620/645] Compiling Models 0122-ParsersRecap.swift + 2020-11-15T22:52:18.6485140Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6486390Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6487030Z ^~~~~~~~ + 2020-11-15T22:52:18.6488340Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6489330Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6489800Z ^ + 2020-11-15T22:52:18.6490700Z [621/645] Compiling Models 0123-FluentZip.swift + 2020-11-15T22:52:18.6492310Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6493550Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6494180Z ^~~~~~~~ + 2020-11-15T22:52:18.6495500Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6496480Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6496950Z ^ + 2020-11-15T22:52:18.6497950Z [622/645] Compiling Models 0124-GeneralizedParsing.swift + 2020-11-15T22:52:18.6499630Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6500860Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6501490Z ^~~~~~~~ + 2020-11-15T22:52:18.6502820Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6503800Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6504260Z ^ + 2020-11-15T22:52:18.6505260Z [623/645] Compiling Models 0125-GeneralizedParsing.swift + 2020-11-15T22:52:18.6506950Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6508350Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6508990Z ^~~~~~~~ + 2020-11-15T22:52:18.6510310Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6511300Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6511790Z ^ + 2020-11-15T22:52:18.6512340Z [624/645] Compiling Models AllEpisodes.swift + 2020-11-15T22:52:18.6513900Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6515440Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6516160Z ^~~~~~~~ + 2020-11-15T22:52:18.6517520Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6518500Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6518970Z ^ + 2020-11-15T22:52:18.6519520Z [625/645] Compiling Models References.swift + 2020-11-15T22:52:18.6521170Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6523100Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6527610Z ^~~~~~~~ + 2020-11-15T22:52:18.6529050Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6529840Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6534570Z ^ + 2020-11-15T22:52:18.6536130Z [626/645] Compiling Models XYZW-TODO.swift + 2020-11-15T22:52:18.6537610Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6538570Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6538970Z ^~~~~~~~ + 2020-11-15T22:52:18.6540070Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6540770Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6541010Z ^ + 2020-11-15T22:52:18.6541370Z [627/645] Compiling Models FeedRequestEvent.swift + 2020-11-15T22:52:18.6542720Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6543670Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6544060Z ^~~~~~~~ + 2020-11-15T22:52:18.6545110Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6545800Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6546050Z ^ + 2020-11-15T22:52:18.6546460Z [628/645] Compiling Models MailgunForwardPayload.swift + 2020-11-15T22:52:18.6555840Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6556840Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6557240Z ^~~~~~~~ + 2020-11-15T22:52:18.6558320Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6559010Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6559250Z ^ + 2020-11-15T22:52:18.6559520Z [629/645] Compiling Models Models.swift + 2020-11-15T22:52:18.6560780Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6561740Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6562140Z ^~~~~~~~ + 2020-11-15T22:52:18.6563630Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6564360Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6564600Z ^ + 2020-11-15T22:52:18.6564990Z [630/645] Compiling Models NewBlogPostFormData.swift + 2020-11-15T22:52:18.6566400Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6567340Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6567730Z ^~~~~~~~ + 2020-11-15T22:52:18.6569070Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6569760Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6570000Z ^ + 2020-11-15T22:52:18.6570280Z [631/645] Compiling Models Pricing.swift + 2020-11-15T22:52:18.6571550Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6572490Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6572890Z ^~~~~~~~ + 2020-11-15T22:52:18.6573940Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6574630Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6574870Z ^ + 2020-11-15T22:52:18.6575180Z [632/645] Compiling Models ProfileData.swift + 2020-11-15T22:52:18.6576460Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6577520Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6578030Z ^~~~~~~~ + 2020-11-15T22:52:18.6579110Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6579800Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6580050Z ^ + 2020-11-15T22:52:18.6580510Z [633/645] Compiling Models SubscribeConfirmationData.swift + 2020-11-15T22:52:18.6581950Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6582910Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6583310Z ^~~~~~~~ + 2020-11-15T22:52:18.6584350Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6585040Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6585280Z ^ + 2020-11-15T22:52:18.6585610Z [634/645] Compiling Models SubscribeData.swift + 2020-11-15T22:52:18.6586920Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6587870Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6588260Z ^~~~~~~~ + 2020-11-15T22:52:18.6589320Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6590010Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6590250Z ^ + 2020-11-15T22:52:18.6590590Z [635/645] Compiling Models SubscriberState.swift + 2020-11-15T22:52:18.6592090Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6593070Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6593470Z ^~~~~~~~ + 2020-11-15T22:52:18.6594550Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6595240Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6595690Z ^ + 2020-11-15T22:52:18.6596010Z [636/645] Compiling Models Subscription.swift + 2020-11-15T22:52:18.6597340Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6598290Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6598680Z ^~~~~~~~ + 2020-11-15T22:52:18.6599720Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6600410Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6600660Z ^ + 2020-11-15T22:52:18.6600960Z [637/645] Compiling Models TeamInvite.swift + 2020-11-15T22:52:18.6602240Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6603190Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6603590Z ^~~~~~~~ + 2020-11-15T22:52:18.6604650Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6605330Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6605560Z ^ + 2020-11-15T22:52:18.6605830Z [638/645] Compiling Models User.swift + 2020-11-15T22:52:18.6607130Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/0112-DesigningDependencies.swift:4:55: warning: expression took 217ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6608080Z public static let ep112_designingDependencies_pt3 = Episode( + 2020-11-15T22:52:18.6608470Z ^~~~~~~~ + 2020-11-15T22:52:18.6609540Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Models/Episodes/AllEpisodes.swift:2:35: warning: expression took 2562ms to type-check (limit: 200ms) + 2020-11-15T22:52:18.6610230Z public static let all: [Self] = [ + 2020-11-15T22:52:18.6610480Z ^ + 2020-11-15T22:52:18.7958510Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/postgresql/Sources/PostgreSQL/Bind/BinaryUtils.swift:7:60: warning: 'characters' is deprecated: Please use String directly + 2020-11-15T22:52:18.7965940Z return String(repeating: "0", count: 2 - hexString.characters.count) + hexString + 2020-11-15T22:52:18.7966820Z ^ + 2020-11-15T22:52:18.7968340Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/postgresql/Sources/PostgreSQL/Bind/BinaryUtils.swift:12:60: warning: 'characters' is deprecated: Please use String directly + 2020-11-15T22:52:18.7970110Z return String(repeating: "0", count: 8 - bitString.characters.count) + bitString + 2020-11-15T22:52:18.7970930Z ^ + 2020-11-15T22:52:18.7972410Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/postgresql/Sources/PostgreSQL/Bind/BinaryUtils.swift:193:83: warning: 'characters' is deprecated: Please use String directly + 2020-11-15T22:52:18.7974630Z return String(repeating: "0", count: Numeric.decDigits - stringDigits.characters.count) + stringDigits + 2020-11-15T22:52:18.7975620Z ^ + 2020-11-15T22:52:18.7977410Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/postgresql/Sources/PostgreSQL/Bind/Bind.swift:17:23: warning: 'deallocate(capacity:)' is deprecated: Swift currently only supports freeing entire heap blocks, use deallocate() instead + 2020-11-15T22:52:18.7978740Z bytes.deallocate(capacity: length) + 2020-11-15T22:52:18.7979290Z ^ + 2020-11-15T22:52:18.7981090Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/postgresql/Sources/PostgreSQL/Bind/BinaryUtils.swift:7:60: warning: 'characters' is deprecated: Please use String directly + 2020-11-15T22:52:18.7983450Z return String(repeating: "0", count: 2 - hexString.characters.count) + hexString + 2020-11-15T22:52:18.7984250Z ^ + 2020-11-15T22:52:18.7985740Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/postgresql/Sources/PostgreSQL/Bind/BinaryUtils.swift:12:60: warning: 'characters' is deprecated: Please use String directly + 2020-11-15T22:52:18.7987520Z return String(repeating: "0", count: 8 - bitString.characters.count) + bitString + 2020-11-15T22:52:18.7988310Z ^ + 2020-11-15T22:52:18.7990010Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/postgresql/Sources/PostgreSQL/Bind/BinaryUtils.swift:193:83: warning: 'characters' is deprecated: Please use String directly + 2020-11-15T22:52:18.7991940Z return String(repeating: "0", count: Numeric.decDigits - stringDigits.characters.count) + stringDigits + 2020-11-15T22:52:18.7992890Z ^ + 2020-11-15T22:52:18.7994560Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/postgresql/Sources/PostgreSQL/Bind/Bind.swift:17:23: warning: 'deallocate(capacity:)' is deprecated: Swift currently only supports freeing entire heap blocks, use deallocate() instead + 2020-11-15T22:52:18.7996050Z bytes.deallocate(capacity: length) + 2020-11-15T22:52:18.7996610Z ^ + 2020-11-15T22:52:18.7998080Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/postgresql/Sources/PostgreSQL/Bind/BinaryUtils.swift:7:60: warning: 'characters' is deprecated: Please use String directly + 2020-11-15T22:52:18.7999830Z return String(repeating: "0", count: 2 - hexString.characters.count) + hexString + 2020-11-15T22:52:18.8000620Z ^ + 2020-11-15T22:52:18.8002110Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/postgresql/Sources/PostgreSQL/Bind/BinaryUtils.swift:12:60: warning: 'characters' is deprecated: Please use String directly + 2020-11-15T22:52:18.8003860Z return String(repeating: "0", count: 8 - bitString.characters.count) + bitString + 2020-11-15T22:52:18.8004660Z ^ + 2020-11-15T22:52:18.8006140Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/postgresql/Sources/PostgreSQL/Bind/BinaryUtils.swift:193:83: warning: 'characters' is deprecated: Please use String directly + 2020-11-15T22:52:18.8008050Z return String(repeating: "0", count: Numeric.decDigits - stringDigits.characters.count) + stringDigits + 2020-11-15T22:52:18.8009000Z ^ + 2020-11-15T22:52:18.8010660Z /Users/runner/work/pointfreeco/pointfreeco/.build/checkouts/postgresql/Sources/PostgreSQL/Bind/Bind.swift:17:23: warning: 'deallocate(capacity:)' is deprecated: Swift currently only supports freeing entire heap blocks, use deallocate() instead + 2020-11-15T22:52:18.8012000Z bytes.deallocate(capacity: length) + 2020-11-15T22:52:18.8012640Z ^ + 2020-11-15T22:52:18.8101250Z [642/647] Merging module NIOHTTPCompression + 2020-11-15T22:52:19.2250490Z [643/655] Merging module Models + 2020-11-15T22:52:19.2947050Z [644/655] Merging module PostgreSQL + 2020-11-15T22:52:19.8815630Z [645/664] Compiling Database Database.swift + 2020-11-15T22:52:19.8916620Z [646/664] Compiling Database DatabaseDecoder.swift + 2020-11-15T22:52:20.0611980Z [647/664] Compiling ModelsTestSupport PricingMocks.swift + 2020-11-15T22:52:20.1582180Z [648/664] Compiling ModelsTestSupport SubscribeDataMocks.swift + 2020-11-15T22:52:20.5456950Z [651/664] Compiling ModelsTestSupport Mocks.swift + 2020-11-15T22:52:20.8672550Z [652/665] Merging module ModelsTestSupport + 2020-11-15T22:52:21.0324010Z [653/668] Compiling ModelsTests BlogPostTest.swift + 2020-11-15T22:52:21.6310660Z [655/668] Compiling ModelsTests CollectionTests.swift + 2020-11-15T22:52:21.6882290Z [656/668] Compiling ModelsTests EpisodeTests.swift + 2020-11-15T22:52:21.9241420Z [659/669] Compiling HttpPipeline SignedCookies.swift + 2020-11-15T22:52:21.9442430Z [660/669] Compiling HttpPipeline Status.swift + 2020-11-15T22:52:22.1769340Z [661/669] Merging module ModelsTests + 2020-11-15T22:52:22.3554590Z [664/670] Compiling HttpPipeline SharedMiddlewareTransformers.swift + 2020-11-15T22:52:22.5171850Z [667/672] Merging module Syndication + 2020-11-15T22:52:22.6302100Z [668/672] Merging module HttpPipeline + 2020-11-15T22:52:22.7963880Z [669/683] Merging module Database + 2020-11-15T22:52:23.0803820Z [670/685] Compiling Mailgun Client.swift + 2020-11-15T22:52:23.3240570Z [672/687] Merging module HttpPipelineHtmlSupport + 2020-11-15T22:52:23.3541850Z [673/688] Merging module ApplicativeRouterHttpPipelineSupport + 2020-11-15T22:52:23.8399250Z [674/689] Compiling Mailgun Models.swift + 2020-11-15T22:52:23.9541760Z [675/689] Compiling DatabaseTestSupport Mocks.swift + 2020-11-15T22:52:24.0589600Z [676/690] Compiling PointFreeRouter GitHubRoutes.swift + 2020-11-15T22:52:24.0691290Z [677/690] Compiling PointFreeRouter PartialIsoReflection.swift + 2020-11-15T22:52:24.1780600Z [678/690] Merging module DatabaseTestSupport + 2020-11-15T22:52:24.2997740Z [681/690] Compiling PointFreeRouter ApiRoutes.swift + 2020-11-15T22:52:24.3324680Z [682/690] Compiling PointFreeRouter TwitterRoutes.swift + 2020-11-15T22:52:24.3325510Z [683/690] Compiling PointFreeRouter Util.swift + 2020-11-15T22:52:24.6289340Z [686/692] Merging module Mailgun + 2020-11-15T22:52:24.8165410Z [687/692] Merging module HttpPipelineTestSupport + 2020-11-15T22:52:25.2849200Z [688/692] Compiling PointFreeRouter PointFreeRouter.swift + 2020-11-15T22:52:25.2859030Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFreeRouter/Routes.swift:138:32: warning: expression took 296ms to type-check (limit: 200ms) + 2020-11-15T22:52:25.2860080Z let routers: [Router] = [ + 2020-11-15T22:52:25.2860620Z ^ + 2020-11-15T22:52:25.2861280Z [689/692] Compiling PointFreeRouter Routes.swift + 2020-11-15T22:52:25.2862790Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFreeRouter/Routes.swift:138:32: warning: expression took 296ms to type-check (limit: 200ms) + 2020-11-15T22:52:25.2863790Z let routers: [Router] = [ + 2020-11-15T22:52:25.2864270Z ^ + 2020-11-15T22:52:25.6881590Z [690/693] Merging module PointFreeRouter + 2020-11-15T22:52:26.6244240Z [691/724] Compiling Views About.swift + 2020-11-15T22:52:27.2255710Z [692/725] Merging module PointFreeRouterTests + 2020-11-15T22:52:28.2902900Z [693/725] Compiling Views Privacy.swift + 2020-11-15T22:52:28.2927610Z [694/725] Compiling Views StripeHtml.swift + 2020-11-15T22:52:28.2928400Z [695/725] Compiling Views SubscriptionConfirmation.swift + 2020-11-15T22:52:28.2934360Z [696/725] Compiling Views Svg.swift + 2020-11-15T22:52:28.2934750Z [697/725] Compiling Views TODO.swift + 2020-11-15T22:52:28.2935170Z [698/725] Compiling Views Testimonials.swift + 2020-11-15T22:52:28.2935700Z [699/725] Compiling Views TranscriptBlockView.swift + 2020-11-15T22:52:28.5136190Z [700/725] Compiling Views Footer.swift + 2020-11-15T22:52:28.5136980Z [701/725] Compiling Views Home.swift + 2020-11-15T22:52:28.5137400Z [702/725] Compiling Views InviteViews.swift + 2020-11-15T22:52:28.5138380Z [703/725] Compiling Views Markdown.swift + 2020-11-15T22:52:28.5138880Z [704/725] Compiling Views MinimalNavView.swift + 2020-11-15T22:52:28.5139380Z [705/725] Compiling Views MountainNavView.swift + 2020-11-15T22:52:28.5139870Z [706/725] Compiling Views PricingLanding.swift + 2020-11-15T22:52:29.1286960Z [707/725] Compiling Views CollectionIndex.swift + 2020-11-15T22:52:29.1287600Z [708/725] Compiling Views CollectionSection.swift + 2020-11-15T22:52:29.1289640Z [709/725] Compiling Views CollectionShared.swift + 2020-11-15T22:52:29.1290270Z [710/725] Compiling Views CollectionShow.swift + 2020-11-15T22:52:29.1290710Z [711/725] Compiling Views Enterprise.swift + 2020-11-15T22:52:29.1291620Z [712/725] Compiling Views EpisodePage.swift + 2020-11-15T22:52:29.1292110Z [713/725] Compiling Views EpisodeVideoView.swift + 2020-11-15T22:52:29.1292540Z [714/725] Compiling Views File.swift + 2020-11-15T22:52:29.2125140Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Views/Account/Account.swift:551:11: warning: expression took 287ms to type-check (limit: 200ms) + 2020-11-15T22:52:29.2126170Z return .gridRow( + 2020-11-15T22:52:29.2126410Z ~^~~~~~~~ + 2020-11-15T22:52:29.2128470Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Views/Account/Account.swift:537:14: warning: global function 'subscriptionTeammateOverview' took 289ms to type-check (limit: 200ms) + 2020-11-15T22:52:29.2133080Z private func subscriptionTeammateOverview(_ data: AccountData) -> Node { + 2020-11-15T22:52:29.2134250Z ^ + 2020-11-15T22:52:29.2134540Z [716/725] Compiling Views Account.swift + 2020-11-15T22:52:29.2135760Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Views/Account/Account.swift:551:11: warning: expression took 287ms to type-check (limit: 200ms) + 2020-11-15T22:52:29.2136410Z return .gridRow( + 2020-11-15T22:52:29.2136630Z ~^~~~~~~~ + 2020-11-15T22:52:29.2137890Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Views/Account/Account.swift:537:14: warning: global function 'subscriptionTeammateOverview' took 289ms to type-check (limit: 200ms) + 2020-11-15T22:52:29.2139390Z private func subscriptionTeammateOverview(_ data: AccountData) -> Node { + 2020-11-15T22:52:29.2139900Z ^ + 2020-11-15T22:52:29.2140230Z [717/725] Compiling Views Invoices.swift + 2020-11-15T22:52:29.2141360Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Views/Account/Account.swift:551:11: warning: expression took 287ms to type-check (limit: 200ms) + 2020-11-15T22:52:29.2141990Z return .gridRow( + 2020-11-15T22:52:29.2142210Z ~^~~~~~~~ + 2020-11-15T22:52:29.2143440Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Views/Account/Account.swift:537:14: warning: global function 'subscriptionTeammateOverview' took 289ms to type-check (limit: 200ms) + 2020-11-15T22:52:29.2144930Z private func subscriptionTeammateOverview(_ data: AccountData) -> Node { + 2020-11-15T22:52:29.2145440Z ^ + 2020-11-15T22:52:29.2145790Z [718/725] Compiling Views PaymentInfoViews.swift + 2020-11-15T22:52:29.2147110Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Views/Account/Account.swift:551:11: warning: expression took 287ms to type-check (limit: 200ms) + 2020-11-15T22:52:29.2147760Z return .gridRow( + 2020-11-15T22:52:29.2147980Z ~^~~~~~~~ + 2020-11-15T22:52:29.2149680Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Views/Account/Account.swift:537:14: warning: global function 'subscriptionTeammateOverview' took 289ms to type-check (limit: 200ms) + 2020-11-15T22:52:29.2151160Z private func subscriptionTeammateOverview(_ data: AccountData) -> Node { + 2020-11-15T22:52:29.2151660Z ^ + 2020-11-15T22:52:29.2152040Z [719/725] Compiling Views AdminEpisodeCredit.swift + 2020-11-15T22:52:29.2153760Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Views/Account/Account.swift:551:11: warning: expression took 287ms to type-check (limit: 200ms) + 2020-11-15T22:52:29.2154410Z return .gridRow( + 2020-11-15T22:52:29.2154620Z ~^~~~~~~~ + 2020-11-15T22:52:29.2156660Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Views/Account/Account.swift:537:14: warning: global function 'subscriptionTeammateOverview' took 289ms to type-check (limit: 200ms) + 2020-11-15T22:52:29.2158260Z private func subscriptionTeammateOverview(_ data: AccountData) -> Node { + 2020-11-15T22:52:29.2158770Z ^ + 2020-11-15T22:52:29.2159120Z [720/725] Compiling Views AdminFreeEpisode.swift + 2020-11-15T22:52:29.2160310Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Views/Account/Account.swift:551:11: warning: expression took 287ms to type-check (limit: 200ms) + 2020-11-15T22:52:29.2160930Z return .gridRow( + 2020-11-15T22:52:29.2163430Z ~^~~~~~~~ + 2020-11-15T22:52:29.2164780Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Views/Account/Account.swift:537:14: warning: global function 'subscriptionTeammateOverview' took 289ms to type-check (limit: 200ms) + 2020-11-15T22:52:29.2166570Z private func subscriptionTeammateOverview(_ data: AccountData) -> Node { + 2020-11-15T22:52:29.2167630Z ^ + 2020-11-15T22:52:29.2167970Z [721/725] Compiling Views BlogIndex.swift + 2020-11-15T22:52:29.2169320Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Views/Account/Account.swift:551:11: warning: expression took 287ms to type-check (limit: 200ms) + 2020-11-15T22:52:29.2169970Z return .gridRow( + 2020-11-15T22:52:29.2170180Z ~^~~~~~~~ + 2020-11-15T22:52:29.2171480Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Views/Account/Account.swift:537:14: warning: global function 'subscriptionTeammateOverview' took 289ms to type-check (limit: 200ms) + 2020-11-15T22:52:29.2172970Z private func subscriptionTeammateOverview(_ data: AccountData) -> Node { + 2020-11-15T22:52:29.2173470Z ^ + 2020-11-15T22:52:29.2173800Z [722/725] Compiling Views BlogPostShow.swift + 2020-11-15T22:52:29.2174960Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Views/Account/Account.swift:551:11: warning: expression took 287ms to type-check (limit: 200ms) + 2020-11-15T22:52:29.2175580Z return .gridRow( + 2020-11-15T22:52:29.2175800Z ~^~~~~~~~ + 2020-11-15T22:52:29.2177030Z /Users/runner/work/pointfreeco/pointfreeco/Sources/Views/Account/Account.swift:537:14: warning: global function 'subscriptionTeammateOverview' took 289ms to type-check (limit: 200ms) + 2020-11-15T22:52:29.2178520Z private func subscriptionTeammateOverview(_ data: AccountData) -> Node { + 2020-11-15T22:52:29.2179020Z ^ + 2020-11-15T22:52:29.4749720Z [723/726] Merging module Views + 2020-11-15T22:52:35.4081890Z [724/796] Compiling PointFree ApiMiddleware.swift + 2020-11-15T22:52:35.4084120Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Auth.swift:23:3: warning: expression took 406ms to type-check (limit: 200ms) + 2020-11-15T22:52:35.4085170Z <<< requireAccessToken + 2020-11-15T22:52:35.4085720Z ~~^~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:35.4086840Z [725/796] Compiling PointFree AppleDeveloperMerchantIdDomainAssociation.swift + 2020-11-15T22:52:35.4088740Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Auth.swift:23:3: warning: expression took 406ms to type-check (limit: 200ms) + 2020-11-15T22:52:35.4089750Z <<< requireAccessToken + 2020-11-15T22:52:35.4090290Z ~~^~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:35.4090850Z [726/796] Compiling PointFree Assets.swift + 2020-11-15T22:52:35.4092230Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Auth.swift:23:3: warning: expression took 406ms to type-check (limit: 200ms) + 2020-11-15T22:52:35.4093210Z <<< requireAccessToken + 2020-11-15T22:52:35.4093750Z ~~^~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:35.4094300Z [727/796] Compiling PointFree AtomFeed.swift + 2020-11-15T22:52:35.4095690Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Auth.swift:23:3: warning: expression took 406ms to type-check (limit: 200ms) + 2020-11-15T22:52:35.4096680Z <<< requireAccessToken + 2020-11-15T22:52:35.4097180Z ~~^~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:35.4097680Z [728/796] Compiling PointFree Auth.swift + 2020-11-15T22:52:35.4099010Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Auth.swift:23:3: warning: expression took 406ms to type-check (limit: 200ms) + 2020-11-15T22:52:35.4100470Z <<< requireAccessToken + 2020-11-15T22:52:35.4101060Z ~~^~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:35.4101630Z [729/796] Compiling PointFree AllBlogPosts.swift + 2020-11-15T22:52:35.4103040Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Auth.swift:23:3: warning: expression took 406ms to type-check (limit: 200ms) + 2020-11-15T22:52:35.4103980Z <<< requireAccessToken + 2020-11-15T22:52:35.4104460Z ~~^~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:35.4110980Z [730/796] Compiling PointFree BlogAtomFeed.swift + 2020-11-15T22:52:35.4112530Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Auth.swift:23:3: warning: expression took 406ms to type-check (limit: 200ms) + 2020-11-15T22:52:35.4113760Z <<< requireAccessToken + 2020-11-15T22:52:35.4114250Z ~~^~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:35.4114920Z [731/796] Compiling PointFree BlogMiddleware.swift + 2020-11-15T22:52:35.4116380Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Auth.swift:23:3: warning: expression took 406ms to type-check (limit: 200ms) + 2020-11-15T22:52:35.4117320Z <<< requireAccessToken + 2020-11-15T22:52:35.4117810Z ~~^~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:35.4118370Z [732/796] Compiling PointFree BlogPostIndex.swift + 2020-11-15T22:52:35.4119770Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Auth.swift:23:3: warning: expression took 406ms to type-check (limit: 200ms) + 2020-11-15T22:52:35.4120710Z <<< requireAccessToken + 2020-11-15T22:52:35.4121210Z ~~^~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:35.4121770Z [733/796] Compiling PointFree BlogPostShow.swift + 2020-11-15T22:52:35.4123150Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Auth.swift:23:3: warning: expression took 406ms to type-check (limit: 200ms) + 2020-11-15T22:52:35.4124100Z <<< requireAccessToken + 2020-11-15T22:52:35.4124590Z ~~^~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:35.4125120Z [734/796] Compiling PointFree Bootstrap.swift + 2020-11-15T22:52:35.4126490Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Auth.swift:23:3: warning: expression took 406ms to type-check (limit: 200ms) + 2020-11-15T22:52:35.4127420Z <<< requireAccessToken + 2020-11-15T22:52:35.4127910Z ~~^~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:35.4128500Z [735/796] Compiling PointFree CollectionIndex.swift + 2020-11-15T22:52:35.4129910Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Auth.swift:23:3: warning: expression took 406ms to type-check (limit: 200ms) + 2020-11-15T22:52:35.4130850Z <<< requireAccessToken + 2020-11-15T22:52:35.4131330Z ~~^~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:35.4131930Z [736/796] Compiling PointFree CollectionSection.swift + 2020-11-15T22:52:35.4133360Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Auth.swift:23:3: warning: expression took 406ms to type-check (limit: 200ms) + 2020-11-15T22:52:35.4134300Z <<< requireAccessToken + 2020-11-15T22:52:35.4134790Z ~~^~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:35.4135380Z [737/796] Compiling PointFree CollectionShow.swift + 2020-11-15T22:52:35.4136780Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Auth.swift:23:3: warning: expression took 406ms to type-check (limit: 200ms) + 2020-11-15T22:52:35.4137800Z <<< requireAccessToken + 2020-11-15T22:52:35.4138290Z ~~^~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:35.4138800Z [738/796] Compiling PointFree Debug.swift + 2020-11-15T22:52:35.4140130Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Auth.swift:23:3: warning: expression took 406ms to type-check (limit: 200ms) + 2020-11-15T22:52:35.4141060Z <<< requireAccessToken + 2020-11-15T22:52:35.4141550Z ~~^~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:35.4142130Z [739/796] Compiling PointFree AdminEmailReport.swift + 2020-11-15T22:52:35.4143590Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Auth.swift:23:3: warning: expression took 406ms to type-check (limit: 200ms) + 2020-11-15T22:52:35.4144520Z <<< requireAccessToken + 2020-11-15T22:52:35.4145010Z ~~^~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:35.4145690Z [740/796] Compiling PointFree ChangeEmailConfirmation.swift + 2020-11-15T22:52:35.4147530Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Auth.swift:23:3: warning: expression took 406ms to type-check (limit: 200ms) + 2020-11-15T22:52:35.4148510Z <<< requireAccessToken + 2020-11-15T22:52:35.4149010Z ~~^~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:35.4149570Z [741/796] Compiling PointFree EmailLayouts.swift + 2020-11-15T22:52:35.4150970Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Auth.swift:23:3: warning: expression took 406ms to type-check (limit: 200ms) + 2020-11-15T22:52:35.4151900Z <<< requireAccessToken + 2020-11-15T22:52:35.4152390Z ~~^~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:36.2881240Z [742/796] Compiling PointFree FreeEpisodeEmail.swift + 2020-11-15T22:52:36.2884740Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Episode/Show.swift:19:5: warning: expression took 230ms to type-check (limit: 200ms) + 2020-11-15T22:52:36.2885420Z <| writeStatus(.ok) + 2020-11-15T22:52:36.2885650Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:36.2886000Z [743/796] Compiling PointFree InviteEmail.swift + 2020-11-15T22:52:36.2887500Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Episode/Show.swift:19:5: warning: expression took 230ms to type-check (limit: 200ms) + 2020-11-15T22:52:36.2896200Z <| writeStatus(.ok) + 2020-11-15T22:52:36.2896690Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:36.2897160Z [744/796] Compiling PointFree NewBlogPostEmail.swift + 2020-11-15T22:52:36.2899840Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Episode/Show.swift:19:5: warning: expression took 230ms to type-check (limit: 200ms) + 2020-11-15T22:52:36.2900510Z <| writeStatus(.ok) + 2020-11-15T22:52:36.2900800Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:36.2901170Z [745/796] Compiling PointFree NewEpisodeEmail.swift + 2020-11-15T22:52:36.2902450Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Episode/Show.swift:19:5: warning: expression took 230ms to type-check (limit: 200ms) + 2020-11-15T22:52:36.2903090Z <| writeStatus(.ok) + 2020-11-15T22:52:36.2903330Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:36.2903670Z [746/796] Compiling PointFree ReferrerEmail.swift + 2020-11-15T22:52:36.2904850Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Episode/Show.swift:19:5: warning: expression took 230ms to type-check (limit: 200ms) + 2020-11-15T22:52:36.2905470Z <| writeStatus(.ok) + 2020-11-15T22:52:36.2905700Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:36.2906080Z [747/796] Compiling PointFree RegistrationEmail.swift + 2020-11-15T22:52:36.2907280Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Episode/Show.swift:19:5: warning: expression took 230ms to type-check (limit: 200ms) + 2020-11-15T22:52:36.2907920Z <| writeStatus(.ok) + 2020-11-15T22:52:36.2908150Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:36.2908460Z [748/796] Compiling PointFree SendEmail.swift + 2020-11-15T22:52:36.2909590Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Episode/Show.swift:19:5: warning: expression took 230ms to type-check (limit: 200ms) + 2020-11-15T22:52:36.2910230Z <| writeStatus(.ok) + 2020-11-15T22:52:36.2910450Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:36.2910880Z [749/796] Compiling PointFree SharedEmailComponents.swift + 2020-11-15T22:52:36.2912120Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Episode/Show.swift:19:5: warning: expression took 230ms to type-check (limit: 200ms) + 2020-11-15T22:52:36.2912750Z <| writeStatus(.ok) + 2020-11-15T22:52:36.2912980Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:36.2913300Z [750/796] Compiling PointFree TeamEmails.swift + 2020-11-15T22:52:36.2914430Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Episode/Show.swift:19:5: warning: expression took 230ms to type-check (limit: 200ms) + 2020-11-15T22:52:36.2915070Z <| writeStatus(.ok) + 2020-11-15T22:52:36.2915280Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:36.2915670Z [751/796] Compiling PointFree Enterprise.swift + 2020-11-15T22:52:36.2917200Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Episode/Show.swift:19:5: warning: expression took 230ms to type-check (limit: 200ms) + 2020-11-15T22:52:36.2917870Z <| writeStatus(.ok) + 2020-11-15T22:52:36.2918090Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:36.2918390Z [752/796] Compiling PointFree EnvVars.swift + 2020-11-15T22:52:36.2919550Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Episode/Show.swift:19:5: warning: expression took 230ms to type-check (limit: 200ms) + 2020-11-15T22:52:36.2920180Z <| writeStatus(.ok) + 2020-11-15T22:52:36.2920410Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:36.2920740Z [753/796] Compiling PointFree Environment.swift + 2020-11-15T22:52:36.2921860Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Episode/Show.swift:19:5: warning: expression took 230ms to type-check (limit: 200ms) + 2020-11-15T22:52:36.2922700Z <| writeStatus(.ok) + 2020-11-15T22:52:36.2922930Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:36.2923230Z [754/796] Compiling PointFree Episode.swift + 2020-11-15T22:52:36.2924380Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Episode/Show.swift:19:5: warning: expression took 230ms to type-check (limit: 200ms) + 2020-11-15T22:52:36.2925010Z <| writeStatus(.ok) + 2020-11-15T22:52:36.2925240Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:36.2925510Z [755/796] Compiling PointFree Show.swift + 2020-11-15T22:52:36.2926590Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Episode/Show.swift:19:5: warning: expression took 230ms to type-check (limit: 200ms) + 2020-11-15T22:52:36.2927420Z <| writeStatus(.ok) + 2020-11-15T22:52:36.2927650Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:36.2927980Z [756/796] Compiling PointFree FeatureFlags.swift + 2020-11-15T22:52:36.2929170Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Episode/Show.swift:19:5: warning: expression took 230ms to type-check (limit: 200ms) + 2020-11-15T22:52:36.2929810Z <| writeStatus(.ok) + 2020-11-15T22:52:36.2930040Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:36.2930400Z [757/796] Compiling PointFree GoogleAnalytics.swift + 2020-11-15T22:52:36.2931590Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Episode/Show.swift:19:5: warning: expression took 230ms to type-check (limit: 200ms) + 2020-11-15T22:52:36.2932210Z <| writeStatus(.ok) + 2020-11-15T22:52:36.2932440Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:36.2932710Z [758/796] Compiling PointFree Home.swift + 2020-11-15T22:52:36.2933800Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Episode/Show.swift:19:5: warning: expression took 230ms to type-check (limit: 200ms) + 2020-11-15T22:52:36.2934430Z <| writeStatus(.ok) + 2020-11-15T22:52:36.2934660Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2042370Z [759/796] Compiling PointFree About.swift + 2020-11-15T22:52:40.2044440Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/AccountMiddleware.swift:11:6: warning: global function 'accountMiddleware(conn:)' took 747ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2045720Z func accountMiddleware(conn: Conn>) + 2020-11-15T22:52:40.2046350Z ^ + 2020-11-15T22:52:40.2047440Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: closure took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2048510Z return { conn -> IO> in + 2020-11-15T22:52:40.2048830Z ^ + 2020-11-15T22:52:40.2049830Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: expression took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2050880Z return { conn -> IO> in + 2020-11-15T22:52:40.2051190Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2052310Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:116:14: warning: global function 'fetchSeatsTaken' took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2053100Z private func fetchSeatsTaken( + 2020-11-15T22:52:40.2053380Z ^ + 2020-11-15T22:52:40.2054140Z [760/796] Compiling PointFree Account.swift + 2020-11-15T22:52:40.2055590Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/AccountMiddleware.swift:11:6: warning: global function 'accountMiddleware(conn:)' took 747ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2056880Z func accountMiddleware(conn: Conn>) + 2020-11-15T22:52:40.2057490Z ^ + 2020-11-15T22:52:40.2058500Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: closure took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2059530Z return { conn -> IO> in + 2020-11-15T22:52:40.2060060Z ^ + 2020-11-15T22:52:40.2061100Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: expression took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2062150Z return { conn -> IO> in + 2020-11-15T22:52:40.2062480Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2063590Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:116:14: warning: global function 'fetchSeatsTaken' took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2064380Z private func fetchSeatsTaken( + 2020-11-15T22:52:40.2064660Z ^ + 2020-11-15T22:52:40.2065140Z [761/796] Compiling PointFree AccountMiddleware.swift + 2020-11-15T22:52:40.2066610Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/AccountMiddleware.swift:11:6: warning: global function 'accountMiddleware(conn:)' took 747ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2067860Z func accountMiddleware(conn: Conn>) + 2020-11-15T22:52:40.2068470Z ^ + 2020-11-15T22:52:40.2069460Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: closure took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2070500Z return { conn -> IO> in + 2020-11-15T22:52:40.2070810Z ^ + 2020-11-15T22:52:40.2071810Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: expression took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2072850Z return { conn -> IO> in + 2020-11-15T22:52:40.2073160Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2074260Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:116:14: warning: global function 'fetchSeatsTaken' took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2075060Z private func fetchSeatsTaken( + 2020-11-15T22:52:40.2075350Z ^ + 2020-11-15T22:52:40.2075640Z [762/796] Compiling PointFree Cancel.swift + 2020-11-15T22:52:40.2077080Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/AccountMiddleware.swift:11:6: warning: global function 'accountMiddleware(conn:)' took 747ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2078320Z func accountMiddleware(conn: Conn>) + 2020-11-15T22:52:40.2078930Z ^ + 2020-11-15T22:52:40.2079950Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: closure took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2080980Z return { conn -> IO> in + 2020-11-15T22:52:40.2081280Z ^ + 2020-11-15T22:52:40.2082270Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: expression took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2083320Z return { conn -> IO> in + 2020-11-15T22:52:40.2083650Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2084980Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:116:14: warning: global function 'fetchSeatsTaken' took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2085800Z private func fetchSeatsTaken( + 2020-11-15T22:52:40.2086080Z ^ + 2020-11-15T22:52:40.2086380Z [763/796] Compiling PointFree Change.swift + 2020-11-15T22:52:40.2087770Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/AccountMiddleware.swift:11:6: warning: global function 'accountMiddleware(conn:)' took 747ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2089010Z func accountMiddleware(conn: Conn>) + 2020-11-15T22:52:40.2089610Z ^ + 2020-11-15T22:52:40.2090590Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: closure took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2091850Z return { conn -> IO> in + 2020-11-15T22:52:40.2092160Z ^ + 2020-11-15T22:52:40.2093170Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: expression took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2094210Z return { conn -> IO> in + 2020-11-15T22:52:40.2094540Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2095640Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:116:14: warning: global function 'fetchSeatsTaken' took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2096430Z private func fetchSeatsTaken( + 2020-11-15T22:52:40.2096700Z ^ + 2020-11-15T22:52:40.2096990Z [764/796] Compiling PointFree Invite.swift + 2020-11-15T22:52:40.2098340Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/AccountMiddleware.swift:11:6: warning: global function 'accountMiddleware(conn:)' took 747ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2099590Z func accountMiddleware(conn: Conn>) + 2020-11-15T22:52:40.2100200Z ^ + 2020-11-15T22:52:40.2101200Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: closure took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2102230Z return { conn -> IO> in + 2020-11-15T22:52:40.2102550Z ^ + 2020-11-15T22:52:40.2103540Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: expression took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2104590Z return { conn -> IO> in + 2020-11-15T22:52:40.2104900Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2106010Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:116:14: warning: global function 'fetchSeatsTaken' took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2106800Z private func fetchSeatsTaken( + 2020-11-15T22:52:40.2107180Z ^ + 2020-11-15T22:52:40.2107480Z [765/796] Compiling PointFree Invoices.swift + 2020-11-15T22:52:40.2108880Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/AccountMiddleware.swift:11:6: warning: global function 'accountMiddleware(conn:)' took 747ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2110120Z func accountMiddleware(conn: Conn>) + 2020-11-15T22:52:40.2110730Z ^ + 2020-11-15T22:52:40.2111720Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: closure took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2113320Z return { conn -> IO> in + 2020-11-15T22:52:40.2113630Z ^ + 2020-11-15T22:52:40.2114630Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: expression took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2115680Z return { conn -> IO> in + 2020-11-15T22:52:40.2116550Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2117760Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:116:14: warning: global function 'fetchSeatsTaken' took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2118550Z private func fetchSeatsTaken( + 2020-11-15T22:52:40.2118830Z ^ + 2020-11-15T22:52:40.2119160Z [766/796] Compiling PointFree PaymentInfo.swift + 2020-11-15T22:52:40.2120560Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/AccountMiddleware.swift:11:6: warning: global function 'accountMiddleware(conn:)' took 747ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2121800Z func accountMiddleware(conn: Conn>) + 2020-11-15T22:52:40.2122590Z ^ + 2020-11-15T22:52:40.2123610Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: closure took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2124660Z return { conn -> IO> in + 2020-11-15T22:52:40.2124970Z ^ + 2020-11-15T22:52:40.2125970Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: expression took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2127010Z return { conn -> IO> in + 2020-11-15T22:52:40.2127340Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2128440Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:116:14: warning: global function 'fetchSeatsTaken' took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2129230Z private func fetchSeatsTaken( + 2020-11-15T22:52:40.2129510Z ^ + 2020-11-15T22:52:40.2129810Z [767/796] Compiling PointFree PrivateRss.swift + 2020-11-15T22:52:40.2131190Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/AccountMiddleware.swift:11:6: warning: global function 'accountMiddleware(conn:)' took 747ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2132450Z func accountMiddleware(conn: Conn>) + 2020-11-15T22:52:40.2133060Z ^ + 2020-11-15T22:52:40.2134040Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: closure took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2135070Z return { conn -> IO> in + 2020-11-15T22:52:40.2135390Z ^ + 2020-11-15T22:52:40.2136380Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: expression took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2137540Z return { conn -> IO> in + 2020-11-15T22:52:40.2137870Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2138960Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:116:14: warning: global function 'fetchSeatsTaken' took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2139750Z private func fetchSeatsTaken( + 2020-11-15T22:52:40.2140040Z ^ + 2020-11-15T22:52:40.2140320Z [768/796] Compiling PointFree Team.swift + 2020-11-15T22:52:40.2141650Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/AccountMiddleware.swift:11:6: warning: global function 'accountMiddleware(conn:)' took 747ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2142990Z func accountMiddleware(conn: Conn>) + 2020-11-15T22:52:40.2143600Z ^ + 2020-11-15T22:52:40.2144610Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: closure took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2145650Z return { conn -> IO> in + 2020-11-15T22:52:40.2145970Z ^ + 2020-11-15T22:52:40.2147200Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: expression took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2148340Z return { conn -> IO> in + 2020-11-15T22:52:40.2148660Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2149770Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:116:14: warning: global function 'fetchSeatsTaken' took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2150550Z private func fetchSeatsTaken( + 2020-11-15T22:52:40.2150840Z ^ + 2020-11-15T22:52:40.2151180Z [769/796] Compiling PointFree UpdateProfile.swift + 2020-11-15T22:52:40.2152590Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/AccountMiddleware.swift:11:6: warning: global function 'accountMiddleware(conn:)' took 747ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2154010Z func accountMiddleware(conn: Conn>) + 2020-11-15T22:52:40.2154620Z ^ + 2020-11-15T22:52:40.2155650Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: closure took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2156680Z return { conn -> IO> in + 2020-11-15T22:52:40.2156990Z ^ + 2020-11-15T22:52:40.2157980Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: expression took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2159020Z return { conn -> IO> in + 2020-11-15T22:52:40.2159350Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2160450Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:116:14: warning: global function 'fetchSeatsTaken' took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2161240Z private func fetchSeatsTaken( + 2020-11-15T22:52:40.2161530Z ^ + 2020-11-15T22:52:40.2161890Z [770/796] Compiling PointFree AdminMiddleware.swift + 2020-11-15T22:52:40.2163320Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/AccountMiddleware.swift:11:6: warning: global function 'accountMiddleware(conn:)' took 747ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2164560Z func accountMiddleware(conn: Conn>) + 2020-11-15T22:52:40.2165160Z ^ + 2020-11-15T22:52:40.2166140Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: closure took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2167180Z return { conn -> IO> in + 2020-11-15T22:52:40.2167500Z ^ + 2020-11-15T22:52:40.2168500Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: expression took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2169540Z return { conn -> IO> in + 2020-11-15T22:52:40.2169860Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2170970Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:116:14: warning: global function 'fetchSeatsTaken' took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2171750Z private func fetchSeatsTaken( + 2020-11-15T22:52:40.2172030Z ^ + 2020-11-15T22:52:40.2172370Z [771/796] Compiling PointFree EpisodeCredit.swift + 2020-11-15T22:52:40.2173790Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/AccountMiddleware.swift:11:6: warning: global function 'accountMiddleware(conn:)' took 747ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2175030Z func accountMiddleware(conn: Conn>) + 2020-11-15T22:52:40.2175650Z ^ + 2020-11-15T22:52:40.2176640Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: closure took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2177940Z return { conn -> IO> in + 2020-11-15T22:52:40.2178280Z ^ + 2020-11-15T22:52:40.2179320Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: expression took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2180370Z return { conn -> IO> in + 2020-11-15T22:52:40.2180690Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2181790Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:116:14: warning: global function 'fetchSeatsTaken' took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2182580Z private func fetchSeatsTaken( + 2020-11-15T22:52:40.2183050Z ^ + 2020-11-15T22:52:40.2183390Z [772/796] Compiling PointFree FreeEpisodes.swift + 2020-11-15T22:52:40.2184830Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/AccountMiddleware.swift:11:6: warning: global function 'accountMiddleware(conn:)' took 747ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2186070Z func accountMiddleware(conn: Conn>) + 2020-11-15T22:52:40.2186680Z ^ + 2020-11-15T22:52:40.2187670Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: closure took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2188700Z return { conn -> IO> in + 2020-11-15T22:52:40.2189000Z ^ + 2020-11-15T22:52:40.2189990Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: expression took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2191050Z return { conn -> IO> in + 2020-11-15T22:52:40.2191370Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2192470Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:116:14: warning: global function 'fetchSeatsTaken' took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2193270Z private func fetchSeatsTaken( + 2020-11-15T22:52:40.2193550Z ^ + 2020-11-15T22:52:40.2193830Z [773/796] Compiling PointFree Ghost.swift + 2020-11-15T22:52:40.2195180Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/AccountMiddleware.swift:11:6: warning: global function 'accountMiddleware(conn:)' took 747ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2196420Z func accountMiddleware(conn: Conn>) + 2020-11-15T22:52:40.2197020Z ^ + 2020-11-15T22:52:40.2198000Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: closure took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2199040Z return { conn -> IO> in + 2020-11-15T22:52:40.2199360Z ^ + 2020-11-15T22:52:40.2200350Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: expression took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2201400Z return { conn -> IO> in + 2020-11-15T22:52:40.2201720Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2202830Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:116:14: warning: global function 'fetchSeatsTaken' took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2203610Z private func fetchSeatsTaken( + 2020-11-15T22:52:40.2203880Z ^ + 2020-11-15T22:52:40.2204160Z [774/796] Compiling PointFree Index.swift + 2020-11-15T22:52:40.2205510Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/AccountMiddleware.swift:11:6: warning: global function 'accountMiddleware(conn:)' took 747ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2206760Z func accountMiddleware(conn: Conn>) + 2020-11-15T22:52:40.2207500Z ^ + 2020-11-15T22:52:40.2208730Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: closure took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2209830Z return { conn -> IO> in + 2020-11-15T22:52:40.2210140Z ^ + 2020-11-15T22:52:40.2211140Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: expression took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2212190Z return { conn -> IO> in + 2020-11-15T22:52:40.2212500Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2213610Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:116:14: warning: global function 'fetchSeatsTaken' took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2214570Z private func fetchSeatsTaken( + 2020-11-15T22:52:40.2214860Z ^ + 2020-11-15T22:52:40.2215180Z [775/796] Compiling PointFree NewEpisodes.swift + 2020-11-15T22:52:40.2216620Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/AccountMiddleware.swift:11:6: warning: global function 'accountMiddleware(conn:)' took 747ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2217860Z func accountMiddleware(conn: Conn>) + 2020-11-15T22:52:40.2218470Z ^ + 2020-11-15T22:52:40.2219450Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: closure took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2220480Z return { conn -> IO> in + 2020-11-15T22:52:40.2220780Z ^ + 2020-11-15T22:52:40.2221780Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: expression took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2222830Z return { conn -> IO> in + 2020-11-15T22:52:40.2223160Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2224260Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:116:14: warning: global function 'fetchSeatsTaken' took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2225060Z private func fetchSeatsTaken( + 2020-11-15T22:52:40.2225340Z ^ + 2020-11-15T22:52:40.2225770Z [776/796] Compiling PointFree SendNewBlogPostMailer.swift + 2020-11-15T22:52:40.2227270Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/AccountMiddleware.swift:11:6: warning: global function 'accountMiddleware(conn:)' took 747ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2228510Z func accountMiddleware(conn: Conn>) + 2020-11-15T22:52:40.2229110Z ^ + 2020-11-15T22:52:40.2230100Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: closure took 211ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2231130Z return { conn -> IO> in + 2020-11-15T22:52:40.2231450Z ^ + 2020-11-15T22:52:40.2232440Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:121:12: warning: expression took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2233490Z return { conn -> IO> in + 2020-11-15T22:52:40.2233820Z ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:40.2234920Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/Account/Change.swift:116:14: warning: global function 'fetchSeatsTaken' took 212ms to type-check (limit: 200ms) + 2020-11-15T22:52:40.2235710Z private func fetchSeatsTaken( + 2020-11-15T22:52:40.2236000Z ^ + 2020-11-15T22:52:42.2478170Z [777/796] Compiling PointFree Host.swift + 2020-11-15T22:52:42.2486850Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/HtmlCssInliner.swift:19:14: warning: global function 'applyInlineStyles(tag:attribs:child:stylesheet:)' took 232ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2488560Z private func applyInlineStyles( + 2020-11-15T22:52:42.2489210Z ^ + 2020-11-15T22:52:42.2490750Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:58:52: warning: immutable value 'sectionSlug' was never used; consider replacing with '_' or removing it + 2020-11-15T22:52:42.2492080Z case let .collections(.episode(collectionSlug, sectionSlug, episodeParam)): + 2020-11-15T22:52:42.2492780Z ^~~~~~~~~~~ + 2020-11-15T22:52:42.2493200Z _ + 2020-11-15T22:52:42.2494610Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:23:14: warning: global function 'render(conn:)' took 574ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2496500Z private func render(conn: Conn>) + 2020-11-15T22:52:42.2497260Z ^ + 2020-11-15T22:52:42.2498500Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:16:5: warning: expression took 4085ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2499270Z <| writeStatus(.ok) + 2020-11-15T22:52:42.2499500Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2500640Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:223:12: warning: expression took 239ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2501380Z .flatMap( + 2020-11-15T22:52:42.2501580Z ~~~~~~~~~~~^~~~~~~~ + 2020-11-15T22:52:42.2502690Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:203:14: warning: closure took 242ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2503440Z return { conn in + 2020-11-15T22:52:42.2503630Z ^ + 2020-11-15T22:52:42.2504760Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:202:12: warning: expression took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2505540Z return { middleware in + 2020-11-15T22:52:42.2505790Z ^~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2507140Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:196:6: warning: global function 'redirectActiveSubscribers(user:)' took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2508240Z func redirectActiveSubscribers( + 2020-11-15T22:52:42.2508600Z ^ + 2020-11-15T22:52:42.2508950Z [778/796] Compiling PointFree HtmlCssInliner.swift + 2020-11-15T22:52:42.2510410Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/HtmlCssInliner.swift:19:14: warning: global function 'applyInlineStyles(tag:attribs:child:stylesheet:)' took 232ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2511350Z private func applyInlineStyles( + 2020-11-15T22:52:42.2511650Z ^ + 2020-11-15T22:52:42.2512850Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:58:52: warning: immutable value 'sectionSlug' was never used; consider replacing with '_' or removing it + 2020-11-15T22:52:42.2513880Z case let .collections(.episode(collectionSlug, sectionSlug, episodeParam)): + 2020-11-15T22:52:42.2514330Z ^~~~~~~~~~~ + 2020-11-15T22:52:42.2514540Z _ + 2020-11-15T22:52:42.2515650Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:23:14: warning: global function 'render(conn:)' took 574ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2516710Z private func render(conn: Conn>) + 2020-11-15T22:52:42.2517270Z ^ + 2020-11-15T22:52:42.2518410Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:16:5: warning: expression took 4085ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2519170Z <| writeStatus(.ok) + 2020-11-15T22:52:42.2519390Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2520820Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:223:12: warning: expression took 239ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2521590Z .flatMap( + 2020-11-15T22:52:42.2521790Z ~~~~~~~~~~~^~~~~~~~ + 2020-11-15T22:52:42.2522940Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:203:14: warning: closure took 242ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2523670Z return { conn in + 2020-11-15T22:52:42.2523880Z ^ + 2020-11-15T22:52:42.2525010Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:202:12: warning: expression took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2525970Z return { middleware in + 2020-11-15T22:52:42.2526200Z ^~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2527670Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:196:6: warning: global function 'redirectActiveSubscribers(user:)' took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2528780Z func redirectActiveSubscribers( + 2020-11-15T22:52:42.2529130Z ^ + 2020-11-15T22:52:42.2529450Z [779/796] Compiling PointFree MetaLayout.swift + 2020-11-15T22:52:42.2530890Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/HtmlCssInliner.swift:19:14: warning: global function 'applyInlineStyles(tag:attribs:child:stylesheet:)' took 232ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2531830Z private func applyInlineStyles( + 2020-11-15T22:52:42.2532130Z ^ + 2020-11-15T22:52:42.2533320Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:58:52: warning: immutable value 'sectionSlug' was never used; consider replacing with '_' or removing it + 2020-11-15T22:52:42.2534350Z case let .collections(.episode(collectionSlug, sectionSlug, episodeParam)): + 2020-11-15T22:52:42.2534790Z ^~~~~~~~~~~ + 2020-11-15T22:52:42.2534990Z _ + 2020-11-15T22:52:42.2536110Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:23:14: warning: global function 'render(conn:)' took 574ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2537180Z private func render(conn: Conn>) + 2020-11-15T22:52:42.2537740Z ^ + 2020-11-15T22:52:42.2538870Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:16:5: warning: expression took 4085ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2539630Z <| writeStatus(.ok) + 2020-11-15T22:52:42.2539860Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2541000Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:223:12: warning: expression took 239ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2541730Z .flatMap( + 2020-11-15T22:52:42.2541920Z ~~~~~~~~~~~^~~~~~~~ + 2020-11-15T22:52:42.2543030Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:203:14: warning: closure took 242ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2543760Z return { conn in + 2020-11-15T22:52:42.2543970Z ^ + 2020-11-15T22:52:42.2545100Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:202:12: warning: expression took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2545870Z return { middleware in + 2020-11-15T22:52:42.2546110Z ^~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2547540Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:196:6: warning: global function 'redirectActiveSubscribers(user:)' took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2548640Z func redirectActiveSubscribers( + 2020-11-15T22:52:42.2548990Z ^ + 2020-11-15T22:52:42.2549310Z [780/796] Compiling PointFree Newsletters.swift + 2020-11-15T22:52:42.2550920Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/HtmlCssInliner.swift:19:14: warning: global function 'applyInlineStyles(tag:attribs:child:stylesheet:)' took 232ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2551900Z private func applyInlineStyles( + 2020-11-15T22:52:42.2552190Z ^ + 2020-11-15T22:52:42.2553430Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:58:52: warning: immutable value 'sectionSlug' was never used; consider replacing with '_' or removing it + 2020-11-15T22:52:42.2554450Z case let .collections(.episode(collectionSlug, sectionSlug, episodeParam)): + 2020-11-15T22:52:42.2554900Z ^~~~~~~~~~~ + 2020-11-15T22:52:42.2555280Z _ + 2020-11-15T22:52:42.2556440Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:23:14: warning: global function 'render(conn:)' took 574ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2557500Z private func render(conn: Conn>) + 2020-11-15T22:52:42.2558060Z ^ + 2020-11-15T22:52:42.2559200Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:16:5: warning: expression took 4085ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2559970Z <| writeStatus(.ok) + 2020-11-15T22:52:42.2560190Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2561320Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:223:12: warning: expression took 239ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2562050Z .flatMap( + 2020-11-15T22:52:42.2562250Z ~~~~~~~~~~~^~~~~~~~ + 2020-11-15T22:52:42.2563370Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:203:14: warning: closure took 242ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2564090Z return { conn in + 2020-11-15T22:52:42.2564300Z ^ + 2020-11-15T22:52:42.2565420Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:202:12: warning: expression took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2566200Z return { middleware in + 2020-11-15T22:52:42.2566440Z ^~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2567800Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:196:6: warning: global function 'redirectActiveSubscribers(user:)' took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2568880Z func redirectActiveSubscribers( + 2020-11-15T22:52:42.2569240Z ^ + 2020-11-15T22:52:42.2569550Z [781/796] Compiling PointFree PageLayout.swift + 2020-11-15T22:52:42.2571260Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/HtmlCssInliner.swift:19:14: warning: global function 'applyInlineStyles(tag:attribs:child:stylesheet:)' took 232ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2572210Z private func applyInlineStyles( + 2020-11-15T22:52:42.2572500Z ^ + 2020-11-15T22:52:42.2573700Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:58:52: warning: immutable value 'sectionSlug' was never used; consider replacing with '_' or removing it + 2020-11-15T22:52:42.2574730Z case let .collections(.episode(collectionSlug, sectionSlug, episodeParam)): + 2020-11-15T22:52:42.2575180Z ^~~~~~~~~~~ + 2020-11-15T22:52:42.2575380Z _ + 2020-11-15T22:52:42.2576500Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:23:14: warning: global function 'render(conn:)' took 574ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2577650Z private func render(conn: Conn>) + 2020-11-15T22:52:42.2578210Z ^ + 2020-11-15T22:52:42.2579370Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:16:5: warning: expression took 4085ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2580140Z <| writeStatus(.ok) + 2020-11-15T22:52:42.2580570Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2581770Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:223:12: warning: expression took 239ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2582520Z .flatMap( + 2020-11-15T22:52:42.2582710Z ~~~~~~~~~~~^~~~~~~~ + 2020-11-15T22:52:42.2583820Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:203:14: warning: closure took 242ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2584560Z return { conn in + 2020-11-15T22:52:42.2584760Z ^ + 2020-11-15T22:52:42.2585890Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:202:12: warning: expression took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2587050Z return { middleware in + 2020-11-15T22:52:42.2587280Z ^~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2588690Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:196:6: warning: global function 'redirectActiveSubscribers(user:)' took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2589780Z func redirectActiveSubscribers( + 2020-11-15T22:52:42.2590140Z ^ + 2020-11-15T22:52:42.2590490Z [782/796] Compiling PointFree PricingLanding.swift + 2020-11-15T22:52:42.2591940Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/HtmlCssInliner.swift:19:14: warning: global function 'applyInlineStyles(tag:attribs:child:stylesheet:)' took 232ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2592880Z private func applyInlineStyles( + 2020-11-15T22:52:42.2593180Z ^ + 2020-11-15T22:52:42.2594380Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:58:52: warning: immutable value 'sectionSlug' was never used; consider replacing with '_' or removing it + 2020-11-15T22:52:42.2595400Z case let .collections(.episode(collectionSlug, sectionSlug, episodeParam)): + 2020-11-15T22:52:42.2595990Z ^~~~~~~~~~~ + 2020-11-15T22:52:42.2596190Z _ + 2020-11-15T22:52:42.2597330Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:23:14: warning: global function 'render(conn:)' took 574ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2598630Z private func render(conn: Conn>) + 2020-11-15T22:52:42.2599200Z ^ + 2020-11-15T22:52:42.2600380Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:16:5: warning: expression took 4085ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2601160Z <| writeStatus(.ok) + 2020-11-15T22:52:42.2601390Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2602520Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:223:12: warning: expression took 239ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2603260Z .flatMap( + 2020-11-15T22:52:42.2603450Z ~~~~~~~~~~~^~~~~~~~ + 2020-11-15T22:52:42.2604740Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:203:14: warning: closure took 242ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2605480Z return { conn in + 2020-11-15T22:52:42.2605680Z ^ + 2020-11-15T22:52:42.2606850Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:202:12: warning: expression took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2607620Z return { middleware in + 2020-11-15T22:52:42.2607850Z ^~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2609220Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:196:6: warning: global function 'redirectActiveSubscribers(user:)' took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2610310Z func redirectActiveSubscribers( + 2020-11-15T22:52:42.2610650Z ^ + 2020-11-15T22:52:42.2610940Z [783/796] Compiling PointFree Privacy.swift + 2020-11-15T22:52:42.2612500Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/HtmlCssInliner.swift:19:14: warning: global function 'applyInlineStyles(tag:attribs:child:stylesheet:)' took 232ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2613480Z private func applyInlineStyles( + 2020-11-15T22:52:42.2613780Z ^ + 2020-11-15T22:52:42.2615010Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:58:52: warning: immutable value 'sectionSlug' was never used; consider replacing with '_' or removing it + 2020-11-15T22:52:42.2616030Z case let .collections(.episode(collectionSlug, sectionSlug, episodeParam)): + 2020-11-15T22:52:42.2616660Z ^~~~~~~~~~~ + 2020-11-15T22:52:42.2616860Z _ + 2020-11-15T22:52:42.2618020Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:23:14: warning: global function 'render(conn:)' took 574ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2619080Z private func render(conn: Conn>) + 2020-11-15T22:52:42.2619650Z ^ + 2020-11-15T22:52:42.2621130Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:16:5: warning: expression took 4085ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2621960Z <| writeStatus(.ok) + 2020-11-15T22:52:42.2622190Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2623560Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:223:12: warning: expression took 239ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2624320Z .flatMap( + 2020-11-15T22:52:42.2624820Z ~~~~~~~~~~~^~~~~~~~ + 2020-11-15T22:52:42.2626040Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:203:14: warning: closure took 242ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2626760Z return { conn in + 2020-11-15T22:52:42.2626980Z ^ + 2020-11-15T22:52:42.2628130Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:202:12: warning: expression took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2628910Z return { middleware in + 2020-11-15T22:52:42.2629150Z ^~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2630810Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:196:6: warning: global function 'redirectActiveSubscribers(user:)' took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2631930Z func redirectActiveSubscribers( + 2020-11-15T22:52:42.2632280Z ^ + 2020-11-15T22:52:42.2632750Z [784/796] Compiling PointFree RouteNotFoundMiddleware.swift + 2020-11-15T22:52:42.2634590Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/HtmlCssInliner.swift:19:14: warning: global function 'applyInlineStyles(tag:attribs:child:stylesheet:)' took 232ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2635560Z private func applyInlineStyles( + 2020-11-15T22:52:42.2635860Z ^ + 2020-11-15T22:52:42.2637130Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:58:52: warning: immutable value 'sectionSlug' was never used; consider replacing with '_' or removing it + 2020-11-15T22:52:42.2638410Z case let .collections(.episode(collectionSlug, sectionSlug, episodeParam)): + 2020-11-15T22:52:42.2638860Z ^~~~~~~~~~~ + 2020-11-15T22:52:42.2639060Z _ + 2020-11-15T22:52:42.2640240Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:23:14: warning: global function 'render(conn:)' took 574ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2641320Z private func render(conn: Conn>) + 2020-11-15T22:52:42.2641870Z ^ + 2020-11-15T22:52:42.2643250Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:16:5: warning: expression took 4085ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2644030Z <| writeStatus(.ok) + 2020-11-15T22:52:42.2644270Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2645450Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:223:12: warning: expression took 239ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2646190Z .flatMap( + 2020-11-15T22:52:42.2646390Z ~~~~~~~~~~~^~~~~~~~ + 2020-11-15T22:52:42.2647620Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:203:14: warning: closure took 242ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2648560Z return { conn in + 2020-11-15T22:52:42.2648760Z ^ + 2020-11-15T22:52:42.2650200Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:202:12: warning: expression took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2650970Z return { middleware in + 2020-11-15T22:52:42.2651220Z ^~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2652870Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:196:6: warning: global function 'redirectActiveSubscribers(user:)' took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2653980Z func redirectActiveSubscribers( + 2020-11-15T22:52:42.2654330Z ^ + 2020-11-15T22:52:42.2654800Z [785/796] Compiling PointFree ValidateEnterpriseEmails.swift + 2020-11-15T22:52:42.2656380Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/HtmlCssInliner.swift:19:14: warning: global function 'applyInlineStyles(tag:attribs:child:stylesheet:)' took 232ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2657340Z private func applyInlineStyles( + 2020-11-15T22:52:42.2657630Z ^ + 2020-11-15T22:52:42.2658850Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:58:52: warning: immutable value 'sectionSlug' was never used; consider replacing with '_' or removing it + 2020-11-15T22:52:42.2660120Z case let .collections(.episode(collectionSlug, sectionSlug, episodeParam)): + 2020-11-15T22:52:42.2660610Z ^~~~~~~~~~~ + 2020-11-15T22:52:42.2660810Z _ + 2020-11-15T22:52:42.2661990Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:23:14: warning: global function 'render(conn:)' took 574ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2663060Z private func render(conn: Conn>) + 2020-11-15T22:52:42.2663620Z ^ + 2020-11-15T22:52:42.2664770Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:16:5: warning: expression took 4085ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2665530Z <| writeStatus(.ok) + 2020-11-15T22:52:42.2666000Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2667230Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:223:12: warning: expression took 239ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2667960Z .flatMap( + 2020-11-15T22:52:42.2668160Z ~~~~~~~~~~~^~~~~~~~ + 2020-11-15T22:52:42.2669270Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:203:14: warning: closure took 242ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2670010Z return { conn in + 2020-11-15T22:52:42.2670220Z ^ + 2020-11-15T22:52:42.2671360Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:202:12: warning: expression took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2672140Z return { middleware in + 2020-11-15T22:52:42.2672370Z ^~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2673740Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:196:6: warning: global function 'redirectActiveSubscribers(user:)' took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2675080Z func redirectActiveSubscribers( + 2020-11-15T22:52:42.2675460Z ^ + 2020-11-15T22:52:42.2675810Z [786/796] Compiling PointFree WelcomeEmails.swift + 2020-11-15T22:52:42.2677300Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/HtmlCssInliner.swift:19:14: warning: global function 'applyInlineStyles(tag:attribs:child:stylesheet:)' took 232ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2678250Z private func applyInlineStyles( + 2020-11-15T22:52:42.2678550Z ^ + 2020-11-15T22:52:42.2679760Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:58:52: warning: immutable value 'sectionSlug' was never used; consider replacing with '_' or removing it + 2020-11-15T22:52:42.2681350Z case let .collections(.episode(collectionSlug, sectionSlug, episodeParam)): + 2020-11-15T22:52:42.2681830Z ^~~~~~~~~~~ + 2020-11-15T22:52:42.2682030Z _ + 2020-11-15T22:52:42.2683220Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:23:14: warning: global function 'render(conn:)' took 574ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2684290Z private func render(conn: Conn>) + 2020-11-15T22:52:42.2684930Z ^ + 2020-11-15T22:52:42.2686090Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:16:5: warning: expression took 4085ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2686860Z <| writeStatus(.ok) + 2020-11-15T22:52:42.2687090Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2688240Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:223:12: warning: expression took 239ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2688980Z .flatMap( + 2020-11-15T22:52:42.2689170Z ~~~~~~~~~~~^~~~~~~~ + 2020-11-15T22:52:42.2690300Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:203:14: warning: closure took 242ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2691020Z return { conn in + 2020-11-15T22:52:42.2691220Z ^ + 2020-11-15T22:52:42.2692360Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:202:12: warning: expression took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2693140Z return { middleware in + 2020-11-15T22:52:42.2693370Z ^~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2694740Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:196:6: warning: global function 'redirectActiveSubscribers(user:)' took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2695830Z func redirectActiveSubscribers( + 2020-11-15T22:52:42.2696190Z ^ + 2020-11-15T22:52:42.2696480Z [787/796] Compiling PointFree Session.swift + 2020-11-15T22:52:42.2697880Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/HtmlCssInliner.swift:19:14: warning: global function 'applyInlineStyles(tag:attribs:child:stylesheet:)' took 232ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2698940Z private func applyInlineStyles( + 2020-11-15T22:52:42.2699240Z ^ + 2020-11-15T22:52:42.2700470Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:58:52: warning: immutable value 'sectionSlug' was never used; consider replacing with '_' or removing it + 2020-11-15T22:52:42.2701500Z case let .collections(.episode(collectionSlug, sectionSlug, episodeParam)): + 2020-11-15T22:52:42.2701950Z ^~~~~~~~~~~ + 2020-11-15T22:52:42.2702150Z _ + 2020-11-15T22:52:42.2703290Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:23:14: warning: global function 'render(conn:)' took 574ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2704350Z private func render(conn: Conn>) + 2020-11-15T22:52:42.2705140Z ^ + 2020-11-15T22:52:42.2706360Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:16:5: warning: expression took 4085ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2707280Z <| writeStatus(.ok) + 2020-11-15T22:52:42.2707510Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2708690Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:223:12: warning: expression took 239ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2709430Z .flatMap( + 2020-11-15T22:52:42.2709630Z ~~~~~~~~~~~^~~~~~~~ + 2020-11-15T22:52:42.2710990Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:203:14: warning: closure took 242ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2711730Z return { conn in + 2020-11-15T22:52:42.2711930Z ^ + 2020-11-15T22:52:42.2713080Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:202:12: warning: expression took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2713840Z return { middleware in + 2020-11-15T22:52:42.2714080Z ^~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2715440Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:196:6: warning: global function 'redirectActiveSubscribers(user:)' took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2716540Z func redirectActiveSubscribers( + 2020-11-15T22:52:42.2716900Z ^ + 2020-11-15T22:52:42.2717250Z [788/796] Compiling PointFree SiteMiddleware.swift + 2020-11-15T22:52:42.2718700Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/HtmlCssInliner.swift:19:14: warning: global function 'applyInlineStyles(tag:attribs:child:stylesheet:)' took 232ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2719660Z private func applyInlineStyles( + 2020-11-15T22:52:42.2719950Z ^ + 2020-11-15T22:52:42.2721150Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:58:52: warning: immutable value 'sectionSlug' was never used; consider replacing with '_' or removing it + 2020-11-15T22:52:42.2722170Z case let .collections(.episode(collectionSlug, sectionSlug, episodeParam)): + 2020-11-15T22:52:42.2722620Z ^~~~~~~~~~~ + 2020-11-15T22:52:42.2722820Z _ + 2020-11-15T22:52:42.2723940Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:23:14: warning: global function 'render(conn:)' took 574ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2725010Z private func render(conn: Conn>) + 2020-11-15T22:52:42.2725580Z ^ + 2020-11-15T22:52:42.2726720Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:16:5: warning: expression took 4085ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2727490Z <| writeStatus(.ok) + 2020-11-15T22:52:42.2727720Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2728850Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:223:12: warning: expression took 239ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2729600Z .flatMap( + 2020-11-15T22:52:42.2729800Z ~~~~~~~~~~~^~~~~~~~ + 2020-11-15T22:52:42.2730910Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:203:14: warning: closure took 242ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2731650Z return { conn in + 2020-11-15T22:52:42.2731860Z ^ + 2020-11-15T22:52:42.2732990Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:202:12: warning: expression took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2733770Z return { middleware in + 2020-11-15T22:52:42.2734010Z ^~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2735540Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:196:6: warning: global function 'redirectActiveSubscribers(user:)' took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2736650Z func redirectActiveSubscribers( + 2020-11-15T22:52:42.2737090Z ^ + 2020-11-15T22:52:42.2737450Z [789/796] Compiling PointFree StripeWebhooks.swift + 2020-11-15T22:52:42.2738960Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/HtmlCssInliner.swift:19:14: warning: global function 'applyInlineStyles(tag:attribs:child:stylesheet:)' took 232ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2739910Z private func applyInlineStyles( + 2020-11-15T22:52:42.2740200Z ^ + 2020-11-15T22:52:42.2741630Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:58:52: warning: immutable value 'sectionSlug' was never used; consider replacing with '_' or removing it + 2020-11-15T22:52:42.2742660Z case let .collections(.episode(collectionSlug, sectionSlug, episodeParam)): + 2020-11-15T22:52:42.2743110Z ^~~~~~~~~~~ + 2020-11-15T22:52:42.2743320Z _ + 2020-11-15T22:52:42.2744430Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:23:14: warning: global function 'render(conn:)' took 574ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2745500Z private func render(conn: Conn>) + 2020-11-15T22:52:42.2746050Z ^ + 2020-11-15T22:52:42.2747520Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:16:5: warning: expression took 4085ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2748320Z <| writeStatus(.ok) + 2020-11-15T22:52:42.2748540Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2749740Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:223:12: warning: expression took 239ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2750480Z .flatMap( + 2020-11-15T22:52:42.2750680Z ~~~~~~~~~~~^~~~~~~~ + 2020-11-15T22:52:42.2751990Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:203:14: warning: closure took 242ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2752740Z return { conn in + 2020-11-15T22:52:42.2752950Z ^ + 2020-11-15T22:52:42.2754130Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:202:12: warning: expression took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2754910Z return { middleware in + 2020-11-15T22:52:42.2755150Z ^~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2756520Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:196:6: warning: global function 'redirectActiveSubscribers(user:)' took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2757620Z func redirectActiveSubscribers( + 2020-11-15T22:52:42.2757970Z ^ + 2020-11-15T22:52:42.2758270Z [790/796] Compiling PointFree Subscribe.swift + 2020-11-15T22:52:42.2759690Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/HtmlCssInliner.swift:19:14: warning: global function 'applyInlineStyles(tag:attribs:child:stylesheet:)' took 232ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2760640Z private func applyInlineStyles( + 2020-11-15T22:52:42.2760940Z ^ + 2020-11-15T22:52:42.2762150Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:58:52: warning: immutable value 'sectionSlug' was never used; consider replacing with '_' or removing it + 2020-11-15T22:52:42.2763180Z case let .collections(.episode(collectionSlug, sectionSlug, episodeParam)): + 2020-11-15T22:52:42.2763640Z ^~~~~~~~~~~ + 2020-11-15T22:52:42.2763840Z _ + 2020-11-15T22:52:42.2764970Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:23:14: warning: global function 'render(conn:)' took 574ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2766210Z private func render(conn: Conn>) + 2020-11-15T22:52:42.2766800Z ^ + 2020-11-15T22:52:42.2767970Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:16:5: warning: expression took 4085ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2768740Z <| writeStatus(.ok) + 2020-11-15T22:52:42.2768970Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2770100Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:223:12: warning: expression took 239ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2771030Z .flatMap( + 2020-11-15T22:52:42.2771230Z ~~~~~~~~~~~^~~~~~~~ + 2020-11-15T22:52:42.2772390Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:203:14: warning: closure took 242ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2773120Z return { conn in + 2020-11-15T22:52:42.2773330Z ^ + 2020-11-15T22:52:42.2774460Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:202:12: warning: expression took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2775240Z return { middleware in + 2020-11-15T22:52:42.2775480Z ^~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2776830Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:196:6: warning: global function 'redirectActiveSubscribers(user:)' took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2777990Z func redirectActiveSubscribers( + 2020-11-15T22:52:42.2778350Z ^ + 2020-11-15T22:52:42.2778780Z [791/796] Compiling PointFree SubscribeConfirmation.swift + 2020-11-15T22:52:42.2780340Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/HtmlCssInliner.swift:19:14: warning: global function 'applyInlineStyles(tag:attribs:child:stylesheet:)' took 232ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2781290Z private func applyInlineStyles( + 2020-11-15T22:52:42.2781990Z ^ + 2020-11-15T22:52:42.2784500Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:58:52: warning: immutable value 'sectionSlug' was never used; consider replacing with '_' or removing it + 2020-11-15T22:52:42.2785570Z case let .collections(.episode(collectionSlug, sectionSlug, episodeParam)): + 2020-11-15T22:52:42.2786030Z ^~~~~~~~~~~ + 2020-11-15T22:52:42.2786230Z _ + 2020-11-15T22:52:42.2787620Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:23:14: warning: global function 'render(conn:)' took 574ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2788720Z private func render(conn: Conn>) + 2020-11-15T22:52:42.2789290Z ^ + 2020-11-15T22:52:42.2790500Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:16:5: warning: expression took 4085ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2791270Z <| writeStatus(.ok) + 2020-11-15T22:52:42.2791500Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2792640Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:223:12: warning: expression took 239ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2793380Z .flatMap( + 2020-11-15T22:52:42.2793580Z ~~~~~~~~~~~^~~~~~~~ + 2020-11-15T22:52:42.2794690Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:203:14: warning: closure took 242ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2795810Z return { conn in + 2020-11-15T22:52:42.2796070Z ^ + 2020-11-15T22:52:42.2804460Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:202:12: warning: expression took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2805300Z return { middleware in + 2020-11-15T22:52:42.2805820Z ^~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2807340Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:196:6: warning: global function 'redirectActiveSubscribers(user:)' took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2808450Z func redirectActiveSubscribers( + 2020-11-15T22:52:42.2808800Z ^ + 2020-11-15T22:52:42.2809080Z [792/796] Compiling PointFree TODO.swift + 2020-11-15T22:52:42.2810470Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/HtmlCssInliner.swift:19:14: warning: global function 'applyInlineStyles(tag:attribs:child:stylesheet:)' took 232ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2811630Z private func applyInlineStyles( + 2020-11-15T22:52:42.2811920Z ^ + 2020-11-15T22:52:42.2813170Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:58:52: warning: immutable value 'sectionSlug' was never used; consider replacing with '_' or removing it + 2020-11-15T22:52:42.2814200Z case let .collections(.episode(collectionSlug, sectionSlug, episodeParam)): + 2020-11-15T22:52:42.2814660Z ^~~~~~~~~~~ + 2020-11-15T22:52:42.2814840Z _ + 2020-11-15T22:52:42.2815960Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:23:14: warning: global function 'render(conn:)' took 574ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2817120Z private func render(conn: Conn>) + 2020-11-15T22:52:42.2817690Z ^ + 2020-11-15T22:52:42.2818850Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:16:5: warning: expression took 4085ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2819630Z <| writeStatus(.ok) + 2020-11-15T22:52:42.2819860Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2821000Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:223:12: warning: expression took 239ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2821740Z .flatMap( + 2020-11-15T22:52:42.2821940Z ~~~~~~~~~~~^~~~~~~~ + 2020-11-15T22:52:42.2823040Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:203:14: warning: closure took 242ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2823780Z return { conn in + 2020-11-15T22:52:42.2823990Z ^ + 2020-11-15T22:52:42.2825110Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:202:12: warning: expression took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2825900Z return { middleware in + 2020-11-15T22:52:42.2826130Z ^~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2827490Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:196:6: warning: global function 'redirectActiveSubscribers(user:)' took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2828580Z func redirectActiveSubscribers( + 2020-11-15T22:52:42.2828950Z ^ + 2020-11-15T22:52:42.2829210Z [793/796] Compiling PointFree Util.swift + 2020-11-15T22:52:42.2830590Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/HtmlCssInliner.swift:19:14: warning: global function 'applyInlineStyles(tag:attribs:child:stylesheet:)' took 232ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2831540Z private func applyInlineStyles( + 2020-11-15T22:52:42.2831840Z ^ + 2020-11-15T22:52:42.2833030Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:58:52: warning: immutable value 'sectionSlug' was never used; consider replacing with '_' or removing it + 2020-11-15T22:52:42.2834060Z case let .collections(.episode(collectionSlug, sectionSlug, episodeParam)): + 2020-11-15T22:52:42.2834510Z ^~~~~~~~~~~ + 2020-11-15T22:52:42.2834710Z _ + 2020-11-15T22:52:42.2836030Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift:23:14: warning: global function 'render(conn:)' took 574ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2837120Z private func render(conn: Conn>) + 2020-11-15T22:52:42.2837680Z ^ + 2020-11-15T22:52:42.2838840Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:16:5: warning: expression took 4085ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2839610Z <| writeStatus(.ok) + 2020-11-15T22:52:42.2839840Z ~~~~^~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2840970Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:223:12: warning: expression took 239ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2841880Z .flatMap( + 2020-11-15T22:52:42.2842080Z ~~~~~~~~~~~^~~~~~~~ + 2020-11-15T22:52:42.2843240Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:203:14: warning: closure took 242ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2843970Z return { conn in + 2020-11-15T22:52:42.2844180Z ^ + 2020-11-15T22:52:42.2845290Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:202:12: warning: expression took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2846070Z return { middleware in + 2020-11-15T22:52:42.2846310Z ^~~~~~~~~~~~~~~ + 2020-11-15T22:52:42.2847760Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SubscribeConfirmation.swift:196:6: warning: global function 'redirectActiveSubscribers(user:)' took 245ms to type-check (limit: 200ms) + 2020-11-15T22:52:42.2848870Z func redirectActiveSubscribers( + 2020-11-15T22:52:42.2849230Z ^ + 2020-11-15T22:52:42.6479880Z [794/797] Merging module PointFree + 2020-11-15T22:52:43.0756290Z [795/801] Compiling Runner main.swift + 2020-11-15T22:52:43.2947410Z [797/803] Merging module Server + 2020-11-15T22:52:43.3198670Z [798/803] Merging module Runner + 2020-11-15T22:52:43.6957160Z [799/803] Compiling PointFreeTestSupport TestCase.swift + 2020-11-15T22:52:43.6964950Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFreeTestSupport/TestCase.swift:62:21: warning: 'record' is deprecated: renamed to 'isRecording' + 2020-11-15T22:52:43.6965840Z SnapshotTesting.record = false + 2020-11-15T22:52:43.6966170Z ^ + 2020-11-15T22:52:43.6967300Z /Users/runner/work/pointfreeco/pointfreeco/Sources/PointFreeTestSupport/TestCase.swift:62:21: note: use 'isRecording' instead + 2020-11-15T22:52:43.6968060Z SnapshotTesting.record = false + 2020-11-15T22:52:43.6968390Z ^~~~~~ + 2020-11-15T22:52:43.6968630Z isRecording + 2020-11-15T22:52:44.3684080Z [801/804] Linking Runner + 2020-11-15T22:52:44.4210510Z [802/804] Linking Server + 2020-11-15T22:52:44.4863570Z [803/804] Merging module PointFreeTestSupport + 2020-11-15T22:52:48.4398600Z [804/849] Compiling PointFreeTests DatabaseTests.swift + 2020-11-15T22:52:48.4409060Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:10:62: warning: closure took 291ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4410000Z let thing = EitherIO(run: IO { + 2020-11-15T22:52:48.4413360Z ^ + 2020-11-15T22:52:48.4414600Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:14:8: warning: expression took 292ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4415390Z .retry(maxRetries: 2) + 2020-11-15T22:52:48.4415620Z ~~~~~~~^~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:48.4416790Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:8:8: warning: instance method 'testRetry_Fails()' took 293ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4417570Z func testRetry_Fails() { + 2020-11-15T22:52:48.4417810Z ^ + 2020-11-15T22:52:48.4418190Z [805/849] Compiling PointFreeTests DiscountsTests.swift + 2020-11-15T22:52:48.4420200Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:10:62: warning: closure took 291ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4421050Z let thing = EitherIO(run: IO { + 2020-11-15T22:52:48.4421410Z ^ + 2020-11-15T22:52:48.4422560Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:14:8: warning: expression took 292ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4423260Z .retry(maxRetries: 2) + 2020-11-15T22:52:48.4423490Z ~~~~~~~^~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:48.4424640Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:8:8: warning: instance method 'testRetry_Fails()' took 293ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4425790Z func testRetry_Fails() { + 2020-11-15T22:52:48.4426030Z ^ + 2020-11-15T22:52:48.4426400Z [806/849] Compiling PointFreeTests EitherIOTests.swift + 2020-11-15T22:52:48.4427710Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:10:62: warning: closure took 291ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4428520Z let thing = EitherIO(run: IO { + 2020-11-15T22:52:48.4428870Z ^ + 2020-11-15T22:52:48.4429960Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:14:8: warning: expression took 292ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4430670Z .retry(maxRetries: 2) + 2020-11-15T22:52:48.4430900Z ~~~~~~~^~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:48.4432060Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:8:8: warning: instance method 'testRetry_Fails()' took 293ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4432830Z func testRetry_Fails() { + 2020-11-15T22:52:48.4433060Z ^ + 2020-11-15T22:52:48.4433610Z [807/849] Compiling PointFreeTests ChangeEmailConfirmationTests.swift + 2020-11-15T22:52:48.4435050Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:10:62: warning: closure took 291ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4435860Z let thing = EitherIO(run: IO { + 2020-11-15T22:52:48.4436220Z ^ + 2020-11-15T22:52:48.4437380Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:14:8: warning: expression took 292ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4438100Z .retry(maxRetries: 2) + 2020-11-15T22:52:48.4438330Z ~~~~~~~^~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:48.4439510Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:8:8: warning: instance method 'testRetry_Fails()' took 293ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4440280Z func testRetry_Fails() { + 2020-11-15T22:52:48.4440510Z ^ + 2020-11-15T22:52:48.4440980Z [808/849] Compiling PointFreeTests FreeEpisodeEmailTests.swift + 2020-11-15T22:52:48.4442320Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:10:62: warning: closure took 291ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4443120Z let thing = EitherIO(run: IO { + 2020-11-15T22:52:48.4443470Z ^ + 2020-11-15T22:52:48.4444540Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:14:8: warning: expression took 292ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4445250Z .retry(maxRetries: 2) + 2020-11-15T22:52:48.4445480Z ~~~~~~~^~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:48.4446640Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:8:8: warning: instance method 'testRetry_Fails()' took 293ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4447490Z func testRetry_Fails() { + 2020-11-15T22:52:48.4447720Z ^ + 2020-11-15T22:52:48.4448380Z [809/849] Compiling PointFreeTests InviteEmailTests.swift + 2020-11-15T22:52:48.4449740Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:10:62: warning: closure took 291ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4450550Z let thing = EitherIO(run: IO { + 2020-11-15T22:52:48.4450890Z ^ + 2020-11-15T22:52:48.4451970Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:14:8: warning: expression took 292ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4452680Z .retry(maxRetries: 2) + 2020-11-15T22:52:48.4453170Z ~~~~~~~^~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:48.4454360Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:8:8: warning: instance method 'testRetry_Fails()' took 293ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4455130Z func testRetry_Fails() { + 2020-11-15T22:52:48.4455360Z ^ + 2020-11-15T22:52:48.4455830Z [810/849] Compiling PointFreeTests NewBlogPostEmailTests.swift + 2020-11-15T22:52:48.4457170Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:10:62: warning: closure took 291ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4457960Z let thing = EitherIO(run: IO { + 2020-11-15T22:52:48.4458320Z ^ + 2020-11-15T22:52:48.4459400Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:14:8: warning: expression took 292ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4460110Z .retry(maxRetries: 2) + 2020-11-15T22:52:48.4460350Z ~~~~~~~^~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:48.4461500Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:8:8: warning: instance method 'testRetry_Fails()' took 293ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4462270Z func testRetry_Fails() { + 2020-11-15T22:52:48.4462500Z ^ + 2020-11-15T22:52:48.4462950Z [811/849] Compiling PointFreeTests NewEpisodeEmailTests.swift + 2020-11-15T22:52:48.4464270Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:10:62: warning: closure took 291ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4465080Z let thing = EitherIO(run: IO { + 2020-11-15T22:52:48.4465440Z ^ + 2020-11-15T22:52:48.4466530Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:14:8: warning: expression took 292ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4467230Z .retry(maxRetries: 2) + 2020-11-15T22:52:48.4467470Z ~~~~~~~^~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:48.4468610Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:8:8: warning: instance method 'testRetry_Fails()' took 293ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4469380Z func testRetry_Fails() { + 2020-11-15T22:52:48.4469610Z ^ + 2020-11-15T22:52:48.4470040Z [812/849] Compiling PointFreeTests ReferralEmailTests.swift + 2020-11-15T22:52:48.4471350Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:10:62: warning: closure took 291ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4472160Z let thing = EitherIO(run: IO { + 2020-11-15T22:52:48.4472520Z ^ + 2020-11-15T22:52:48.4473610Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:14:8: warning: expression took 292ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4474320Z .retry(maxRetries: 2) + 2020-11-15T22:52:48.4474540Z ~~~~~~~^~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:48.4475690Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:8:8: warning: instance method 'testRetry_Fails()' took 293ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4476460Z func testRetry_Fails() { + 2020-11-15T22:52:48.4476920Z ^ + 2020-11-15T22:52:48.4477520Z [813/849] Compiling PointFreeTests RegistrationEmailTests.swift + 2020-11-15T22:52:48.4478920Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:10:62: warning: closure took 291ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4479730Z let thing = EitherIO(run: IO { + 2020-11-15T22:52:48.4480090Z ^ + 2020-11-15T22:52:48.4481170Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:14:8: warning: expression took 292ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4482130Z .retry(maxRetries: 2) + 2020-11-15T22:52:48.4482360Z ~~~~~~~^~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:48.4483540Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:8:8: warning: instance method 'testRetry_Fails()' took 293ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4484320Z func testRetry_Fails() { + 2020-11-15T22:52:48.4484550Z ^ + 2020-11-15T22:52:48.4484950Z [814/849] Compiling PointFreeTests TeamEmailsTests.swift + 2020-11-15T22:52:48.4486220Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:10:62: warning: closure took 291ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4487030Z let thing = EitherIO(run: IO { + 2020-11-15T22:52:48.4487380Z ^ + 2020-11-15T22:52:48.4488470Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:14:8: warning: expression took 292ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4489410Z .retry(maxRetries: 2) + 2020-11-15T22:52:48.4489650Z ~~~~~~~^~~~~~~~~~~~~~~~~~~~ + 2020-11-15T22:52:48.4490820Z /Users/runner/work/pointfreeco/pointfreeco/Tests/PointFreeTests/EitherIOTests.swift:8:8: warning: instance method 'testRetry_Fails()' took 293ms to type-check (limit: 200ms) + 2020-11-15T22:52:48.4491600Z func testRetry_Fails() { + 2020-11-15T22:52:48.4491830Z ^ + 2020-11-15T22:52:49.1057000Z [815/849] Compiling PointFreeTests AboutTests.swift + 2020-11-15T22:52:49.1062100Z [816/849] Compiling PointFreeTests AccountTests.swift + 2020-11-15T22:52:49.1062680Z [817/849] Compiling PointFreeTests CancelTests.swift + 2020-11-15T22:52:49.1063220Z [818/849] Compiling PointFreeTests ChangeTests.swift + 2020-11-15T22:52:49.1064660Z [819/849] Compiling PointFreeTests PaymentInfoTests.swift + 2020-11-15T22:52:49.1065350Z [820/849] Compiling PointFreeTests UpdateProfileTests.swift + 2020-11-15T22:52:49.1065930Z [821/849] Compiling PointFreeTests ApiTests.swift + 2020-11-15T22:52:49.1067000Z [822/849] Compiling PointFreeTests AppleDeveloperMerchantIdDomainAssociationTests.swift + 2020-11-15T22:52:49.1068120Z [823/849] Compiling PointFreeTests AtomFeedTests.swift + 2020-11-15T22:52:49.1068660Z [824/849] Compiling PointFreeTests AuthTests.swift + 2020-11-15T22:52:49.1071930Z [825/849] Compiling PointFreeTests BlogTests.swift + 2020-11-15T22:52:49.1072780Z [826/849] Compiling PointFreeTests CollectionsTests.swift + 2020-11-15T22:52:49.4985200Z [827/849] Compiling PointFreeTests WelcomeEmailTests.swift + 2020-11-15T22:52:49.4985990Z [828/849] Compiling PointFreeTests EnterpriseTests.swift + 2020-11-15T22:52:49.4986580Z [829/849] Compiling PointFreeTests EnvVarTests.swift + 2020-11-15T22:52:49.4990120Z [830/849] Compiling PointFreeTests EnvironmentTests.swift + 2020-11-15T22:52:49.4990940Z [831/849] Compiling PointFreeTests EpisodePageTests.swift + 2020-11-15T22:52:49.4992040Z [832/849] Compiling PointFreeTests GhostTests.swift + 2020-11-15T22:52:49.4992560Z [833/849] Compiling PointFreeTests HomeTests.swift + 2020-11-15T22:52:49.4993190Z [834/849] Compiling PointFreeTests HtmlCssInlinerTests.swift + 2020-11-15T22:52:49.4994820Z [835/849] Compiling PointFreeTests InviteTests.swift + 2020-11-15T22:52:49.4995780Z [836/849] Compiling PointFreeTests InvoicesTests.swift + 2020-11-15T22:52:49.4996410Z [837/849] Compiling PointFreeTests MetaLayoutTests.swift + 2020-11-15T22:52:50.3444490Z [838/849] Compiling PointFreeTests MinimalNavViewTests.swift + 2020-11-15T22:52:50.3445330Z [839/849] Compiling PointFreeTests NewslettersTests.swift + 2020-11-15T22:52:50.3447810Z [840/849] Compiling PointFreeTests NotFoundMiddlewareTests.swift + 2020-11-15T22:52:50.3448620Z [841/849] Compiling PointFreeTests PricingLandingTests.swift + 2020-11-15T22:52:50.3451650Z [842/849] Compiling PointFreeTests PrivacyTests.swift + 2020-11-15T22:52:50.3452240Z [843/849] Compiling PointFreeTests PrivateRssTests.swift + 2020-11-15T22:52:50.3452810Z [844/849] Compiling PointFreeTests SessionTests.swift + 2020-11-15T22:52:50.3453420Z [845/849] Compiling PointFreeTests SiteMiddlewareTests.swift + 2020-11-15T22:52:50.3454470Z [846/849] Compiling PointFreeTests StripeWebhooksTests.swift + 2020-11-15T22:52:50.3455230Z [847/849] Compiling PointFreeTests SubscribeConfirmationTests.swift + 2020-11-15T22:52:50.3455950Z [848/849] Compiling PointFreeTests SubscribeTests.swift + 2020-11-15T22:52:50.9582600Z [849/850] Merging module PointFreeTests + 2020-11-15T22:52:52.5210220Z [850/850] Linking PointFreePackageTests + 2020-11-15T22:52:53.1837100Z Test Suite 'All tests' started at 2020-11-15 22:52:53.183 + 2020-11-15T22:52:53.1838270Z Test Suite 'PointFreePackageTests.xctest' started at 2020-11-15 22:52:53.183 + 2020-11-15T22:52:53.1839190Z Test Suite 'AboutTests' started at 2020-11-15 22:52:53.184 + 2020-11-15T22:52:53.1840090Z Test Case '-[PointFreeTests.AboutTests testAbout]' started. + 2020-11-15T22:52:53.3415970Z 2020-11-15T22:52:53+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift D34F055D-7366-4B47-85FE-FF8C31814C4B [Request] GET /about + 2020-11-15T22:52:53.3889360Z 2020-11-15T22:52:53+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 D34F055D-7366-4B47-85FE-FF8C31814C4B [Time] 47ms + 2020-11-15T22:52:53.3908510Z Test Case '-[PointFreeTests.AboutTests testAbout]' passed (0.207 seconds). + 2020-11-15T22:52:53.3909510Z Test Suite 'AboutTests' passed at 2020-11-15 22:52:53.391. + 2020-11-15T22:52:53.3909940Z Executed 1 test, with 0 failures (0 unexpected) in 0.207 (0.207) seconds + 2020-11-15T22:52:53.3910850Z Test Suite 'AccountIntegrationTests' started at 2020-11-15 22:52:53.391 + 2020-11-15T22:52:53.3912050Z Test Case '-[PointFreeTests.AccountIntegrationTests testLeaveTeam]' started. + 2020-11-15T22:52:54.8853200Z 2020-11-15T22:52:54+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 4A5941C6-FB38-4CA5-92A4-FC059E131150 [Request] POST /account/team/leave + 2020-11-15T22:52:54.9234510Z 2020-11-15T22:52:54+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 4A5941C6-FB38-4CA5-92A4-FC059E131150 [Time] 38ms + 2020-11-15T22:52:54.9353780Z Test Case '-[PointFreeTests.AccountIntegrationTests testLeaveTeam]' passed (1.544 seconds). + 2020-11-15T22:52:54.9355220Z Test Suite 'AccountIntegrationTests' passed at 2020-11-15 22:52:54.935. + 2020-11-15T22:52:54.9355790Z Executed 1 test, with 0 failures (0 unexpected) in 1.544 (1.544) seconds + 2020-11-15T22:52:54.9356950Z Test Suite 'AccountTests' started at 2020-11-15 22:52:54.935 + 2020-11-15T22:52:54.9358110Z Test Case '-[PointFreeTests.AccountTests testAccount]' started. + 2020-11-15T22:52:54.9380050Z 2020-11-15T22:52:54+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 C65BFC5B-D58B-4207-96F9-59D9BB4D3931 [Request] GET /account + 2020-11-15T22:52:54.9864230Z 2020-11-15T22:52:54+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 C65BFC5B-D58B-4207-96F9-59D9BB4D3931 [Time] 48ms + 2020-11-15T22:52:54.9874570Z Test Case '-[PointFreeTests.AccountTests testAccount]' passed (0.052 seconds). + 2020-11-15T22:52:54.9876180Z Test Case '-[PointFreeTests.AccountTests testAccount_InvoiceBilling]' started. + 2020-11-15T22:52:54.9895340Z 2020-11-15T22:52:54+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 0C6028F5-6DE9-4E4C-A62E-CBCFAC474E79 [Request] GET /account + 2020-11-15T22:52:55.0349510Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 0C6028F5-6DE9-4E4C-A62E-CBCFAC474E79 [Time] 45ms + 2020-11-15T22:52:55.0359760Z Test Case '-[PointFreeTests.AccountTests testAccount_InvoiceBilling]' passed (0.048 seconds). + 2020-11-15T22:52:55.0361710Z Test Case '-[PointFreeTests.AccountTests testAccount_WithExtraInvoiceInfo]' started. + 2020-11-15T22:52:55.0381100Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 F53B8959-93C6-49CC-A175-02E17C9F2616 [Request] GET /account + 2020-11-15T22:52:55.0794970Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 F53B8959-93C6-49CC-A175-02E17C9F2616 [Time] 41ms + 2020-11-15T22:52:55.0805200Z Test Case '-[PointFreeTests.AccountTests testAccount_WithExtraInvoiceInfo]' passed (0.044 seconds). + 2020-11-15T22:52:55.0811580Z Test Case '-[PointFreeTests.AccountTests testAccountCanceledSubscription]' started. + 2020-11-15T22:52:55.0825400Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 81187219-5BBA-42F8-A25E-B5B91984864F [Request] GET /account + 2020-11-15T22:52:55.1178020Z Test Case '-[PointFreeTests.AccountTests testAccountCanceledSubscription]' passed (0.037 seconds). + 2020-11-15T22:52:55.1180060Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 81187219-5BBA-42F8-A25E-B5B91984864F [Time] 33ms + 2020-11-15T22:52:55.1252630Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 1232E770-2F39-4A53-B1FC-0C26930E65A4 [Request] GET /account + 2020-11-15T22:52:55.1275100Z Test Case '-[PointFreeTests.AccountTests testAccountCancelingSubscription]' started. + 2020-11-15T22:52:55.1573900Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 1232E770-2F39-4A53-B1FC-0C26930E65A4 [Time] 37ms + 2020-11-15T22:52:55.1585560Z Test Case '-[PointFreeTests.AccountTests testAccountCancelingSubscription]' passed (0.041 seconds). + 2020-11-15T22:52:55.1588180Z Test Case '-[PointFreeTests.AccountTests testAccountWithCredit]' started. + 2020-11-15T22:52:55.1610050Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 DA5E7781-8A94-4903-87CB-6C56387B37ED [Request] GET /account + 2020-11-15T22:52:55.2015630Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift DA5E7781-8A94-4903-87CB-6C56387B37ED [Time] 40ms + 2020-11-15T22:52:55.2026470Z Test Case '-[PointFreeTests.AccountTests testAccountWithCredit]' passed (0.044 seconds). + 2020-11-15T22:52:55.2027880Z Test Case '-[PointFreeTests.AccountTests testAccountWithDiscount]' started. + 2020-11-15T22:52:55.2047480Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 F7FB5D81-61E8-4F4F-9368-8373FFB5597F [Request] GET /account + 2020-11-15T22:52:55.2472020Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 F7FB5D81-61E8-4F4F-9368-8373FFB5597F [Time] 42ms + 2020-11-15T22:52:55.2481420Z Test Case '-[PointFreeTests.AccountTests testAccountWithDiscount]' passed (0.045 seconds). + 2020-11-15T22:52:55.2482860Z Test Case '-[PointFreeTests.AccountTests testAccountWithFlashError]' started. + 2020-11-15T22:52:55.2502560Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift B446A787-BD78-4854-A13D-D68320720724 [Request] GET /account + 2020-11-15T22:52:55.2932090Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift B446A787-BD78-4854-A13D-D68320720724 [Time] 42ms + 2020-11-15T22:52:55.2942370Z Test Case '-[PointFreeTests.AccountTests testAccountWithFlashError]' passed (0.046 seconds). + 2020-11-15T22:52:55.2943840Z Test Case '-[PointFreeTests.AccountTests testAccountWithFlashNotice]' started. + 2020-11-15T22:52:55.2965200Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift FC046C1B-DB49-4CED-B860-D6E8D3E41A64 [Request] GET /account + 2020-11-15T22:52:55.3427870Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift FC046C1B-DB49-4CED-B860-D6E8D3E41A64 [Time] 45ms + 2020-11-15T22:52:55.3432510Z Test Case '-[PointFreeTests.AccountTests testAccountWithFlashNotice]' passed (0.049 seconds). + 2020-11-15T22:52:55.3435330Z Test Case '-[PointFreeTests.AccountTests testAccountWithFlashWarning]' started. + 2020-11-15T22:52:55.3506290Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 681BE838-FB2D-44CB-97C9-C32D3A799F0A [Request] GET /account + 2020-11-15T22:52:55.3932840Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 681BE838-FB2D-44CB-97C9-C32D3A799F0A [Time] 42ms + 2020-11-15T22:52:55.3941810Z Test Case '-[PointFreeTests.AccountTests testAccountWithFlashWarning]' passed (0.051 seconds). + 2020-11-15T22:52:55.3943290Z Test Case '-[PointFreeTests.AccountTests testAccountWithPastDue]' started. + 2020-11-15T22:52:55.3965180Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 933AC6C2-1A68-4A61-A435-1C7A9E96F6DE [Request] GET /account + 2020-11-15T22:52:55.4354150Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 933AC6C2-1A68-4A61-A435-1C7A9E96F6DE [Time] 38ms + 2020-11-15T22:52:55.4361570Z Test Case '-[PointFreeTests.AccountTests testAccountWithPastDue]' passed (0.042 seconds). + 2020-11-15T22:52:55.4363030Z Test Case '-[PointFreeTests.AccountTests testEpisodeCredits_1Credit_1Chosen]' started. + 2020-11-15T22:52:55.4382160Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 5DE98086-2CBF-4B00-9169-186AA8AED7B1 [Request] GET /account + 2020-11-15T22:52:55.4706090Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 5DE98086-2CBF-4B00-9169-186AA8AED7B1 [Time] 32ms + 2020-11-15T22:52:55.4717670Z Test Case '-[PointFreeTests.AccountTests testEpisodeCredits_1Credit_1Chosen]' passed (0.035 seconds). + 2020-11-15T22:52:55.4719150Z Test Case '-[PointFreeTests.AccountTests testEpisodeCredits_1Credit_NoneChosen]' started. + 2020-11-15T22:52:55.4737370Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift CD7B708A-3CE0-42C5-A2D6-70223F0CF2F0 [Request] GET /account + 2020-11-15T22:52:55.5044810Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 CD7B708A-3CE0-42C5-A2D6-70223F0CF2F0 [Time] 30ms + 2020-11-15T22:52:55.5054210Z Test Case '-[PointFreeTests.AccountTests testEpisodeCredits_1Credit_NoneChosen]' passed (0.034 seconds). + 2020-11-15T22:52:55.5055600Z Test Case '-[PointFreeTests.AccountTests testTeam_AsTeammate]' started. + 2020-11-15T22:52:55.5074720Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 0E6C71B3-42BA-44CB-9F53-026DD096F445 [Request] GET /account + 2020-11-15T22:52:55.5402600Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 0E6C71B3-42BA-44CB-9F53-026DD096F445 [Time] 32ms + 2020-11-15T22:52:55.5413170Z Test Case '-[PointFreeTests.AccountTests testTeam_AsTeammate]' passed (0.036 seconds). + 2020-11-15T22:52:55.5414550Z Test Case '-[PointFreeTests.AccountTests testTeam_NoRemainingSeats]' started. + 2020-11-15T22:52:55.5433530Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 9AE8B18E-1D2B-4D7A-ADC5-14A7651DD51A [Request] GET /account + 2020-11-15T22:52:55.5857890Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 9AE8B18E-1D2B-4D7A-ADC5-14A7651DD51A [Time] 42ms + 2020-11-15T22:52:55.5867950Z Test Case '-[PointFreeTests.AccountTests testTeam_NoRemainingSeats]' passed (0.045 seconds). + 2020-11-15T22:52:55.5869780Z Test Case '-[PointFreeTests.AccountTests testTeam_OwnerIsNotSubscriber]' started. + 2020-11-15T22:52:55.5889490Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 09C8B9B9-BC8E-4171-9D95-E089FB4C48AB [Request] GET /account + 2020-11-15T22:52:55.6327220Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 09C8B9B9-BC8E-4171-9D95-E089FB4C48AB [Time] 43ms + 2020-11-15T22:52:55.6337940Z Test Case '-[PointFreeTests.AccountTests testTeam_OwnerIsNotSubscriber]' passed (0.047 seconds). + 2020-11-15T22:52:55.6339130Z Test Suite 'AccountTests' passed at 2020-11-15 22:52:55.634. + 2020-11-15T22:52:55.6340120Z Executed 16 tests, with 0 failures (0 unexpected) in 0.698 (0.698) seconds + 2020-11-15T22:52:55.6341220Z Test Suite 'ApiTests' started at 2020-11-15 22:52:55.634 + 2020-11-15T22:52:55.6342110Z Test Case '-[PointFreeTests.ApiTests testEpisode]' started. + 2020-11-15T22:52:55.6361910Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift EBAE01B1-7E9C-4F02-83E2-2449741CE521 [Request] GET /api/episodes/1 + 2020-11-15T22:52:55.6383750Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 EBAE01B1-7E9C-4F02-83E2-2449741CE521 [Time] 2ms + 2020-11-15T22:52:55.6392730Z Test Case '-[PointFreeTests.ApiTests testEpisode]' passed (0.005 seconds). + 2020-11-15T22:52:55.6394080Z Test Case '-[PointFreeTests.ApiTests testEpisode_NotFound]' started. + 2020-11-15T22:52:55.6410930Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 9EBBD82E-26C2-49E3-A5CD-94512E105F61 [Request] GET /api/episodes/424242 + 2020-11-15T22:52:55.6740280Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 9EBBD82E-26C2-49E3-A5CD-94512E105F61 [Time] 32ms + 2020-11-15T22:52:55.6750360Z Test Case '-[PointFreeTests.ApiTests testEpisode_NotFound]' passed (0.036 seconds). + 2020-11-15T22:52:55.6751510Z Test Case '-[PointFreeTests.ApiTests testEpisodes]' started. + 2020-11-15T22:52:55.6770740Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 05D99342-F3E1-45D8-BFB6-F78AB4D0D630 [Request] GET /api/episodes + 2020-11-15T22:52:55.6780480Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 05D99342-F3E1-45D8-BFB6-F78AB4D0D630 [Time] 0ms + 2020-11-15T22:52:55.6791820Z Test Case '-[PointFreeTests.ApiTests testEpisodes]' passed (0.004 seconds). + 2020-11-15T22:52:55.6793100Z Test Suite 'ApiTests' passed at 2020-11-15 22:52:55.679. + 2020-11-15T22:52:55.6793570Z Executed 3 tests, with 0 failures (0 unexpected) in 0.045 (0.045) seconds + 2020-11-15T22:52:55.6794980Z Test Suite 'AppleDeveloperMerchantIdDomainAssociationTests' started at 2020-11-15 22:52:55.679 + 2020-11-15T22:52:55.6797210Z Test Case '-[PointFreeTests.AppleDeveloperMerchantIdDomainAssociationTests testNotLoggedIn_IndividualMonthly]' started. + 2020-11-15T22:52:55.6816480Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift D0F4226A-F4FF-40BF-8782-DC04AC48E17A [Request] GET /.well-known/apple-developer-merchantid-domain-association + 2020-11-15T22:52:55.6823610Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift D0F4226A-F4FF-40BF-8782-DC04AC48E17A [Time] 0ms + 2020-11-15T22:52:55.6832210Z Test Case '-[PointFreeTests.AppleDeveloperMerchantIdDomainAssociationTests testNotLoggedIn_IndividualMonthly]' passed (0.004 seconds). + 2020-11-15T22:52:55.6834670Z Test Suite 'AppleDeveloperMerchantIdDomainAssociationTests' passed at 2020-11-15 22:52:55.683. + 2020-11-15T22:52:55.6836250Z Executed 1 test, with 0 failures (0 unexpected) in 0.004 (0.004) seconds + 2020-11-15T22:52:55.6837620Z Test Suite 'AtomFeedTests' started at 2020-11-15 22:52:55.683 + 2020-11-15T22:52:55.6838610Z Test Case '-[PointFreeTests.AtomFeedTests testAtomFeed]' started. + 2020-11-15T22:52:55.6858680Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 BBDBC8C9-377C-47EE-93C2-1BF3237AEF65 [Request] GET /feed/atom.xml + 2020-11-15T22:52:55.6906920Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 BBDBC8C9-377C-47EE-93C2-1BF3237AEF65 [Time] 4ms + 2020-11-15T22:52:55.6910560Z Test Case '-[PointFreeTests.AtomFeedTests testAtomFeed]' passed (0.008 seconds). + 2020-11-15T22:52:55.6911840Z Test Case '-[PointFreeTests.AtomFeedTests testEpisodeFeed]' started. + 2020-11-15T22:52:55.6933500Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 3D189D2A-77C5-4032-891D-532EDF8E131A [Request] GET /feed/episodes.xml + 2020-11-15T22:52:55.6972430Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 3D189D2A-77C5-4032-891D-532EDF8E131A [Time] 3ms + 2020-11-15T22:52:55.6979730Z Test Case '-[PointFreeTests.AtomFeedTests testEpisodeFeed]' passed (0.007 seconds). + 2020-11-15T22:52:55.6981390Z Test Case '-[PointFreeTests.AtomFeedTests testEpisodeFeed_WithRecentlyFreeEpisode]' started. + 2020-11-15T22:52:55.7008830Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 05DE8A3A-C819-445C-B5FE-226C2449AA2D [Request] GET /feed/episodes.xml + 2020-11-15T22:52:55.7053430Z 2020-11-15T22:52:55+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 05DE8A3A-C819-445C-B5FE-226C2449AA2D [Time] 4ms + 2020-11-15T22:52:55.7060930Z Test Case '-[PointFreeTests.AtomFeedTests testEpisodeFeed_WithRecentlyFreeEpisode]' passed (0.008 seconds). + 2020-11-15T22:52:55.7062560Z Test Suite 'AtomFeedTests' passed at 2020-11-15 22:52:55.706. + 2020-11-15T22:52:55.7063040Z Executed 3 tests, with 0 failures (0 unexpected) in 0.023 (0.023) seconds + 2020-11-15T22:52:55.7064040Z Test Suite 'AuthIntegrationTests' started at 2020-11-15 22:52:55.706 + 2020-11-15T22:52:55.7065550Z Test Case '-[PointFreeTests.AuthIntegrationTests testAuth]' started. + 2020-11-15T22:52:55.7587060Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:52:55.7588160Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:52:55.7589690Z drop cascades to extension uuid-ossp + 2020-11-15T22:52:55.7590570Z drop cascades to extension citext + 2020-11-15T22:52:55.7591300Z drop cascades to table users + 2020-11-15T22:52:55.7592040Z drop cascades to table subscriptions + 2020-11-15T22:52:55.7592800Z drop cascades to table team_invites + 2020-11-15T22:52:55.7593540Z drop cascades to table email_settings + 2020-11-15T22:52:55.7594300Z drop cascades to table episode_credits + 2020-11-15T22:52:55.7595070Z drop cascades to table feed_request_events + 2020-11-15T22:52:55.7595830Z drop cascades to function update_updated_at() + 2020-11-15T22:52:55.7596630Z drop cascades to table enterprise_accounts + 2020-11-15T22:52:55.7597420Z drop cascades to table enterprise_emails + 2020-11-15T22:52:55.7598220Z drop cascades to table episode_progresses + 2020-11-15T22:52:55.7599020Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:52:55.7599800Z drop cascades to sequence test_uuids + 2020-11-15T22:52:55.7600550Z drop cascades to sequence test_shortids + 2020-11-15T22:52:56.7468480Z 2020-11-15T22:52:56+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 81ED8E06-D130-47AA-BB60-06AC94ED6E1B [Request] GET /github-auth + 2020-11-15T22:52:56.9437950Z 2020-11-15T22:52:56+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 81ED8E06-D130-47AA-BB60-06AC94ED6E1B [Time] 196ms + 2020-11-15T22:52:56.9444110Z Test Case '-[PointFreeTests.AuthIntegrationTests testAuth]' passed (1.238 seconds). + 2020-11-15T22:52:56.9445600Z Test Case '-[PointFreeTests.AuthIntegrationTests testLoginWithRedirect]' started. + 2020-11-15T22:52:56.9600010Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:52:56.9601570Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:52:56.9603050Z drop cascades to extension uuid-ossp + 2020-11-15T22:52:56.9603740Z drop cascades to extension citext + 2020-11-15T22:52:56.9604420Z drop cascades to table users + 2020-11-15T22:52:56.9605040Z drop cascades to table subscriptions + 2020-11-15T22:52:56.9605650Z drop cascades to table team_invites + 2020-11-15T22:52:56.9606240Z drop cascades to table email_settings + 2020-11-15T22:52:56.9606840Z drop cascades to table episode_credits + 2020-11-15T22:52:56.9607450Z drop cascades to table feed_request_events + 2020-11-15T22:52:56.9608080Z drop cascades to function update_updated_at() + 2020-11-15T22:52:56.9608720Z drop cascades to table enterprise_accounts + 2020-11-15T22:52:56.9609350Z drop cascades to table enterprise_emails + 2020-11-15T22:52:56.9609980Z drop cascades to table episode_progresses + 2020-11-15T22:52:56.9610630Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:52:56.9611270Z drop cascades to sequence test_uuids + 2020-11-15T22:52:56.9611880Z drop cascades to sequence test_shortids + 2020-11-15T22:52:57.9147240Z 2020-11-15T22:52:57+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 A04CD553-F346-4CAA-BF23-72791E062B1C [Request] GET /login + 2020-11-15T22:52:57.9245040Z 2020-11-15T22:52:57+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift A04CD553-F346-4CAA-BF23-72791E062B1C [Time] 9ms + 2020-11-15T22:52:57.9250510Z Test Case '-[PointFreeTests.AuthIntegrationTests testLoginWithRedirect]' passed (0.981 seconds). + 2020-11-15T22:52:57.9253290Z Test Case '-[PointFreeTests.AuthIntegrationTests testRegister]' started. + 2020-11-15T22:52:57.9384790Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:52:57.9385400Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:52:57.9386990Z drop cascades to extension uuid-ossp + 2020-11-15T22:52:57.9387380Z drop cascades to extension citext + 2020-11-15T22:52:57.9387720Z drop cascades to table users + 2020-11-15T22:52:57.9388070Z drop cascades to table subscriptions + 2020-11-15T22:52:57.9388440Z drop cascades to table team_invites + 2020-11-15T22:52:57.9388780Z drop cascades to table email_settings + 2020-11-15T22:52:57.9389160Z drop cascades to table episode_credits + 2020-11-15T22:52:57.9389540Z drop cascades to table feed_request_events + 2020-11-15T22:52:57.9389930Z drop cascades to function update_updated_at() + 2020-11-15T22:52:57.9390340Z drop cascades to table enterprise_accounts + 2020-11-15T22:52:57.9390740Z drop cascades to table enterprise_emails + 2020-11-15T22:52:57.9391140Z drop cascades to table episode_progresses + 2020-11-15T22:52:57.9391540Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:52:57.9391940Z drop cascades to sequence test_uuids + 2020-11-15T22:52:57.9392300Z drop cascades to sequence test_shortids + 2020-11-15T22:52:58.7860970Z 2020-11-15T22:52:58+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 C24057B3-D996-4241-BE50-6B96BDDFEE79 [Request] GET /github-auth + 2020-11-15T22:52:58.9800740Z 2020-11-15T22:52:58+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 C24057B3-D996-4241-BE50-6B96BDDFEE79 [Time] 193ms + 2020-11-15T22:52:58.9889740Z Test Case '-[PointFreeTests.AuthIntegrationTests testRegister]' passed (1.064 seconds). + 2020-11-15T22:52:58.9892000Z Test Suite 'AuthIntegrationTests' passed at 2020-11-15 22:52:58.989. + 2020-11-15T22:52:58.9893030Z Executed 3 tests, with 0 failures (0 unexpected) in 3.283 (3.283) seconds + 2020-11-15T22:52:58.9894150Z Test Suite 'AuthTests' started at 2020-11-15 22:52:58.989 + 2020-11-15T22:52:58.9895640Z Test Case '-[PointFreeTests.AuthTests testAuth_WithFetchAuthTokenBadVerificationCode]' started. + 2020-11-15T22:52:58.9925990Z 2020-11-15T22:52:58+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift E0E320BD-BB81-4198-9335-30D5ADB42568 [Request] GET /github-auth + 2020-11-15T22:52:58.9945190Z 2020-11-15T22:52:58+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift E0E320BD-BB81-4198-9335-30D5ADB42568 [Time] 2ms + 2020-11-15T22:52:58.9952530Z Test Case '-[PointFreeTests.AuthTests testAuth_WithFetchAuthTokenBadVerificationCode]' passed (0.006 seconds). + 2020-11-15T22:52:58.9961720Z Test Case '-[PointFreeTests.AuthTests testAuth_WithFetchAuthTokenBadVerificationCodeRedirect]' started. + 2020-11-15T22:52:58.9996110Z 2020-11-15T22:52:58+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 6F815C8E-C35E-4A4E-8A63-94C9FBCB616D [Request] GET /github-auth + 2020-11-15T22:52:59.0019860Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 6F815C8E-C35E-4A4E-8A63-94C9FBCB616D [Time] 2ms + 2020-11-15T22:52:59.0026900Z Test Case '-[PointFreeTests.AuthTests testAuth_WithFetchAuthTokenBadVerificationCodeRedirect]' passed (0.007 seconds). + 2020-11-15T22:52:59.0029290Z Test Case '-[PointFreeTests.AuthTests testAuth_WithFetchAuthTokenFailure]' started. + 2020-11-15T22:52:59.0058860Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 B5D2F280-D22B-4B29-83F2-8A056915802C [Request] GET /github-auth + 2020-11-15T22:52:59.0073110Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift B5D2F280-D22B-4B29-83F2-8A056915802C [Time] 1ms + 2020-11-15T22:52:59.0078990Z Test Case '-[PointFreeTests.AuthTests testAuth_WithFetchAuthTokenFailure]' passed (0.005 seconds). + 2020-11-15T22:52:59.0081050Z Test Case '-[PointFreeTests.AuthTests testAuth_WithFetchUserFailure]' started. + 2020-11-15T22:52:59.0110330Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 1425DBD4-62BA-43D1-B7A3-5289F13ADB47 [Request] GET /github-auth + 2020-11-15T22:52:59.0127560Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 1425DBD4-62BA-43D1-B7A3-5289F13ADB47 [Time] 1ms + 2020-11-15T22:52:59.0134320Z Test Case '-[PointFreeTests.AuthTests testAuth_WithFetchUserFailure]' passed (0.006 seconds). + 2020-11-15T22:52:59.0135790Z Test Case '-[PointFreeTests.AuthTests testHome_LoggedIn]' started. + 2020-11-15T22:52:59.0156520Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 9C517EC1-871D-4F33-AB2E-D7B29F5BA0D4 [Request] GET + 2020-11-15T22:52:59.0548300Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 9C517EC1-871D-4F33-AB2E-D7B29F5BA0D4 [Time] 39ms + 2020-11-15T22:52:59.0556710Z Test Case '-[PointFreeTests.AuthTests testHome_LoggedIn]' passed (0.042 seconds). + 2020-11-15T22:52:59.0558140Z Test Case '-[PointFreeTests.AuthTests testHome_LoggedOut]' started. + 2020-11-15T22:52:59.0578380Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 9EDF928B-9A67-4085-B8E8-A146157DBE5C [Request] GET + 2020-11-15T22:52:59.0973540Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 9EDF928B-9A67-4085-B8E8-A146157DBE5C [Time] 39ms + 2020-11-15T22:52:59.0981740Z Test Case '-[PointFreeTests.AuthTests testHome_LoggedOut]' passed (0.042 seconds). + 2020-11-15T22:52:59.0984950Z Test Case '-[PointFreeTests.AuthTests testLogin]' started. + 2020-11-15T22:52:59.1045240Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 46C8FDA5-F694-4D14-B3ED-DF1751326CEB [Request] GET /login + 2020-11-15T22:52:59.1087040Z Test Case '-[PointFreeTests.AuthTests testLogin]' passed (0.007 seconds). + 2020-11-15T22:52:59.1089220Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 46C8FDA5-F694-4D14-B3ED-DF1751326CEB [Time] 2ms + 2020-11-15T22:52:59.1091240Z Test Case '-[PointFreeTests.AuthTests testLogin_AlreadyLoggedIn]' started. + 2020-11-15T22:52:59.1093010Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 1A36C095-C950-4EA6-9A69-6B219BA786D8 [Request] GET /login + 2020-11-15T22:52:59.1097510Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 1A36C095-C950-4EA6-9A69-6B219BA786D8 [Time] 1ms + 2020-11-15T22:52:59.1104810Z Test Case '-[PointFreeTests.AuthTests testLogin_AlreadyLoggedIn]' passed (0.005 seconds). + 2020-11-15T22:52:59.1118690Z Test Case '-[PointFreeTests.AuthTests testLogout]' started. + 2020-11-15T22:52:59.1131430Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 B8C16D79-59DF-454F-A56F-E200958A5CDC [Request] GET /logout + 2020-11-15T22:52:59.1140200Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift B8C16D79-59DF-454F-A56F-E200958A5CDC [Time] 1ms + 2020-11-15T22:52:59.1145220Z Test Case '-[PointFreeTests.AuthTests testLogout]' passed (0.004 seconds). + 2020-11-15T22:52:59.1149450Z Test Suite 'AuthTests' passed at 2020-11-15 22:52:59.114. + 2020-11-15T22:52:59.1163460Z Executed 9 tests, with 0 failures (0 unexpected) in 0.125 (0.125) seconds + 2020-11-15T22:52:59.1164590Z Test Suite 'BlogPostTests' started at 2020-11-15 22:52:59.114 + 2020-11-15T22:52:59.1166500Z Test Case '-[ModelsTests.BlogPostTests testSlug]' started. + 2020-11-15T22:52:59.1167950Z Test Case '-[ModelsTests.BlogPostTests testSlug]' passed (0.000 seconds). + 2020-11-15T22:52:59.1169930Z Test Suite 'BlogPostTests' passed at 2020-11-15 22:52:59.115. + 2020-11-15T22:52:59.1170790Z Executed 1 test, with 0 failures (0 unexpected) in 0.000 (0.000) seconds + 2020-11-15T22:52:59.1171660Z Test Suite 'BlogTests' started at 2020-11-15 22:52:59.115 + 2020-11-15T22:52:59.1173280Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 51286411-A81C-4E85-9905-2F0C56612799 [Request] GET /blog/feed/atom.xml + 2020-11-15T22:52:59.1175350Z Test Case '-[PointFreeTests.BlogTests testBlogAtomFeed]' started. + 2020-11-15T22:52:59.1236530Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 51286411-A81C-4E85-9905-2F0C56612799 [Time] 6ms + 2020-11-15T22:52:59.1244600Z Test Case '-[PointFreeTests.BlogTests testBlogAtomFeed]' passed (0.009 seconds). + 2020-11-15T22:52:59.1246660Z Test Case '-[PointFreeTests.BlogTests testBlogAtomFeed_Unauthed]' started. + 2020-11-15T22:52:59.1284100Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift DCE1A3BA-7AD1-4D04-81E7-BE2D9ED503FB [Request] GET /blog/feed/atom.xml + 2020-11-15T22:52:59.1321800Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift DCE1A3BA-7AD1-4D04-81E7-BE2D9ED503FB [Time] 5ms + 2020-11-15T22:52:59.1421770Z Test Case '-[PointFreeTests.BlogTests testBlogAtomFeed_Unauthed]' passed (0.009 seconds). + 2020-11-15T22:52:59.1423940Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 924D06E7-F3DA-40E4-8FBF-84F3930CB051 [Request] GET /blog + 2020-11-15T22:52:59.1522660Z Test Case '-[PointFreeTests.BlogTests testBlogIndex]' started. + 2020-11-15T22:52:59.1765680Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 924D06E7-F3DA-40E4-8FBF-84F3930CB051 [Time] 40ms + 2020-11-15T22:52:59.1848080Z Test Case '-[PointFreeTests.BlogTests testBlogIndex]' passed (0.046 seconds). + 2020-11-15T22:52:59.1859280Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift E076DBBA-3AB4-423E-82B5-12D9BD1E3A78 [Request] GET /blog + 2020-11-15T22:52:59.1873110Z Test Case '-[PointFreeTests.BlogTests testBlogIndex_WithLotsOfPosts]' started. + 2020-11-15T22:52:59.2273690Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift E076DBBA-3AB4-423E-82B5-12D9BD1E3A78 [Time] 46ms + 2020-11-15T22:52:59.2287260Z Test Case '-[PointFreeTests.BlogTests testBlogIndex_WithLotsOfPosts]' passed (0.050 seconds). + 2020-11-15T22:52:59.2295840Z Test Case '-[PointFreeTests.BlogTests testBlogShow]' started. + 2020-11-15T22:52:59.2315210Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift EFA22E54-7AE5-420C-8C16-45B8F5FB024C [Request] GET /blog/posts/0-mock-blog-post + 2020-11-15T22:52:59.2692700Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 EFA22E54-7AE5-420C-8C16-45B8F5FB024C [Time] 37ms + 2020-11-15T22:52:59.2703490Z Test Case '-[PointFreeTests.BlogTests testBlogShow]' passed (0.042 seconds). + 2020-11-15T22:52:59.2704720Z Test Case '-[PointFreeTests.BlogTests testBlogShow_Unauthed]' started. + 2020-11-15T22:52:59.2734400Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 524C4D11-88DB-41EB-83AA-1049AC2AF88C [Request] GET /blog/posts/0-mock-blog-post + 2020-11-15T22:52:59.3119470Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 524C4D11-88DB-41EB-83AA-1049AC2AF88C [Time] 38ms + 2020-11-15T22:52:59.3131830Z Test Case '-[PointFreeTests.BlogTests testBlogShow_Unauthed]' passed (0.043 seconds). + 2020-11-15T22:52:59.3133030Z Test Suite 'BlogTests' passed at 2020-11-15 22:52:59.313. + 2020-11-15T22:52:59.3133470Z Executed 6 tests, with 0 failures (0 unexpected) in 0.198 (0.198) seconds + 2020-11-15T22:52:59.3134260Z Test Suite 'CancelTests' started at 2020-11-15 22:52:59.313 + 2020-11-15T22:52:59.3135210Z Test Case '-[PointFreeTests.CancelTests testCancel]' started. + 2020-11-15T22:52:59.3159360Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 82D86C3C-8343-4468-9994-1852457B3C87 [Request] POST /account/subscription/cancel + 2020-11-15T22:52:59.3624280Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 82D86C3C-8343-4468-9994-1852457B3C87 [Time] 46ms + 2020-11-15T22:52:59.3631460Z Test Case '-[PointFreeTests.CancelTests testCancel]' passed (0.050 seconds). + 2020-11-15T22:52:59.3632870Z Test Case '-[PointFreeTests.CancelTests testCancelCanceledSubscription]' started. + 2020-11-15T22:52:59.3655860Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift EC621325-9BD7-4887-81FB-70960864BC39 [Request] POST /account/subscription/cancel + 2020-11-15T22:52:59.3668500Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift EC621325-9BD7-4887-81FB-70960864BC39 [Time] 1ms + 2020-11-15T22:52:59.3675270Z Test Case '-[PointFreeTests.CancelTests testCancelCanceledSubscription]' passed (0.004 seconds). + 2020-11-15T22:52:59.3676920Z Test Case '-[PointFreeTests.CancelTests testCancelCancelingSubscription]' started. + 2020-11-15T22:52:59.3697210Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 29EE9CCE-4E59-486D-BFDA-7D7DFAAC8E3A [Request] POST /account/subscription/cancel + 2020-11-15T22:52:59.3708350Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 29EE9CCE-4E59-486D-BFDA-7D7DFAAC8E3A [Time] 1ms + 2020-11-15T22:52:59.3714150Z Test Case '-[PointFreeTests.CancelTests testCancelCancelingSubscription]' passed (0.004 seconds). + 2020-11-15T22:52:59.3715830Z Test Case '-[PointFreeTests.CancelTests testCancelEmail]' started. + 2020-11-15T22:52:59.4145000Z Test Case '-[PointFreeTests.CancelTests testCancelEmail]' passed (0.043 seconds). + 2020-11-15T22:52:59.4147290Z Test Case '-[PointFreeTests.CancelTests testCancelLoggedOut]' started. + 2020-11-15T22:52:59.4169900Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 1AA11D9F-D032-4960-AFDE-0081005B9F4A [Request] POST /account/subscription/cancel + 2020-11-15T22:52:59.4196110Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 1AA11D9F-D032-4960-AFDE-0081005B9F4A [Time] 2ms + 2020-11-15T22:52:59.4203690Z Test Case '-[PointFreeTests.CancelTests testCancelLoggedOut]' passed (0.006 seconds). + 2020-11-15T22:52:59.4206590Z Test Case '-[PointFreeTests.CancelTests testCancelNoSubscription]' started. + 2020-11-15T22:52:59.4231030Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 83546FBD-B87C-4515-9782-B0475A922C45 [Request] POST /account/subscription/cancel + 2020-11-15T22:52:59.4245270Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 83546FBD-B87C-4515-9782-B0475A922C45 [Time] 1ms + 2020-11-15T22:52:59.4251910Z Test Case '-[PointFreeTests.CancelTests testCancelNoSubscription]' passed (0.005 seconds). + 2020-11-15T22:52:59.4254010Z Test Case '-[PointFreeTests.CancelTests testCancelStripeFailure]' started. + 2020-11-15T22:52:59.4274080Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 2CAB75E2-C669-4C2A-9F18-78A7B19873D2 [Request] POST /account/subscription/cancel + 2020-11-15T22:52:59.4288690Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 2CAB75E2-C669-4C2A-9F18-78A7B19873D2 [Time] 1ms + 2020-11-15T22:52:59.4296480Z Test Case '-[PointFreeTests.CancelTests testCancelStripeFailure]' passed (0.004 seconds). + 2020-11-15T22:52:59.4297800Z Test Case '-[PointFreeTests.CancelTests testReactivate]' started. + 2020-11-15T22:52:59.4320130Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 1A4EAC50-5309-4832-95FF-FE9D100D1990 [Request] POST /account/subscription/reactivate + 2020-11-15T22:52:59.4764310Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 1A4EAC50-5309-4832-95FF-FE9D100D1990 [Time] 44ms + 2020-11-15T22:52:59.4770940Z Test Case '-[PointFreeTests.CancelTests testReactivate]' passed (0.047 seconds). + 2020-11-15T22:52:59.4772390Z Test Case '-[PointFreeTests.CancelTests testReactivateActiveSubscription]' started. + 2020-11-15T22:52:59.4796640Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 863B82F3-BFEE-4962-95D9-74035101914A [Request] POST /account/subscription/reactivate + 2020-11-15T22:52:59.4808720Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 863B82F3-BFEE-4962-95D9-74035101914A [Time] 1ms + 2020-11-15T22:52:59.4815400Z Test Case '-[PointFreeTests.CancelTests testReactivateActiveSubscription]' passed (0.004 seconds). + 2020-11-15T22:52:59.4817240Z Test Case '-[PointFreeTests.CancelTests testReactivateCanceledSubscription]' started. + 2020-11-15T22:52:59.4840510Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 45374B86-0B89-4F15-9E35-7153F37068FF [Request] POST /account/subscription/reactivate + 2020-11-15T22:52:59.4852940Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 45374B86-0B89-4F15-9E35-7153F37068FF [Time] 1ms + 2020-11-15T22:52:59.4859380Z Test Case '-[PointFreeTests.CancelTests testReactivateCanceledSubscription]' passed (0.004 seconds). + 2020-11-15T22:52:59.4862170Z Test Case '-[PointFreeTests.CancelTests testReactivateEmail]' started. + 2020-11-15T22:52:59.5302210Z Test Case '-[PointFreeTests.CancelTests testReactivateEmail]' passed (0.044 seconds). + 2020-11-15T22:52:59.5303770Z Test Case '-[PointFreeTests.CancelTests testReactivateLoggedOut]' started. + 2020-11-15T22:52:59.5327600Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 171A0030-A56E-48F3-AE68-F98698358DC6 [Request] POST /account/subscription/reactivate + 2020-11-15T22:52:59.5350310Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 171A0030-A56E-48F3-AE68-F98698358DC6 [Time] 2ms + 2020-11-15T22:52:59.5357160Z Test Case '-[PointFreeTests.CancelTests testReactivateLoggedOut]' passed (0.006 seconds). + 2020-11-15T22:52:59.5358630Z Test Case '-[PointFreeTests.CancelTests testReactivateNoSubscription]' started. + 2020-11-15T22:52:59.5381360Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift AF4C1D89-F205-4ADC-87A4-500EB983DA8F [Request] POST /account/subscription/reactivate + 2020-11-15T22:52:59.5392270Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift AF4C1D89-F205-4ADC-87A4-500EB983DA8F [Time] 1ms + 2020-11-15T22:52:59.5398410Z Test Case '-[PointFreeTests.CancelTests testReactivateNoSubscription]' passed (0.004 seconds). + 2020-11-15T22:52:59.5399930Z Test Case '-[PointFreeTests.CancelTests testReactivateStripeFailure]' started. + 2020-11-15T22:52:59.5422570Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 85FE4D10-9CFB-4BB8-A507-388C998EC77A [Request] POST /account/subscription/reactivate + 2020-11-15T22:52:59.5434340Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 85FE4D10-9CFB-4BB8-A507-388C998EC77A [Time] 1ms + 2020-11-15T22:52:59.5442740Z Test Case '-[PointFreeTests.CancelTests testReactivateStripeFailure]' passed (0.004 seconds). + 2020-11-15T22:52:59.5443930Z Test Suite 'CancelTests' passed at 2020-11-15 22:52:59.544. + 2020-11-15T22:52:59.5444370Z Executed 14 tests, with 0 failures (0 unexpected) in 0.230 (0.231) seconds + 2020-11-15T22:52:59.5445380Z Test Suite 'ChangeEmailConfirmationTests' started at 2020-11-15 22:52:59.544 + 2020-11-15T22:52:59.5449460Z Test Case '-[PointFreeTests.ChangeEmailConfirmationTests testChangedEmail]' started. + 2020-11-15T22:52:59.5911320Z Test Case '-[PointFreeTests.ChangeEmailConfirmationTests testChangedEmail]' passed (0.046 seconds). + 2020-11-15T22:52:59.5919700Z Test Case '-[PointFreeTests.ChangeEmailConfirmationTests testChangeEmailConfirmationEmail]' started. + 2020-11-15T22:52:59.6403770Z Test Case '-[PointFreeTests.ChangeEmailConfirmationTests testChangeEmailConfirmationEmail]' passed (0.049 seconds). + 2020-11-15T22:52:59.6405530Z Test Suite 'ChangeEmailConfirmationTests' passed at 2020-11-15 22:52:59.640. + 2020-11-15T22:52:59.6406480Z Executed 2 tests, with 0 failures (0 unexpected) in 0.095 (0.096) seconds + 2020-11-15T22:52:59.6407370Z Test Suite 'ChangeTests' started at 2020-11-15 22:52:59.640 + 2020-11-15T22:52:59.6408640Z Test Case '-[PointFreeTests.ChangeTests testChangeRedirect]' started. + 2020-11-15T22:52:59.6429840Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 2FECC484-2F4F-4BB3-97B0-F57767C49D80 [Request] GET /account/subscription/change + 2020-11-15T22:52:59.6440830Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 2FECC484-2F4F-4BB3-97B0-F57767C49D80 [Time] 1ms + 2020-11-15T22:52:59.6447210Z Test Case '-[PointFreeTests.ChangeTests testChangeRedirect]' passed (0.004 seconds). + 2020-11-15T22:52:59.6448840Z Test Case '-[PointFreeTests.ChangeTests testChangeUpdateAddSeatsIndividualPlan]' started. + 2020-11-15T22:52:59.6487410Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 A2F33E18-E9FD-4B75-AFEA-A4AF914018AC [Request] POST /account/subscription/change + 2020-11-15T22:52:59.6525010Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift A2F33E18-E9FD-4B75-AFEA-A4AF914018AC [Time] 3ms + 2020-11-15T22:52:59.6532740Z Test Case '-[PointFreeTests.ChangeTests testChangeUpdateAddSeatsIndividualPlan]' passed (0.008 seconds). + 2020-11-15T22:52:59.6534510Z Test Case '-[PointFreeTests.ChangeTests testChangeUpdateAddSeatsTeamPlan]' started. + 2020-11-15T22:52:59.6565070Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 6FAB1D54-6B92-425F-8005-2CAE06ADAC00 [Request] POST /account/subscription/change + 2020-11-15T22:52:59.6587230Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 6FAB1D54-6B92-425F-8005-2CAE06ADAC00 [Time] 2ms + 2020-11-15T22:52:59.6598730Z Test Case '-[PointFreeTests.ChangeTests testChangeUpdateAddSeatsTeamPlan]' passed (0.007 seconds). + 2020-11-15T22:52:59.6601160Z Test Case '-[PointFreeTests.ChangeTests testChangeUpdateDowngradeIndividualPlan]' started. + 2020-11-15T22:52:59.6634390Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift ACF904E0-6BDC-4A17-B4F7-4F497854FDDB [Request] POST /account/subscription/change + 2020-11-15T22:52:59.6656910Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift ACF904E0-6BDC-4A17-B4F7-4F497854FDDB [Time] 2ms + 2020-11-15T22:52:59.6668130Z Test Case '-[PointFreeTests.ChangeTests testChangeUpdateDowngradeIndividualPlan]' passed (0.007 seconds). + 2020-11-15T22:52:59.6669950Z Test Case '-[PointFreeTests.ChangeTests testChangeUpdateDowngradeTeamPlan]' started. + 2020-11-15T22:52:59.6707020Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 36E21F8B-2DDE-44CE-85F7-6258CBF5E856 [Request] POST /account/subscription/change + 2020-11-15T22:52:59.6733150Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 36E21F8B-2DDE-44CE-85F7-6258CBF5E856 [Time] 2ms + 2020-11-15T22:52:59.6740180Z Test Case '-[PointFreeTests.ChangeTests testChangeUpdateDowngradeTeamPlan]' passed (0.007 seconds). + 2020-11-15T22:52:59.6741970Z Test Case '-[PointFreeTests.ChangeTests testChangeUpdateRemoveSeats]' started. + 2020-11-15T22:52:59.6778860Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 0255A954-CB06-4582-B0F0-1D11AFF16474 [Request] POST /account/subscription/change + 2020-11-15T22:52:59.6798670Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 0255A954-CB06-4582-B0F0-1D11AFF16474 [Time] 2ms + 2020-11-15T22:52:59.6804310Z Test Case '-[PointFreeTests.ChangeTests testChangeUpdateRemoveSeats]' passed (0.006 seconds). + 2020-11-15T22:52:59.6806650Z Test Case '-[PointFreeTests.ChangeTests testChangeUpdateRemoveSeatsInvalidNumber]' started. + 2020-11-15T22:52:59.6836780Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 4B90232D-99D5-4F9C-995A-BE812B959E59 [Request] POST /account/subscription/change + 2020-11-15T22:52:59.6861590Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 4B90232D-99D5-4F9C-995A-BE812B959E59 [Time] 2ms + 2020-11-15T22:52:59.6870940Z Test Case '-[PointFreeTests.ChangeTests testChangeUpdateRemoveSeatsInvalidNumber]' passed (0.007 seconds). + 2020-11-15T22:52:59.6873150Z Test Case '-[PointFreeTests.ChangeTests testChangeUpdateUpgradeIndividualPlan]' started. + 2020-11-15T22:52:59.6909940Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 45D65333-9884-4718-AD90-66D7BB3C0A70 [Request] POST /account/subscription/change + 2020-11-15T22:52:59.6933170Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 45D65333-9884-4718-AD90-66D7BB3C0A70 [Time] 2ms + 2020-11-15T22:52:59.6939940Z Test Case '-[PointFreeTests.ChangeTests testChangeUpdateUpgradeIndividualPlan]' passed (0.007 seconds). + 2020-11-15T22:52:59.6942050Z Test Case '-[PointFreeTests.ChangeTests testChangeUpdateUpgradeTeamPlan]' started. + 2020-11-15T22:52:59.6972640Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 C54693E3-8294-407C-BF02-C93D43FB9127 [Request] POST /account/subscription/change + 2020-11-15T22:52:59.6991900Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift C54693E3-8294-407C-BF02-C93D43FB9127 [Time] 1ms + 2020-11-15T22:52:59.6998750Z Test Case '-[PointFreeTests.ChangeTests testChangeUpdateUpgradeTeamPlan]' passed (0.006 seconds). + 2020-11-15T22:52:59.7001220Z Test Case '-[PointFreeTests.ChangeTests testChangeUpgradeIndividualMonthlyToTeamYearly]' started. + 2020-11-15T22:52:59.7034460Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 6A5CC337-5371-4666-B833-014FFF5B137A [Request] POST /account/subscription/change + 2020-11-15T22:52:59.7054090Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 6A5CC337-5371-4666-B833-014FFF5B137A [Time] 2ms + 2020-11-15T22:52:59.7065870Z Test Case '-[PointFreeTests.ChangeTests testChangeUpgradeIndividualMonthlyToTeamYearly]' passed (0.006 seconds). + 2020-11-15T22:52:59.7067460Z Test Suite 'ChangeTests' passed at 2020-11-15 22:52:59.706. + 2020-11-15T22:52:59.7067910Z Executed 10 tests, with 0 failures (0 unexpected) in 0.065 (0.066) seconds + 2020-11-15T22:52:59.7068760Z Test Suite 'CollectionTests' started at 2020-11-15 22:52:59.706 + 2020-11-15T22:52:59.7069770Z Test Case '-[ModelsTests.CollectionTests testAllCollections]' started. + 2020-11-15T22:52:59.7071050Z Test Case '-[ModelsTests.CollectionTests testAllCollections]' passed (0.001 seconds). + 2020-11-15T22:52:59.7072390Z Test Suite 'CollectionTests' passed at 2020-11-15 22:52:59.707. + 2020-11-15T22:52:59.7072890Z Executed 1 test, with 0 failures (0 unexpected) in 0.001 (0.001) seconds + 2020-11-15T22:52:59.7073770Z Test Suite 'CollectionsTests' started at 2020-11-15 22:52:59.707 + 2020-11-15T22:52:59.7074850Z Test Case '-[PointFreeTests.CollectionsTests testCollectionIndex]' started. + 2020-11-15T22:52:59.7106290Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 9EC7FFAC-0D8A-4F71-8EAB-1B0FE3D6DC28 [Request] GET /collections + 2020-11-15T22:52:59.7518580Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 9EC7FFAC-0D8A-4F71-8EAB-1B0FE3D6DC28 [Time] 41ms + 2020-11-15T22:52:59.7530710Z Test Case '-[PointFreeTests.CollectionsTests testCollectionIndex]' passed (0.046 seconds). + 2020-11-15T22:52:59.7532440Z Test Case '-[PointFreeTests.CollectionsTests testCollectionSection]' started. + 2020-11-15T22:52:59.7568620Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 FCEF0A90-09C5-4EAB-85CE-882D54722AF0 [Request] GET /collections/functions/functions-that-begin-with-b + 2020-11-15T22:52:59.8052310Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift FCEF0A90-09C5-4EAB-85CE-882D54722AF0 [Time] 48ms + 2020-11-15T22:52:59.8062810Z Test Case '-[PointFreeTests.CollectionsTests testCollectionSection]' passed (0.053 seconds). + 2020-11-15T22:52:59.8064590Z Test Case '-[PointFreeTests.CollectionsTests testCollectionShow]' started. + 2020-11-15T22:52:59.8092170Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 1B3580C3-83B7-423C-8DCD-286103EC7801 [Request] GET /collections/functions + 2020-11-15T22:52:59.8914980Z 2020-11-15T22:52:59+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 1B3580C3-83B7-423C-8DCD-286103EC7801 [Time] 82ms + 2020-11-15T22:52:59.8964270Z Test Case '-[PointFreeTests.CollectionsTests testCollectionShow]' passed (0.087 seconds). + 2020-11-15T22:52:59.8965490Z Test Suite 'CollectionsTests' passed at 2020-11-15 22:52:59.894. + 2020-11-15T22:52:59.8977670Z Executed 3 tests, with 0 failures (0 unexpected) in 0.187 (0.187) seconds + 2020-11-15T22:52:59.8979420Z Test Suite 'DatabaseTests' started at 2020-11-15 22:52:59.894 + 2020-11-15T22:52:59.9081890Z Test Case '-[PointFreeTests.DatabaseTests testCreateSubscription_OwnerIsNotTakingSeat]' started. + 2020-11-15T22:52:59.9183680Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:52:59.9204880Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:52:59.9209870Z drop cascades to extension uuid-ossp + 2020-11-15T22:52:59.9241110Z drop cascades to extension citext + 2020-11-15T22:52:59.9242380Z drop cascades to table users + 2020-11-15T22:52:59.9248400Z drop cascades to table subscriptions + 2020-11-15T22:52:59.9252980Z drop cascades to table team_invites + 2020-11-15T22:52:59.9253890Z drop cascades to table email_settings + 2020-11-15T22:52:59.9258020Z drop cascades to table episode_credits + 2020-11-15T22:52:59.9258700Z drop cascades to table feed_request_events + 2020-11-15T22:52:59.9259350Z drop cascades to function update_updated_at() + 2020-11-15T22:52:59.9260000Z drop cascades to table enterprise_accounts + 2020-11-15T22:52:59.9260510Z drop cascades to table enterprise_emails + 2020-11-15T22:52:59.9261000Z drop cascades to table episode_progresses + 2020-11-15T22:52:59.9261610Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:52:59.9262440Z drop cascades to sequence test_uuids + 2020-11-15T22:52:59.9262940Z drop cascades to sequence test_shortids + 2020-11-15T22:53:00.9327130Z Test Case '-[PointFreeTests.DatabaseTests testCreateSubscription_OwnerIsNotTakingSeat]' passed (1.039 seconds). + 2020-11-15T22:53:00.9328970Z Test Case '-[PointFreeTests.DatabaseTests testCreateSubscription_OwnerIsTakingSeat]' started. + 2020-11-15T22:53:00.9455450Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:00.9456000Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:00.9457160Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:00.9457550Z drop cascades to extension citext + 2020-11-15T22:53:00.9457880Z drop cascades to table users + 2020-11-15T22:53:00.9458240Z drop cascades to table subscriptions + 2020-11-15T22:53:00.9458610Z drop cascades to table team_invites + 2020-11-15T22:53:00.9459500Z drop cascades to table email_settings + 2020-11-15T22:53:00.9459870Z drop cascades to table episode_credits + 2020-11-15T22:53:00.9460230Z drop cascades to table feed_request_events + 2020-11-15T22:53:00.9460620Z drop cascades to function update_updated_at() + 2020-11-15T22:53:00.9461020Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:00.9461420Z drop cascades to table enterprise_emails + 2020-11-15T22:53:00.9461800Z drop cascades to table episode_progresses + 2020-11-15T22:53:00.9462210Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:00.9462580Z drop cascades to sequence test_uuids + 2020-11-15T22:53:00.9462940Z drop cascades to sequence test_shortids + 2020-11-15T22:53:02.0174470Z Test Case '-[PointFreeTests.DatabaseTests testCreateSubscription_OwnerIsTakingSeat]' passed (1.085 seconds). + 2020-11-15T22:53:02.0177180Z Test Case '-[PointFreeTests.DatabaseTests testFetchEnterpriseAccount]' started. + 2020-11-15T22:53:02.0304780Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:02.0305300Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:02.0306510Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:02.0306890Z drop cascades to extension citext + 2020-11-15T22:53:02.0307230Z drop cascades to table users + 2020-11-15T22:53:02.0307570Z drop cascades to table subscriptions + 2020-11-15T22:53:02.0307950Z drop cascades to table team_invites + 2020-11-15T22:53:02.0308310Z drop cascades to table email_settings + 2020-11-15T22:53:02.0308680Z drop cascades to table episode_credits + 2020-11-15T22:53:02.0309050Z drop cascades to table feed_request_events + 2020-11-15T22:53:02.0309450Z drop cascades to function update_updated_at() + 2020-11-15T22:53:02.0309850Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:02.0310240Z drop cascades to table enterprise_emails + 2020-11-15T22:53:02.0310640Z drop cascades to table episode_progresses + 2020-11-15T22:53:02.0311050Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:02.0311450Z drop cascades to sequence test_uuids + 2020-11-15T22:53:02.0311820Z drop cascades to sequence test_shortids + 2020-11-15T22:53:03.2423680Z Test Case '-[PointFreeTests.DatabaseTests testFetchEnterpriseAccount]' passed (1.225 seconds). + 2020-11-15T22:53:03.2425910Z Test Case '-[PointFreeTests.DatabaseTests testFetchEpisodeProgress_NoProgress]' started. + 2020-11-15T22:53:03.2567960Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:03.2568510Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:03.2569730Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:03.2570110Z drop cascades to extension citext + 2020-11-15T22:53:03.2570450Z drop cascades to table users + 2020-11-15T22:53:03.2570800Z drop cascades to table subscriptions + 2020-11-15T22:53:03.2571160Z drop cascades to table team_invites + 2020-11-15T22:53:03.2571520Z drop cascades to table email_settings + 2020-11-15T22:53:03.2571890Z drop cascades to table episode_credits + 2020-11-15T22:53:03.2572260Z drop cascades to table feed_request_events + 2020-11-15T22:53:03.2572670Z drop cascades to function update_updated_at() + 2020-11-15T22:53:03.2573080Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:03.2573480Z drop cascades to table enterprise_emails + 2020-11-15T22:53:03.2573860Z drop cascades to table episode_progresses + 2020-11-15T22:53:03.2574290Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:03.2575120Z drop cascades to sequence test_uuids + 2020-11-15T22:53:03.2575530Z drop cascades to sequence test_shortids + 2020-11-15T22:53:04.2970790Z Test Case '-[PointFreeTests.DatabaseTests testFetchEpisodeProgress_NoProgress]' passed (1.055 seconds). + 2020-11-15T22:53:04.2972390Z Test Case '-[PointFreeTests.DatabaseTests testFetchEpisodeProgress]' started. + 2020-11-15T22:53:04.3104830Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:04.3105370Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:04.3106570Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:04.3106960Z drop cascades to extension citext + 2020-11-15T22:53:04.3107790Z drop cascades to table users + 2020-11-15T22:53:04.3108140Z drop cascades to table subscriptions + 2020-11-15T22:53:04.3108520Z drop cascades to table team_invites + 2020-11-15T22:53:04.3108860Z drop cascades to table email_settings + 2020-11-15T22:53:04.3109230Z drop cascades to table episode_credits + 2020-11-15T22:53:04.3109600Z drop cascades to table feed_request_events + 2020-11-15T22:53:04.3110010Z drop cascades to function update_updated_at() + 2020-11-15T22:53:04.3110420Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:04.3110950Z drop cascades to table enterprise_emails + 2020-11-15T22:53:04.3111360Z drop cascades to table episode_progresses + 2020-11-15T22:53:04.3111770Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:04.3112160Z drop cascades to sequence test_uuids + 2020-11-15T22:53:04.3112530Z drop cascades to sequence test_shortids + 2020-11-15T22:53:05.3632500Z Test Case '-[PointFreeTests.DatabaseTests testFetchEpisodeProgress]' passed (1.066 seconds). + 2020-11-15T22:53:05.3634400Z Test Case '-[PointFreeTests.DatabaseTests testUpdateEpisodeProgress]' started. + 2020-11-15T22:53:05.3766850Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:05.3767640Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:05.3769100Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:05.3769690Z drop cascades to extension citext + 2020-11-15T22:53:05.3770220Z drop cascades to table users + 2020-11-15T22:53:05.3770750Z drop cascades to table subscriptions + 2020-11-15T22:53:05.3771280Z drop cascades to table team_invites + 2020-11-15T22:53:05.3771800Z drop cascades to table email_settings + 2020-11-15T22:53:05.3772330Z drop cascades to table episode_credits + 2020-11-15T22:53:05.3772880Z drop cascades to table feed_request_events + 2020-11-15T22:53:05.3773440Z drop cascades to function update_updated_at() + 2020-11-15T22:53:05.3774010Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:05.3774570Z drop cascades to table enterprise_emails + 2020-11-15T22:53:05.3775130Z drop cascades to table episode_progresses + 2020-11-15T22:53:05.3775720Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:05.3776280Z drop cascades to sequence test_uuids + 2020-11-15T22:53:05.3776800Z drop cascades to sequence test_shortids + 2020-11-15T22:53:06.5725910Z Test Case '-[PointFreeTests.DatabaseTests testUpdateEpisodeProgress]' passed (1.209 seconds). + 2020-11-15T22:53:06.5727780Z Test Case '-[PointFreeTests.DatabaseTests testUpsertUser_FetchUserById]' started. + 2020-11-15T22:53:06.5856580Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:06.5857310Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:06.5858770Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:06.5859160Z drop cascades to extension citext + 2020-11-15T22:53:06.5859610Z drop cascades to table users + 2020-11-15T22:53:06.5860270Z drop cascades to table subscriptions + 2020-11-15T22:53:06.5860840Z drop cascades to table team_invites + 2020-11-15T22:53:06.5861380Z drop cascades to table email_settings + 2020-11-15T22:53:06.5861930Z drop cascades to table episode_credits + 2020-11-15T22:53:06.5862510Z drop cascades to table feed_request_events + 2020-11-15T22:53:06.5863090Z drop cascades to function update_updated_at() + 2020-11-15T22:53:06.5863670Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:06.5864260Z drop cascades to table enterprise_emails + 2020-11-15T22:53:06.5865200Z drop cascades to table episode_progresses + 2020-11-15T22:53:06.5865880Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:06.5866460Z drop cascades to sequence test_uuids + 2020-11-15T22:53:06.5867020Z drop cascades to sequence test_shortids + 2020-11-15T22:53:07.4631700Z Test Case '-[PointFreeTests.DatabaseTests testUpsertUser_FetchUserById]' passed (0.891 seconds). + 2020-11-15T22:53:07.4632920Z Test Suite 'DatabaseTests' passed at 2020-11-15 22:53:07.463. + 2020-11-15T22:53:07.4633380Z Executed 7 tests, with 0 failures (0 unexpected) in 7.569 (7.569) seconds + 2020-11-15T22:53:07.4634190Z Test Suite 'DiscountsTests' started at 2020-11-15 22:53:07.463 + 2020-11-15T22:53:07.4635700Z Test Case '-[PointFreeTests.DiscountsTests testDiscounts_LoggedIn_5DollarsOff_Forever]' started. + 2020-11-15T22:53:07.4654380Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 74EE5FA9-94C2-492B-922C-68621E5E9EA3 [Request] GET /discounts/blobfest + 2020-11-15T22:53:07.5096000Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 74EE5FA9-94C2-492B-922C-68621E5E9EA3 [Time] 44ms + 2020-11-15T22:53:07.5104140Z Test Case '-[PointFreeTests.DiscountsTests testDiscounts_LoggedIn_5DollarsOff_Forever]' passed (0.047 seconds). + 2020-11-15T22:53:07.5105630Z Test Case '-[PointFreeTests.DiscountsTests testDiscounts_LoggedIn_5DollarsOff_Once]' started. + 2020-11-15T22:53:07.5124520Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 9C5E7548-D0FD-4B08-929D-AB5CC4B1F5EA [Request] GET /discounts/blobfest + 2020-11-15T22:53:07.5496710Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 9C5E7548-D0FD-4B08-929D-AB5CC4B1F5EA [Time] 37ms + 2020-11-15T22:53:07.5505210Z Test Case '-[PointFreeTests.DiscountsTests testDiscounts_LoggedIn_5DollarsOff_Once]' passed (0.040 seconds). + 2020-11-15T22:53:07.5506740Z Test Case '-[PointFreeTests.DiscountsTests testDiscounts_LoggedIn_5DollarsOff_Repeating]' started. + 2020-11-15T22:53:07.5525560Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 E62BAB02-0A27-4111-90FC-5C0627C8E14B [Request] GET /discounts/blobfest + 2020-11-15T22:53:07.5910860Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 E62BAB02-0A27-4111-90FC-5C0627C8E14B [Time] 38ms + 2020-11-15T22:53:07.5918900Z Test Case '-[PointFreeTests.DiscountsTests testDiscounts_LoggedIn_5DollarsOff_Repeating]' passed (0.041 seconds). + 2020-11-15T22:53:07.5920530Z Test Case '-[PointFreeTests.DiscountsTests testDiscounts_LoggedIn_PercentOff_Forever]' started. + 2020-11-15T22:53:07.5937860Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift D9ECE82A-5BC0-4CB6-92A0-5E619D27AE77 [Request] GET /discounts/blobfest + 2020-11-15T22:53:07.6326530Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift D9ECE82A-5BC0-4CB6-92A0-5E619D27AE77 [Time] 38ms + 2020-11-15T22:53:07.6437240Z Test Case '-[PointFreeTests.DiscountsTests testDiscounts_LoggedIn_PercentOff_Forever]' passed (0.042 seconds). + 2020-11-15T22:53:07.6439470Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 DB34E2F0-7317-45F1-AE03-EAB3450B59EF [Request] GET /discounts/blobfest + 2020-11-15T22:53:07.6441500Z Test Case '-[PointFreeTests.DiscountsTests testDiscounts_LoggedIn_PercentOff_Once]' started. + 2020-11-15T22:53:07.6807570Z Test Case '-[PointFreeTests.DiscountsTests testDiscounts_LoggedIn_PercentOff_Once]' passed (0.046 seconds). + 2020-11-15T22:53:07.6810360Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift DB34E2F0-7317-45F1-AE03-EAB3450B59EF [Time] 42ms + 2020-11-15T22:53:07.6818980Z Test Case '-[PointFreeTests.DiscountsTests testDiscounts_LoggedIn_PercentOff_Repeating]' started. + 2020-11-15T22:53:07.6821020Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 09D4C8FD-C363-43BD-8A13-6B41C8EB20DF [Request] GET /discounts/blobfest + 2020-11-15T22:53:07.7220320Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 09D4C8FD-C363-43BD-8A13-6B41C8EB20DF [Time] 40ms + 2020-11-15T22:53:07.7228200Z Test Case '-[PointFreeTests.DiscountsTests testDiscounts_LoggedIn_PercentOff_Repeating]' passed (0.043 seconds). + 2020-11-15T22:53:07.7230050Z Test Case '-[PointFreeTests.DiscountsTests testDiscounts_LoggedOut]' started. + 2020-11-15T22:53:07.7251120Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 56157898-6AE6-4D04-8AAA-1D4C3AE60BD0 [Request] GET /discounts/blobfest + 2020-11-15T22:53:07.7717430Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 56157898-6AE6-4D04-8AAA-1D4C3AE60BD0 [Time] 46ms + 2020-11-15T22:53:07.7819600Z Test Case '-[PointFreeTests.DiscountsTests testDiscounts_LoggedOut]' passed (0.050 seconds). + 2020-11-15T22:53:07.7822180Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 4C53416A-616F-4DFB-8B14-03EF5D9E9D75 [Request] GET /discounts/regional-discount + 2020-11-15T22:53:07.7831370Z Test Case '-[PointFreeTests.DiscountsTests testDiscounts_UsingRegionalCouponId]' started. + 2020-11-15T22:53:07.7833360Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 4C53416A-616F-4DFB-8B14-03EF5D9E9D75 [Time] 1ms + 2020-11-15T22:53:07.7836550Z Test Case '-[PointFreeTests.DiscountsTests testDiscounts_UsingRegionalCouponId]' passed (0.003 seconds). + 2020-11-15T22:53:07.7897200Z Test Suite 'DiscountsTests' passed at 2020-11-15 22:53:07.776. + 2020-11-15T22:53:07.7901220Z Executed 8 tests, with 0 failures (0 unexpected) in 0.313 (0.313) seconds + 2020-11-15T22:53:07.7902500Z Test Suite 'EitherIOTests' started at 2020-11-15 22:53:07.776 + 2020-11-15T22:53:07.7906000Z Test Case '-[PointFreeTests.EitherIOTests testRetry_Fails]' started. + 2020-11-15T22:53:07.7910850Z Test Case '-[PointFreeTests.EitherIOTests testRetry_Fails]' passed (0.002 seconds). + 2020-11-15T22:53:07.7914570Z Test Case '-[PointFreeTests.EitherIOTests testRetry_MaxRetriesZero_Failure]' started. + 2020-11-15T22:53:07.7916170Z Test Case '-[PointFreeTests.EitherIOTests testRetry_MaxRetriesZero_Failure]' passed (0.001 seconds). + 2020-11-15T22:53:07.7917530Z Test Case '-[PointFreeTests.EitherIOTests testRetry_MaxRetriesZero_Success]' started. + 2020-11-15T22:53:07.7918880Z Test Case '-[PointFreeTests.EitherIOTests testRetry_MaxRetriesZero_Success]' passed (0.001 seconds). + 2020-11-15T22:53:07.7920130Z Test Case '-[PointFreeTests.EitherIOTests testRetry_Succeeds]' started. + 2020-11-15T22:53:07.7921330Z Test Case '-[PointFreeTests.EitherIOTests testRetry_Succeeds]' passed (0.002 seconds). + 2020-11-15T22:53:07.7922310Z Test Suite 'EitherIOTests' passed at 2020-11-15 22:53:07.782. + 2020-11-15T22:53:07.7922780Z Executed 4 tests, with 0 failures (0 unexpected) in 0.006 (0.006) seconds + 2020-11-15T22:53:07.7923870Z Test Suite 'EmailInviteTests' started at 2020-11-15 22:53:07.783 + 2020-11-15T22:53:07.7925000Z Test Case '-[PointFreeTests.EmailInviteTests testEmailInvite]' started. + 2020-11-15T22:53:07.8329400Z Test Case '-[PointFreeTests.EmailInviteTests testEmailInvite]' passed (0.050 seconds). + 2020-11-15T22:53:07.8364010Z Test Case '-[PointFreeTests.EmailInviteTests testInviteAcceptance]' started. + 2020-11-15T22:53:07.8770750Z Test Case '-[PointFreeTests.EmailInviteTests testInviteAcceptance]' passed (0.044 seconds). + 2020-11-15T22:53:07.8778640Z Test Suite 'EmailInviteTests' passed at 2020-11-15 22:53:07.877. + 2020-11-15T22:53:07.8792380Z Executed 2 tests, with 0 failures (0 unexpected) in 0.094 (0.094) seconds + 2020-11-15T22:53:07.8794160Z Test Suite 'EnterpriseTests' started at 2020-11-15 22:53:07.877 + 2020-11-15T22:53:07.8795330Z Test Case '-[PointFreeTests.EnterpriseTests testAcceptInvitation_BadEmail]' started. + 2020-11-15T22:53:07.8821440Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 DEED92C1-BA68-4C1D-B0C5-9DB2B9DA44A5 [Request] GET /enterprise/pointfree.co/accept + 2020-11-15T22:53:07.8853450Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift DEED92C1-BA68-4C1D-B0C5-9DB2B9DA44A5 [Time] 3ms + 2020-11-15T22:53:07.8859140Z Test Case '-[PointFreeTests.EnterpriseTests testAcceptInvitation_BadEmail]' passed (0.009 seconds). + 2020-11-15T22:53:07.8864610Z Test Case '-[PointFreeTests.EnterpriseTests testAcceptInvitation_BadUserId]' started. + 2020-11-15T22:53:07.8900670Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 923EA30D-6C73-467B-99EF-C5324C9EDC23 [Request] GET /enterprise/pointfree.co/accept + 2020-11-15T22:53:07.8932110Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 923EA30D-6C73-467B-99EF-C5324C9EDC23 [Time] 3ms + 2020-11-15T22:53:07.8944680Z Test Case '-[PointFreeTests.EnterpriseTests testAcceptInvitation_BadUserId]' passed (0.008 seconds). + 2020-11-15T22:53:07.8960510Z Test Case '-[PointFreeTests.EnterpriseTests testAcceptInvitation_EmailDoesntMatchEnterpriseDomain]' started. + 2020-11-15T22:53:07.8988760Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 3B5F1F62-C060-475D-A554-AE05EE0F241D [Request] GET /enterprise/pointfree.co/accept + 2020-11-15T22:53:07.9013300Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 3B5F1F62-C060-475D-A554-AE05EE0F241D [Time] 2ms + 2020-11-15T22:53:07.9019870Z Test Case '-[PointFreeTests.EnterpriseTests testAcceptInvitation_EmailDoesntMatchEnterpriseDomain]' passed (0.008 seconds). + 2020-11-15T22:53:07.9024700Z Test Case '-[PointFreeTests.EnterpriseTests testAcceptInvitation_EnterpriseAccountDoesntExist]' started. + 2020-11-15T22:53:07.9066460Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 3492A11E-3325-471D-802D-C7E7D1F41683 [Request] GET /enterprise/pointfree.co/accept + 2020-11-15T22:53:07.9080910Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 3492A11E-3325-471D-802D-C7E7D1F41683 [Time] 1ms + 2020-11-15T22:53:07.9089960Z Test Case '-[PointFreeTests.EnterpriseTests testAcceptInvitation_EnterpriseAccountDoesntExist]' passed (0.007 seconds). + 2020-11-15T22:53:07.9091930Z Test Case '-[PointFreeTests.EnterpriseTests testAcceptInvitation_HappyPath]' started. + 2020-11-15T22:53:07.9137720Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 CBD4AED7-F7FB-473E-AAF3-6B4A76B7012B [Request] GET /enterprise/pointfree.co/accept + 2020-11-15T22:53:07.9164170Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 CBD4AED7-F7FB-473E-AAF3-6B4A76B7012B [Time] 2ms + 2020-11-15T22:53:07.9170350Z Test Case '-[PointFreeTests.EnterpriseTests testAcceptInvitation_HappyPath]' passed (0.008 seconds). + 2020-11-15T22:53:07.9176330Z Test Case '-[PointFreeTests.EnterpriseTests testAcceptInvitation_LoggedOut]' started. + 2020-11-15T22:53:07.9204160Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 39B4B7CE-3678-407B-8450-190434C6CA56 [Request] GET /enterprise/blob.biz/accept + 2020-11-15T22:53:07.9232450Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 39B4B7CE-3678-407B-8450-190434C6CA56 [Time] 2ms + 2020-11-15T22:53:07.9240540Z Test Case '-[PointFreeTests.EnterpriseTests testAcceptInvitation_LoggedOut]' passed (0.007 seconds). + 2020-11-15T22:53:07.9244020Z Test Case '-[PointFreeTests.EnterpriseTests testAcceptInvitation_RequesterUserDoesntMatchAccepterUserId]' started. + 2020-11-15T22:53:07.9295440Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 BBB27205-3A6F-4DE3-95C8-3DAA16DA4F79 [Request] GET /enterprise/pointfree.co/accept + 2020-11-15T22:53:07.9405030Z Test Case '-[PointFreeTests.EnterpriseTests testAcceptInvitation_RequesterUserDoesntMatchAccepterUserId]' passed (0.010 seconds). + 2020-11-15T22:53:07.9407450Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift BBB27205-3A6F-4DE3-95C8-3DAA16DA4F79 [Time] 3ms + 2020-11-15T22:53:07.9410850Z Test Case '-[PointFreeTests.EnterpriseTests testLanding_AlreadySubscribedToEnterprise]' started. + 2020-11-15T22:53:07.9419360Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 5790FE95-187F-4B6B-BFFE-97364B4CC9DF [Request] GET /enterprise/blob.biz + 2020-11-15T22:53:07.9738210Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 5790FE95-187F-4B6B-BFFE-97364B4CC9DF [Time] 35ms + 2020-11-15T22:53:07.9744410Z Test Case '-[PointFreeTests.EnterpriseTests testLanding_AlreadySubscribedToEnterprise]' passed (0.040 seconds). + 2020-11-15T22:53:07.9746420Z Test Case '-[PointFreeTests.EnterpriseTests testLanding_LoggedOut]' started. + 2020-11-15T22:53:07.9784110Z 2020-11-15T22:53:07+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 60E2D94B-575E-4096-AA17-AE3ECC63B758 [Request] GET /enterprise/blob.biz + 2020-11-15T22:53:08.0130660Z 2020-11-15T22:53:08+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 60E2D94B-575E-4096-AA17-AE3ECC63B758 [Time] 35ms + 2020-11-15T22:53:08.0141070Z Test Case '-[PointFreeTests.EnterpriseTests testLanding_LoggedOut]' passed (0.040 seconds). + 2020-11-15T22:53:08.0142630Z Test Case '-[PointFreeTests.EnterpriseTests testLanding_NonExistentEnterpriseAccount]' started. + 2020-11-15T22:53:08.0171450Z 2020-11-15T22:53:08+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift C0968921-1618-45FD-9DD9-6DBF282B2EB8 [Request] GET /enterprise/blob.biz + 2020-11-15T22:53:08.0182880Z 2020-11-15T22:53:08+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift C0968921-1618-45FD-9DD9-6DBF282B2EB8 [Time] 1ms + 2020-11-15T22:53:08.0189730Z Test Case '-[PointFreeTests.EnterpriseTests testLanding_NonExistentEnterpriseAccount]' passed (0.005 seconds). + 2020-11-15T22:53:08.0191090Z Test Suite 'EnterpriseTests' passed at 2020-11-15 22:53:08.019. + 2020-11-15T22:53:08.0191700Z Executed 10 tests, with 0 failures (0 unexpected) in 0.141 (0.142) seconds + 2020-11-15T22:53:08.0193040Z Test Suite 'EnvVarTests' started at 2020-11-15 22:53:08.019 + 2020-11-15T22:53:08.0193970Z Test Case '-[PointFreeTests.EnvVarTests testDecoding]' started. + 2020-11-15T22:53:08.0226490Z Test Case '-[PointFreeTests.EnvVarTests testDecoding]' passed (0.004 seconds). + 2020-11-15T22:53:08.0228080Z Test Suite 'EnvVarTests' passed at 2020-11-15 22:53:08.023. + 2020-11-15T22:53:08.0228550Z Executed 1 test, with 0 failures (0 unexpected) in 0.004 (0.004) seconds + 2020-11-15T22:53:08.0229430Z Test Suite 'EnvironmentTests' started at 2020-11-15 22:53:08.023 + 2020-11-15T22:53:08.0230640Z Test Case '-[PointFreeTests.EnvironmentTests testDefault]' started. + 2020-11-15T22:53:08.0244880Z Test Case '-[PointFreeTests.EnvironmentTests testDefault]' passed (0.002 seconds). + 2020-11-15T22:53:08.0246180Z Test Suite 'EnvironmentTests' passed at 2020-11-15 22:53:08.024. + 2020-11-15T22:53:08.0246670Z Executed 1 test, with 0 failures (0 unexpected) in 0.002 (0.002) seconds + 2020-11-15T22:53:08.0247740Z Test Suite 'EpisodePageIntegrationTests' started at 2020-11-15 22:53:08.024 + 2020-11-15T22:53:08.0249340Z Test Case '-[PointFreeTests.EpisodePageIntegrationTests testRedeemEpisodeCredit_AlreadyCredited]' started. + 2020-11-15T22:53:08.0380080Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:08.0380590Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:08.0381710Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:08.0382080Z drop cascades to extension citext + 2020-11-15T22:53:08.0382410Z drop cascades to table users + 2020-11-15T22:53:08.0382790Z drop cascades to table subscriptions + 2020-11-15T22:53:08.0383160Z drop cascades to table team_invites + 2020-11-15T22:53:08.0383510Z drop cascades to table email_settings + 2020-11-15T22:53:08.0383880Z drop cascades to table episode_credits + 2020-11-15T22:53:08.0384260Z drop cascades to table feed_request_events + 2020-11-15T22:53:08.0384640Z drop cascades to function update_updated_at() + 2020-11-15T22:53:08.0385140Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:08.0385620Z drop cascades to table enterprise_emails + 2020-11-15T22:53:08.0386020Z drop cascades to table episode_progresses + 2020-11-15T22:53:08.0386430Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:08.0386840Z drop cascades to sequence test_uuids + 2020-11-15T22:53:08.0387200Z drop cascades to sequence test_shortids + 2020-11-15T22:53:09.1314940Z 2020-11-15T22:53:09+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 6F3F6519-3827-4B17-915C-78A7A4478E57 [Request] POST /episodes/2/credit + 2020-11-15T22:53:09.1566540Z 2020-11-15T22:53:09+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 6F3F6519-3827-4B17-915C-78A7A4478E57 [Time] 24ms + 2020-11-15T22:53:09.1796300Z Test Case '-[PointFreeTests.EpisodePageIntegrationTests testRedeemEpisodeCredit_AlreadyCredited]' passed (1.152 seconds). + 2020-11-15T22:53:09.1798370Z Test Case '-[PointFreeTests.EpisodePageIntegrationTests testRedeemEpisodeCredit_HappyPath]' started. + 2020-11-15T22:53:09.1953750Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:09.1961770Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:09.1966030Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:09.1966460Z drop cascades to extension citext + 2020-11-15T22:53:09.1966800Z drop cascades to table users + 2020-11-15T22:53:09.1967150Z drop cascades to table subscriptions + 2020-11-15T22:53:09.1967920Z drop cascades to table team_invites + 2020-11-15T22:53:09.1968320Z drop cascades to table email_settings + 2020-11-15T22:53:09.1968690Z drop cascades to table episode_credits + 2020-11-15T22:53:09.1969050Z drop cascades to table feed_request_events + 2020-11-15T22:53:09.1969450Z drop cascades to function update_updated_at() + 2020-11-15T22:53:09.1969860Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:09.1970260Z drop cascades to table enterprise_emails + 2020-11-15T22:53:09.1970650Z drop cascades to table episode_progresses + 2020-11-15T22:53:09.1971070Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:09.1971460Z drop cascades to sequence test_uuids + 2020-11-15T22:53:09.1972050Z drop cascades to sequence test_shortids + 2020-11-15T22:53:10.3834150Z 2020-11-15T22:53:10+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 0CD00D92-FD14-4EF1-A905-ABC5C8925FF8 [Request] POST /episodes/2/credit + 2020-11-15T22:53:10.4536270Z 2020-11-15T22:53:10+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 0CD00D92-FD14-4EF1-A905-ABC5C8925FF8 [Time] 70ms + 2020-11-15T22:53:10.4656750Z Test Case '-[PointFreeTests.EpisodePageIntegrationTests testRedeemEpisodeCredit_HappyPath]' passed (1.287 seconds). + 2020-11-15T22:53:10.4659310Z Test Case '-[PointFreeTests.EpisodePageIntegrationTests testRedeemEpisodeCredit_NotEnoughCredits]' started. + 2020-11-15T22:53:10.4787130Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:10.4787620Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:10.4788860Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:10.4789240Z drop cascades to extension citext + 2020-11-15T22:53:10.4789560Z drop cascades to table users + 2020-11-15T22:53:10.4789990Z drop cascades to table subscriptions + 2020-11-15T22:53:10.4790360Z drop cascades to table team_invites + 2020-11-15T22:53:10.4790700Z drop cascades to table email_settings + 2020-11-15T22:53:10.4791060Z drop cascades to table episode_credits + 2020-11-15T22:53:10.4791430Z drop cascades to table feed_request_events + 2020-11-15T22:53:10.4791820Z drop cascades to function update_updated_at() + 2020-11-15T22:53:10.4792210Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:10.4792610Z drop cascades to table enterprise_emails + 2020-11-15T22:53:10.4792990Z drop cascades to table episode_progresses + 2020-11-15T22:53:10.4793390Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:10.4793770Z drop cascades to sequence test_uuids + 2020-11-15T22:53:10.4794130Z drop cascades to sequence test_shortids + 2020-11-15T22:53:11.3347690Z 2020-11-15T22:53:11+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 7B0ED2E2-4CB4-435E-A265-9C831009BC7E [Request] POST /episodes/2/credit + 2020-11-15T22:53:11.3551330Z 2020-11-15T22:53:11+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 7B0ED2E2-4CB4-435E-A265-9C831009BC7E [Time] 20ms + 2020-11-15T22:53:11.3611930Z Test Case '-[PointFreeTests.EpisodePageIntegrationTests testRedeemEpisodeCredit_NotEnoughCredits]' passed (0.895 seconds). + 2020-11-15T22:53:11.3614010Z Test Case '-[PointFreeTests.EpisodePageIntegrationTests testRedeemEpisodeCredit_PublicEpisode]' started. + 2020-11-15T22:53:11.3743680Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:11.3744200Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:11.3745310Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:11.3745690Z drop cascades to extension citext + 2020-11-15T22:53:11.3746040Z drop cascades to table users + 2020-11-15T22:53:11.3746390Z drop cascades to table subscriptions + 2020-11-15T22:53:11.3746760Z drop cascades to table team_invites + 2020-11-15T22:53:11.3747340Z drop cascades to table email_settings + 2020-11-15T22:53:11.3747700Z drop cascades to table episode_credits + 2020-11-15T22:53:11.3748450Z drop cascades to table feed_request_events + 2020-11-15T22:53:11.3748890Z drop cascades to function update_updated_at() + 2020-11-15T22:53:11.3749300Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:11.3749690Z drop cascades to table enterprise_emails + 2020-11-15T22:53:11.3750090Z drop cascades to table episode_progresses + 2020-11-15T22:53:11.3750510Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:11.3750900Z drop cascades to sequence test_uuids + 2020-11-15T22:53:11.3751270Z drop cascades to sequence test_shortids + 2020-11-15T22:53:12.4045040Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 8A85D4F6-1080-4AF7-9DBD-B70071C0E67F [Request] POST /episodes/2/credit + 2020-11-15T22:53:12.4266200Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 8A85D4F6-1080-4AF7-9DBD-B70071C0E67F [Time] 22ms + 2020-11-15T22:53:12.4330070Z Test Case '-[PointFreeTests.EpisodePageIntegrationTests testRedeemEpisodeCredit_PublicEpisode]' passed (1.072 seconds). + 2020-11-15T22:53:12.4331700Z Test Suite 'EpisodePageIntegrationTests' passed at 2020-11-15 22:53:12.433. + 2020-11-15T22:53:12.4332290Z Executed 4 tests, with 0 failures (0 unexpected) in 4.407 (4.408) seconds + 2020-11-15T22:53:12.4333130Z Test Suite 'EpisodePageTests' started at 2020-11-15 22:53:12.433 + 2020-11-15T22:53:12.4334140Z Test Case '-[PointFreeTests.EpisodePageTests test_permission]' started. + 2020-11-15T22:53:12.4346590Z Test Case '-[PointFreeTests.EpisodePageTests test_permission]' passed (0.002 seconds). + 2020-11-15T22:53:12.4348360Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodeCredit_PrivateEpisode_NonSubscriber_HasCredits]' started. + 2020-11-15T22:53:12.4376130Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 F5A48625-5574-4B16-B7B2-43E240F8F3DE [Request] GET /episodes/ep2-proof-in-functions + 2020-11-15T22:53:13.1126570Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodeCredit_PrivateEpisode_NonSubscriber_HasCredits]' passed (0.044 seconds). + 2020-11-15T22:53:13.1129180Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift F5A48625-5574-4B16-B7B2-43E240F8F3DE [Time] 39ms + 2020-11-15T22:53:13.1132430Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodeCredit_PrivateEpisode_NonSubscriber_NoCredits]' started. + 2020-11-15T22:53:13.1134170Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodeCredit_PrivateEpisode_NonSubscriber_NoCredits]' passed (0.042 seconds). + 2020-11-15T22:53:13.1135900Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodeCredit_PrivateEpisode_NonSubscriber_UsedCredit]' started. + 2020-11-15T22:53:13.1137600Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodeCredit_PrivateEpisode_NonSubscriber_UsedCredit]' passed (0.045 seconds). + 2020-11-15T22:53:13.1139290Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodeCredit_PublicEpisode_NonSubscriber_UsedCredit]' started. + 2020-11-15T22:53:13.1140970Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodeCredit_PublicEpisode_NonSubscriber_UsedCredit]' passed (0.048 seconds). + 2020-11-15T22:53:13.1142470Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodeNotFound]' started. + 2020-11-15T22:53:13.1144100Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodeNotFound]' passed (0.035 seconds). + 2020-11-15T22:53:13.1145700Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodePage]' started. + 2020-11-15T22:53:13.1147720Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodePage]' passed (0.064 seconds). + 2020-11-15T22:53:13.1149190Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodePage_ExercisesAndReferences]' started. + 2020-11-15T22:53:13.1151100Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodePage_ExercisesAndReferences]' passed (0.042 seconds). + 2020-11-15T22:53:13.1152750Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodePage_InCollectionContext]' started. + 2020-11-15T22:53:13.1154280Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodePage_InCollectionContext]' passed (0.057 seconds). + 2020-11-15T22:53:13.1155850Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodePage_InCollectionContext_LastEpisode]' started. + 2020-11-15T22:53:13.1157490Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodePage_InCollectionContext_LastEpisode]' passed (0.061 seconds). + 2020-11-15T22:53:13.1158970Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodePage_Trialing]' started. + 2020-11-15T22:53:13.1160610Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodePage_Trialing]' passed (0.044 seconds). + 2020-11-15T22:53:13.1162060Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodePage_WithEpisodeProgress]' started. + 2020-11-15T22:53:13.1163610Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodePage_WithEpisodeProgress]' passed (0.045 seconds). + 2020-11-15T22:53:13.1165110Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodePageSubscriber]' started. + 2020-11-15T22:53:13.1166620Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodePageSubscriber]' passed (0.044 seconds). + 2020-11-15T22:53:13.1168170Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodePageSubscriber_Deactivated]' started. + 2020-11-15T22:53:13.1169770Z Test Case '-[PointFreeTests.EpisodePageTests testEpisodePageSubscriber_Deactivated]' passed (0.045 seconds). + 2020-11-15T22:53:13.1171240Z Test Case '-[PointFreeTests.EpisodePageTests testFreeEpisodePage]' started. + 2020-11-15T22:53:13.1172620Z Test Case '-[PointFreeTests.EpisodePageTests testFreeEpisodePage]' passed (0.053 seconds). + 2020-11-15T22:53:13.1174100Z Test Case '-[PointFreeTests.EpisodePageTests testFreeEpisodePageSubscriber]' started. + 2020-11-15T22:53:13.1176270Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 35D52D93-9499-45D7-8DAD-0DC8DDFACF77 [Request] GET /episodes/ep2-proof-in-functions + 2020-11-15T22:53:13.1178680Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 35D52D93-9499-45D7-8DAD-0DC8DDFACF77 [Time] 37ms + 2020-11-15T22:53:13.1181070Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift EB42152C-293E-42F3-980F-43E680EE692F [Request] GET /episodes/ep1-type-safe-html-in-swift + 2020-11-15T22:53:13.1183420Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 EB42152C-293E-42F3-980F-43E680EE692F [Time] 40ms + 2020-11-15T22:53:13.1185830Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 A8BF3B24-AC92-444A-80EC-F216892E44D5 [Request] GET /episodes/ep1-type-safe-html-in-swift + 2020-11-15T22:53:13.1188230Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 A8BF3B24-AC92-444A-80EC-F216892E44D5 [Time] 43ms + 2020-11-15T22:53:13.1190630Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 35380F82-797F-45FF-9D9E-264EEC351330 [Request] GET /episodes/object-oriented-programming + 2020-11-15T22:53:13.1192980Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 35380F82-797F-45FF-9D9E-264EEC351330 [Time] 30ms + 2020-11-15T22:53:13.1195450Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 0A51D448-60E4-4AFC-8C01-35361DBD15C8 [Request] GET /episodes/ep1-proof-in-functions + 2020-11-15T22:53:13.1197840Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 0A51D448-60E4-4AFC-8C01-35361DBD15C8 [Time] 59ms + 2020-11-15T22:53:13.1200200Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 FF98BB66-9DED-4A15-B759-899E3431159A [Request] GET /episodes/ep2-proof-in-functions + 2020-11-15T22:53:13.1202820Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 FF98BB66-9DED-4A15-B759-899E3431159A [Time] 37ms + 2020-11-15T22:53:13.1205430Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 CEF37532-72C8-4290-9B5B-14456A7EB631 [Request] GET /collections/functions/functions-that-begin-with-a/ep2-proof-in-functions + 2020-11-15T22:53:13.1208040Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 CEF37532-72C8-4290-9B5B-14456A7EB631 [Time] 52ms + 2020-11-15T22:53:13.1210680Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 7F3D2118-3A1A-49CD-8DFC-434D6A7EC778 [Request] GET /collections/functions/functions-that-begin-with-a/ep1-type-safe-html-in-swift + 2020-11-15T22:53:13.1213290Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 7F3D2118-3A1A-49CD-8DFC-434D6A7EC778 [Time] 56ms + 2020-11-15T22:53:13.1215620Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 209C49D8-19D4-43C4-8EAC-50212D24238B [Request] GET /episodes/ep2-proof-in-functions + 2020-11-15T22:53:13.1217890Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 209C49D8-19D4-43C4-8EAC-50212D24238B [Time] 39ms + 2020-11-15T22:53:13.1220280Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift F1C44DAC-18FD-4074-BB60-8F9D64F969E3 [Request] GET /episodes/ep1-type-safe-html-in-swift + 2020-11-15T22:53:13.1222750Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift F1C44DAC-18FD-4074-BB60-8F9D64F969E3 [Time] 41ms + 2020-11-15T22:53:13.1225120Z 2020-11-15T22:53:12+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 C07E4627-5B75-487D-B60C-BB6CD2DF5B6E [Request] GET /episodes/ep2-proof-in-functions + 2020-11-15T22:53:13.1227550Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift C07E4627-5B75-487D-B60C-BB6CD2DF5B6E [Time] 40ms + 2020-11-15T22:53:13.1229880Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 922B88BC-65E7-4449-9BC4-8C2C3A3D2B86 [Request] GET /episodes/ep2-proof-in-functions + 2020-11-15T22:53:13.1232250Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 922B88BC-65E7-4449-9BC4-8C2C3A3D2B86 [Time] 41ms + 2020-11-15T22:53:13.1234790Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift A1B6A9AC-138A-4BE1-BDDF-A94990307859 [Request] GET /episodes/ep2-proof-in-functions + 2020-11-15T22:53:13.1237340Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift A1B6A9AC-138A-4BE1-BDDF-A94990307859 [Time] 48ms + 2020-11-15T22:53:13.1239710Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 D3436801-0810-4B1F-A565-62D7A7CE329F [Request] GET /episodes/ep2-proof-in-functions + 2020-11-15T22:53:13.1467170Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 D3436801-0810-4B1F-A565-62D7A7CE329F [Time] 39ms + 2020-11-15T22:53:13.1478960Z Test Case '-[PointFreeTests.EpisodePageTests testFreeEpisodePageSubscriber]' passed (0.043 seconds). + 2020-11-15T22:53:13.1480970Z Test Case '-[PointFreeTests.EpisodePageTests testProgress_LoggedIn]' started. + 2020-11-15T22:53:13.1516990Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 8B9453C3-B845-4226-AD7A-728F185D2865 [Request] POST /episodes/ep2-proof-in-functions/progress + 2020-11-15T22:53:13.1528460Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 8B9453C3-B845-4226-AD7A-728F185D2865 [Time] 1ms + 2020-11-15T22:53:13.1535450Z Test Case '-[PointFreeTests.EpisodePageTests testProgress_LoggedIn]' passed (0.006 seconds). + 2020-11-15T22:53:13.1536980Z Test Case '-[PointFreeTests.EpisodePageTests testProgress_LoggedOut]' started. + 2020-11-15T22:53:13.1571960Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 6AC3F4DE-963E-4C2D-9689-0CD3F20BD2B0 [Request] POST /episodes/ep2-proof-in-functions/progress + 2020-11-15T22:53:13.1580880Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 6AC3F4DE-963E-4C2D-9689-0CD3F20BD2B0 [Time] 0ms + 2020-11-15T22:53:13.1586440Z Test Case '-[PointFreeTests.EpisodePageTests testProgress_LoggedOut]' passed (0.005 seconds). + 2020-11-15T22:53:13.1587750Z Test Suite 'EpisodePageTests' passed at 2020-11-15 22:53:13.158. + 2020-11-15T22:53:13.1588330Z Executed 18 tests, with 0 failures (0 unexpected) in 0.725 (0.726) seconds + 2020-11-15T22:53:13.1589220Z Test Suite 'EpisodeTests' started at 2020-11-15 22:53:13.159 + 2020-11-15T22:53:13.1590240Z Test Case '-[ModelsTests.EpisodeTests testFreeSince]' started. + 2020-11-15T22:53:13.1591420Z Test Case '-[ModelsTests.EpisodeTests testFreeSince]' passed (0.000 seconds). + 2020-11-15T22:53:13.1592570Z Test Case '-[ModelsTests.EpisodeTests testIsSubscriberOnly]' started. + 2020-11-15T22:53:13.1594330Z Test Case '-[ModelsTests.EpisodeTests testIsSubscriberOnly]' passed (0.000 seconds). + 2020-11-15T22:53:13.1596080Z Test Case '-[ModelsTests.EpisodeTests testSlug]' started. + 2020-11-15T22:53:13.1597480Z Test Case '-[ModelsTests.EpisodeTests testSlug]' passed (0.000 seconds). + 2020-11-15T22:53:13.1598530Z Test Suite 'EpisodeTests' passed at 2020-11-15 22:53:13.159. + 2020-11-15T22:53:13.1605290Z Executed 3 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds + 2020-11-15T22:53:13.1606330Z Test Suite 'FreeEpisodeEmailTests' started at 2020-11-15 22:53:13.159 + 2020-11-15T22:53:13.1607560Z Test Case '-[PointFreeTests.FreeEpisodeEmailTests testFreeEpisodeEmail]' started. + 2020-11-15T22:53:13.2326950Z Test Case '-[PointFreeTests.FreeEpisodeEmailTests testFreeEpisodeEmail]' passed (0.073 seconds). + 2020-11-15T22:53:13.2328720Z Test Suite 'FreeEpisodeEmailTests' passed at 2020-11-15 22:53:13.232. + 2020-11-15T22:53:13.2329330Z Executed 1 test, with 0 failures (0 unexpected) in 0.073 (0.073) seconds + 2020-11-15T22:53:13.2331040Z Test Suite 'FunctionalCssTests' started at 2020-11-15 22:53:13.233 + 2020-11-15T22:53:13.2333360Z Test Case '-[FunctionalCssTests.FunctionalCssTests testFunctionalCss]' started. + 2020-11-15T22:53:13.2632400Z Test Case '-[FunctionalCssTests.FunctionalCssTests testFunctionalCss]' passed (0.030 seconds). + 2020-11-15T22:53:13.2633840Z Test Suite 'FunctionalCssTests' passed at 2020-11-15 22:53:13.263. + 2020-11-15T22:53:13.2634350Z Executed 1 test, with 0 failures (0 unexpected) in 0.030 (0.030) seconds + 2020-11-15T22:53:13.2635590Z Test Suite 'GhostTests' started at 2020-11-15 22:53:13.263 + 2020-11-15T22:53:13.2636550Z Test Case '-[PointFreeTests.GhostTests testEndGhosting_HappyPath]' started. + 2020-11-15T22:53:13.2657060Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 90BC0E5E-8D13-4E72-BB4A-016806B15531 [Request] POST /ghosting/end + 2020-11-15T22:53:13.2728470Z Test Case '-[PointFreeTests.GhostTests testEndGhosting_HappyPath]' passed (0.005 seconds). + 2020-11-15T22:53:13.2732840Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 90BC0E5E-8D13-4E72-BB4A-016806B15531 [Time] 1ms + 2020-11-15T22:53:13.2739620Z Test Case '-[PointFreeTests.GhostTests testStartGhosting_HappyPath]' started. + 2020-11-15T22:53:13.2742510Z Test Case '-[PointFreeTests.GhostTests testStartGhosting_HappyPath]' passed (0.006 seconds). + 2020-11-15T22:53:13.2744360Z Test Case '-[PointFreeTests.GhostTests testStartGhosting_InvalidGhostee]' started. + 2020-11-15T22:53:13.2746880Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 458D97EE-E4AC-43B6-B3D0-4B28CF8BFDD6 [Request] POST /admin/ghost/start + 2020-11-15T22:53:13.2749760Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 458D97EE-E4AC-43B6-B3D0-4B28CF8BFDD6 [Time] 2ms + 2020-11-15T22:53:13.2793410Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 51FDC2C5-7FAF-4BDA-B379-A115CAC3907E [Request] POST /admin/ghost/start + 2020-11-15T22:53:13.2810820Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 51FDC2C5-7FAF-4BDA-B379-A115CAC3907E [Time] 2ms + 2020-11-15T22:53:13.2935000Z Test Case '-[PointFreeTests.GhostTests testStartGhosting_InvalidGhostee]' passed (0.008 seconds). + 2020-11-15T22:53:13.2937090Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 66C94529-62A5-4BA7-B3F2-C13AA3F07C3D [Request] POST /admin/ghost/start + 2020-11-15T22:53:13.2940030Z Test Case '-[PointFreeTests.GhostTests testStartGhosting_NonAdmin]' started. + 2020-11-15T22:53:13.2941820Z Test Case '-[PointFreeTests.GhostTests testStartGhosting_NonAdmin]' passed (0.004 seconds). + 2020-11-15T22:53:13.2943330Z Test Suite 'GhostTests' passed at 2020-11-15 22:53:13.286. + 2020-11-15T22:53:13.2944230Z Executed 4 tests, with 0 failures (0 unexpected) in 0.022 (0.023) seconds + 2020-11-15T22:53:13.2945470Z Test Suite 'GitHubTests' started at 2020-11-15 22:53:13.286 + 2020-11-15T22:53:13.2946860Z Test Case '-[GitHubTests.GitHubTests testRequests]' started. + 2020-11-15T22:53:13.2948490Z Test Case '-[GitHubTests.GitHubTests testRequests]' passed (0.002 seconds). + 2020-11-15T22:53:13.2949890Z Test Suite 'GitHubTests' passed at 2020-11-15 22:53:13.288. + 2020-11-15T22:53:13.2951140Z Executed 1 test, with 0 failures (0 unexpected) in 0.002 (0.003) seconds + 2020-11-15T22:53:13.2952450Z Test Suite 'HomeTests' started at 2020-11-15 22:53:13.288 + 2020-11-15T22:53:13.2954010Z Test Case '-[PointFreeTests.HomeTests testEpisodesIndex]' started. + 2020-11-15T22:53:13.2955710Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 66C94529-62A5-4BA7-B3F2-C13AA3F07C3D [Time] 1ms + 2020-11-15T22:53:13.2958010Z Test Case '-[PointFreeTests.HomeTests testEpisodesIndex]' passed (0.004 seconds). + 2020-11-15T22:53:13.2959820Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 1BEC3F59-1D65-4C7C-A609-D583E98C44CB [Request] GET /episodes + 2020-11-15T22:53:13.2962340Z Test Case '-[PointFreeTests.HomeTests testHomepage_LoggedOut]' started. + 2020-11-15T22:53:13.2964080Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 1BEC3F59-1D65-4C7C-A609-D583E98C44CB [Time] 0ms + 2020-11-15T22:53:13.3042450Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 A92418EE-B547-4860-A8FC-EE8BB81A460C [Request] GET + 2020-11-15T22:53:13.3438800Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift A92418EE-B547-4860-A8FC-EE8BB81A460C [Time] 46ms + 2020-11-15T22:53:13.3448370Z Test Case '-[PointFreeTests.HomeTests testHomepage_LoggedOut]' passed (0.053 seconds). + 2020-11-15T22:53:13.3449550Z Test Case '-[PointFreeTests.HomeTests testHomepage_Subscriber]' started. + 2020-11-15T22:53:13.3468490Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 B1013BF7-3918-4C54-98E3-61C5AE931532 [Request] GET + 2020-11-15T22:53:13.3901780Z 2020-11-15T22:53:13+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 B1013BF7-3918-4C54-98E3-61C5AE931532 [Time] 43ms + 2020-11-15T22:53:13.3912220Z Test Case '-[PointFreeTests.HomeTests testHomepage_Subscriber]' passed (0.046 seconds). + 2020-11-15T22:53:13.3913240Z Test Suite 'HomeTests' passed at 2020-11-15 22:53:13.391. + 2020-11-15T22:53:13.3913680Z Executed 3 tests, with 0 failures (0 unexpected) in 0.103 (0.103) seconds + 2020-11-15T22:53:13.3914550Z Test Suite 'HtmlCssInlinerTests' started at 2020-11-15 22:53:13.391 + 2020-11-15T22:53:13.3915750Z Test Case '-[PointFreeTests.HtmlCssInlinerTests testHtmlCssInliner]' started. + 2020-11-15T22:53:13.3955090Z Test Case '-[PointFreeTests.HtmlCssInlinerTests testHtmlCssInliner]' passed (0.004 seconds). + 2020-11-15T22:53:13.3956380Z Test Suite 'HtmlCssInlinerTests' passed at 2020-11-15 22:53:13.395. + 2020-11-15T22:53:13.3956920Z Executed 1 test, with 0 failures (0 unexpected) in 0.004 (0.004) seconds + 2020-11-15T22:53:13.3957830Z Test Suite 'InviteIntegrationTests' started at 2020-11-15 22:53:13.395 + 2020-11-15T22:53:13.3959110Z Test Case '-[PointFreeTests.InviteIntegrationTests testAcceptInvitation_HappyPath]' started. + 2020-11-15T22:53:13.4222460Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:13.4269120Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:13.4270720Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:13.4271470Z drop cascades to extension citext + 2020-11-15T22:53:13.4299870Z drop cascades to table users + 2020-11-15T22:53:13.4307160Z drop cascades to table subscriptions + 2020-11-15T22:53:13.4307880Z drop cascades to table team_invites + 2020-11-15T22:53:13.4308530Z drop cascades to table email_settings + 2020-11-15T22:53:13.4309180Z drop cascades to table episode_credits + 2020-11-15T22:53:13.4309840Z drop cascades to table feed_request_events + 2020-11-15T22:53:13.4310950Z drop cascades to function update_updated_at() + 2020-11-15T22:53:13.4311740Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:13.4312420Z drop cascades to table enterprise_emails + 2020-11-15T22:53:13.4313080Z drop cascades to table episode_progresses + 2020-11-15T22:53:13.4313780Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:13.4314460Z drop cascades to sequence test_uuids + 2020-11-15T22:53:13.4315100Z drop cascades to sequence test_shortids + 2020-11-15T22:53:14.5605470Z 2020-11-15T22:53:14+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 7E7DF052-EB64-4158-8097-11E8AD4A60C9 [Request] POST /invites/00000000-0000-0000-0000-000000000014/accept + 2020-11-15T22:53:14.6060010Z 2020-11-15T22:53:14+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 7E7DF052-EB64-4158-8097-11E8AD4A60C9 [Time] 45ms + 2020-11-15T22:53:14.6140620Z Test Case '-[PointFreeTests.InviteIntegrationTests testAcceptInvitation_HappyPath]' passed (1.218 seconds). + 2020-11-15T22:53:14.6145400Z Test Case '-[PointFreeTests.InviteIntegrationTests testAcceptInvitation_InviterHasCancelingStripeSubscription]' started. + 2020-11-15T22:53:14.6278570Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:14.6279140Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:14.6280300Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:14.6280690Z drop cascades to extension citext + 2020-11-15T22:53:14.6281030Z drop cascades to table users + 2020-11-15T22:53:14.6281390Z drop cascades to table subscriptions + 2020-11-15T22:53:14.6281780Z drop cascades to table team_invites + 2020-11-15T22:53:14.6282130Z drop cascades to table email_settings + 2020-11-15T22:53:14.6282500Z drop cascades to table episode_credits + 2020-11-15T22:53:14.6282880Z drop cascades to table feed_request_events + 2020-11-15T22:53:14.6283280Z drop cascades to function update_updated_at() + 2020-11-15T22:53:14.6283690Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:14.6284090Z drop cascades to table enterprise_emails + 2020-11-15T22:53:14.6284480Z drop cascades to table episode_progresses + 2020-11-15T22:53:14.6284900Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:14.6285290Z drop cascades to sequence test_uuids + 2020-11-15T22:53:14.6285650Z drop cascades to sequence test_shortids + 2020-11-15T22:53:15.7981820Z 2020-11-15T22:53:15+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 18409D8F-F0FF-4048-A4D0-4523E734CEC5 [Request] POST /invites/00000000-0000-0000-0000-000000000014/accept + 2020-11-15T22:53:15.8321860Z 2020-11-15T22:53:15+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 18409D8F-F0FF-4048-A4D0-4523E734CEC5 [Time] 33ms + 2020-11-15T22:53:15.8388780Z Test Case '-[PointFreeTests.InviteIntegrationTests testAcceptInvitation_InviterHasCancelingStripeSubscription]' passed (1.225 seconds). + 2020-11-15T22:53:15.8391600Z Test Case '-[PointFreeTests.InviteIntegrationTests testAcceptInvitation_InviterHasInactiveStripeSubscription]' started. + 2020-11-15T22:53:15.8542830Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:15.8543380Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:15.8544450Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:15.8544840Z drop cascades to extension citext + 2020-11-15T22:53:15.8545170Z drop cascades to table users + 2020-11-15T22:53:15.8545530Z drop cascades to table subscriptions + 2020-11-15T22:53:15.8545950Z drop cascades to table team_invites + 2020-11-15T22:53:15.8546310Z drop cascades to table email_settings + 2020-11-15T22:53:15.8546660Z drop cascades to table episode_credits + 2020-11-15T22:53:15.8547130Z drop cascades to table feed_request_events + 2020-11-15T22:53:15.8547540Z drop cascades to function update_updated_at() + 2020-11-15T22:53:15.8548270Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:15.8548720Z drop cascades to table enterprise_emails + 2020-11-15T22:53:15.8549110Z drop cascades to table episode_progresses + 2020-11-15T22:53:15.8549520Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:15.8549920Z drop cascades to sequence test_uuids + 2020-11-15T22:53:15.8550280Z drop cascades to sequence test_shortids + 2020-11-15T22:53:17.0179170Z 2020-11-15T22:53:17+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 96CDA505-FB6F-4064-90A8-9DA099E54C02 [Request] POST /invites/00000000-0000-0000-0000-000000000014/accept + 2020-11-15T22:53:17.0561070Z 2020-11-15T22:53:17+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 96CDA505-FB6F-4064-90A8-9DA099E54C02 [Time] 37ms + 2020-11-15T22:53:17.0644140Z Test Case '-[PointFreeTests.InviteIntegrationTests testAcceptInvitation_InviterHasInactiveStripeSubscription]' passed (1.225 seconds). + 2020-11-15T22:53:17.0646360Z Test Case '-[PointFreeTests.InviteIntegrationTests testAcceptInvitation_InviterIsNotSubscriber]' started. + 2020-11-15T22:53:17.0773150Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:17.0774190Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:17.0775350Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:17.0775730Z drop cascades to extension citext + 2020-11-15T22:53:17.0776070Z drop cascades to table users + 2020-11-15T22:53:17.0776420Z drop cascades to table subscriptions + 2020-11-15T22:53:17.0776770Z drop cascades to table team_invites + 2020-11-15T22:53:17.0777150Z drop cascades to table email_settings + 2020-11-15T22:53:17.0777520Z drop cascades to table episode_credits + 2020-11-15T22:53:17.0777890Z drop cascades to table feed_request_events + 2020-11-15T22:53:17.0778290Z drop cascades to function update_updated_at() + 2020-11-15T22:53:17.0778690Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:17.0779090Z drop cascades to table enterprise_emails + 2020-11-15T22:53:17.0779490Z drop cascades to table episode_progresses + 2020-11-15T22:53:17.0779890Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:17.0780280Z drop cascades to sequence test_uuids + 2020-11-15T22:53:17.0780650Z drop cascades to sequence test_shortids + 2020-11-15T22:53:18.2742610Z 2020-11-15T22:53:18+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift BCC3E3D3-2C96-4840-A75F-78901A0729FD [Request] POST /invites/00000000-0000-0000-0000-000000000013/accept + 2020-11-15T22:53:18.3108950Z 2020-11-15T22:53:18+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 BCC3E3D3-2C96-4840-A75F-78901A0729FD [Time] 36ms + 2020-11-15T22:53:18.3181820Z Test Case '-[PointFreeTests.InviteIntegrationTests testAcceptInvitation_InviterIsNotSubscriber]' passed (1.254 seconds). + 2020-11-15T22:53:18.3184050Z Test Case '-[PointFreeTests.InviteIntegrationTests testAddTeammate]' started. + 2020-11-15T22:53:18.3315720Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:18.3316310Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:18.3317480Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:18.3317870Z drop cascades to extension citext + 2020-11-15T22:53:18.3318190Z drop cascades to table users + 2020-11-15T22:53:18.3318540Z drop cascades to table subscriptions + 2020-11-15T22:53:18.3318910Z drop cascades to table team_invites + 2020-11-15T22:53:18.3319260Z drop cascades to table email_settings + 2020-11-15T22:53:18.3319650Z drop cascades to table episode_credits + 2020-11-15T22:53:18.3320020Z drop cascades to table feed_request_events + 2020-11-15T22:53:18.3320420Z drop cascades to function update_updated_at() + 2020-11-15T22:53:18.3320820Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:18.3321220Z drop cascades to table enterprise_emails + 2020-11-15T22:53:18.3322240Z drop cascades to table episode_progresses + 2020-11-15T22:53:18.3322720Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:18.3323120Z drop cascades to sequence test_uuids + 2020-11-15T22:53:18.3323480Z drop cascades to sequence test_shortids + 2020-11-15T22:53:19.4918990Z 2020-11-15T22:53:19+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 4159A07F-3F68-4607-A52E-35884B8BB562 [Request] POST /invites/add + 2020-11-15T22:53:19.5877620Z 2020-11-15T22:53:19+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 4159A07F-3F68-4607-A52E-35884B8BB562 [Time] 95ms + 2020-11-15T22:53:19.5946000Z Test Case '-[PointFreeTests.InviteIntegrationTests testAddTeammate]' passed (1.276 seconds). + 2020-11-15T22:53:19.5948540Z Test Case '-[PointFreeTests.InviteIntegrationTests testResendInvite_CurrentUserIsNotInviter]' started. + 2020-11-15T22:53:19.6080400Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:19.6080910Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:19.6082090Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:19.6082480Z drop cascades to extension citext + 2020-11-15T22:53:19.6082810Z drop cascades to table users + 2020-11-15T22:53:19.6083160Z drop cascades to table subscriptions + 2020-11-15T22:53:19.6083530Z drop cascades to table team_invites + 2020-11-15T22:53:19.6083880Z drop cascades to table email_settings + 2020-11-15T22:53:19.6084250Z drop cascades to table episode_credits + 2020-11-15T22:53:19.6084620Z drop cascades to table feed_request_events + 2020-11-15T22:53:19.6085030Z drop cascades to function update_updated_at() + 2020-11-15T22:53:19.6085430Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:19.6085840Z drop cascades to table enterprise_emails + 2020-11-15T22:53:19.6086230Z drop cascades to table episode_progresses + 2020-11-15T22:53:19.6086650Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:19.6087040Z drop cascades to sequence test_uuids + 2020-11-15T22:53:19.6087400Z drop cascades to sequence test_shortids + 2020-11-15T22:53:20.8043580Z 2020-11-15T22:53:20+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 4E0B0FC3-FE65-4A71-B57A-B173A2BDB930 [Request] POST /invites/00000000-0000-0000-0000-000000000013/resend + 2020-11-15T22:53:20.8272730Z 2020-11-15T22:53:20+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 4E0B0FC3-FE65-4A71-B57A-B173A2BDB930 [Time] 22ms + 2020-11-15T22:53:20.8276790Z Test Case '-[PointFreeTests.InviteIntegrationTests testResendInvite_CurrentUserIsNotInviter]' passed (1.233 seconds). + 2020-11-15T22:53:20.8278610Z Test Case '-[PointFreeTests.InviteIntegrationTests testResendInvite_HappyPath]' started. + 2020-11-15T22:53:20.8615510Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:20.8616090Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:20.8617300Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:20.8617680Z drop cascades to extension citext + 2020-11-15T22:53:20.8618020Z drop cascades to table users + 2020-11-15T22:53:20.8618360Z drop cascades to table subscriptions + 2020-11-15T22:53:20.8618730Z drop cascades to table team_invites + 2020-11-15T22:53:20.8619080Z drop cascades to table email_settings + 2020-11-15T22:53:20.8619450Z drop cascades to table episode_credits + 2020-11-15T22:53:20.8619820Z drop cascades to table feed_request_events + 2020-11-15T22:53:20.8620220Z drop cascades to function update_updated_at() + 2020-11-15T22:53:20.8620630Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:20.8621030Z drop cascades to table enterprise_emails + 2020-11-15T22:53:20.8621420Z drop cascades to table episode_progresses + 2020-11-15T22:53:20.8621840Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:20.8622240Z drop cascades to sequence test_uuids + 2020-11-15T22:53:20.8623110Z drop cascades to sequence test_shortids + 2020-11-15T22:53:21.8396570Z 2020-11-15T22:53:21+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 8DFCF5F9-B7AA-45C0-A872-A3BE59437140 [Request] POST /invites/00000000-0000-0000-0000-000000000007/resend + 2020-11-15T22:53:21.9045850Z 2020-11-15T22:53:21+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 8DFCF5F9-B7AA-45C0-A872-A3BE59437140 [Time] 64ms + 2020-11-15T22:53:21.9054160Z Test Case '-[PointFreeTests.InviteIntegrationTests testResendInvite_HappyPath]' passed (1.078 seconds). + 2020-11-15T22:53:21.9056330Z Test Case '-[PointFreeTests.InviteIntegrationTests testRevokeInvite_CurrentUserIsNotInviter]' started. + 2020-11-15T22:53:21.9189050Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:21.9189650Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:21.9190780Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:21.9191170Z drop cascades to extension citext + 2020-11-15T22:53:21.9191500Z drop cascades to table users + 2020-11-15T22:53:21.9191850Z drop cascades to table subscriptions + 2020-11-15T22:53:21.9192220Z drop cascades to table team_invites + 2020-11-15T22:53:21.9192570Z drop cascades to table email_settings + 2020-11-15T22:53:21.9192940Z drop cascades to table episode_credits + 2020-11-15T22:53:21.9193310Z drop cascades to table feed_request_events + 2020-11-15T22:53:21.9193700Z drop cascades to function update_updated_at() + 2020-11-15T22:53:21.9194110Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:21.9194520Z drop cascades to table enterprise_emails + 2020-11-15T22:53:21.9194920Z drop cascades to table episode_progresses + 2020-11-15T22:53:21.9195330Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:21.9195730Z drop cascades to sequence test_uuids + 2020-11-15T22:53:21.9196080Z drop cascades to sequence test_shortids + 2020-11-15T22:53:23.0285030Z 2020-11-15T22:53:23+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift F4D5FFB6-5C0A-4DBD-9845-7BB3795E22B1 [Request] POST /invites/00000000-0000-0000-0000-000000000013/revoke + 2020-11-15T22:53:23.0529660Z 2020-11-15T22:53:23+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift F4D5FFB6-5C0A-4DBD-9845-7BB3795E22B1 [Time] 24ms + 2020-11-15T22:53:23.0606840Z Test Case '-[PointFreeTests.InviteIntegrationTests testRevokeInvite_CurrentUserIsNotInviter]' passed (1.155 seconds). + 2020-11-15T22:53:23.0609270Z Test Case '-[PointFreeTests.InviteIntegrationTests testRevokeInvite_HappyPath]' started. + 2020-11-15T22:53:23.0745420Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:23.0745970Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:23.0747280Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:23.0747700Z drop cascades to extension citext + 2020-11-15T22:53:23.0748030Z drop cascades to table users + 2020-11-15T22:53:23.0748390Z drop cascades to table subscriptions + 2020-11-15T22:53:23.0748750Z drop cascades to table team_invites + 2020-11-15T22:53:23.0749100Z drop cascades to table email_settings + 2020-11-15T22:53:23.0749470Z drop cascades to table episode_credits + 2020-11-15T22:53:23.0749840Z drop cascades to table feed_request_events + 2020-11-15T22:53:23.0750240Z drop cascades to function update_updated_at() + 2020-11-15T22:53:23.0750650Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:23.0751050Z drop cascades to table enterprise_emails + 2020-11-15T22:53:23.0751450Z drop cascades to table episode_progresses + 2020-11-15T22:53:23.0751860Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:23.0752260Z drop cascades to sequence test_uuids + 2020-11-15T22:53:23.0752620Z drop cascades to sequence test_shortids + 2020-11-15T22:53:24.1741970Z 2020-11-15T22:53:24+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 CA1756AB-A32F-4FF7-B6DC-D34383D1EAE7 [Request] POST /invites/00000000-0000-0000-0000-000000000007/revoke + 2020-11-15T22:53:24.2668030Z 2020-11-15T22:53:24+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift CA1756AB-A32F-4FF7-B6DC-D34383D1EAE7 [Time] 92ms + 2020-11-15T22:53:24.2736320Z Test Case '-[PointFreeTests.InviteIntegrationTests testRevokeInvite_HappyPath]' passed (1.213 seconds). + 2020-11-15T22:53:24.2737730Z Test Suite 'InviteIntegrationTests' passed at 2020-11-15 22:53:24.273. + 2020-11-15T22:53:24.2738800Z Executed 9 tests, with 0 failures (0 unexpected) in 10.877 (10.878) seconds + 2020-11-15T22:53:24.2739650Z Test Suite 'InviteTests' started at 2020-11-15 22:53:24.273 + 2020-11-15T22:53:24.2740690Z Test Case '-[PointFreeTests.InviteTests testShowInvite_LoggedIn_NonSubscriber]' started. + 2020-11-15T22:53:24.2773280Z 2020-11-15T22:53:24+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 45595FC5-DD39-4FEB-90EE-8D9899DBCB44 [Request] GET /invites/DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF + 2020-11-15T22:53:24.3071060Z 2020-11-15T22:53:24+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 45595FC5-DD39-4FEB-90EE-8D9899DBCB44 [Time] 29ms + 2020-11-15T22:53:24.3080710Z Test Case '-[PointFreeTests.InviteTests testShowInvite_LoggedIn_NonSubscriber]' passed (0.034 seconds). + 2020-11-15T22:53:24.3082250Z Test Case '-[PointFreeTests.InviteTests testShowInvite_LoggedIn_Subscriber]' started. + 2020-11-15T22:53:24.3114700Z 2020-11-15T22:53:24+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 89C3EA7B-DF74-48F0-8AB1-B75CBF13DBA0 [Request] GET /invites/DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF + 2020-11-15T22:53:24.3128070Z 2020-11-15T22:53:24+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 89C3EA7B-DF74-48F0-8AB1-B75CBF13DBA0 [Time] 1ms + 2020-11-15T22:53:24.3133220Z Test Case '-[PointFreeTests.InviteTests testShowInvite_LoggedIn_Subscriber]' passed (0.005 seconds). + 2020-11-15T22:53:24.3134510Z Test Case '-[PointFreeTests.InviteTests testShowInvite_LoggedOut]' started. + 2020-11-15T22:53:24.3165520Z 2020-11-15T22:53:24+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 C640508A-E551-4131-9067-E50ABFC0C225 [Request] GET /invites/DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF + 2020-11-15T22:53:24.3493970Z 2020-11-15T22:53:24+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 C640508A-E551-4131-9067-E50ABFC0C225 [Time] 32ms + 2020-11-15T22:53:24.3503720Z Test Case '-[PointFreeTests.InviteTests testShowInvite_LoggedOut]' passed (0.037 seconds). + 2020-11-15T22:53:24.3505010Z Test Suite 'InviteTests' passed at 2020-11-15 22:53:24.350. + 2020-11-15T22:53:24.3505460Z Executed 3 tests, with 0 failures (0 unexpected) in 0.077 (0.077) seconds + 2020-11-15T22:53:24.3506280Z Test Suite 'InvoicesTests' started at 2020-11-15 22:53:24.350 + 2020-11-15T22:53:24.3507240Z Test Case '-[PointFreeTests.InvoicesTests testInvoice]' started. + 2020-11-15T22:53:24.3587790Z 2020-11-15T22:53:24+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 8A6EA3F9-FE8C-49C4-AB2E-FC7D884B10D1 [Request] GET /account/invoices/in_test + 2020-11-15T22:53:24.3876510Z Test Case '-[PointFreeTests.InvoicesTests testInvoice]' passed (0.037 seconds). + 2020-11-15T22:53:24.3878780Z 2020-11-15T22:53:24+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 8A6EA3F9-FE8C-49C4-AB2E-FC7D884B10D1 [Time] 32ms + 2020-11-15T22:53:24.3982360Z Test Case '-[PointFreeTests.InvoicesTests testInvoice_InvoiceBilling]' started. + 2020-11-15T22:53:24.3984360Z 2020-11-15T22:53:24+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 802B8B92-0775-40E5-A85D-7FBCE136C14E [Request] GET /account/invoices/in_test + 2020-11-15T22:53:24.4208360Z Test Case '-[PointFreeTests.InvoicesTests testInvoice_InvoiceBilling]' passed (0.034 seconds). + 2020-11-15T22:53:24.4210320Z 2020-11-15T22:53:24+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 802B8B92-0775-40E5-A85D-7FBCE136C14E [Time] 28ms + 2020-11-15T22:53:24.4323900Z Test Case '-[PointFreeTests.InvoicesTests testInvoices]' started. + 2020-11-15T22:53:24.4325940Z 2020-11-15T22:53:24+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 1C01F549-38F9-4F8F-9CDF-3ADBD7CF6453 [Request] GET /account/invoices + 2020-11-15T22:53:24.4589010Z 2020-11-15T22:53:24+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 1C01F549-38F9-4F8F-9CDF-3ADBD7CF6453 [Time] 32ms + 2020-11-15T22:53:24.4608940Z Test Case '-[PointFreeTests.InvoicesTests testInvoices]' passed (0.038 seconds). + 2020-11-15T22:53:24.4628240Z Test Case '-[PointFreeTests.InvoicesTests testInvoiceWithDiscount]' started. + 2020-11-15T22:53:24.4630560Z 2020-11-15T22:53:24+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 B941583D-4216-45CF-BBAF-E018F4315923 [Request] GET /account/invoices/in_test + 2020-11-15T22:53:24.4911130Z Test Case '-[PointFreeTests.InvoicesTests testInvoiceWithDiscount]' passed (0.032 seconds). + 2020-11-15T22:53:24.4913180Z 2020-11-15T22:53:24+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 B941583D-4216-45CF-BBAF-E018F4315923 [Time] 28ms + 2020-11-15T22:53:24.4946780Z Test Suite 'InvoicesTests' passed at 2020-11-15 22:53:24.491. + 2020-11-15T22:53:24.4954920Z Executed 4 tests, with 0 failures (0 unexpected) in 0.140 (0.140) seconds + 2020-11-15T22:53:24.4956930Z Test Suite 'MetaLayoutTests' started at 2020-11-15 22:53:24.491 + 2020-11-15T22:53:24.4959560Z Test Case '-[PointFreeTests.MetaLayoutTests testMetaTagsWithStyleTag]' started. + 2020-11-15T22:53:24.4961610Z Test Case '-[PointFreeTests.MetaLayoutTests testMetaTagsWithStyleTag]' passed (0.002 seconds). + 2020-11-15T22:53:24.4964890Z Test Suite 'MetaLayoutTests' passed at 2020-11-15 22:53:24.493. + 2020-11-15T22:53:24.4965760Z Executed 1 test, with 0 failures (0 unexpected) in 0.002 (0.003) seconds + 2020-11-15T22:53:24.4966750Z Test Suite 'MinimalNavViewTests' started at 2020-11-15 22:53:24.493 + 2020-11-15T22:53:24.4968320Z Test Case '-[PointFreeTests.MinimalNavViewTests testNav_Html]' started. + 2020-11-15T22:53:24.6778950Z Test Case '-[PointFreeTests.MinimalNavViewTests testNav_Html]' passed (0.184 seconds). + 2020-11-15T22:53:24.6780900Z Test Case '-[PointFreeTests.MinimalNavViewTests testNav_Screenshots]' started. + 2020-11-15T22:53:24.8452040Z Test Case '-[PointFreeTests.MinimalNavViewTests testNav_Screenshots]' passed (0.167 seconds). + 2020-11-15T22:53:24.8454160Z Test Suite 'MinimalNavViewTests' passed at 2020-11-15 22:53:24.845. + 2020-11-15T22:53:24.8454690Z Executed 2 tests, with 0 failures (0 unexpected) in 0.351 (0.352) seconds + 2020-11-15T22:53:24.8455600Z Test Suite 'NewBlogPostEmailTests' started at 2020-11-15 22:53:24.845 + 2020-11-15T22:53:24.8457000Z Test Case '-[PointFreeTests.NewBlogPostEmailTests testNewBlogPostEmail_Announcements_NonSubscriber]' started. + 2020-11-15T22:53:24.9107380Z Test Case '-[PointFreeTests.NewBlogPostEmailTests testNewBlogPostEmail_Announcements_NonSubscriber]' passed (0.065 seconds). + 2020-11-15T22:53:24.9109740Z Test Case '-[PointFreeTests.NewBlogPostEmailTests testNewBlogPostEmail_Announcements_Subscriber]' started. + 2020-11-15T22:53:24.9759370Z Test Case '-[PointFreeTests.NewBlogPostEmailTests testNewBlogPostEmail_Announcements_Subscriber]' passed (0.065 seconds). + 2020-11-15T22:53:24.9763110Z Test Case '-[PointFreeTests.NewBlogPostEmailTests testNewBlogPostEmail_NoAnnouncements_NonSubscriber]' started. + 2020-11-15T22:53:25.0382440Z Test Case '-[PointFreeTests.NewBlogPostEmailTests testNewBlogPostEmail_NoAnnouncements_NonSubscriber]' passed (0.063 seconds). + 2020-11-15T22:53:25.0385380Z Test Case '-[PointFreeTests.NewBlogPostEmailTests testNewBlogPostEmail_NoAnnouncements_Subscriber]' started. + 2020-11-15T22:53:25.0968500Z Test Case '-[PointFreeTests.NewBlogPostEmailTests testNewBlogPostEmail_NoAnnouncements_Subscriber]' passed (0.059 seconds). + 2020-11-15T22:53:25.0970340Z Test Case '-[PointFreeTests.NewBlogPostEmailTests testNewBlogPostEmail_NoCoverImage]' started. + 2020-11-15T22:53:25.1520690Z Test Case '-[PointFreeTests.NewBlogPostEmailTests testNewBlogPostEmail_NoCoverImage]' passed (0.055 seconds). + 2020-11-15T22:53:25.1522440Z Test Case '-[PointFreeTests.NewBlogPostEmailTests testNewBlogPostRoute]' started. + 2020-11-15T22:53:25.1554700Z Test Case '-[PointFreeTests.NewBlogPostEmailTests testNewBlogPostRoute]' passed (0.003 seconds). + 2020-11-15T22:53:25.1555990Z Test Suite 'NewBlogPostEmailTests' passed at 2020-11-15 22:53:25.155. + 2020-11-15T22:53:25.1556530Z Executed 6 tests, with 0 failures (0 unexpected) in 0.310 (0.310) seconds + 2020-11-15T22:53:25.1557380Z Test Suite 'NewEpisodeEmailTests' started at 2020-11-15 22:53:25.155 + 2020-11-15T22:53:25.1558700Z Test Case '-[PointFreeTests.NewEpisodeEmailTests testNewEpisodeEmail_Announcement_NonSubscriber]' started. + 2020-11-15T22:53:25.2334530Z Test Case '-[PointFreeTests.NewEpisodeEmailTests testNewEpisodeEmail_Announcement_NonSubscriber]' passed (0.077 seconds). + 2020-11-15T22:53:25.2336830Z Test Case '-[PointFreeTests.NewEpisodeEmailTests testNewEpisodeEmail_Announcement_Subscriber]' started. + 2020-11-15T22:53:25.2975510Z Test Case '-[PointFreeTests.NewEpisodeEmailTests testNewEpisodeEmail_Announcement_Subscriber]' passed (0.065 seconds). + 2020-11-15T22:53:25.2977390Z Test Case '-[PointFreeTests.NewEpisodeEmailTests testNewEpisodeEmail_FreeEpisode_NonSubscriber]' started. + 2020-11-15T22:53:25.3602200Z Test Case '-[PointFreeTests.NewEpisodeEmailTests testNewEpisodeEmail_FreeEpisode_NonSubscriber]' passed (0.063 seconds). + 2020-11-15T22:53:25.3604010Z Test Case '-[PointFreeTests.NewEpisodeEmailTests testNewEpisodeEmail_Subscriber]' started. + 2020-11-15T22:53:25.4199140Z Test Case '-[PointFreeTests.NewEpisodeEmailTests testNewEpisodeEmail_Subscriber]' passed (0.060 seconds). + 2020-11-15T22:53:25.4200830Z Test Suite 'NewEpisodeEmailTests' passed at 2020-11-15 22:53:25.420. + 2020-11-15T22:53:25.4207110Z Executed 4 tests, with 0 failures (0 unexpected) in 0.264 (0.264) seconds + 2020-11-15T22:53:25.4208320Z Test Suite 'NewslettersIntegrationTests' started at 2020-11-15 22:53:25.420 + 2020-11-15T22:53:25.4209780Z Test Case '-[PointFreeTests.NewslettersIntegrationTests testExpressUnsubscribe]' started. + 2020-11-15T22:53:25.4359910Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:25.4362620Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:25.4364070Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:25.4370100Z drop cascades to extension citext + 2020-11-15T22:53:25.4370500Z drop cascades to table users + 2020-11-15T22:53:25.4370900Z drop cascades to table subscriptions + 2020-11-15T22:53:25.4371270Z drop cascades to table team_invites + 2020-11-15T22:53:25.4371630Z drop cascades to table email_settings + 2020-11-15T22:53:25.4372020Z drop cascades to table episode_credits + 2020-11-15T22:53:25.4372400Z drop cascades to table feed_request_events + 2020-11-15T22:53:25.4372800Z drop cascades to function update_updated_at() + 2020-11-15T22:53:25.4373210Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:25.4373600Z drop cascades to table enterprise_emails + 2020-11-15T22:53:25.4374280Z drop cascades to table episode_progresses + 2020-11-15T22:53:25.4374730Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:25.4375130Z drop cascades to sequence test_uuids + 2020-11-15T22:53:25.4375500Z drop cascades to sequence test_shortids + 2020-11-15T22:53:26.5399580Z 2020-11-15T22:53:26+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 6E51D3F5-CC8B-47A5-AADE-508E6E6C63CC [Request] GET /newsletters/express-unsubscribe + 2020-11-15T22:53:26.6148970Z 2020-11-15T22:53:26+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 6E51D3F5-CC8B-47A5-AADE-508E6E6C63CC [Time] 70ms + 2020-11-15T22:53:26.6244430Z Test Case '-[PointFreeTests.NewslettersIntegrationTests testExpressUnsubscribe]' passed (1.204 seconds). + 2020-11-15T22:53:26.6246450Z Test Case '-[PointFreeTests.NewslettersIntegrationTests testExpressUnsubscribeReply]' started. + 2020-11-15T22:53:26.6401350Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:26.6402540Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:26.6405440Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:26.6406670Z drop cascades to extension citext + 2020-11-15T22:53:26.6407250Z drop cascades to table users + 2020-11-15T22:53:26.6407860Z drop cascades to table subscriptions + 2020-11-15T22:53:26.6408470Z drop cascades to table team_invites + 2020-11-15T22:53:26.6409490Z drop cascades to table email_settings + 2020-11-15T22:53:26.6414130Z drop cascades to table episode_credits + 2020-11-15T22:53:26.6414510Z drop cascades to table feed_request_events + 2020-11-15T22:53:26.6414930Z drop cascades to function update_updated_at() + 2020-11-15T22:53:26.6416650Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:26.6417060Z drop cascades to table enterprise_emails + 2020-11-15T22:53:26.6417460Z drop cascades to table episode_progresses + 2020-11-15T22:53:26.6417880Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:26.6418810Z drop cascades to sequence test_uuids + 2020-11-15T22:53:26.6419200Z drop cascades to sequence test_shortids + 2020-11-15T22:53:27.7611830Z 2020-11-15T22:53:27+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 144FCD01-15B2-47DB-8810-EF3FB8A03F7C [Request] POST /newsletters/express-unsubscribe-reply + 2020-11-15T22:53:27.8103460Z 2020-11-15T22:53:27+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 144FCD01-15B2-47DB-8810-EF3FB8A03F7C [Time] 49ms + 2020-11-15T22:53:27.8193670Z Test Case '-[PointFreeTests.NewslettersIntegrationTests testExpressUnsubscribeReply]' passed (1.195 seconds). + 2020-11-15T22:53:27.8195860Z Test Case '-[PointFreeTests.NewslettersIntegrationTests testExpressUnsubscribeReply_IncorrectSignature]' started. + 2020-11-15T22:53:27.8331410Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:27.8331970Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:27.8333150Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:27.8333530Z drop cascades to extension citext + 2020-11-15T22:53:27.8333870Z drop cascades to table users + 2020-11-15T22:53:27.8334220Z drop cascades to table subscriptions + 2020-11-15T22:53:27.8334600Z drop cascades to table team_invites + 2020-11-15T22:53:27.8334940Z drop cascades to table email_settings + 2020-11-15T22:53:27.8335310Z drop cascades to table episode_credits + 2020-11-15T22:53:27.8335810Z drop cascades to table feed_request_events + 2020-11-15T22:53:27.8336210Z drop cascades to function update_updated_at() + 2020-11-15T22:53:27.8336630Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:27.8337030Z drop cascades to table enterprise_emails + 2020-11-15T22:53:27.8337420Z drop cascades to table episode_progresses + 2020-11-15T22:53:27.8337830Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:27.8338650Z drop cascades to sequence test_uuids + 2020-11-15T22:53:27.8339070Z drop cascades to sequence test_shortids + 2020-11-15T22:53:28.9445690Z 2020-11-15T22:53:28+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 31D31D46-1D25-4B39-8E39-B3C785662D97 [Request] POST /newsletters/express-unsubscribe-reply + 2020-11-15T22:53:28.9459750Z 2020-11-15T22:53:28+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 31D31D46-1D25-4B39-8E39-B3C785662D97 [Time] 1ms + 2020-11-15T22:53:28.9550130Z Test Case '-[PointFreeTests.NewslettersIntegrationTests testExpressUnsubscribeReply_IncorrectSignature]' passed (1.136 seconds). + 2020-11-15T22:53:28.9552830Z Test Case '-[PointFreeTests.NewslettersIntegrationTests testExpressUnsubscribeReply_UnknownNewsletter]' started. + 2020-11-15T22:53:28.9682160Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:28.9682720Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:28.9683820Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:28.9684210Z drop cascades to extension citext + 2020-11-15T22:53:28.9684530Z drop cascades to table users + 2020-11-15T22:53:28.9684890Z drop cascades to table subscriptions + 2020-11-15T22:53:28.9685250Z drop cascades to table team_invites + 2020-11-15T22:53:28.9685610Z drop cascades to table email_settings + 2020-11-15T22:53:28.9685970Z drop cascades to table episode_credits + 2020-11-15T22:53:28.9686350Z drop cascades to table feed_request_events + 2020-11-15T22:53:28.9686740Z drop cascades to function update_updated_at() + 2020-11-15T22:53:28.9687160Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:28.9687550Z drop cascades to table enterprise_emails + 2020-11-15T22:53:28.9687950Z drop cascades to table episode_progresses + 2020-11-15T22:53:28.9688360Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:28.9688750Z drop cascades to sequence test_uuids + 2020-11-15T22:53:28.9689120Z drop cascades to sequence test_shortids + 2020-11-15T22:53:29.9633120Z 2020-11-15T22:53:29+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 7E6DDFCF-30B2-4632-8CB5-472C87D8C476 [Request] POST /newsletters/express-unsubscribe-reply + 2020-11-15T22:53:29.9644610Z 2020-11-15T22:53:29+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 7E6DDFCF-30B2-4632-8CB5-472C87D8C476 [Time] 1ms + 2020-11-15T22:53:29.9737670Z Test Case '-[PointFreeTests.NewslettersIntegrationTests testExpressUnsubscribeReply_UnknownNewsletter]' passed (1.019 seconds). + 2020-11-15T22:53:29.9741780Z Test Suite 'NewslettersIntegrationTests' passed at 2020-11-15 22:53:29.973. + 2020-11-15T22:53:29.9745230Z Executed 4 tests, with 0 failures (0 unexpected) in 4.553 (4.554) seconds + 2020-11-15T22:53:29.9747200Z Test Suite 'NotFoundMiddlewareTests' started at 2020-11-15 22:53:29.974 + 2020-11-15T22:53:29.9748490Z Test Case '-[PointFreeTests.NotFoundMiddlewareTests testNotFound]' started. + 2020-11-15T22:53:29.9759330Z 2020-11-15T22:53:29+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift A246C68D-FCFC-4113-B894-A1C596616A6A [Request] GET /404 + 2020-11-15T22:53:30.0050750Z 2020-11-15T22:53:30+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 A246C68D-FCFC-4113-B894-A1C596616A6A [Time] 29ms + 2020-11-15T22:53:30.0059620Z Test Case '-[PointFreeTests.NotFoundMiddlewareTests testNotFound]' passed (0.032 seconds). + 2020-11-15T22:53:30.0061460Z Test Case '-[PointFreeTests.NotFoundMiddlewareTests testNotFound_LoggedIn]' started. + 2020-11-15T22:53:30.0081890Z 2020-11-15T22:53:30+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift B9997531-FCB2-490B-BF63-6AD0275C24BA [Request] GET /404 + 2020-11-15T22:53:30.0363040Z 2020-11-15T22:53:30+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 B9997531-FCB2-490B-BF63-6AD0275C24BA [Time] 28ms + 2020-11-15T22:53:30.0373190Z Test Case '-[PointFreeTests.NotFoundMiddlewareTests testNotFound_LoggedIn]' passed (0.031 seconds). + 2020-11-15T22:53:30.0374540Z Test Suite 'NotFoundMiddlewareTests' passed at 2020-11-15 22:53:30.037. + 2020-11-15T22:53:30.0375100Z Executed 2 tests, with 0 failures (0 unexpected) in 0.064 (0.064) seconds + 2020-11-15T22:53:30.0375930Z Test Suite 'PaymentInfoTests' started at 2020-11-15 22:53:30.037 + 2020-11-15T22:53:30.0377470Z Test Case '-[PointFreeTests.PaymentInfoTests testInvoiceBilling]' started. + 2020-11-15T22:53:30.0395760Z 2020-11-15T22:53:30+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 A726F62B-6736-4421-8E6D-DAD047579D53 [Request] GET /account/payment-info + 2020-11-15T22:53:30.0419180Z 2020-11-15T22:53:30+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 A726F62B-6736-4421-8E6D-DAD047579D53 [Time] 2ms + 2020-11-15T22:53:30.0425200Z Test Case '-[PointFreeTests.PaymentInfoTests testInvoiceBilling]' passed (0.005 seconds). + 2020-11-15T22:53:30.0426530Z Test Case '-[PointFreeTests.PaymentInfoTests testRender]' started. + 2020-11-15T22:53:30.0446570Z 2020-11-15T22:53:30+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 AE961DA6-4F95-4BBC-ABFB-465BABA36411 [Request] GET /account/payment-info + 2020-11-15T22:53:30.0741730Z 2020-11-15T22:53:30+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 AE961DA6-4F95-4BBC-ABFB-465BABA36411 [Time] 29ms + 2020-11-15T22:53:30.0751820Z Test Case '-[PointFreeTests.PaymentInfoTests testRender]' passed (0.033 seconds). + 2020-11-15T22:53:30.0752940Z Test Suite 'PaymentInfoTests' passed at 2020-11-15 22:53:30.075. + 2020-11-15T22:53:30.0753430Z Executed 2 tests, with 0 failures (0 unexpected) in 0.038 (0.038) seconds + 2020-11-15T22:53:30.0754290Z Test Suite 'PointFreeRouterTests' started at 2020-11-15 22:53:30.075 + 2020-11-15T22:53:30.0755620Z Test Case '-[PointFreeRouterTests.PointFreeRouterTests testEpisodeProgressRoute]' started. + 2020-11-15T22:53:30.0771000Z Test Case '-[PointFreeRouterTests.PointFreeRouterTests testEpisodeProgressRoute]' passed (0.002 seconds). + 2020-11-15T22:53:30.0772840Z Test Case '-[PointFreeRouterTests.PointFreeRouterTests testEpisodeShowRoute]' started. + 2020-11-15T22:53:30.0786150Z Test Case '-[PointFreeRouterTests.PointFreeRouterTests testEpisodeShowRoute]' passed (0.001 seconds). + 2020-11-15T22:53:30.0787900Z Test Case '-[PointFreeRouterTests.PointFreeRouterTests testSubscribeRoute]' started. + 2020-11-15T22:53:30.0830870Z Test Case '-[PointFreeRouterTests.PointFreeRouterTests testSubscribeRoute]' passed (0.005 seconds). + 2020-11-15T22:53:30.0832570Z Test Case '-[PointFreeRouterTests.PointFreeRouterTests testTeamJoin]' started. + 2020-11-15T22:53:30.0855480Z Test Case '-[PointFreeRouterTests.PointFreeRouterTests testTeamJoin]' passed (0.002 seconds). + 2020-11-15T22:53:30.0857540Z Test Case '-[PointFreeRouterTests.PointFreeRouterTests testTeamJoinLanding]' started. + 2020-11-15T22:53:30.0880780Z Test Case '-[PointFreeRouterTests.PointFreeRouterTests testTeamJoinLanding]' passed (0.002 seconds). + 2020-11-15T22:53:30.0882530Z Test Case '-[PointFreeRouterTests.PointFreeRouterTests testUpdateProfile]' started. + 2020-11-15T22:53:30.0901760Z Test Case '-[PointFreeRouterTests.PointFreeRouterTests testUpdateProfile]' passed (0.002 seconds). + 2020-11-15T22:53:30.0903140Z Test Suite 'PointFreeRouterTests' passed at 2020-11-15 22:53:30.090. + 2020-11-15T22:53:30.0904180Z Executed 6 tests, with 0 failures (0 unexpected) in 0.015 (0.015) seconds + 2020-11-15T22:53:30.0905270Z Test Suite 'PricingLandingIntegrationTests' started at 2020-11-15 22:53:30.090 + 2020-11-15T22:53:30.0906830Z Test Case '-[PointFreeTests.PricingLandingIntegrationTests testLanding_LoggedIn_InactiveSubscriber]' started. + 2020-11-15T22:53:30.1035910Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:30.1036450Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:30.1037620Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:30.1037990Z drop cascades to extension citext + 2020-11-15T22:53:30.1038330Z drop cascades to table users + 2020-11-15T22:53:30.1038680Z drop cascades to table subscriptions + 2020-11-15T22:53:30.1039520Z drop cascades to table team_invites + 2020-11-15T22:53:30.1039880Z drop cascades to table email_settings + 2020-11-15T22:53:30.1040240Z drop cascades to table episode_credits + 2020-11-15T22:53:30.1040620Z drop cascades to table feed_request_events + 2020-11-15T22:53:30.1041010Z drop cascades to function update_updated_at() + 2020-11-15T22:53:30.1041420Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:30.1041830Z drop cascades to table enterprise_emails + 2020-11-15T22:53:30.1042220Z drop cascades to table episode_progresses + 2020-11-15T22:53:30.1042640Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:30.1043030Z drop cascades to sequence test_uuids + 2020-11-15T22:53:30.1043400Z drop cascades to sequence test_shortids + 2020-11-15T22:53:31.1197180Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 58B4D2CF-A2C7-446D-B8CF-5BA9DAA07BB5 [Request] GET /pricing + 2020-11-15T22:53:31.2004490Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 58B4D2CF-A2C7-446D-B8CF-5BA9DAA07BB5 [Time] 80ms + 2020-11-15T22:53:31.2032320Z Test Case '-[PointFreeTests.PricingLandingIntegrationTests testLanding_LoggedIn_InactiveSubscriber]' passed (1.112 seconds). + 2020-11-15T22:53:31.2035410Z Test Suite 'PricingLandingIntegrationTests' passed at 2020-11-15 22:53:31.203. + 2020-11-15T22:53:31.2036060Z Executed 1 test, with 0 failures (0 unexpected) in 1.112 (1.113) seconds + 2020-11-15T22:53:31.2036920Z Test Suite 'PricingLandingTests' started at 2020-11-15 22:53:31.203 + 2020-11-15T22:53:31.2038130Z Test Case '-[PointFreeTests.PricingLandingTests testLanding_LoggedIn_ActiveSubscriber]' started. + 2020-11-15T22:53:31.2048060Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 4C992ED8-B4DC-47F0-AEF1-295BCAAA6870 [Request] GET /pricing + 2020-11-15T22:53:31.2519840Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 4C992ED8-B4DC-47F0-AEF1-295BCAAA6870 [Time] 46ms + 2020-11-15T22:53:31.2535900Z Test Case '-[PointFreeTests.PricingLandingTests testLanding_LoggedIn_ActiveSubscriber]' passed (0.051 seconds). + 2020-11-15T22:53:31.2537520Z Test Case '-[PointFreeTests.PricingLandingTests testLanding_LoggedOut]' started. + 2020-11-15T22:53:31.2557210Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 9E4CD0D2-3599-4660-9A3A-B3B1B3A6D03A [Request] GET /pricing + 2020-11-15T22:53:31.3180200Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 9E4CD0D2-3599-4660-9A3A-B3B1B3A6D03A [Time] 62ms + 2020-11-15T22:53:31.3196220Z Test Case '-[PointFreeTests.PricingLandingTests testLanding_LoggedOut]' passed (0.066 seconds). + 2020-11-15T22:53:31.3197470Z Test Suite 'PricingLandingTests' passed at 2020-11-15 22:53:31.319. + 2020-11-15T22:53:31.3197990Z Executed 2 tests, with 0 failures (0 unexpected) in 0.117 (0.117) seconds + 2020-11-15T22:53:31.3199180Z Test Suite 'PrivacyTests' started at 2020-11-15 22:53:31.320 + 2020-11-15T22:53:31.3200200Z Test Case '-[PointFreeTests.PrivacyTests testPrivacy]' started. + 2020-11-15T22:53:31.3217950Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 E9FE3397-4DF8-4FEE-8E34-6FCF36232B85 [Request] GET /privacy + 2020-11-15T22:53:31.3526940Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 E9FE3397-4DF8-4FEE-8E34-6FCF36232B85 [Time] 30ms + 2020-11-15T22:53:31.3535950Z Test Case '-[PointFreeTests.PrivacyTests testPrivacy]' passed (0.034 seconds). + 2020-11-15T22:53:31.3537010Z Test Suite 'PrivacyTests' passed at 2020-11-15 22:53:31.353. + 2020-11-15T22:53:31.3537460Z Executed 1 test, with 0 failures (0 unexpected) in 0.034 (0.034) seconds + 2020-11-15T22:53:31.3538290Z Test Suite 'PrivateRssTests' started at 2020-11-15 22:53:31.354 + 2020-11-15T22:53:31.3539480Z Test Case '-[PointFreeTests.PrivateRssTests testFeed_Authenticated_DeactivatedSubscriber]' started. + 2020-11-15T22:53:31.3569660Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 C099F60A-083F-44FD-879D-0BCA65505659 [Request] GET /account/rss/f9c46e50cb32c3f12369e92c8bb9d9db09edf2cce5a0307b4e8516ac36340b47847c7d6d216c635dd0cff1d0429f0567/6f19da772a4f375a88d7fa153b38da002839db602c2dab23f1a9524dcfb37f8498e27e463f4da28c1cf14a06cbd6d07a + 2020-11-15T22:53:31.3594250Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift C099F60A-083F-44FD-879D-0BCA65505659 [Time] 2ms + 2020-11-15T22:53:31.3599690Z Test Case '-[PointFreeTests.PrivateRssTests testFeed_Authenticated_DeactivatedSubscriber]' passed (0.006 seconds). + 2020-11-15T22:53:31.3601280Z Test Case '-[PointFreeTests.PrivateRssTests testFeed_Authenticated_InActiveSubscriber]' started. + 2020-11-15T22:53:31.3630260Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 DE081278-AF9A-49C5-9567-787B0336D32E [Request] GET /account/rss/f9c46e50cb32c3f12369e92c8bb9d9db09edf2cce5a0307b4e8516ac36340b47847c7d6d216c635dd0cff1d0429f0567/6f19da772a4f375a88d7fa153b38da002839db602c2dab23f1a9524dcfb37f8498e27e463f4da28c1cf14a06cbd6d07a + 2020-11-15T22:53:31.3646900Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift DE081278-AF9A-49C5-9567-787B0336D32E [Time] 1ms + 2020-11-15T22:53:31.3652320Z Test Case '-[PointFreeTests.PrivateRssTests testFeed_Authenticated_InActiveSubscriber]' passed (0.005 seconds). + 2020-11-15T22:53:31.3653810Z Test Case '-[PointFreeTests.PrivateRssTests testFeed_Authenticated_NonSubscriber]' started. + 2020-11-15T22:53:31.3682950Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 071064E2-415B-47D1-9FC6-64099917BDCF [Request] GET /account/rss/f9c46e50cb32c3f12369e92c8bb9d9db09edf2cce5a0307b4e8516ac36340b47847c7d6d216c635dd0cff1d0429f0567/6f19da772a4f375a88d7fa153b38da002839db602c2dab23f1a9524dcfb37f8498e27e463f4da28c1cf14a06cbd6d07a + 2020-11-15T22:53:31.3699580Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 071064E2-415B-47D1-9FC6-64099917BDCF [Time] 1ms + 2020-11-15T22:53:31.3704880Z Test Case '-[PointFreeTests.PrivateRssTests testFeed_Authenticated_NonSubscriber]' passed (0.005 seconds). + 2020-11-15T22:53:31.3706350Z Test Case '-[PointFreeTests.PrivateRssTests testFeed_Authenticated_Subscriber_Monthly]' started. + 2020-11-15T22:53:31.3738600Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 F80A2B73-86CF-44BA-BEA4-927FA5ECA9A6 [Request] GET /account/rss/f9c46e50cb32c3f12369e92c8bb9d9db09edf2cce5a0307b4e8516ac36340b47847c7d6d216c635dd0cff1d0429f0567/6f19da772a4f375a88d7fa153b38da002839db602c2dab23f1a9524dcfb37f8498e27e463f4da28c1cf14a06cbd6d07a + 2020-11-15T22:53:31.3832860Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 F80A2B73-86CF-44BA-BEA4-927FA5ECA9A6 [Time] 9ms + 2020-11-15T22:53:31.3839010Z Test Case '-[PointFreeTests.PrivateRssTests testFeed_Authenticated_Subscriber_Monthly]' passed (0.013 seconds). + 2020-11-15T22:53:31.3840840Z Test Case '-[PointFreeTests.PrivateRssTests testFeed_Authenticated_Subscriber_Yearly]' started. + 2020-11-15T22:53:31.3870080Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift B0764081-205D-4432-A36C-90F4B58D3C68 [Request] GET /account/rss/f9c46e50cb32c3f12369e92c8bb9d9db09edf2cce5a0307b4e8516ac36340b47847c7d6d216c635dd0cff1d0429f0567/6f19da772a4f375a88d7fa153b38da002839db602c2dab23f1a9524dcfb37f8498e27e463f4da28c1cf14a06cbd6d07a + 2020-11-15T22:53:31.3983690Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 B0764081-205D-4432-A36C-90F4B58D3C68 [Time] 11ms + 2020-11-15T22:53:31.3989730Z Test Case '-[PointFreeTests.PrivateRssTests testFeed_Authenticated_Subscriber_Yearly]' passed (0.015 seconds). + 2020-11-15T22:53:31.3991080Z Test Case '-[PointFreeTests.PrivateRssTests testFeed_BadSalt]' started. + 2020-11-15T22:53:31.4021440Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 4E4EBBAA-82C7-455E-AA1E-D7F03F3557E9 [Request] GET /account/rss/f9c46e50cb32c3f12369e92c8bb9d9db09edf2cce5a0307b4e8516ac36340b47847c7d6d216c635dd0cff1d0429f0567/a1c680c38d3e5791f6fdf120fc5c55f4e2a11e8f457168064e770c67058c8f1ada90a08da9c299d7a52e5e593ecb63a8 + 2020-11-15T22:53:31.4040060Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 4E4EBBAA-82C7-455E-AA1E-D7F03F3557E9 [Time] 2ms + 2020-11-15T22:53:31.4045000Z Test Case '-[PointFreeTests.PrivateRssTests testFeed_BadSalt]' passed (0.005 seconds). + 2020-11-15T22:53:31.4046400Z Test Case '-[PointFreeTests.PrivateRssTests testFeed_BadSalt_InvalidUserAgent]' started. + 2020-11-15T22:53:31.4075850Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 128A292E-FD70-435C-AC0C-1D83A5F8F371 [Request] GET /account/rss/f9c46e50cb32c3f12369e92c8bb9d9db09edf2cce5a0307b4e8516ac36340b47847c7d6d216c635dd0cff1d0429f0567/a1c680c38d3e5791f6fdf120fc5c55f4e2a11e8f457168064e770c67058c8f1ada90a08da9c299d7a52e5e593ecb63a8 + 2020-11-15T22:53:31.4094710Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 128A292E-FD70-435C-AC0C-1D83A5F8F371 [Time] 2ms + 2020-11-15T22:53:31.4100050Z Test Case '-[PointFreeTests.PrivateRssTests testFeed_BadSalt_InvalidUserAgent]' passed (0.005 seconds). + 2020-11-15T22:53:31.4101480Z Test Case '-[PointFreeTests.PrivateRssTests testFeed_InvalidUserAgent]' started. + 2020-11-15T22:53:31.4131510Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 00AAE330-3C26-4633-BE10-3D16CE3C80FE [Request] GET /account/rss/f9c46e50cb32c3f12369e92c8bb9d9db09edf2cce5a0307b4e8516ac36340b47847c7d6d216c635dd0cff1d0429f0567/6f19da772a4f375a88d7fa153b38da002839db602c2dab23f1a9524dcfb37f8498e27e463f4da28c1cf14a06cbd6d07a + 2020-11-15T22:53:31.4150340Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 00AAE330-3C26-4633-BE10-3D16CE3C80FE [Time] 2ms + 2020-11-15T22:53:31.4155790Z Test Case '-[PointFreeTests.PrivateRssTests testFeed_InvalidUserAgent]' passed (0.006 seconds). + 2020-11-15T22:53:31.4157180Z Test Case '-[PointFreeTests.PrivateRssTests testFeed_ValidUserAgent]' started. + 2020-11-15T22:53:31.4190270Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 4FDFE1BE-7392-416C-8C8A-36793EDDC5B5 [Request] GET /account/rss/f9c46e50cb32c3f12369e92c8bb9d9db09edf2cce5a0307b4e8516ac36340b47847c7d6d216c635dd0cff1d0429f0567/6f19da772a4f375a88d7fa153b38da002839db602c2dab23f1a9524dcfb37f8498e27e463f4da28c1cf14a06cbd6d07a + 2020-11-15T22:53:31.4287680Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 4FDFE1BE-7392-416C-8C8A-36793EDDC5B5 [Time] 9ms + 2020-11-15T22:53:31.4293640Z Test Case '-[PointFreeTests.PrivateRssTests testFeed_ValidUserAgent]' passed (0.014 seconds). + 2020-11-15T22:53:31.4294800Z Test Suite 'PrivateRssTests' passed at 2020-11-15 22:53:31.429. + 2020-11-15T22:53:31.4295280Z Executed 9 tests, with 0 failures (0 unexpected) in 0.075 (0.076) seconds + 2020-11-15T22:53:31.4296130Z Test Suite 'ReferralEmailTests' started at 2020-11-15 22:53:31.429 + 2020-11-15T22:53:31.4297230Z Test Case '-[PointFreeTests.ReferralEmailTests testReferralEmail]' started. + 2020-11-15T22:53:31.4735880Z Test Case '-[PointFreeTests.ReferralEmailTests testReferralEmail]' passed (0.044 seconds). + 2020-11-15T22:53:31.4737540Z Test Suite 'ReferralEmailTests' passed at 2020-11-15 22:53:31.473. + 2020-11-15T22:53:31.4738130Z Executed 1 test, with 0 failures (0 unexpected) in 0.044 (0.044) seconds + 2020-11-15T22:53:31.4739140Z Test Suite 'RegistrationEmailTests' started at 2020-11-15 22:53:31.473 + 2020-11-15T22:53:31.4740480Z Test Case '-[PointFreeTests.RegistrationEmailTests testRegistrationEmail]' started. + 2020-11-15T22:53:31.5224500Z Test Case '-[PointFreeTests.RegistrationEmailTests testRegistrationEmail]' passed (0.049 seconds). + 2020-11-15T22:53:31.5232350Z Test Suite 'RegistrationEmailTests' passed at 2020-11-15 22:53:31.522. + 2020-11-15T22:53:31.5232910Z Executed 1 test, with 0 failures (0 unexpected) in 0.049 (0.049) seconds + 2020-11-15T22:53:31.5233740Z Test Suite 'SessionTests' started at 2020-11-15 22:53:31.522 + 2020-11-15T22:53:31.5234680Z Test Case '-[PointFreeTests.SessionTests testDecodable]' started. + 2020-11-15T22:53:31.5249570Z Test Case '-[PointFreeTests.SessionTests testDecodable]' passed (0.002 seconds). + 2020-11-15T22:53:31.5250780Z Test Case '-[PointFreeTests.SessionTests testEncodable]' started. + 2020-11-15T22:53:31.5276420Z Test Case '-[PointFreeTests.SessionTests testEncodable]' passed (0.003 seconds). + 2020-11-15T22:53:31.5277520Z Test Suite 'SessionTests' passed at 2020-11-15 22:53:31.527. + 2020-11-15T22:53:31.5277970Z Executed 2 tests, with 0 failures (0 unexpected) in 0.005 (0.005) seconds + 2020-11-15T22:53:31.5278850Z Test Suite 'SiteMiddlewareTests' started at 2020-11-15 22:53:31.528 + 2020-11-15T22:53:31.5279960Z Test Case '-[PointFreeTests.SiteMiddlewareTests testWithHttps]' started. + 2020-11-15T22:53:31.5298370Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 044AB434-F185-412B-B869-354D85E48C78 [Request] GET + 2020-11-15T22:53:31.5301260Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 044AB434-F185-412B-B869-354D85E48C78 [Time] 0ms + 2020-11-15T22:53:31.5309940Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 86FEB890-9650-4821-B4DD-6C0FE5E46FF4 [Request] GET /episodes + 2020-11-15T22:53:31.5312680Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 86FEB890-9650-4821-B4DD-6C0FE5E46FF4 [Time] 0ms + 2020-11-15T22:53:31.5318320Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 324E9806-438E-471D-A6A7-0228CF80FD52 [Request] GET / + 2020-11-15T22:53:31.5729540Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 324E9806-438E-471D-A6A7-0228CF80FD52 [Time] 40ms + 2020-11-15T22:53:31.5763320Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 DFB1EF9C-C41E-4082-A5BB-A3BC4AAE44C2 [Request] GET / + 2020-11-15T22:53:31.6165040Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 DFB1EF9C-C41E-4082-A5BB-A3BC4AAE44C2 [Time] 41ms + 2020-11-15T22:53:31.6173830Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 0D5FC19B-90B6-419D-B5C6-985B67478DE5 [Request] GET / + 2020-11-15T22:53:31.6593010Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 0D5FC19B-90B6-419D-B5C6-985B67478DE5 [Time] 41ms + 2020-11-15T22:53:31.6608610Z Test Case '-[PointFreeTests.SiteMiddlewareTests testWithHttps]' passed (0.133 seconds). + 2020-11-15T22:53:31.6610160Z Test Case '-[PointFreeTests.SiteMiddlewareTests testWithoutHeroku]' started. + 2020-11-15T22:53:31.6628390Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 4233473F-5FB0-44D0-85F3-DAFF0B5B5D0A [Request] GET + 2020-11-15T22:53:31.6630860Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 4233473F-5FB0-44D0-85F3-DAFF0B5B5D0A [Time] 0ms + 2020-11-15T22:53:31.6639260Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 16F914E5-CE47-4D2C-AC5F-1370050E588A [Request] GET /episodes + 2020-11-15T22:53:31.6642440Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 16F914E5-CE47-4D2C-AC5F-1370050E588A [Time] 0ms + 2020-11-15T22:53:31.6645950Z Test Case '-[PointFreeTests.SiteMiddlewareTests testWithoutHeroku]' passed (0.004 seconds). + 2020-11-15T22:53:31.6647530Z Test Case '-[PointFreeTests.SiteMiddlewareTests testWithoutWWW]' started. + 2020-11-15T22:53:31.6663900Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 41BC104A-46AF-4F5F-AB8E-01C3DCBFB00D [Request] GET + 2020-11-15T22:53:31.6666230Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 41BC104A-46AF-4F5F-AB8E-01C3DCBFB00D [Time] 0ms + 2020-11-15T22:53:31.6673880Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 26B9A42A-74A3-488C-B45C-F1F05475DE43 [Request] GET /episodes + 2020-11-15T22:53:31.6676860Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 26B9A42A-74A3-488C-B45C-F1F05475DE43 [Time] 0ms + 2020-11-15T22:53:31.6680810Z Test Case '-[PointFreeTests.SiteMiddlewareTests testWithoutWWW]' passed (0.003 seconds). + 2020-11-15T22:53:31.6682210Z Test Case '-[PointFreeTests.SiteMiddlewareTests testWithWWW]' started. + 2020-11-15T22:53:31.6699480Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 BF54FDEE-1172-4C5E-AFEE-4CAF2A11D8A3 [Request] GET + 2020-11-15T22:53:31.7105870Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift BF54FDEE-1172-4C5E-AFEE-4CAF2A11D8A3 [Time] 39ms + 2020-11-15T22:53:31.7130210Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift F1DF9ED2-4146-4F67-AFC7-125162D54A79 [Request] GET + 2020-11-15T22:53:31.7524830Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift F1DF9ED2-4146-4F67-AFC7-125162D54A79 [Time] 40ms + 2020-11-15T22:53:31.7533080Z Test Case '-[PointFreeTests.SiteMiddlewareTests testWithWWW]' passed (0.085 seconds). + 2020-11-15T22:53:31.7534290Z Test Suite 'SiteMiddlewareTests' passed at 2020-11-15 22:53:31.753. + 2020-11-15T22:53:31.7534800Z Executed 4 tests, with 0 failures (0 unexpected) in 0.225 (0.226) seconds + 2020-11-15T22:53:31.7535600Z Test Suite 'StripeTests' started at 2020-11-15 22:53:31.753 + 2020-11-15T22:53:31.7536570Z Test Case '-[StripeTests.StripeTests testDecodingCustomer_Metadata]' started. + 2020-11-15T22:53:31.7543200Z Test Case '-[StripeTests.StripeTests testDecodingCustomer_Metadata]' passed (0.001 seconds). + 2020-11-15T22:53:31.7544470Z Test Case '-[StripeTests.StripeTests testDecodingCustomer]' started. + 2020-11-15T22:53:31.7546830Z Test Case '-[StripeTests.StripeTests testDecodingCustomer]' passed (0.000 seconds). + 2020-11-15T22:53:31.7548260Z Test Case '-[StripeTests.StripeTests testDecodingDiscountJson]' started. + 2020-11-15T22:53:31.7558270Z Test Case '-[StripeTests.StripeTests testDecodingDiscountJson]' passed (0.001 seconds). + 2020-11-15T22:53:31.7559540Z Test Case '-[StripeTests.StripeTests testDecodingPlan_WithNickname]' started. + 2020-11-15T22:53:31.7563660Z Test Case '-[StripeTests.StripeTests testDecodingPlan_WithNickname]' passed (0.000 seconds). + 2020-11-15T22:53:31.7564940Z Test Case '-[StripeTests.StripeTests testDecodingPlan_WithoutNickname]' started. + 2020-11-15T22:53:31.7567180Z Test Case '-[StripeTests.StripeTests testDecodingPlan_WithoutNickname]' passed (0.000 seconds). + 2020-11-15T22:53:31.7568740Z Test Case '-[StripeTests.StripeTests testDecodingSubscriptionWithDiscount]' started. + 2020-11-15T22:53:31.7581070Z Test Case '-[StripeTests.StripeTests testDecodingSubscriptionWithDiscount]' passed (0.001 seconds). + 2020-11-15T22:53:31.7582450Z Test Case '-[StripeTests.StripeTests testRequests]' started. + 2020-11-15T22:53:31.7692840Z Test Case '-[StripeTests.StripeTests testRequests]' passed (0.011 seconds). + 2020-11-15T22:53:31.7693910Z Test Suite 'StripeTests' passed at 2020-11-15 22:53:31.769. + 2020-11-15T22:53:31.7694370Z Executed 7 tests, with 0 failures (0 unexpected) in 0.015 (0.016) seconds + 2020-11-15T22:53:31.7695240Z Test Suite 'StripeWebhooksTests' started at 2020-11-15 22:53:31.769 + 2020-11-15T22:53:31.7696340Z Test Case '-[PointFreeTests.StripeWebhooksTests testDecoding]' started. + 2020-11-15T22:53:31.7729280Z Test Case '-[PointFreeTests.StripeWebhooksTests testDecoding]' passed (0.004 seconds). + 2020-11-15T22:53:31.7730760Z Test Case '-[PointFreeTests.StripeWebhooksTests testInvalidHook]' started. + 2020-11-15T22:53:31.7883250Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 3E7379A1-1712-48E8-AFE5-563D1183DB38 [Request] POST /webhooks/stripe + 2020-11-15T22:53:31.7907820Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 3E7379A1-1712-48E8-AFE5-563D1183DB38 [Time] 2ms + 2020-11-15T22:53:31.7914420Z Test Case '-[PointFreeTests.StripeWebhooksTests testInvalidHook]' passed (0.018 seconds). + 2020-11-15T22:53:31.7915950Z Test Case '-[PointFreeTests.StripeWebhooksTests testNoInvoiceNumber]' started. + 2020-11-15T22:53:31.8046180Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 976B2E7D-081F-4A71-8DBA-9FEADAB9C8EF [Request] POST /webhooks/stripe + 2020-11-15T22:53:31.8061840Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 976B2E7D-081F-4A71-8DBA-9FEADAB9C8EF [Time] 1ms + 2020-11-15T22:53:31.8067450Z Test Case '-[PointFreeTests.StripeWebhooksTests testNoInvoiceNumber]' passed (0.015 seconds). + 2020-11-15T22:53:31.8069060Z Test Case '-[PointFreeTests.StripeWebhooksTests testNoInvoiceSubscriptionId]' started. + 2020-11-15T22:53:31.8188250Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 A5A69268-A020-4D3A-B5E4-A6B7F7155A91 [Request] POST /webhooks/stripe + 2020-11-15T22:53:31.8205660Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift A5A69268-A020-4D3A-B5E4-A6B7F7155A91 [Time] 1ms + 2020-11-15T22:53:31.8211920Z Test Case '-[PointFreeTests.StripeWebhooksTests testNoInvoiceSubscriptionId]' passed (0.014 seconds). + 2020-11-15T22:53:31.8213880Z Test Case '-[PointFreeTests.StripeWebhooksTests testNoInvoiceSubscriptionId_AndNoLineItemSubscriptionId]' started. + 2020-11-15T22:53:31.8330820Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 17A4D825-C0EC-4C7E-8C94-265989880E73 [Request] POST /webhooks/stripe + 2020-11-15T22:53:31.8347970Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 17A4D825-C0EC-4C7E-8C94-265989880E73 [Time] 1ms + 2020-11-15T22:53:31.8354580Z Test Case '-[PointFreeTests.StripeWebhooksTests testNoInvoiceSubscriptionId_AndNoLineItemSubscriptionId]' passed (0.014 seconds). + 2020-11-15T22:53:31.8356390Z Test Case '-[PointFreeTests.StripeWebhooksTests testPastDueEmail]' started. + 2020-11-15T22:53:31.8821520Z Test Case '-[PointFreeTests.StripeWebhooksTests testPastDueEmail]' passed (0.047 seconds). + 2020-11-15T22:53:31.8823060Z Test Case '-[PointFreeTests.StripeWebhooksTests testStaleHook]' started. + 2020-11-15T22:53:31.8944290Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 70E29579-9DF8-4EF6-9DA4-C5E5C0C38589 [Request] POST /webhooks/stripe + 2020-11-15T22:53:31.8959680Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 70E29579-9DF8-4EF6-9DA4-C5E5C0C38589 [Time] 1ms + 2020-11-15T22:53:31.8965700Z Test Case '-[PointFreeTests.StripeWebhooksTests testStaleHook]' passed (0.014 seconds). + 2020-11-15T22:53:31.8967110Z Test Case '-[PointFreeTests.StripeWebhooksTests testValidHook]' started. + 2020-11-15T22:53:31.9088390Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 13E23F6F-92CE-45AD-9054-9A0930560AF6 [Request] POST /webhooks/stripe + 2020-11-15T22:53:31.9104000Z 2020-11-15T22:53:31+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 13E23F6F-92CE-45AD-9054-9A0930560AF6 [Time] 1ms + 2020-11-15T22:53:31.9108780Z Test Case '-[PointFreeTests.StripeWebhooksTests testValidHook]' passed (0.014 seconds). + 2020-11-15T22:53:31.9110010Z Test Suite 'StripeWebhooksTests' passed at 2020-11-15 22:53:31.911. + 2020-11-15T22:53:31.9110530Z Executed 8 tests, with 0 failures (0 unexpected) in 0.141 (0.142) seconds + 2020-11-15T22:53:31.9111350Z Test Suite 'StyleguideTests' started at 2020-11-15 22:53:31.911 + 2020-11-15T22:53:31.9112380Z Test Case '-[StyleguideTests.StyleguideTests testGitHubLink_Black]' started. + 2020-11-15T22:53:31.9300580Z Test Case '-[StyleguideTests.StyleguideTests testGitHubLink_Black]' passed (0.019 seconds). + 2020-11-15T22:53:31.9302450Z Test Case '-[StyleguideTests.StyleguideTests testGitHubLink_White]' started. + 2020-11-15T22:53:31.9483170Z Test Case '-[StyleguideTests.StyleguideTests testGitHubLink_White]' passed (0.018 seconds). + 2020-11-15T22:53:31.9486330Z Test Case '-[StyleguideTests.StyleguideTests testPointFreeStyles]' started. + 2020-11-15T22:53:31.9594850Z Test Case '-[StyleguideTests.StyleguideTests testPointFreeStyles]' passed (0.011 seconds). + 2020-11-15T22:53:31.9596320Z Test Case '-[StyleguideTests.StyleguideTests testStyleguide]' started. + 2020-11-15T22:53:32.0000970Z Test Case '-[StyleguideTests.StyleguideTests testStyleguide]' passed (0.040 seconds). + 2020-11-15T22:53:32.0002660Z Test Case '-[StyleguideTests.StyleguideTests testTwitterLink]' started. + 2020-11-15T22:53:32.0186140Z Test Case '-[StyleguideTests.StyleguideTests testTwitterLink]' passed (0.019 seconds). + 2020-11-15T22:53:32.0187330Z Test Suite 'StyleguideTests' passed at 2020-11-15 22:53:32.018. + 2020-11-15T22:53:32.0187840Z Executed 5 tests, with 0 failures (0 unexpected) in 0.107 (0.108) seconds + 2020-11-15T22:53:32.0188760Z Test Suite 'SubscribeIntegrationTests' started at 2020-11-15 22:53:32.018 + 2020-11-15T22:53:32.0190040Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testCoupon_Individual]' started. + 2020-11-15T22:53:32.0364300Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:32.0364820Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:32.0365960Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:32.0366350Z drop cascades to extension citext + 2020-11-15T22:53:32.0366680Z drop cascades to table users + 2020-11-15T22:53:32.0367030Z drop cascades to table subscriptions + 2020-11-15T22:53:32.0367390Z drop cascades to table team_invites + 2020-11-15T22:53:32.0367750Z drop cascades to table email_settings + 2020-11-15T22:53:32.0368120Z drop cascades to table episode_credits + 2020-11-15T22:53:32.0368500Z drop cascades to table feed_request_events + 2020-11-15T22:53:32.0368900Z drop cascades to function update_updated_at() + 2020-11-15T22:53:32.0369320Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:32.0369720Z drop cascades to table enterprise_emails + 2020-11-15T22:53:32.0370120Z drop cascades to table episode_progresses + 2020-11-15T22:53:32.0370530Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:32.0370930Z drop cascades to sequence test_uuids + 2020-11-15T22:53:32.0371300Z drop cascades to sequence test_shortids + 2020-11-15T22:53:32.6777710Z 2020-11-15T22:53:32+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift AF4211C6-522B-44AD-BC94-968702E471B2 [Request] POST /subscribe + 2020-11-15T22:53:32.7708960Z 2020-11-15T22:53:32+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 AF4211C6-522B-44AD-BC94-968702E471B2 [Time] 93ms + 2020-11-15T22:53:32.7805840Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testCoupon_Individual]' passed (0.762 seconds). + 2020-11-15T22:53:32.7808010Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testCoupon_Team]' started. + 2020-11-15T22:53:32.7943960Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:32.7944500Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:32.7945670Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:32.7946490Z drop cascades to extension citext + 2020-11-15T22:53:32.7946870Z drop cascades to table users + 2020-11-15T22:53:32.7947310Z drop cascades to table subscriptions + 2020-11-15T22:53:32.7947680Z drop cascades to table team_invites + 2020-11-15T22:53:32.7948040Z drop cascades to table email_settings + 2020-11-15T22:53:32.7948410Z drop cascades to table episode_credits + 2020-11-15T22:53:32.7948780Z drop cascades to table feed_request_events + 2020-11-15T22:53:32.7949170Z drop cascades to function update_updated_at() + 2020-11-15T22:53:32.7949580Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:32.7949980Z drop cascades to table enterprise_emails + 2020-11-15T22:53:32.7950610Z drop cascades to table episode_progresses + 2020-11-15T22:53:32.7951030Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:32.7951430Z drop cascades to sequence test_uuids + 2020-11-15T22:53:32.7951800Z drop cascades to sequence test_shortids + 2020-11-15T22:53:33.4662180Z 2020-11-15T22:53:33+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 1F9C34D1-96EC-4054-AB3E-756EC0C74870 [Request] POST /subscribe + 2020-11-15T22:53:33.4830860Z 2020-11-15T22:53:33+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 1F9C34D1-96EC-4054-AB3E-756EC0C74870 [Time] 16ms + 2020-11-15T22:53:33.4905320Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testCoupon_Team]' passed (0.710 seconds). + 2020-11-15T22:53:33.4907030Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testHappyPath]' started. + 2020-11-15T22:53:33.5244920Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:33.5245500Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:33.5246660Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:33.5247190Z drop cascades to extension citext + 2020-11-15T22:53:33.5247540Z drop cascades to table users + 2020-11-15T22:53:33.5247900Z drop cascades to table subscriptions + 2020-11-15T22:53:33.5248270Z drop cascades to table team_invites + 2020-11-15T22:53:33.5248620Z drop cascades to table email_settings + 2020-11-15T22:53:33.5248990Z drop cascades to table episode_credits + 2020-11-15T22:53:33.5249370Z drop cascades to table feed_request_events + 2020-11-15T22:53:33.5249880Z drop cascades to function update_updated_at() + 2020-11-15T22:53:33.5250270Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:33.5250670Z drop cascades to table enterprise_emails + 2020-11-15T22:53:33.5251040Z drop cascades to table episode_progresses + 2020-11-15T22:53:33.5251450Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:33.5251840Z drop cascades to sequence test_uuids + 2020-11-15T22:53:33.5252200Z drop cascades to sequence test_shortids + 2020-11-15T22:53:34.2540930Z 2020-11-15T22:53:34+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 09797E4F-CCEE-4A89-9AFE-42B53CE394A5 [Request] POST /subscribe + 2020-11-15T22:53:34.3590900Z 2020-11-15T22:53:34+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 09797E4F-CCEE-4A89-9AFE-42B53CE394A5 [Time] 104ms + 2020-11-15T22:53:34.3688170Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testHappyPath]' passed (0.878 seconds). + 2020-11-15T22:53:34.3689940Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testHappyPath_Referral_Monthly]' started. + 2020-11-15T22:53:34.3827770Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:34.3828290Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:34.3829490Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:34.3829870Z drop cascades to extension citext + 2020-11-15T22:53:34.3830210Z drop cascades to table users + 2020-11-15T22:53:34.3830560Z drop cascades to table subscriptions + 2020-11-15T22:53:34.3830930Z drop cascades to table team_invites + 2020-11-15T22:53:34.3831700Z drop cascades to table email_settings + 2020-11-15T22:53:34.3832110Z drop cascades to table episode_credits + 2020-11-15T22:53:34.3832490Z drop cascades to table feed_request_events + 2020-11-15T22:53:34.3832870Z drop cascades to function update_updated_at() + 2020-11-15T22:53:34.3833290Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:34.3833690Z drop cascades to table enterprise_emails + 2020-11-15T22:53:34.3834090Z drop cascades to table episode_progresses + 2020-11-15T22:53:34.3834510Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:34.3834910Z drop cascades to sequence test_uuids + 2020-11-15T22:53:34.3835270Z drop cascades to sequence test_shortids + 2020-11-15T22:53:35.2454600Z 2020-11-15T22:53:35+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 6F3EE8F5-3A4C-41F5-8F99-5CB263067266 [Request] POST /subscribe + 2020-11-15T22:53:35.3358470Z 2020-11-15T22:53:35+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 6F3EE8F5-3A4C-41F5-8F99-5CB263067266 [Time] 90ms + 2020-11-15T22:53:35.3440890Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testHappyPath_Referral_Monthly]' passed (0.975 seconds). + 2020-11-15T22:53:35.3442760Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testHappyPath_Referral_Yearly]' started. + 2020-11-15T22:53:35.3580210Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:35.3580780Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:35.3581960Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:35.3582370Z drop cascades to extension citext + 2020-11-15T22:53:35.3582700Z drop cascades to table users + 2020-11-15T22:53:35.3583050Z drop cascades to table subscriptions + 2020-11-15T22:53:35.3583420Z drop cascades to table team_invites + 2020-11-15T22:53:35.3583770Z drop cascades to table email_settings + 2020-11-15T22:53:35.3584140Z drop cascades to table episode_credits + 2020-11-15T22:53:35.3584530Z drop cascades to table feed_request_events + 2020-11-15T22:53:35.3584930Z drop cascades to function update_updated_at() + 2020-11-15T22:53:35.3585340Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:35.3585740Z drop cascades to table enterprise_emails + 2020-11-15T22:53:35.3586130Z drop cascades to table episode_progresses + 2020-11-15T22:53:35.3586550Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:35.3586950Z drop cascades to sequence test_uuids + 2020-11-15T22:53:35.3587320Z drop cascades to sequence test_shortids + 2020-11-15T22:53:36.2487010Z 2020-11-15T22:53:36+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift B9A9D54E-3FA3-4E34-BE94-D071A9811A22 [Request] POST /subscribe + 2020-11-15T22:53:36.3405960Z 2020-11-15T22:53:36+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift B9A9D54E-3FA3-4E34-BE94-D071A9811A22 [Time] 91ms + 2020-11-15T22:53:36.3482140Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testHappyPath_Referral_Yearly]' passed (1.004 seconds). + 2020-11-15T22:53:36.3483970Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testHappyPath_RegionalDiscount]' started. + 2020-11-15T22:53:36.3619520Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:36.3620040Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:36.3621210Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:36.3621600Z drop cascades to extension citext + 2020-11-15T22:53:36.3621940Z drop cascades to table users + 2020-11-15T22:53:36.3622310Z drop cascades to table subscriptions + 2020-11-15T22:53:36.3622680Z drop cascades to table team_invites + 2020-11-15T22:53:36.3623040Z drop cascades to table email_settings + 2020-11-15T22:53:36.3623410Z drop cascades to table episode_credits + 2020-11-15T22:53:36.3623780Z drop cascades to table feed_request_events + 2020-11-15T22:53:36.3624620Z drop cascades to function update_updated_at() + 2020-11-15T22:53:36.3625070Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:36.3625480Z drop cascades to table enterprise_emails + 2020-11-15T22:53:36.3625880Z drop cascades to table episode_progresses + 2020-11-15T22:53:36.3626300Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:36.3626700Z drop cascades to sequence test_uuids + 2020-11-15T22:53:36.3627070Z drop cascades to sequence test_shortids + 2020-11-15T22:53:37.1147570Z 2020-11-15T22:53:37+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 E421FF52-0091-459D-B834-AA3CABF93036 [Request] POST /subscribe + 2020-11-15T22:53:37.2085990Z 2020-11-15T22:53:37+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift E421FF52-0091-459D-B834-AA3CABF93036 [Time] 93ms + 2020-11-15T22:53:37.2183100Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testHappyPath_RegionalDiscount]' passed (0.870 seconds). + 2020-11-15T22:53:37.2184920Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testHappyPath_Team]' started. + 2020-11-15T22:53:37.2321920Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:37.2322510Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:37.2323690Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:37.2324080Z drop cascades to extension citext + 2020-11-15T22:53:37.2324400Z drop cascades to table users + 2020-11-15T22:53:37.2324750Z drop cascades to table subscriptions + 2020-11-15T22:53:37.2325130Z drop cascades to table team_invites + 2020-11-15T22:53:37.2325510Z drop cascades to table email_settings + 2020-11-15T22:53:37.2325870Z drop cascades to table episode_credits + 2020-11-15T22:53:37.2326250Z drop cascades to table feed_request_events + 2020-11-15T22:53:37.2326650Z drop cascades to function update_updated_at() + 2020-11-15T22:53:37.2327060Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:37.2327460Z drop cascades to table enterprise_emails + 2020-11-15T22:53:37.2327860Z drop cascades to table episode_progresses + 2020-11-15T22:53:37.2328270Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:37.2328670Z drop cascades to sequence test_uuids + 2020-11-15T22:53:37.2329040Z drop cascades to sequence test_shortids + 2020-11-15T22:53:37.9754260Z 2020-11-15T22:53:37+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 143E3785-8A93-4513-8B2F-CCA4FF41F949 [Request] POST /subscribe + 2020-11-15T22:53:38.1424850Z 2020-11-15T22:53:38+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 143E3785-8A93-4513-8B2F-CCA4FF41F949 [Time] 167ms + 2020-11-15T22:53:38.1580850Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testHappyPath_Team]' passed (0.940 seconds). + 2020-11-15T22:53:38.1582840Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testHappyPath_Team_OwnerIsNotTakingSeat]' started. + 2020-11-15T22:53:38.1718910Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:38.1719470Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:38.1720640Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:38.1721030Z drop cascades to extension citext + 2020-11-15T22:53:38.1721370Z drop cascades to table users + 2020-11-15T22:53:38.1721720Z drop cascades to table subscriptions + 2020-11-15T22:53:38.1722100Z drop cascades to table team_invites + 2020-11-15T22:53:38.1722440Z drop cascades to table email_settings + 2020-11-15T22:53:38.1722820Z drop cascades to table episode_credits + 2020-11-15T22:53:38.1723220Z drop cascades to table feed_request_events + 2020-11-15T22:53:38.1723620Z drop cascades to function update_updated_at() + 2020-11-15T22:53:38.1724030Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:38.1724430Z drop cascades to table enterprise_emails + 2020-11-15T22:53:38.1724830Z drop cascades to table episode_progresses + 2020-11-15T22:53:38.1725640Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:38.1726060Z drop cascades to sequence test_uuids + 2020-11-15T22:53:38.1726440Z drop cascades to sequence test_shortids + 2020-11-15T22:53:39.0016770Z 2020-11-15T22:53:39+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift F19A1686-1D23-4371-B875-D64108ECA364 [Request] POST /subscribe + 2020-11-15T22:53:39.1769520Z 2020-11-15T22:53:39+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 F19A1686-1D23-4371-B875-D64108ECA364 [Time] 175ms + 2020-11-15T22:53:39.2028310Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testHappyPath_Team_OwnerIsNotTakingSeat]' passed (1.045 seconds). + 2020-11-15T22:53:39.2032720Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testHappyPath_Yearly]' started. + 2020-11-15T22:53:39.2186870Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:39.2187440Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:39.2188680Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:39.2189060Z drop cascades to extension citext + 2020-11-15T22:53:39.2189390Z drop cascades to table users + 2020-11-15T22:53:39.2189780Z drop cascades to table subscriptions + 2020-11-15T22:53:39.2190160Z drop cascades to table team_invites + 2020-11-15T22:53:39.2190520Z drop cascades to table email_settings + 2020-11-15T22:53:39.2190880Z drop cascades to table episode_credits + 2020-11-15T22:53:39.2191260Z drop cascades to table feed_request_events + 2020-11-15T22:53:39.2191660Z drop cascades to function update_updated_at() + 2020-11-15T22:53:39.2192070Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:39.2194200Z drop cascades to table enterprise_emails + 2020-11-15T22:53:39.2194610Z drop cascades to table episode_progresses + 2020-11-15T22:53:39.2195030Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:39.2195420Z drop cascades to sequence test_uuids + 2020-11-15T22:53:39.2195800Z drop cascades to sequence test_shortids + 2020-11-15T22:53:39.9891740Z 2020-11-15T22:53:39+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 55786111-4A7F-4ADC-94C5-C2EC2BC605C5 [Request] POST /subscribe + 2020-11-15T22:53:40.0830540Z 2020-11-15T22:53:40+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 55786111-4A7F-4ADC-94C5-C2EC2BC605C5 [Time] 93ms + 2020-11-15T22:53:40.0925060Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testHappyPath_Yearly]' passed (0.890 seconds). + 2020-11-15T22:53:40.0927080Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testRegionalDiscountWithReferral_Monthly]' started. + 2020-11-15T22:53:40.1065760Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:40.1066220Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:40.1067470Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:40.1067860Z drop cascades to extension citext + 2020-11-15T22:53:40.1068200Z drop cascades to table users + 2020-11-15T22:53:40.1068550Z drop cascades to table subscriptions + 2020-11-15T22:53:40.1068920Z drop cascades to table team_invites + 2020-11-15T22:53:40.1069260Z drop cascades to table email_settings + 2020-11-15T22:53:40.1069630Z drop cascades to table episode_credits + 2020-11-15T22:53:40.1070010Z drop cascades to table feed_request_events + 2020-11-15T22:53:40.1070400Z drop cascades to function update_updated_at() + 2020-11-15T22:53:40.1070810Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:40.1071210Z drop cascades to table enterprise_emails + 2020-11-15T22:53:40.1071620Z drop cascades to table episode_progresses + 2020-11-15T22:53:40.1072020Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:40.1072420Z drop cascades to sequence test_uuids + 2020-11-15T22:53:40.1072790Z drop cascades to sequence test_shortids + 2020-11-15T22:53:41.0187000Z 2020-11-15T22:53:41+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 C8F24DDB-D84F-484C-9374-E0C8B6A486A4 [Request] POST /subscribe + 2020-11-15T22:53:41.1070310Z 2020-11-15T22:53:41+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 C8F24DDB-D84F-484C-9374-E0C8B6A486A4 [Time] 88ms + 2020-11-15T22:53:41.1145680Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testRegionalDiscountWithReferral_Monthly]' passed (1.022 seconds). + 2020-11-15T22:53:41.1147910Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testRegionalDiscountWithReferral_Yearly]' started. + 2020-11-15T22:53:41.1284410Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:41.1284920Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:41.1286080Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:41.1286470Z drop cascades to extension citext + 2020-11-15T22:53:41.1286820Z drop cascades to table users + 2020-11-15T22:53:41.1287170Z drop cascades to table subscriptions + 2020-11-15T22:53:41.1287540Z drop cascades to table team_invites + 2020-11-15T22:53:41.1287900Z drop cascades to table email_settings + 2020-11-15T22:53:41.1288260Z drop cascades to table episode_credits + 2020-11-15T22:53:41.1288640Z drop cascades to table feed_request_events + 2020-11-15T22:53:41.1289040Z drop cascades to function update_updated_at() + 2020-11-15T22:53:41.1289430Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:41.1289830Z drop cascades to table enterprise_emails + 2020-11-15T22:53:41.1290230Z drop cascades to table episode_progresses + 2020-11-15T22:53:41.1290660Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:41.1291050Z drop cascades to sequence test_uuids + 2020-11-15T22:53:41.1291420Z drop cascades to sequence test_shortids + 2020-11-15T22:53:42.0465750Z 2020-11-15T22:53:42+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 2B2F972B-28F5-4E53-A62F-93545E240330 [Request] POST /subscribe + 2020-11-15T22:53:42.1365750Z 2020-11-15T22:53:42+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 2B2F972B-28F5-4E53-A62F-93545E240330 [Time] 90ms + 2020-11-15T22:53:42.1446140Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testRegionalDiscountWithReferral_Yearly]' passed (1.030 seconds). + 2020-11-15T22:53:42.1449020Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testSubscribingWithRegionalDiscountAndCoupon]' started. + 2020-11-15T22:53:42.1588720Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:42.1589280Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:42.1590440Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:42.1590830Z drop cascades to extension citext + 2020-11-15T22:53:42.1591170Z drop cascades to table users + 2020-11-15T22:53:42.1591520Z drop cascades to table subscriptions + 2020-11-15T22:53:42.1591910Z drop cascades to table team_invites + 2020-11-15T22:53:42.1592260Z drop cascades to table email_settings + 2020-11-15T22:53:42.1592620Z drop cascades to table episode_credits + 2020-11-15T22:53:42.1593000Z drop cascades to table feed_request_events + 2020-11-15T22:53:42.1593400Z drop cascades to function update_updated_at() + 2020-11-15T22:53:42.1593810Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:42.1594210Z drop cascades to table enterprise_emails + 2020-11-15T22:53:42.1594610Z drop cascades to table episode_progresses + 2020-11-15T22:53:42.1595030Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:42.1595430Z drop cascades to sequence test_uuids + 2020-11-15T22:53:42.1595790Z drop cascades to sequence test_shortids + 2020-11-15T22:53:42.9654840Z 2020-11-15T22:53:42+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 0CFB5272-E8D5-45B7-8A06-7E7F18BF7AF1 [Request] POST /subscribe + 2020-11-15T22:53:42.9834140Z 2020-11-15T22:53:42+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 0CFB5272-E8D5-45B7-8A06-7E7F18BF7AF1 [Time] 18ms + 2020-11-15T22:53:42.9845710Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testSubscribingWithRegionalDiscountAndCoupon]' passed (0.840 seconds). + 2020-11-15T22:53:42.9848490Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testUnhappyPath_RegionalDiscount]' started. + 2020-11-15T22:53:43.0000490Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:43.0002680Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:43.0004630Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:43.0005020Z drop cascades to extension citext + 2020-11-15T22:53:43.0005970Z drop cascades to table users + 2020-11-15T22:53:43.0006320Z drop cascades to table subscriptions + 2020-11-15T22:53:43.0007160Z drop cascades to table team_invites + 2020-11-15T22:53:43.0007550Z drop cascades to table email_settings + 2020-11-15T22:53:43.0007920Z drop cascades to table episode_credits + 2020-11-15T22:53:43.0008290Z drop cascades to table feed_request_events + 2020-11-15T22:53:43.0008690Z drop cascades to function update_updated_at() + 2020-11-15T22:53:43.0009790Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:43.0010200Z drop cascades to table enterprise_emails + 2020-11-15T22:53:43.0010800Z drop cascades to table episode_progresses + 2020-11-15T22:53:43.0011800Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:43.0012230Z drop cascades to sequence test_uuids + 2020-11-15T22:53:43.0012600Z drop cascades to sequence test_shortids + 2020-11-15T22:53:43.7302610Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 1E9216D7-AFA4-446F-8699-1B826514FA74 [Request] POST /subscribe + 2020-11-15T22:53:43.7496310Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 1E9216D7-AFA4-446F-8699-1B826514FA74 [Time] 19ms + 2020-11-15T22:53:43.7506280Z Test Case '-[PointFreeTests.SubscribeIntegrationTests testUnhappyPath_RegionalDiscount]' passed (0.766 seconds). + 2020-11-15T22:53:43.7507840Z Test Suite 'SubscribeIntegrationTests' passed at 2020-11-15 22:53:43.750. + 2020-11-15T22:53:43.7508800Z Executed 13 tests, with 0 failures (0 unexpected) in 11.731 (11.732) seconds + 2020-11-15T22:53:43.7509700Z Test Suite 'SubscribeTests' started at 2020-11-15 22:53:43.751 + 2020-11-15T22:53:43.7510770Z Test Case '-[PointFreeTests.SubscribeTests testCouponFailure_Individual]' started. + 2020-11-15T22:53:43.7568460Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 8B122496-CBAA-42A3-ACEB-96E16E9C70ED [Request] POST /subscribe + 2020-11-15T22:53:43.7599200Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 8B122496-CBAA-42A3-ACEB-96E16E9C70ED [Time] 3ms + 2020-11-15T22:53:43.7610840Z Test Case '-[PointFreeTests.SubscribeTests testCouponFailure_Individual]' passed (0.010 seconds). + 2020-11-15T22:53:43.7612580Z Test Case '-[PointFreeTests.SubscribeTests testCreateCustomerFailure]' started. + 2020-11-15T22:53:43.7654950Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 37686C54-7537-4941-BF84-68AE1E8427DA [Request] POST /subscribe + 2020-11-15T22:53:43.7701690Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 37686C54-7537-4941-BF84-68AE1E8427DA [Time] 4ms + 2020-11-15T22:53:43.7711070Z Test Case '-[PointFreeTests.SubscribeTests testCreateCustomerFailure]' passed (0.010 seconds). + 2020-11-15T22:53:43.7713880Z Test Case '-[PointFreeTests.SubscribeTests testCreateDatabaseSubscriptionFailure]' started. + 2020-11-15T22:53:43.7753880Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 6E637F0B-3E64-40F5-8656-76422B332593 [Request] POST /subscribe + 2020-11-15T22:53:43.7801160Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 6E637F0B-3E64-40F5-8656-76422B332593 [Time] 4ms + 2020-11-15T22:53:43.7812340Z Test Case '-[PointFreeTests.SubscribeTests testCreateDatabaseSubscriptionFailure]' passed (0.010 seconds). + 2020-11-15T22:53:43.7814610Z Test Case '-[PointFreeTests.SubscribeTests testCreateStripeSubscriptionFailure]' started. + 2020-11-15T22:53:43.7856210Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 55C2C292-66A6-49E1-B33F-CDEEFC4ED32A [Request] POST /subscribe + 2020-11-15T22:53:43.7900850Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 55C2C292-66A6-49E1-B33F-CDEEFC4ED32A [Time] 4ms + 2020-11-15T22:53:43.7910990Z Test Case '-[PointFreeTests.SubscribeTests testCreateStripeSubscriptionFailure]' passed (0.010 seconds). + 2020-11-15T22:53:43.7912890Z Test Case '-[PointFreeTests.SubscribeTests testCreateStripeSubscriptionFailure_TeamAndMonthly]' started. + 2020-11-15T22:53:43.7954510Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 5BDDAC0C-3147-46F6-ADC4-8CF7D17561BC [Request] POST /subscribe + 2020-11-15T22:53:43.8000540Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 5BDDAC0C-3147-46F6-ADC4-8CF7D17561BC [Time] 4ms + 2020-11-15T22:53:43.8010640Z Test Case '-[PointFreeTests.SubscribeTests testCreateStripeSubscriptionFailure_TeamAndMonthly]' passed (0.010 seconds). + 2020-11-15T22:53:43.8012670Z Test Case '-[PointFreeTests.SubscribeTests testCreateStripeSubscriptionFailure_TeamAndMonthly_TooManyEmails]' started. + 2020-11-15T22:53:43.8053360Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 9BCDEE22-0A8D-4A03-BE37-A1F67F9EDC3F [Request] POST /subscribe + 2020-11-15T22:53:43.8102040Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 9BCDEE22-0A8D-4A03-BE37-A1F67F9EDC3F [Time] 4ms + 2020-11-15T22:53:43.8112640Z Test Case '-[PointFreeTests.SubscribeTests testCreateStripeSubscriptionFailure_TeamAndMonthly_TooManyEmails]' passed (0.010 seconds). + 2020-11-15T22:53:43.8114650Z Test Case '-[PointFreeTests.SubscribeTests testCurrentSubscribers]' started. + 2020-11-15T22:53:43.8154280Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 0CDA09BB-514C-4E17-A1D5-7A91EA20E66E [Request] POST /subscribe + 2020-11-15T22:53:43.8171640Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 0CDA09BB-514C-4E17-A1D5-7A91EA20E66E [Time] 1ms + 2020-11-15T22:53:43.8180830Z Test Case '-[PointFreeTests.SubscribeTests testCurrentSubscribers]' passed (0.007 seconds). + 2020-11-15T22:53:43.8182470Z Test Case '-[PointFreeTests.SubscribeTests testInvalidQuantity]' started. + 2020-11-15T22:53:43.8223280Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 7DEE8715-1389-4202-BCF3-3282ABBD824C [Request] POST /subscribe + 2020-11-15T22:53:43.8266020Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 7DEE8715-1389-4202-BCF3-3282ABBD824C [Time] 4ms + 2020-11-15T22:53:43.8304720Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 14F1C96A-10EA-4605-9D47-044AAC8CBE6D [Request] POST /subscribe + 2020-11-15T22:53:43.8344780Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 14F1C96A-10EA-4605-9D47-044AAC8CBE6D [Time] 4ms + 2020-11-15T22:53:43.8357250Z Test Case '-[PointFreeTests.SubscribeTests testInvalidQuantity]' passed (0.018 seconds). + 2020-11-15T22:53:43.8359170Z Test Case '-[PointFreeTests.SubscribeTests testNotLoggedIn_IndividualMonthly]' started. + 2020-11-15T22:53:43.8400770Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 593E5551-164F-4E79-BAC1-851651EF4B1D [Request] POST /subscribe + 2020-11-15T22:53:43.8433930Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 593E5551-164F-4E79-BAC1-851651EF4B1D [Time] 3ms + 2020-11-15T22:53:43.8444520Z Test Case '-[PointFreeTests.SubscribeTests testNotLoggedIn_IndividualMonthly]' passed (0.009 seconds). + 2020-11-15T22:53:43.8446110Z Test Case '-[PointFreeTests.SubscribeTests testNotLoggedIn_IndividualYearly]' started. + 2020-11-15T22:53:43.8487370Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 1103C91E-4C51-483D-8D63-C5E4EE14C3D8 [Request] POST /subscribe + 2020-11-15T22:53:43.8518140Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 1103C91E-4C51-483D-8D63-C5E4EE14C3D8 [Time] 3ms + 2020-11-15T22:53:43.8528310Z Test Case '-[PointFreeTests.SubscribeTests testNotLoggedIn_IndividualYearly]' passed (0.008 seconds). + 2020-11-15T22:53:43.8529750Z Test Case '-[PointFreeTests.SubscribeTests testNotLoggedIn_Team]' started. + 2020-11-15T22:53:43.8571020Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 9E50F417-9DCA-46DF-82F2-045D6135922D [Request] POST /subscribe + 2020-11-15T22:53:43.8604640Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 9E50F417-9DCA-46DF-82F2-045D6135922D [Time] 3ms + 2020-11-15T22:53:43.8611890Z Test Case '-[PointFreeTests.SubscribeTests testNotLoggedIn_Team]' passed (0.008 seconds). + 2020-11-15T22:53:43.8613280Z Test Case '-[PointFreeTests.SubscribeTests testReferrals_InactiveCode]' started. + 2020-11-15T22:53:43.8655460Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 23CDD42D-2BD9-4523-A1A8-B19F615DCAC8 [Request] POST /subscribe + 2020-11-15T22:53:43.8703070Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 23CDD42D-2BD9-4523-A1A8-B19F615DCAC8 [Time] 4ms + 2020-11-15T22:53:43.8717710Z Test Case '-[PointFreeTests.SubscribeTests testReferrals_InactiveCode]' passed (0.010 seconds). + 2020-11-15T22:53:43.8720880Z Test Case '-[PointFreeTests.SubscribeTests testReferrals_InvalidCode]' started. + 2020-11-15T22:53:43.8764010Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 7F3E79DD-DEF1-4716-B0DF-7FD2EEF80E80 [Request] POST /subscribe + 2020-11-15T22:53:43.8807860Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 7F3E79DD-DEF1-4716-B0DF-7FD2EEF80E80 [Time] 4ms + 2020-11-15T22:53:43.8817370Z Test Case '-[PointFreeTests.SubscribeTests testReferrals_InvalidCode]' passed (0.010 seconds). + 2020-11-15T22:53:43.8819070Z Test Case '-[PointFreeTests.SubscribeTests testReferrals_InvalidLane]' started. + 2020-11-15T22:53:43.8860830Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 B942DDB7-EE27-4742-A84A-48861E39A54B [Request] POST /subscribe + 2020-11-15T22:53:43.8900370Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift B942DDB7-EE27-4742-A84A-48861E39A54B [Time] 4ms + 2020-11-15T22:53:43.8910300Z Test Case '-[PointFreeTests.SubscribeTests testReferrals_InvalidLane]' passed (0.009 seconds). + 2020-11-15T22:53:43.8911720Z Test Case '-[PointFreeTests.SubscribeTests testReferrals_PreviouslyReferred]' started. + 2020-11-15T22:53:43.8953820Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift F02CC0E7-AC17-4EB9-AAE4-3DFFEB383582 [Request] POST /subscribe + 2020-11-15T22:53:43.8995080Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 F02CC0E7-AC17-4EB9-AAE4-3DFFEB383582 [Time] 4ms + 2020-11-15T22:53:43.9005180Z Test Case '-[PointFreeTests.SubscribeTests testReferrals_PreviouslyReferred]' passed (0.009 seconds). + 2020-11-15T22:53:43.9006380Z Test Suite 'SubscribeTests' passed at 2020-11-15 22:53:43.900. + 2020-11-15T22:53:43.9006860Z Executed 15 tests, with 0 failures (0 unexpected) in 0.149 (0.150) seconds + 2020-11-15T22:53:43.9007850Z Test Suite 'SubscriptionConfirmationTests' started at 2020-11-15 22:53:43.900 + 2020-11-15T22:53:43.9009270Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedIn]' started. + 2020-11-15T22:53:43.9045050Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 10D34D1F-F004-423D-B18B-C684B2F66A4E [Request] GET /subscribe/personal + 2020-11-15T22:53:43.9515460Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 10D34D1F-F004-423D-B18B-C684B2F66A4E [Time] 46ms + 2020-11-15T22:53:43.9614640Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedIn]' passed (0.052 seconds). + 2020-11-15T22:53:43.9617050Z 2020-11-15T22:53:43+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 FE7EE7CA-F97C-43C9-97FD-48CF28CCF801 [Request] GET /subscribe/personal + 2020-11-15T22:53:43.9716540Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedIn_ActiveSubscriber]' started. + 2020-11-15T22:53:44.0044320Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 FE7EE7CA-F97C-43C9-97FD-48CF28CCF801 [Time] 47ms + 2020-11-15T22:53:44.0055110Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedIn_ActiveSubscriber]' passed (0.053 seconds). + 2020-11-15T22:53:44.0059940Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedIn_PreviouslyReferred]' started. + 2020-11-15T22:53:44.0103200Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 02EAD8A7-0F12-4EE2-A310-0D72EDAEACB5 [Request] GET /subscribe/personal + 2020-11-15T22:53:44.0145140Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 02EAD8A7-0F12-4EE2-A310-0D72EDAEACB5 [Time] 4ms + 2020-11-15T22:53:44.0154380Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedIn_PreviouslyReferred]' passed (0.010 seconds). + 2020-11-15T22:53:44.0157100Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedIn_SwitchToMonthly]' started. + 2020-11-15T22:53:44.0201700Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift F3F9AD91-93B2-48BA-A12A-71F305E18B74 [Request] GET /subscribe/personal + 2020-11-15T22:53:44.0215800Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedIn_SwitchToMonthly]' passed (0.006 seconds). + 2020-11-15T22:53:44.0222100Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedIn_SwitchToMonthly_RegionalDiscount]' started. + 2020-11-15T22:53:44.0273650Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedIn_SwitchToMonthly_RegionalDiscount]' passed (0.006 seconds). + 2020-11-15T22:53:44.0277500Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift ECEA87E3-7D4D-4C5F-B4E6-2B69916E3DAB [Request] GET /subscribe/personal + 2020-11-15T22:53:44.0330330Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedIn_WithDiscount]' started. + 2020-11-15T22:53:44.0355090Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 DE108BD7-C683-4FE2-887C-77F2A8E6B285 [Request] GET /discounts/dead-beef + 2020-11-15T22:53:44.0741340Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift DE108BD7-C683-4FE2-887C-77F2A8E6B285 [Time] 44ms + 2020-11-15T22:53:44.0751640Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedIn_WithDiscount]' passed (0.048 seconds). + 2020-11-15T22:53:44.0801730Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedOut]' started. + 2020-11-15T22:53:44.0803970Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 6D74D6BB-32A0-4577-AF64-610E841C15DA [Request] GET /subscribe/personal + 2020-11-15T22:53:44.1370960Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 6D74D6BB-32A0-4577-AF64-610E841C15DA [Time] 56ms + 2020-11-15T22:53:44.1379600Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedOut]' passed (0.063 seconds). + 2020-11-15T22:53:44.1382130Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedOut_InactiveReferralCode]' started. + 2020-11-15T22:53:44.1421210Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 502E8F26-1B69-4AC7-802A-6160D5E500B5 [Request] GET /subscribe/personal + 2020-11-15T22:53:44.1464990Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 502E8F26-1B69-4AC7-802A-6160D5E500B5 [Time] 4ms + 2020-11-15T22:53:44.1473420Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedOut_InactiveReferralCode]' passed (0.009 seconds). + 2020-11-15T22:53:44.1475820Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedOut_InvalidReferralCode]' started. + 2020-11-15T22:53:44.1515100Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 82033E28-5B21-4AA0-A290-43FEAD3D5DDF [Request] GET /subscribe/personal + 2020-11-15T22:53:44.1558130Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 82033E28-5B21-4AA0-A290-43FEAD3D5DDF [Time] 4ms + 2020-11-15T22:53:44.1568230Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedOut_InvalidReferralCode]' passed (0.009 seconds). + 2020-11-15T22:53:44.1571070Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedOut_InvalidReferralLane]' started. + 2020-11-15T22:53:44.1614870Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 A52B537B-95E7-43B3-B57E-477BCFC1326E [Request] GET /subscribe/team + 2020-11-15T22:53:44.1658230Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift A52B537B-95E7-43B3-B57E-477BCFC1326E [Time] 4ms + 2020-11-15T22:53:44.1664420Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedOut_InvalidReferralLane]' passed (0.010 seconds). + 2020-11-15T22:53:44.1705020Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedOut_ReferralCode]' started. + 2020-11-15T22:53:44.1707530Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 A3F0B1B0-7860-4379-B555-5FC4BDC6EEF4 [Request] GET /subscribe/personal + 2020-11-15T22:53:44.2345130Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 A3F0B1B0-7860-4379-B555-5FC4BDC6EEF4 [Time] 63ms + 2020-11-15T22:53:44.2363570Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_LoggedOut_ReferralCode]' passed (0.070 seconds). + 2020-11-15T22:53:44.2370120Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_ReferralCodeAndRegionalDiscount]' started. + 2020-11-15T22:53:44.2414710Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift E93248F0-3C9F-4DCF-A925-7522E15454B7 [Request] GET /subscribe/personal + 2020-11-15T22:53:44.2916980Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 E93248F0-3C9F-4DCF-A925-7522E15454B7 [Time] 50ms + 2020-11-15T22:53:44.2932200Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testPersonal_ReferralCodeAndRegionalDiscount]' passed (0.057 seconds). + 2020-11-15T22:53:44.2934280Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testTeam_LoggedIn]' started. + 2020-11-15T22:53:44.2988500Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 AE579AFD-CFB7-4AF2-A05E-86DD2D2C8A01 [Request] GET /subscribe/team + 2020-11-15T22:53:44.3562580Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 AE579AFD-CFB7-4AF2-A05E-86DD2D2C8A01 [Time] 57ms + 2020-11-15T22:53:44.3575010Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testTeam_LoggedIn]' passed (0.064 seconds). + 2020-11-15T22:53:44.3580820Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testTeam_LoggedIn_AddTeamMember]' started. + 2020-11-15T22:53:44.3622020Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 8FAC8300-7FD2-4FCC-AFE8-C3FE136193EC [Request] GET /subscribe/team + 2020-11-15T22:53:44.3635350Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testTeam_LoggedIn_AddTeamMember]' passed (0.006 seconds). + 2020-11-15T22:53:44.3638550Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testTeam_LoggedIn_RemoveOwnerFromTeam]' started. + 2020-11-15T22:53:44.3676530Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift B982D6C6-08CE-4C7C-B53E-F6E846FD409A [Request] GET /subscribe/team + 2020-11-15T22:53:44.3694260Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testTeam_LoggedIn_RemoveOwnerFromTeam]' passed (0.006 seconds). + 2020-11-15T22:53:44.3696830Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testTeam_LoggedIn_SwitchToMonthly]' started. + 2020-11-15T22:53:44.3733810Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 AB88C535-FD7E-4CE2-8970-8FC23B4EBB9E [Request] GET /subscribe/team + 2020-11-15T22:53:44.3746290Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testTeam_LoggedIn_SwitchToMonthly]' passed (0.005 seconds). + 2020-11-15T22:53:44.3748340Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testTeam_LoggedIn_WithDefaults]' started. + 2020-11-15T22:53:44.3791670Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift B42A61D6-7FE7-4445-BE21-28B958BCD562 [Request] GET /subscribe/team + 2020-11-15T22:53:44.4266720Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift B42A61D6-7FE7-4445-BE21-28B958BCD562 [Time] 47ms + 2020-11-15T22:53:44.4279050Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testTeam_LoggedIn_WithDefaults]' passed (0.053 seconds). + 2020-11-15T22:53:44.4281320Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testTeam_LoggedIn_WithDefaults_OwnerIsNotTakingSeat]' started. + 2020-11-15T22:53:44.4325090Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift AED2E1AA-F133-4CB6-BF6A-6E2860E9501B [Request] GET /subscribe/team + 2020-11-15T22:53:44.4834980Z 2020-11-15T22:53:44+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift AED2E1AA-F133-4CB6-BF6A-6E2860E9501B [Time] 50ms + 2020-11-15T22:53:44.4849170Z Test Case '-[PointFreeTests.SubscriptionConfirmationTests testTeam_LoggedIn_WithDefaults_OwnerIsNotTakingSeat]' passed (0.057 seconds). + 2020-11-15T22:53:44.4850970Z Test Suite 'SubscriptionConfirmationTests' passed at 2020-11-15 22:53:44.485. + 2020-11-15T22:53:44.4851600Z Executed 18 tests, with 0 failures (0 unexpected) in 0.583 (0.584) seconds + 2020-11-15T22:53:44.4852910Z Test Suite 'TeamEmailsTests' started at 2020-11-15 22:53:44.485 + 2020-11-15T22:53:44.4854280Z Test Case '-[PointFreeTests.TeamEmailsTests testTeammateRemovedEmailView]' started. + 2020-11-15T22:53:44.5329110Z Test Case '-[PointFreeTests.TeamEmailsTests testTeammateRemovedEmailView]' passed (0.048 seconds). + 2020-11-15T22:53:44.5331020Z Test Case '-[PointFreeTests.TeamEmailsTests testYouHaveBeenRemovedEmailView]' started. + 2020-11-15T22:53:44.5849290Z Test Case '-[PointFreeTests.TeamEmailsTests testYouHaveBeenRemovedEmailView]' passed (0.052 seconds). + 2020-11-15T22:53:44.5851000Z Test Suite 'TeamEmailsTests' passed at 2020-11-15 22:53:44.585. + 2020-11-15T22:53:44.5851580Z Executed 2 tests, with 0 failures (0 unexpected) in 0.100 (0.100) seconds + 2020-11-15T22:53:44.5853090Z Test Suite 'UpdateProfileIntegrationTests' started at 2020-11-15 22:53:44.585 + 2020-11-15T22:53:44.5862570Z Test Case '-[PointFreeTests.UpdateProfileIntegrationTests testUpdateEmailSettings]' started. + 2020-11-15T22:53:44.6019090Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:44.6019660Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:44.6020810Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:44.6021190Z drop cascades to extension citext + 2020-11-15T22:53:44.6021530Z drop cascades to table users + 2020-11-15T22:53:44.6021870Z drop cascades to table subscriptions + 2020-11-15T22:53:44.6022240Z drop cascades to table team_invites + 2020-11-15T22:53:44.6022600Z drop cascades to table email_settings + 2020-11-15T22:53:44.6022970Z drop cascades to table episode_credits + 2020-11-15T22:53:44.6023340Z drop cascades to table feed_request_events + 2020-11-15T22:53:44.6023740Z drop cascades to function update_updated_at() + 2020-11-15T22:53:44.6024410Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:44.6024810Z drop cascades to table enterprise_emails + 2020-11-15T22:53:44.6025200Z drop cascades to table episode_progresses + 2020-11-15T22:53:44.6025620Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:44.6026020Z drop cascades to sequence test_uuids + 2020-11-15T22:53:44.6026390Z drop cascades to sequence test_shortids + 2020-11-15T22:53:45.5556670Z 2020-11-15T22:53:45+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 22D702E1-E757-4D27-8A09-A910E50FB60C [Request] POST /account + 2020-11-15T22:53:45.6014990Z 2020-11-15T22:53:45+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 22D702E1-E757-4D27-8A09-A910E50FB60C [Time] 45ms + 2020-11-15T22:53:45.6096480Z Test Case '-[PointFreeTests.UpdateProfileIntegrationTests testUpdateEmailSettings]' passed (1.025 seconds). + 2020-11-15T22:53:45.6098580Z Test Case '-[PointFreeTests.UpdateProfileIntegrationTests testUpdateNameAndEmail]' started. + 2020-11-15T22:53:45.6236010Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:45.6236500Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:45.6239180Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:45.6239730Z drop cascades to extension citext + 2020-11-15T22:53:45.6240080Z drop cascades to table users + 2020-11-15T22:53:45.6240440Z drop cascades to table subscriptions + 2020-11-15T22:53:45.6240810Z drop cascades to table team_invites + 2020-11-15T22:53:45.6241170Z drop cascades to table email_settings + 2020-11-15T22:53:45.6241530Z drop cascades to table episode_credits + 2020-11-15T22:53:45.6241910Z drop cascades to table feed_request_events + 2020-11-15T22:53:45.6242300Z drop cascades to function update_updated_at() + 2020-11-15T22:53:45.6242700Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:45.6243120Z drop cascades to table enterprise_emails + 2020-11-15T22:53:45.6243510Z drop cascades to table episode_progresses + 2020-11-15T22:53:45.6243930Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:45.6244320Z drop cascades to sequence test_uuids + 2020-11-15T22:53:45.6244690Z drop cascades to sequence test_shortids + 2020-11-15T22:53:46.5735830Z 2020-11-15T22:53:46+0000 info co.pointfree.PointFreeTestSupport : file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift line=15 C060C0F2-D0C6-4D5F-8924-8EDDA278B798 [Request] POST /account + 2020-11-15T22:53:46.6561950Z 2020-11-15T22:53:46+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift C060C0F2-D0C6-4D5F-8924-8EDDA278B798 [Time] 82ms + 2020-11-15T22:53:46.6662220Z Test Case '-[PointFreeTests.UpdateProfileIntegrationTests testUpdateNameAndEmail]' passed (1.057 seconds). + 2020-11-15T22:53:46.6663880Z Test Suite 'UpdateProfileIntegrationTests' passed at 2020-11-15 22:53:46.666. + 2020-11-15T22:53:46.6664550Z Executed 2 tests, with 0 failures (0 unexpected) in 2.081 (2.081) seconds + 2020-11-15T22:53:46.6665400Z Test Suite 'UpdateProfileTests' started at 2020-11-15 22:53:46.666 + 2020-11-15T22:53:46.6666610Z Test Case '-[PointFreeTests.UpdateProfileTests testUpdateExtraInvoiceInfo]' started. + 2020-11-15T22:53:46.6690800Z 2020-11-15T22:53:46+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 55A41E0F-0E36-4CE7-A952-6FB8EDEDDC4E [Request] POST /account + 2020-11-15T22:53:46.7157580Z 2020-11-15T22:53:46+0000 info co.pointfree.PointFreeTestSupport : line=15 file=/Users/runner/work/pointfreeco/pointfreeco/Sources/PointFree/SiteMiddleware.swift 55A41E0F-0E36-4CE7-A952-6FB8EDEDDC4E [Time] 46ms + 2020-11-15T22:53:46.7167210Z Test Case '-[PointFreeTests.UpdateProfileTests testUpdateExtraInvoiceInfo]' passed (0.050 seconds). + 2020-11-15T22:53:46.7168520Z Test Suite 'UpdateProfileTests' passed at 2020-11-15 22:53:46.717. + 2020-11-15T22:53:46.7169480Z Executed 1 test, with 0 failures (0 unexpected) in 0.050 (0.051) seconds + 2020-11-15T22:53:46.7170510Z Test Suite 'WelcomeEmailIntegrationTests' started at 2020-11-15 22:53:46.717 + 2020-11-15T22:53:46.7172030Z Test Case '-[PointFreeTests.WelcomeEmailIntegrationTests testIncrementEpisodeCredits]' started. + 2020-11-15T22:53:46.7309860Z NOTICE: drop cascades to 16 other objects + 2020-11-15T22:53:46.7310400Z DETAIL: drop cascades to extension pgcrypto + 2020-11-15T22:53:46.7311540Z drop cascades to extension uuid-ossp + 2020-11-15T22:53:46.7311920Z drop cascades to extension citext + 2020-11-15T22:53:46.7312260Z drop cascades to table users + 2020-11-15T22:53:46.7312610Z drop cascades to table subscriptions + 2020-11-15T22:53:46.7312980Z drop cascades to table team_invites + 2020-11-15T22:53:46.7313340Z drop cascades to table email_settings + 2020-11-15T22:53:46.7313700Z drop cascades to table episode_credits + 2020-11-15T22:53:46.7314070Z drop cascades to table feed_request_events + 2020-11-15T22:53:46.7314490Z drop cascades to function update_updated_at() + 2020-11-15T22:53:46.7314900Z drop cascades to table enterprise_accounts + 2020-11-15T22:53:46.7315300Z drop cascades to table enterprise_emails + 2020-11-15T22:53:46.7315690Z drop cascades to table episode_progresses + 2020-11-15T22:53:46.7316120Z drop cascades to function gen_shortid(text,text) + 2020-11-15T22:53:46.7316510Z drop cascades to sequence test_uuids + 2020-11-15T22:53:46.7316870Z drop cascades to sequence test_shortids + 2020-11-15T22:53:47.6859540Z Test Case '-[PointFreeTests.WelcomeEmailIntegrationTests testIncrementEpisodeCredits]' passed (0.969 seconds). + 2020-11-15T22:53:47.6861270Z Test Suite 'WelcomeEmailIntegrationTests' passed at 2020-11-15 22:53:47.686. + 2020-11-15T22:53:47.6861890Z Executed 1 test, with 0 failures (0 unexpected) in 0.969 (0.969) seconds + 2020-11-15T22:53:47.6862740Z Test Suite 'WelcomeEmailTests' started at 2020-11-15 22:53:47.686 + 2020-11-15T22:53:47.6863820Z Test Case '-[PointFreeTests.WelcomeEmailTests testEpisodeEmails]' started. + 2020-11-15T22:53:48.3599420Z Test Case '-[PointFreeTests.WelcomeEmailTests testEpisodeEmails]' passed (0.674 seconds). + 2020-11-15T22:53:48.3602680Z Test Case '-[PointFreeTests.WelcomeEmailTests testWelcomeEmail1]' started. + 2020-11-15T22:53:48.4167150Z Test Case '-[PointFreeTests.WelcomeEmailTests testWelcomeEmail1]' passed (0.057 seconds). + 2020-11-15T22:53:48.4168960Z Test Case '-[PointFreeTests.WelcomeEmailTests testWelcomeEmail2]' started. + 2020-11-15T22:53:48.4945270Z Test Case '-[PointFreeTests.WelcomeEmailTests testWelcomeEmail2]' passed (0.078 seconds). + 2020-11-15T22:53:48.4964750Z Test Case '-[PointFreeTests.WelcomeEmailTests testWelcomeEmail3]' started. + /Users/brandon/projects/swift-parsing/Tests/ParsingTests/Many.swift:8: error: -[ParsingTests.ManyTests testWithNoSeparator] : XCTAssertEqual failed: ("true") is not equal to ("false") + /Users/brandon/projects/swift-parsing/Tests/ParsingTests/ManyMore.swift:9: error: -[ParsingTests.ManyTests testWithNoSeparator] : XCTAssertEqual failed: ("false") is not equal to ("true") + 2020-11-15T22:53:48.5503930Z Test Case '-[PointFreeTests.WelcomeEmailTests testWelcomeEmail3]' failed (0.056 seconds). + 2020-11-15T22:53:48.5505610Z Test Suite 'WelcomeEmailTests' passed at 2020-11-15 22:53:48.550. + 2020-11-15T22:53:48.5514520Z 📧: Sending 2 welcome emails... + 2020-11-15T22:53:48.5515520Z Executed 4 tests, with 0 failures (0 unexpected) in 0.864 (0.864) seconds + 2020-11-15T22:53:48.5516900Z Test Suite 'PointFreePackageTests.xctest' passed at 2020-11-15 22:53:48.550. + 2020-11-15T22:53:48.5538410Z Executed 283 tests, with 0 failures (0 unexpected) in 55.343 (55.367) seconds + 2020-11-15T22:53:48.5545240Z Test Suite 'All tests' passed at 2020-11-15 22:53:48.551. + 2020-11-15T22:53:48.5546060Z Executed 283 tests, with 0 failures (0 unexpected) in 55.343 (55.368) seconds + 2020-11-15T22:53:48.5708200Z Post job cleanup. + 2020-11-15T22:53:48.7105880Z [command]/usr/local/bin/git version + 2020-11-15T22:53:48.7181610Z git version 2.29.2 + 2020-11-15T22:53:48.7233080Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand + 2020-11-15T22:53:48.7311910Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || : + 2020-11-15T22:53:48.8338760Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader + 2020-11-15T22:53:48.8408790Z http.https://github.com/.extraheader + 2020-11-15T22:53:48.8424450Z [command]/usr/local/bin/git config --local --unset-all http.https://github.com/.extraheader + 2020-11-15T22:53:48.8506730Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || : + 2020-11-15T22:53:48.9570880Z Cleaning up orphan processes + + """# diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/StringAbstractions.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/StringAbstractions.swift new file mode 100644 index 00000000..9b797107 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/StringAbstractions.swift @@ -0,0 +1,51 @@ +import Benchmark +import Parsing + +/// This benchmark demonstrates how to parse on multiple string abstractions at once, and the costs +/// of doing so. The parsers benchmarked parse a list of integers that are separated by a +/// UTF8 character with multiple equivalent representations: "LATIN SMALL LETTER E WITH ACUTE" and +/// "E + COMBINING ACUTE ACCENT". +/// +/// In the "Substring" suite we parse integers on the UTF8View abstraction and parse the separator +/// on the Substring abstraction in order to take advantage of its UTF8 normalization logic. +/// +/// In the "UTF8" suite we parse both the integers and the separators on the UTF8View abstraction, +/// but this means we are responsible for handling UTF8 normalization, so we have to explicitly +/// handle both the "LATIN SMALL LETTER E WITH ACUTE" and "E + COMBINING ACUTE ACCENT" characters. +let stringAbstractionsSuite = BenchmarkSuite(name: "String Abstractions") { suite in + let count = 1_000 + let input = (1...count) + .reduce(into: "") { accum, int in + accum += "\(int)" + (int.isMultiple(of: 2) ? "\u{00E9}" : "e\u{0301}") + } + .dropLast() + + var output: [Int]! + suite.benchmark("Substring") { + var input = input[...].utf8 + output = try Many { + // NB: omitting `of: Substring.UTF8View.self` causes a segfault in Xcode 12.5.1 (Swift 5.4.1) + Int.parser(of: Substring.UTF8View.self) + } separator: { + FromSubstring { "\u{00E9}" } + } + .parse(&input) + } tearDown: { + precondition(output.count == count) + } + + suite.benchmark("UTF8") { + var input = input[...].utf8 + output = try Many { + Int.parser() + } separator: { + OneOf { + "\u{00E9}".utf8 + "e\u{0301}".utf8 + } + } + .parse(&input) + } tearDown: { + precondition(output.count == count) + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/URLRequestRouter/URLRequestRouter+Foundation.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/URLRequestRouter/URLRequestRouter+Foundation.swift new file mode 100644 index 00000000..9865f5fe --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/URLRequestRouter/URLRequestRouter+Foundation.swift @@ -0,0 +1,36 @@ +#if compiler(>=5.5) + import Foundation + + #if canImport(FoundationNetworking) + import FoundationNetworking + #endif + + extension URLRequestData { + init?(request: URLRequest) { + guard + let url = request.url, + let components = URLComponents(url: url, resolvingAgainstBaseURL: false) + else { return nil } + + self.init( + method: request.httpMethod, + path: url.path.split(separator: "/")[...], + query: components.queryItems?.reduce(into: [:]) { query, item in + query[item.name, default: []].append(item.value?[...]) + } ?? [:], + headers: request.allHTTPHeaderFields?.mapValues { $0[...] } ?? [:], + body: request.httpBody.map { ArraySlice($0) } + ) + } + + init?(url: URL) { + self.init(request: URLRequest(url: url)) + } + + init?(string: String) { + guard let url = URL(string: string) + else { return nil } + self.init(url: url) + } + } +#endif diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/URLRequestRouter/URLRequestRouter.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/URLRequestRouter/URLRequestRouter.swift new file mode 100644 index 00000000..5c42dff1 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/URLRequestRouter/URLRequestRouter.swift @@ -0,0 +1,260 @@ +#if compiler(>=5.5) + import Foundation + import Parsing + + struct URLRequestData { + var body: ArraySlice? + var headers: [String: Substring] + var method: String? + var path: ArraySlice + var query: [String: ArraySlice] + + init( + method: String? = nil, + path: ArraySlice = [], + query: [String: ArraySlice] = [:], + headers: [String: Substring] = [:], + body: ArraySlice? = nil + ) { + self.method = method + self.path = path + self.query = query + self.headers = headers + self.body = body + } + } + + struct Body: Parser + where + Parsers: Parser, + Parsers.Input == ArraySlice + { + let bodyParser: Parsers + + @inlinable + init(@ParserBuilder _ bodyParser: () -> Parsers) { + self.bodyParser = bodyParser() + } + + @inlinable + func parse(_ input: inout URLRequestData) throws -> Parsers.Output { + guard var body = input.body + else { + throw ParsingError() + } + + let output = try self.bodyParser.parse(&body) + + guard body.isEmpty else { + throw ParsingError() + } + + input.body = nil + return output + } + } + + struct JSON: Parser { + let decoder: JSONDecoder + + @inlinable + init( + _ type: Value.Type, + decoder: JSONDecoder = .init() + ) { + self.decoder = decoder + } + + @inlinable + func parse(_ input: inout ArraySlice) throws -> Value { + guard let output = try? decoder.decode(Value.self, from: Data(input)) + else { + throw ParsingError() + } + input = [] + return output + } + } + + struct Method: Parser { + let name: String + + static let get = Self("GET") + static let post = Self("POST") + static let put = Self("PUT") + static let patch = Self("PATCH") + static let delete = Self("DELETE") + + @inlinable + init(_ name: String) { + self.name = name.uppercased() + } + + @inlinable + func parse(_ input: inout URLRequestData) throws { + guard input.method?.uppercased() == self.name + else { + throw ParsingError() + } + input.method = nil + } + } + + struct Path: Parser + where + Component: Parser, + Component.Input == Substring + { + let componentParser: Component + + @inlinable + init(_ component: Component) { + self.componentParser = component + } + + @inlinable + func parse(_ input: inout URLRequestData) throws -> Component.Output { + guard var component = input.path.first + else { + throw ParsingError() + } + + let output = try self.componentParser.parse(&component) + + guard component.isEmpty + else { + throw ParsingError() + } + + input.path.removeFirst() + return output + } + } + + struct PathEnd: Parser { + @inlinable + init() {} + + @inlinable + func parse(_ input: inout URLRequestData) throws { + guard input.path.isEmpty + else { throw ParsingError() } + } + } + + struct Query: Parser + where + Value: Parser, + Value.Input == Substring + { + let defaultValue: Value.Output? + let name: String + let valueParser: Value + + @inlinable + init( + _ name: String, + _ value: Value, + default defaultValue: Value.Output? = nil + ) { + self.defaultValue = defaultValue + self.name = name + self.valueParser = value + } + + @inlinable + init( + _ name: String, + default defaultValue: Value.Output? = nil + ) where Value == Rest { + self.init( + name, + Rest(), + default: defaultValue + ) + } + + @inlinable + func parse(_ input: inout URLRequestData) throws -> Value.Output { + func defaultOrError(_ error: Error) throws -> Value.Output { + guard let defaultValue = self.defaultValue + else { + throw error + } + return defaultValue + } + + guard + let wrapped = input.query[self.name]?.first, + var value = wrapped + else { + return try defaultOrError(ParsingError()) + } + + let output: Value.Output + do { + output = try self.valueParser.parse(&value) + } catch { + return try defaultOrError(error) + } + + guard value.isEmpty + else { + return try defaultOrError(ParsingError()) + } + + input.query[self.name]?.removeFirst() + if input.query[self.name]?.isEmpty ?? true { + input.query[self.name] = nil + } + + return output + } + } + + struct Route: Parser + where + Parsers: Parser, + Parsers.Input == URLRequestData + { + let parsers: Parsers + + @inlinable + init( + _ transform: @escaping (Upstream.Output) -> Route, + @ParserBuilder with parsers: () -> Upstream + ) where Upstream.Input == URLRequestData, Parsers == Parsing.Parsers.Map { + self.parsers = parsers().map(transform) + } + + @inlinable + init( + _ route: Route, + @ParserBuilder with parsers: () -> Upstream + ) + where + Upstream.Input == URLRequestData, + Upstream.Output == Void, + Parsers == Parsing.Parsers.Map + { + self.parsers = parsers().map { route } + } + + @inlinable + init(_ route: Route) where Parsers == Always { + self.parsers = Always(route) + } + + @inlinable + func parse(_ input: inout URLRequestData) throws -> Parsers.Output { + let output = try self.parsers.parse(&input) + guard + input.method == nil || (try? Method.get.parse(&input)) != nil, + input.path.isEmpty + else { + throw ParsingError() + } + return output + } + } +#endif diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/UUID.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/UUID.swift new file mode 100644 index 00000000..1e4c0c63 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/UUID.swift @@ -0,0 +1,23 @@ +import Benchmark +import Foundation +import Parsing + +/// This benchmark demonstrates how the UUID parser compares to `UUID`'s initializer. +let uuidSuite = BenchmarkSuite(name: "UUID") { suite in + let input = "deadbeef-dead-beef-dead-beefdeadbeef" + let expected = UUID(uuidString: "deadbeef-dead-beef-dead-beefdeadbeef")! + var output: UUID! + + suite.benchmark("UUID.init") { + output = UUID(uuidString: input) + } tearDown: { + precondition(output == expected) + } + + suite.benchmark("UUID.parser") { + var input = input[...].utf8 + output = try UUID.parser().parse(&input) + } tearDown: { + precondition(output == expected) + } +} diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/XCTestLogs.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/XCTestLogs.swift new file mode 100644 index 00000000..cf2572f4 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/XCTestLogs.swift @@ -0,0 +1,125 @@ +import Benchmark +import Parsing + +/// This benchmark demonstrates how to build process a dump of Xcode test logs to transform them +/// in an array of test failures and passes. + +let xcodeLogsSuite = BenchmarkSuite(name: "Xcode Logs") { suite in + var output: [TestResult]! + + suite.benchmark("Parser") { + var input = xcodeLogs[...].utf8 + output = try testResultsUtf8.parse(&input) + } tearDown: { + precondition(output.count == 284) + } +} + +private let testCaseFinishedLine = Parse { + Skip { + PrefixThrough(" (".utf8) + } + Double.parser() + " seconds).\n".utf8 +} + +private let testCaseStartedLine = Parse { + Skip { + PrefixUpTo("Test Case '-[".utf8) + } + PrefixThrough("\n".utf8) + .map { line in line.split(separator: .init(ascii: " "))[3].dropLast(2) } +} + +private let fileName = Parse { + "/".utf8 + PrefixThrough(".swift".utf8) + .compactMap { $0.split(separator: .init(ascii: "/")).last } +} + +private let testCaseBody = Parse { + fileName + ":".utf8 + Int.parser() + Skip { + PrefixThrough("] : ".utf8) + } + Rest() +} + +struct TestCaseBody: Parser { + func parse( + _ input: inout Substring.UTF8View + ) throws -> (file: Substring.UTF8View, line: Int, message: Substring.UTF8View) { + guard input.first == .init(ascii: "/") + else { throw ParsingError() } + + var slashCount = 0 + let filePathPrefix = input.prefix { codeUnit in + if codeUnit == .init(ascii: "/") { + slashCount += 1 + } + return slashCount != 3 + } + + input.removeFirst(filePathPrefix.count) + do { + var failure = try OneOf { + PrefixUpTo(filePathPrefix) + PrefixUpTo("Test Case '-[".utf8) + } + .parse(&input) + + failure.removeLast() // trailing newline + let output = try testCaseBody.parse(&failure) + return output + } catch { + throw error + } + } +} + +enum TestResult { + case failed( + failureMessage: Substring, + file: Substring, + line: Int, + testName: Substring, + time: Double + ) + case passed(testName: Substring, time: Double) +} + +private let testFailed = Parse { + testCaseStartedLine + Many { TestCaseBody() } + testCaseFinishedLine +} +.map { testName, bodyData, time in + bodyData.map { body in + TestResult.failed( + failureMessage: Substring(body.2), + file: Substring(body.0), + line: body.1, + testName: Substring(testName), + time: time + ) + } +} +.filter { !$0.isEmpty } + +private let testPassed = Parse { + testCaseStartedLine.map(Substring.init) + testCaseFinishedLine +} +.map { [TestResult.passed(testName: $0, time: $1)] } + +private let testResult = OneOf { + testFailed + testPassed +} + +let testResultsUtf8 = Many { + testResult +} +.map { $0.flatMap { $0 } } diff --git a/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/main.swift b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/main.swift new file mode 100644 index 00000000..d9996983 --- /dev/null +++ b/0184-parser-printers-pt7/swift-parsing/Sources/swift-parsing-benchmark/main.swift @@ -0,0 +1,24 @@ +import Benchmark +import Parsing + +Benchmark.main( + [ +// defaultBenchmarkSuite, +// arithmeticSuite, +// binaryDataSuite, +// boolSuite, +// colorSuite, +// csvSuite, +// dateSuite, +// httpSuite, +// jsonSuite, +// numericsSuite, +// prefixUpToSuite, + raceSuite, +// readmeExampleSuite, +// routingSuite, +// stringAbstractionsSuite, +// uuidSuite, +// xcodeLogsSuite, + ] +) diff --git a/README.md b/README.md index 21bb3fdc..446f3c91 100644 --- a/README.md +++ b/README.md @@ -185,3 +185,4 @@ This repository is the home of code written on episodes of [Point-Free](https:// 1. [Parser Printers: Generalization](0181-parser-printers-pt4) 1. [Parser Printers: Map](0182-parser-printers-pt5) 1. [Parser Printers: Bizarro Printing](0183-parser-printers-pt6) +1. [Parser Printers: The Point](0184-parser-printers-pt7)