@mmerterden/multi-agent-pipeline 20.6.0 → 20.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/LICENSE +0 -10
- package/docs/facts.json +1 -1
- package/manifest.json +328 -329
- package/package.json +2 -2
- package/pipeline/multi-agent-refs/features/design-conformance.md +62 -64
- package/pipeline/scripts/_notices.mjs +12 -1
- package/pipeline/scripts/gen-skills-index.mjs +1 -1
- package/pipeline/skills/.skill-manifest.json +106 -106
- package/pipeline/skills/shared/README.md +71 -71
- package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +1 -0
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
- package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
- package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
- package/pipeline/skills/shared/external/android-architecture/SKILL.md +2 -0
- package/pipeline/skills/shared/external/android-performance/SKILL.md +2 -0
- package/pipeline/skills/shared/external/android-security/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
- package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
- package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
- package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
- package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
- package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
- package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +339 -277
- package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
- package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +105 -122
- package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +143 -166
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +307 -326
- package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
- package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +333 -360
- package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
- package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
- package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
- package/pipeline/skills/shared/external/authentication/SKILL.md +265 -381
- package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +133 -178
- package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
- package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
- package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
- package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
- package/pipeline/skills/shared/external/background-processing/SKILL.md +270 -382
- package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +169 -317
- package/pipeline/skills/shared/external/backlog/BACKLOG.md +1 -1
- package/pipeline/skills/shared/external/backlog/SKILL.md +56 -33
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
- package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
- package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +1 -0
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
- package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
- package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
- package/pipeline/skills/shared/external/compose-components/SKILL.md +2 -0
- package/pipeline/skills/shared/external/compose-navigation/SKILL.md +3 -2
- package/pipeline/skills/shared/external/compose-testing/SKILL.md +2 -0
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
- package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
- package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +226 -376
- package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
- package/pipeline/skills/shared/external/core-data/SKILL.md +292 -368
- package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
- package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
- package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
- package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
- package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
- package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
- package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
- package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
- package/pipeline/skills/shared/external/council/SKILL.md +1 -0
- package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
- package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
- package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
- package/pipeline/skills/shared/external/css-modern/SKILL.md +1 -0
- package/pipeline/skills/shared/external/database-patterns/SKILL.md +1 -0
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
- package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
- package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +230 -353
- package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
- package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
- package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
- package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
- package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
- package/pipeline/skills/shared/external/evidence-github/SKILL.md +2 -0
- package/pipeline/skills/shared/external/evidence-registry/SKILL.md +2 -0
- package/pipeline/skills/shared/external/gradle-kotlin-dsl/SKILL.md +2 -0
- package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
- package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
- package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
- package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
- package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
- package/pipeline/skills/shared/external/html-semantic/SKILL.md +1 -0
- package/pipeline/skills/shared/external/humanizer/SKILL.md +1 -0
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
- package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
- package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
- package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
- package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
- package/pipeline/skills/shared/external/ios-coding-standard/SKILL.md +1 -0
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
- package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
- package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
- package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +1 -0
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
- package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
- package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
- package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
- package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
- package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
- package/pipeline/skills/shared/external/ios-security/SKILL.md +2 -0
- package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
- package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
- package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
- package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
- package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +91 -283
- package/pipeline/skills/shared/external/localization-reuse-map/reference/format-and-output.md +119 -151
- package/pipeline/skills/shared/external/localization-reuse-map/reference/publish-and-snapshot.md +60 -90
- package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +119 -156
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-artifact.py +726 -787
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/build-spreadsheet.py +253 -288
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-annotations.py +243 -304
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/fetch-legacy-labels.py +88 -104
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/publish-confluence.py +181 -235
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-key-shots.py +198 -263
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/render-overlay.py +461 -466
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-legacy-values.py +145 -151
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +123 -141
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/scan-screen-keys.py +146 -157
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/snapshot-resources.sh +22 -19
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/verify-map.py +156 -140
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +295 -267
- package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
- package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
- package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
- package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
- package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
- package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
- package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
- package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +1 -0
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
- package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
- package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
- package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
- package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
- package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
- package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
- package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
- package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
- package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
- package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
- package/pipeline/skills/shared/external/play-store-review/SKILL.md +2 -0
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
- package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
- package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
- package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
- package/pipeline/skills/shared/external/python-patterns/SKILL.md +1 -0
- package/pipeline/skills/shared/external/react-best-practices/SKILL.md +1 -0
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
- package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
- package/pipeline/skills/shared/external/rest-api-design/SKILL.md +1 -0
- package/pipeline/skills/shared/external/retrofit-networking/SKILL.md +2 -0
- package/pipeline/skills/shared/external/room-database/SKILL.md +2 -0
- package/pipeline/skills/shared/external/search-first/SKILL.md +1 -0
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
- package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
- package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
- package/pipeline/skills/shared/external/signal-community/SKILL.md +2 -0
- package/pipeline/skills/shared/external/skill-creator/SKILL.md +80 -41
- package/pipeline/skills/shared/external/skill-creator/audit.md +63 -59
- package/pipeline/skills/shared/external/skill-creator/checklist.md +28 -20
- package/pipeline/skills/shared/external/skill-creator/examples.md +40 -40
- package/pipeline/skills/shared/external/skill-creator/label-check.md +48 -36
- package/pipeline/skills/shared/external/skill-creator/scripts/audit-panel.js +91 -100
- package/pipeline/skills/shared/external/skill-creator/template.md +51 -39
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
- package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
- package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
- package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
- package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
- package/pipeline/skills/shared/external/storekit/references/core-patterns.md +298 -242
- package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
- package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
- package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
- package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
- package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
- package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +303 -351
- package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
- package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
- package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
- package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
- package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
- package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
- package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
- package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
- package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
- package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
- package/pipeline/skills/shared/external/swift-security/SKILL.md +180 -161
- package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
- package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +408 -476
- package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
- package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
- package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
- package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
- package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +352 -472
- package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
- package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
- package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
- package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +396 -457
- package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +188 -175
- package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
- package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +80 -84
- package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +392 -256
- package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
- package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
- package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
- package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
- package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
- package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
- package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
- package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
- package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
- package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
- package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
- package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
- package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
- package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
- package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
- package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
- package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +193 -168
- package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
- package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +132 -133
- package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
- package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +106 -140
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
- package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
- package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
- package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
- package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
- package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
- package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
- package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
- package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
- package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
- package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
- package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
- package/pipeline/skills/shared/external/tailwind-css/SKILL.md +1 -0
- package/pipeline/skills/shared/external/testing-backend/SKILL.md +1 -0
- package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
- package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
- package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +1 -0
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
- package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
- package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
- package/pipeline/skills/shared/external/vue-composition/SKILL.md +1 -0
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +152 -310
- package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
- package/pipeline/skills/shared/external/web-accessibility/SKILL.md +1 -0
- package/pipeline/skills/shared/external/web-performance/SKILL.md +1 -0
- package/pipeline/skills/shared/external/web-testing/SKILL.md +1 -0
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +216 -288
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +414 -719
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
|
@@ -3,41 +3,44 @@
|
|
|
3
3
|
"evals": [
|
|
4
4
|
{
|
|
5
5
|
"id": 0,
|
|
6
|
-
"
|
|
7
|
-
"
|
|
6
|
+
"name": "settings-plan-review",
|
|
7
|
+
"prompt": "Check this plan for our podcast app on Swift 6.3 and Xcode 26: (1) turning on Approachable Concurrency is enough to make the whole app target main-actor isolated; (2) we will begin the Swift 6 migration at the Targeted strict-concurrency level; (3) waveform rendering is CPU heavy but can stay on the main actor, because nonisolated async functions hop to a background thread anyway. Correct what is wrong and say what we should do instead.",
|
|
8
|
+
"expected_output": "Separates the two settings: Approachable Concurrency enables upcoming features, whereas inferring @MainActor everywhere needs the Default Actor Isolation build setting set to MainActor. Notes that the Swift 6 language mode (6.3 included) is complete checking with errors and that Targeted and Minimal are Swift 5 staging levels. Explains that with NonisolatedNonsendingByDefault a nonisolated async function keeps executing on whichever actor called it, so the rendering must be moved with @concurrent on a nonisolated function. Stays at the level of settings and code-level fixes.",
|
|
8
9
|
"files": [],
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"States that Swift 6
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
10
|
+
"expectations": [
|
|
11
|
+
"Treats Approachable Concurrency and Default Actor Isolation as two separate settings, and only the latter, set to MainActor, gives main-actor-by-default",
|
|
12
|
+
"States that in Swift 6 (and 6.3) mode checking is always complete and reports errors, while the Targeted and Minimal levels belong to Swift 5 staging",
|
|
13
|
+
"Says a nonisolated async function inherits the calling actor, the nonisolated(nonsending) behavior, until @concurrent is added",
|
|
14
|
+
"Moves the CPU-heavy rendering off the main actor with @concurrent in a nonisolated context",
|
|
15
|
+
"Limits the answer to build settings and code-level changes, with no broader redesign of architecture or SwiftUI state"
|
|
15
16
|
]
|
|
16
17
|
},
|
|
17
18
|
{
|
|
18
19
|
"id": 1,
|
|
19
|
-
"
|
|
20
|
-
"
|
|
20
|
+
"name": "default-isolation-remediation",
|
|
21
|
+
"prompt": "Our app target uses Default Actor Isolation = MainActor. We get errors on an @Observable PlaylistModel that conforms to our Archivable protocol, on an async render method of a plain WaveformRenderer class, and around a vendor analytics SDK we import with @preconcurrency. Give a remediation plan that keeps behavior the same, and tell us what is out of scope for this pass.",
|
|
22
|
+
"expected_output": "Keeps PlaylistModel on the main actor and meets the protocol through a main-actor isolated conformance, written extension PlaylistModel: @MainActor Archivable. Explains that WaveformRenderer.render executes on its caller's actor under nonisolated(nonsending), so only CPU-heavy parts should move to a @concurrent nonisolated function. Prefers immutable values, actor isolation or locks over @unchecked Sendable. Treats the @preconcurrency import as temporary with a written removal plan, and leaves module layout, navigation and who owns which SwiftUI state to sibling skills.",
|
|
21
23
|
"files": [],
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
24
|
+
"expectations": [
|
|
25
|
+
"Fixes the conformance with @MainActor on the type or the isolated form extension PlaylistModel: @MainActor Archivable",
|
|
26
|
+
"Separates the case where WaveformRenderer may keep running on the calling actor from CPU-bound work that belongs in a @concurrent nonisolated function",
|
|
27
|
+
"Reaches for immutable values, an actor or a lock before any @unchecked Sendable",
|
|
28
|
+
"Keeps the @preconcurrency import only temporarily and asks for a written plan to drop it",
|
|
29
|
+
"Hands module layout, navigation and fine-grained SwiftUI state ownership over to sibling skills"
|
|
28
30
|
]
|
|
29
31
|
},
|
|
30
32
|
{
|
|
31
33
|
"id": 2,
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
+
"name": "locks-versus-actors",
|
|
35
|
+
"prompt": "Review this plan; the app's deployment range is iOS 16 up to iOS 26: an actor holds the frame-drop counter that a C audio callback increments synchronously; another actor guards its dictionary with an NSLock as extra protection; a Mutex stays locked while we await the network refresh; and NSLock is banned because it is not Sendable. What should change?",
|
|
36
|
+
"expected_output": "Keeps actors for shared mutable state reached asynchronously where hops are acceptable, and replaces the counter with Atomic on iOS 18 or a lock for iOS 16-17 because the C callback is synchronous. Picks Mutex where iOS 18 is the floor and OSAllocatedUnfairLock for the iOS 16 and 17 range or when lock ownership should be asserted. Removes the NSLock from inside the actor and never holds a lock across await. Points out that NSLock does conform to Sendable, yet still favors the newer primitives that own their state.",
|
|
34
37
|
"files": [],
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"Uses Atomic for simple scalar
|
|
39
|
-
"Rejects locks inside actors and
|
|
40
|
-
"
|
|
38
|
+
"expectations": [
|
|
39
|
+
"Keeps an actor where every caller can await and the hop cost does not matter",
|
|
40
|
+
"Chooses Mutex when iOS 18 is the minimum, OSAllocatedUnfairLock for iOS 16 and 17 or for ownership preconditions",
|
|
41
|
+
"Uses Atomic for a simple scalar counter or flag instead of an actor or a full lock",
|
|
42
|
+
"Rejects locks inside actors and any lock held across await",
|
|
43
|
+
"Fixes the false statement that NSLock lacks Sendable, but still prefers the newer lock types that hold their state"
|
|
41
44
|
]
|
|
42
45
|
}
|
|
43
46
|
]
|
package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md
CHANGED
|
@@ -1,87 +1,72 @@
|
|
|
1
1
|
# Approachable Concurrency Quick Reference
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
**
|
|
9
|
-
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
-
|
|
35
|
-
|
|
36
|
-
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
- **Keep global/shared mutable state on MainActor** unless there is a clear
|
|
51
|
-
performance need to offload.
|
|
52
|
-
- **Remove redundant `@MainActor` annotations** that are now implied by the
|
|
53
|
-
default isolation mode.
|
|
54
|
-
|
|
55
|
-
## Offloading Work
|
|
56
|
-
|
|
57
|
-
- Use `@concurrent` on async functions that must run on the concurrent pool.
|
|
58
|
-
- Make types or members `nonisolated` only when they are truly thread-safe and
|
|
59
|
-
used off the main actor.
|
|
60
|
-
- Continue to respect `Sendable` boundaries when values cross actors or tasks.
|
|
61
|
-
|
|
62
|
-
## Common Pitfalls
|
|
63
|
-
|
|
64
|
-
| Pitfall | Why it happens | Fix |
|
|
3
|
+
## Which mode is this target in?
|
|
4
|
+
|
|
5
|
+
- **Xcode 26:** open Build Settings and read the Swift Compiler - Concurrency
|
|
6
|
+
group.
|
|
7
|
+
- **Language version:** approachable concurrency needs Swift 6.2 or later.
|
|
8
|
+
- **Approachable Concurrency = Yes:** the upcoming features
|
|
9
|
+
`NonisolatedNonsendingByDefault`, isolated-conformance inference, inferred
|
|
10
|
+
`Sendable` for captures and related global-actor usability changes are on.
|
|
11
|
+
- **Default Actor Isolation = MainActor:** declarations without an isolation
|
|
12
|
+
annotation are inferred `@MainActor`.
|
|
13
|
+
- **Strict Concurrency Checking:** Swift 6 language mode is always complete and
|
|
14
|
+
reports errors. Complete, Targeted and Minimal are choices for Swift 5 mode.
|
|
15
|
+
- **SwiftPM:** the same switches appear as entries in each target's
|
|
16
|
+
`swiftSettings` in `Package.swift`.
|
|
17
|
+
|
|
18
|
+
## What changes
|
|
19
|
+
|
|
20
|
+
- A `nonisolated` async function keeps running on the actor that called it
|
|
21
|
+
instead of moving to the global concurrent executor, as long as
|
|
22
|
+
`NonisolatedNonsendingByDefault` is on. Many "sending 'x' risks causing data
|
|
23
|
+
races" errors go away as a result.
|
|
24
|
+
- With default MainActor isolation, globals and statics are protected,
|
|
25
|
+
conformances are isolated to the main actor, and ordinary mutable state is
|
|
26
|
+
safe without annotation.
|
|
27
|
+
- A conformance can also be isolated by hand:
|
|
28
|
+
`extension Timeline: @MainActor Refreshable`. The compiler rejects any use
|
|
29
|
+
of it outside main-actor code.
|
|
30
|
+
|
|
31
|
+
## Fixing code in this mode
|
|
32
|
+
|
|
33
|
+
- Add as few annotations as possible; let the default isolate UI code.
|
|
34
|
+
- For protocol conformances, reach for an isolated conformance before a
|
|
35
|
+
`nonisolated` workaround.
|
|
36
|
+
- Keep shared mutable state on the main actor unless profiling gives a reason
|
|
37
|
+
to move it.
|
|
38
|
+
- Delete `@MainActor` attributes the default already implies.
|
|
39
|
+
|
|
40
|
+
### Moving work off the main actor
|
|
41
|
+
|
|
42
|
+
- Put `@concurrent` on async functions that must run on the thread pool.
|
|
43
|
+
- Mark a type or member `nonisolated` only if it really is safe to use from
|
|
44
|
+
several threads and actually runs off the main actor.
|
|
45
|
+
- Values crossing between actors or tasks still have to be `Sendable`.
|
|
46
|
+
|
|
47
|
+
## Pitfalls
|
|
48
|
+
|
|
49
|
+
| Symptom | Cause | Fix |
|
|
65
50
|
|---|---|---|
|
|
66
|
-
| CPU-heavy work
|
|
67
|
-
| `Task.detached`
|
|
68
|
-
|
|
|
69
|
-
| `nonisolated` on mutable state |
|
|
51
|
+
| UI stutters after enabling the mode | CPU-heavy work now inferred onto the main actor | Move it into a `@concurrent` async function |
|
|
52
|
+
| Isolation errors inside a new task | `Task.detached` drops the inherited actor | Use `Task { }` unless detachment is the point |
|
|
53
|
+
| `@MainActor` on nearly every declaration | Annotations from before the default was on | Remove the redundant ones |
|
|
54
|
+
| Races reappear | `nonisolated` placed on mutable state | Keep mutable state isolated |
|
|
70
55
|
|
|
71
|
-
##
|
|
56
|
+
## Keywords
|
|
72
57
|
|
|
73
|
-
| Keyword |
|
|
58
|
+
| Keyword | Meaning |
|
|
74
59
|
|---|---|
|
|
75
|
-
| `async` |
|
|
76
|
-
| `await` |
|
|
77
|
-
| `Task { }` |
|
|
78
|
-
| `Task.detached { }` |
|
|
79
|
-
| `Task.immediate { }` |
|
|
80
|
-
| `@MainActor` |
|
|
81
|
-
| `actor` |
|
|
82
|
-
| `nonisolated` |
|
|
60
|
+
| `async` | The function may suspend |
|
|
61
|
+
| `await` | A point where the caller may suspend until the call finishes |
|
|
62
|
+
| `Task { }` | New unstructured work that inherits actor, priority and task-locals |
|
|
63
|
+
| `Task.detached { }` | New unstructured work that inherits none of them |
|
|
64
|
+
| `Task.immediate { }` | New work that starts running at once on the current actor |
|
|
65
|
+
| `@MainActor` | Isolated to the main actor, which runs on the main thread |
|
|
66
|
+
| `actor` | Reference type whose mutable state is isolated to itself |
|
|
67
|
+
| `nonisolated` | Not isolated to any actor |
|
|
83
68
|
| `Sendable` | Safe to pass between isolation domains |
|
|
84
|
-
| `@concurrent` | Always
|
|
85
|
-
| `async let` |
|
|
86
|
-
| `TaskGroup` |
|
|
87
|
-
| `sending` | Parameter
|
|
69
|
+
| `@concurrent` | Always runs on the concurrent thread pool (Swift 6.2) |
|
|
70
|
+
| `async let` | Concurrent child work, fixed count |
|
|
71
|
+
| `TaskGroup` | Concurrent child work, count decided at run time |
|
|
72
|
+
| `sending` | Parameter or result that transfers a value to another isolation (SE-0430) |
|
|
@@ -1,113 +1,77 @@
|
|
|
1
1
|
# Swift Async Algorithms
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
## Contents
|
|
6
|
-
|
|
7
|
-
- [Key Algorithms](#key-algorithms)
|
|
8
|
-
- [Common Patterns](#common-patterns)
|
|
9
|
-
|
|
10
|
-
Add to Package.swift:
|
|
11
|
-
|
|
12
|
-
```swift
|
|
13
|
-
.package(url: "https://github.com/apple/swift-async-algorithms", from: "1.0.0")
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
## Key Algorithms
|
|
17
|
-
|
|
18
|
-
### Combining
|
|
3
|
+
`swift-async-algorithms` is an open-source Apple package that brings the
|
|
4
|
+
familiar `Sequence` algorithms, plus time-based ones, to `AsyncSequence`.
|
|
19
5
|
|
|
20
6
|
```swift
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
for await (a, b) in zip(streamA, streamB) {
|
|
35
|
-
handle(a, b)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Chain - concatenate sequences end-to-end
|
|
39
|
-
for await value in chain(streamA, streamB) {
|
|
40
|
-
handle(value)
|
|
41
|
-
}
|
|
7
|
+
// Package.swift
|
|
8
|
+
dependencies: [
|
|
9
|
+
.package(
|
|
10
|
+
url: "https://github.com/apple/swift-async-algorithms",
|
|
11
|
+
.upToNextMajor(from: "1.0.0")
|
|
12
|
+
)
|
|
13
|
+
],
|
|
14
|
+
targets: [
|
|
15
|
+
.target(
|
|
16
|
+
name: "Feed",
|
|
17
|
+
dependencies: [.product(name: "AsyncAlgorithms", package: "swift-async-algorithms")]
|
|
18
|
+
)
|
|
19
|
+
]
|
|
42
20
|
```
|
|
43
21
|
|
|
44
|
-
|
|
22
|
+
Then `import AsyncAlgorithms` in the source files that use it.
|
|
45
23
|
|
|
46
|
-
|
|
47
|
-
// Debounce - emit after a quiet period (e.g., search-as-you-type)
|
|
48
|
-
let searchResults = searchTerms
|
|
49
|
-
.debounce(for: .milliseconds(300))
|
|
24
|
+
## Combining sequences
|
|
50
25
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
.throttle(for: .seconds(1))
|
|
58
|
-
|
|
59
|
-
for await reading in throttled {
|
|
60
|
-
updateDisplay(reading)
|
|
61
|
-
}
|
|
26
|
+
| Function | Result |
|
|
27
|
+
|---|---|
|
|
28
|
+
| `merge(first, second)` | One sequence with elements from both, in the order they arrive |
|
|
29
|
+
| `combineLatest(first, second)` | The most recent pair, emitted whenever either side produces |
|
|
30
|
+
| `zip(first, second)` | Elements paired one to one; waits until both sides have one |
|
|
31
|
+
| `chain(first, second)` | All of `first`, then all of `second` |
|
|
62
32
|
|
|
63
|
-
|
|
64
|
-
for await batch in events.chunks(ofCount: 10) {
|
|
65
|
-
await processBatch(batch) // [Event] with up to 10 elements
|
|
66
|
-
}
|
|
33
|
+
## Time-based operators
|
|
67
34
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
35
|
+
| Operator | Behavior | Typical use |
|
|
36
|
+
|---|---|---|
|
|
37
|
+
| `.debounce(for: .milliseconds(250))` | Emits only after the input goes quiet for the interval | Search fields |
|
|
38
|
+
| `.chunks(ofCount: 20)` | Arrays of up to 20 elements | Batch writes |
|
|
39
|
+
| `.chunked(by: .repeating(every: .seconds(5)))` | Arrays collected per time window | Periodic flushes |
|
|
40
|
+
| `.chunks(ofCount: 25, or: .repeating(every: .seconds(2)))` | A batch when it is full or when the timer fires, whichever comes first | Batch uploads with a latency cap |
|
|
72
41
|
|
|
73
|
-
|
|
42
|
+
Throttling ships in the 1.x releases only as the underscored `_throttle(for:)`,
|
|
43
|
+
which is not stable public API; do not build on it.
|
|
74
44
|
|
|
75
|
-
|
|
76
|
-
// Remove consecutive duplicates
|
|
77
|
-
for await value in stream.removeDuplicates() {
|
|
78
|
-
handle(value)
|
|
79
|
-
}
|
|
45
|
+
## Filtering and cleanup
|
|
80
46
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
// value is non-optional Int
|
|
85
|
-
}
|
|
86
|
-
```
|
|
47
|
+
- `.removeDuplicates()` drops an element equal to the one just before it.
|
|
48
|
+
- `.compacted()` removes `nil` from a sequence of optionals, the same as
|
|
49
|
+
`compactMap { $0 }`.
|
|
87
50
|
|
|
88
|
-
##
|
|
51
|
+
## Patterns
|
|
89
52
|
|
|
90
|
-
### Search
|
|
53
|
+
### Search as the user types
|
|
91
54
|
|
|
92
55
|
```swift
|
|
93
|
-
func
|
|
56
|
+
func suggestions(for queries: AsyncStream<String>) -> AsyncStream<[Place]> {
|
|
94
57
|
AsyncStream { continuation in
|
|
95
|
-
Task {
|
|
96
|
-
for await
|
|
97
|
-
|
|
98
|
-
let
|
|
99
|
-
continuation.yield(
|
|
58
|
+
let worker = Task {
|
|
59
|
+
for await query in queries.debounce(for: .milliseconds(250)).removeDuplicates() {
|
|
60
|
+
if Task.isCancelled { break }
|
|
61
|
+
let places = (try? await geocoder.search(query)) ?? []
|
|
62
|
+
continuation.yield(places)
|
|
100
63
|
}
|
|
101
64
|
continuation.finish()
|
|
102
65
|
}
|
|
66
|
+
continuation.onTermination = { _ in worker.cancel() }
|
|
103
67
|
}
|
|
104
68
|
}
|
|
105
69
|
```
|
|
106
70
|
|
|
107
|
-
###
|
|
71
|
+
### Batched uploads
|
|
108
72
|
|
|
109
73
|
```swift
|
|
110
|
-
for await batch in
|
|
111
|
-
await
|
|
74
|
+
for await batch in pendingEvents.chunks(ofCount: 25, or: .repeating(every: .seconds(2))) {
|
|
75
|
+
try await analytics.upload(batch)
|
|
112
76
|
}
|
|
113
77
|
```
|