@swiftbrowser/swift 0.0.0-stage → 0.2.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/Package.swift +214 -0
- package/README.md +10 -2
- package/Sources/AVFoundation/AVFoundation.swift +131 -0
- package/Sources/AVFoundation/Asset.swift +487 -0
- package/Sources/AVFoundation/AudioSession.swift +144 -0
- package/Sources/AVFoundation/CMTime.swift +303 -0
- package/Sources/AVFoundation/Capture.swift +688 -0
- package/Sources/AVFoundation/Player.swift +749 -0
- package/Sources/AVFoundation/PlayerView.swift +117 -0
- package/Sources/AVKit/AVKit.swift +132 -0
- package/Sources/Accelerate/Accelerate.swift +122 -0
- package/Sources/AppIntents/AppIntents.swift +144 -0
- package/Sources/AppIntents/Parameters.swift +220 -0
- package/Sources/AppIntents/Shortcuts.swift +159 -0
- package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
- package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
- package/Sources/AuthenticationServices/Authorization.swift +251 -0
- package/Sources/Charts/Charts.swift +61 -0
- package/Sources/Combine/AnyCancellable.swift +65 -0
- package/Sources/Combine/AnyPublisher.swift +148 -0
- package/Sources/Combine/AnySubscriber.swift +230 -0
- package/Sources/Combine/Cancellable.swift +35 -0
- package/Sources/Combine/Codable.swift +29 -0
- package/Sources/Combine/CombineIdentifier.swift +45 -0
- package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
- package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
- package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
- package/Sources/Combine/CurrentValueSubject.swift +252 -0
- package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
- package/Sources/Combine/Future.swift +228 -0
- package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
- package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
- package/Sources/Combine/Helpers/ConduitList.swift +59 -0
- package/Sources/Combine/Helpers/DebugHook.swift +177 -0
- package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
- package/Sources/Combine/Helpers/Locking.swift +30 -0
- package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
- package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
- package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
- package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
- package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
- package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
- package/Sources/Combine/Helpers/Utils.swift +30 -0
- package/Sources/Combine/Helpers/Violations.swift +33 -0
- package/Sources/Combine/ImmediateScheduler.swift +178 -0
- package/Sources/Combine/LICENSE +21 -0
- package/Sources/Combine/NotificationPublisher.swift +48 -0
- package/Sources/Combine/ObjectWillChange.swift +46 -0
- package/Sources/Combine/PassthroughSubject.swift +222 -0
- package/Sources/Combine/Publisher+Subscribe.swift +53 -0
- package/Sources/Combine/Publishers/Deferred.swift +48 -0
- package/Sources/Combine/Publishers/Empty.swift +54 -0
- package/Sources/Combine/Publishers/Fail.swift +42 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
- package/Sources/Combine/Publishers/Just.swift +313 -0
- package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
- package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
- package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
- package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
- package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
- package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
- package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
- package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
- package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
- package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
- package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
- package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
- package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
- package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
- package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
- package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
- package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
- package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
- package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
- package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
- package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
- package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
- package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
- package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
- package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
- package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
- package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
- package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
- package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
- package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
- package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
- package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
- package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
- package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
- package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
- package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
- package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
- package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
- package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
- package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
- package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
- package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
- package/Sources/Combine/Publishers/Publishers.swift +13 -0
- package/Sources/Combine/Publishers/Record.swift +237 -0
- package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
- package/Sources/Combine/Result.swift +46 -0
- package/Sources/Combine/Scheduler.swift +89 -0
- package/Sources/Combine/Schedulers.swift +211 -0
- package/Sources/Combine/Subject+Void.swift +17 -0
- package/Sources/Combine/Subscriber+Void.swift +20 -0
- package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
- package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
- package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
- package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
- package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
- package/Sources/Combine/Subscription.swift +22 -0
- package/Sources/Combine/Subscriptions.swift +42 -0
- package/Sources/Combine/SwiftUIObservation.swift +10 -0
- package/Sources/Combine/_Introspection.swift +107 -0
- package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
- package/Sources/Compression/Compression.swift +365 -0
- package/Sources/Compression/Deflate.swift +407 -0
- package/Sources/Compression/Zlib.swift +179 -0
- package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
- package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
- package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
- package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
- package/Sources/CoreImage/CIColor.swift +41 -0
- package/Sources/CoreImage/CIContext.swift +31 -0
- package/Sources/CoreImage/CIDetector.swift +57 -0
- package/Sources/CoreImage/CIFilter.swift +243 -0
- package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
- package/Sources/CoreImage/CIImage.swift +162 -0
- package/Sources/CoreImage/QRCode.swift +393 -0
- package/Sources/CoreLocation/Coordinate.swift +30 -0
- package/Sources/CoreLocation/Location.swift +65 -0
- package/Sources/CoreML/Evaluation.swift +414 -0
- package/Sources/CoreML/FeatureValue.swift +266 -0
- package/Sources/CoreML/Model.swift +269 -0
- package/Sources/CoreML/MultiArray.swift +92 -0
- package/Sources/CoreML/Specification.swift +233 -0
- package/Sources/CoreText/CoreText.swift +64 -0
- package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
- package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
- package/Sources/CryptoKit/CryptoKit.swift +375 -0
- package/Sources/CryptoKit/Curve25519.swift +317 -0
- package/Sources/CryptoKit/P256.swift +321 -0
- package/Sources/FoundationBridge/AppStorage.swift +165 -0
- package/Sources/FoundationBridge/AssetResources.swift +90 -0
- package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
- package/Sources/FoundationBridge/AsyncImage.swift +116 -0
- package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
- package/Sources/FoundationBridge/Bundle.swift +119 -0
- package/Sources/FoundationBridge/CombineExports.swift +8 -0
- package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
- package/Sources/FoundationBridge/Dispatch.swift +458 -0
- package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
- package/Sources/FoundationBridge/FileImporter.swift +128 -0
- package/Sources/FoundationBridge/FileSystem.swift +68 -0
- package/Sources/FoundationBridge/FoundationBridge.swift +29 -0
- package/Sources/FoundationBridge/HostResolution.swift +31 -0
- package/Sources/FoundationBridge/ItemProvider.swift +655 -0
- package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
- package/Sources/FoundationBridge/Links.swift +127 -0
- package/Sources/FoundationBridge/ListFormatter.swift +32 -0
- package/Sources/FoundationBridge/Locale.swift +86 -0
- package/Sources/FoundationBridge/Localization.swift +149 -0
- package/Sources/FoundationBridge/Locks.swift +50 -0
- package/Sources/FoundationBridge/Markdown.swift +527 -0
- package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
- package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
- package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
- package/Sources/FoundationBridge/Operation.swift +195 -0
- package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
- package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
- package/Sources/FoundationBridge/SceneStorage.swift +78 -0
- package/Sources/FoundationBridge/SecurityExports.swift +8 -0
- package/Sources/FoundationBridge/Selector.swift +226 -0
- package/Sources/FoundationBridge/StringComparators.swift +17 -0
- package/Sources/FoundationBridge/Table.swift +211 -0
- package/Sources/FoundationBridge/TextAttributes.swift +42 -0
- package/Sources/FoundationBridge/Timer.swift +53 -0
- package/Sources/FoundationBridge/UITextChecker.swift +30 -0
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/FoundationBridge/UserDefaults.swift +183 -0
- package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
- package/Sources/FoundationBridge/WebSocket.swift +187 -0
- package/Sources/FoundationModels/FoundationModels.swift +1098 -0
- package/Sources/ImageIO/GIF.swift +72 -0
- package/Sources/ImageIO/ImageIO.swift +248 -0
- package/Sources/ImageIO/ImageTypes.swift +28 -0
- package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
- package/Sources/LocalAuthentication/LAContext.swift +86 -0
- package/Sources/MapKit/Geometry.swift +223 -0
- package/Sources/MapKit/Map.swift +638 -0
- package/Sources/MapKit/MapView.swift +229 -0
- package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
- package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
- package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
- package/Sources/OSLog/OSLog.swift +6 -0
- package/Sources/Photos/Photos.swift +572 -0
- package/Sources/PhotosUI/PhotosPicker.swift +248 -0
- package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
- package/Sources/QuickLook/QuickLook.swift +168 -0
- package/Sources/SafariServices/SafariServices.swift +106 -0
- package/Sources/Security/Security.swift +332 -0
- package/Sources/StoreKit/AppStore.swift +207 -0
- package/Sources/StoreKit/Products.swift +280 -0
- package/Sources/StoreKit/RequestReview.swift +28 -0
- package/Sources/StoreKit/StoreKit1.swift +486 -0
- package/Sources/StoreKit/StoreViews.swift +428 -0
- package/Sources/StoreKit/Transactions.swift +197 -0
- package/Sources/SwiftData/Macros.swift +58 -0
- package/Sources/SwiftData/ModelActor.swift +38 -0
- package/Sources/SwiftData/ModelContainer.swift +129 -0
- package/Sources/SwiftData/ModelContext.swift +451 -0
- package/Sources/SwiftData/PersistentModel.swift +238 -0
- package/Sources/SwiftData/Properties.swift +261 -0
- package/Sources/SwiftData/Query.swift +256 -0
- package/Sources/SwiftData/Schema.swift +192 -0
- package/Sources/SwiftData/Store.swift +146 -0
- package/Sources/SwiftData/StringPredicates.swift +125 -0
- package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
- package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
- package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
- package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
- package/Sources/SwiftDataMacros/Plugin.swift +18 -0
- package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
- package/Sources/SwiftUI/API/Accessibility.swift +181 -0
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +221 -0
- package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
- package/Sources/SwiftUI/API/Animation.swift +285 -0
- package/Sources/SwiftUI/API/App.swift +87 -0
- package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
- package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
- package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
- package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
- package/Sources/SwiftUI/API/Canvas.swift +337 -0
- package/Sources/SwiftUI/API/Color.swift +237 -0
- package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
- package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
- package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
- package/Sources/SwiftUI/API/Commands.swift +106 -0
- package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
- package/Sources/SwiftUI/API/ContentShape.swift +33 -0
- package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
- package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
- package/Sources/SwiftUI/API/Controls.swift +300 -0
- package/Sources/SwiftUI/API/CustomLayout.swift +442 -0
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +92 -0
- package/Sources/SwiftUI/API/EditMode.swift +212 -0
- package/Sources/SwiftUI/API/Effects.swift +388 -0
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +439 -0
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +137 -0
- package/Sources/SwiftUI/API/Font.swift +131 -0
- package/Sources/SwiftUI/API/Gauge.swift +290 -0
- package/Sources/SwiftUI/API/Geometry.swift +89 -0
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +135 -0
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +342 -0
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +188 -0
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +124 -0
- package/Sources/SwiftUI/API/Layout.swift +220 -0
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +331 -0
- package/Sources/SwiftUI/API/Menu.swift +58 -0
- package/Sources/SwiftUI/API/Modifiers.swift +313 -0
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +386 -0
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +293 -0
- package/Sources/SwiftUI/API/OnChange.swift +48 -0
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +411 -0
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +185 -0
- package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
- package/Sources/SwiftUI/API/Popover.swift +41 -0
- package/Sources/SwiftUI/API/Preferences.swift +262 -0
- package/Sources/SwiftUI/API/Presentation.swift +122 -0
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +517 -0
- package/Sources/SwiftUI/API/Publishers.swift +107 -0
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +84 -0
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +104 -0
- package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
- package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +409 -0
- package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
- package/Sources/SwiftUI/API/Sharing.swift +193 -0
- package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
- package/Sources/SwiftUI/API/State.swift +144 -0
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
- package/Sources/SwiftUI/API/StrokeStyle.swift +30 -0
- package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
- package/Sources/SwiftUI/API/TabContent.swift +841 -0
- package/Sources/SwiftUI/API/Table.swift +382 -0
- package/Sources/SwiftUI/API/Tabs.swift +263 -0
- package/Sources/SwiftUI/API/Tasks.swift +35 -0
- package/Sources/SwiftUI/API/Text.swift +386 -0
- package/Sources/SwiftUI/API/TextDates.swift +61 -0
- package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
- package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
- package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
- package/Sources/SwiftUI/API/Timeline.swift +212 -0
- package/Sources/SwiftUI/API/Toolbar.swift +251 -0
- package/Sources/SwiftUI/API/Transfer.swift +145 -0
- package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
- package/Sources/SwiftUI/API/Video.swift +64 -0
- package/Sources/SwiftUI/API/View.swift +215 -0
- package/Sources/SwiftUI/API/ViewModifier.swift +43 -0
- package/Sources/SwiftUI/API/VisualEffect.swift +155 -0
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +325 -0
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +660 -0
- package/Sources/SwiftUI/Charts/ChartContent.swift +376 -0
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Charts/Marks.swift +204 -0
- package/Sources/SwiftUI/Charts/Plottable.swift +99 -0
- package/Sources/SwiftUI/Charts/Scales.swift +326 -0
- package/Sources/SwiftUI/Localization/Localization.swift +498 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +85 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +101 -0
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +143 -0
- package/Sources/SwiftUI/Runtime/JSONParser.swift +443 -0
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +152 -0
- package/Sources/SwiftUI/Runtime/Reconciler.swift +219 -0
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +2146 -0
- package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
- package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
- package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
- package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
- package/Sources/Symbols/Symbols.swift +25 -0
- package/Sources/Translation/Translation.swift +423 -0
- package/Sources/UIKit/Activity.swift +213 -0
- package/Sources/UIKit/Alerts.swift +69 -0
- package/Sources/UIKit/AppDelegate.swift +222 -0
- package/Sources/UIKit/Appearance.swift +84 -0
- package/Sources/UIKit/ColorConversions.swift +70 -0
- package/Sources/UIKit/Controls.swift +225 -0
- package/Sources/UIKit/Device.swift +200 -0
- package/Sources/UIKit/Feedback.swift +65 -0
- package/Sources/UIKit/Font.swift +307 -0
- package/Sources/UIKit/Graphics.swift +204 -0
- package/Sources/UIKit/HostingController.swift +185 -0
- package/Sources/UIKit/Identity.swift +24 -0
- package/Sources/UIKit/Introspectable.swift +510 -0
- package/Sources/UIKit/Pasteboard.swift +363 -0
- package/Sources/UIKit/PhotoAlbum.swift +81 -0
- package/Sources/UIKit/RemoteNotifications.swift +15 -0
- package/Sources/UIKit/Representable.swift +288 -0
- package/Sources/UIKit/SafeArea.swift +12 -0
- package/Sources/UIKit/SceneDelegates.swift +132 -0
- package/Sources/UIKit/Scenes.swift +40 -0
- package/Sources/UIKit/ScrollView.swift +157 -0
- package/Sources/UIKit/ShortcutItems.swift +67 -0
- package/Sources/UIKit/SymbolConfiguration.swift +124 -0
- package/Sources/UIKit/TargetAction.swift +123 -0
- package/Sources/UIKit/TextPaste.swift +161 -0
- package/Sources/UIKit/TextView.swift +538 -0
- package/Sources/UIKit/UIKit.swift +292 -0
- package/Sources/UIKit/UIView.swift +855 -0
- package/Sources/UIKit/ViewTranslation.swift +311 -0
- package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
- package/Sources/UserNotifications/Content.swift +370 -0
- package/Sources/UserNotifications/NotificationCenter.swift +309 -0
- package/Sources/WeatherKit/WeatherKit.swift +228 -0
- package/Sources/WebKit/WebKit.swift +245 -0
- package/Sources/os/os.swift +376 -0
- package/Sources/zlib/zlib.swift +6 -0
- package/index.d.ts +2 -0
- package/index.mjs +16 -0
- package/manifest.d.mts +2 -0
- package/manifest.mjs +39 -0
- package/package.json +30 -4
- package/sync-sources.mjs +33 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/// One instruction for a renderer. See docs/ops-protocol.md.
|
|
2
|
+
public enum _Op: Equatable, Sendable {
|
|
3
|
+
case create(id: Int, kind: String, props: _JSON)
|
|
4
|
+
case update(id: Int, props: _JSON)
|
|
5
|
+
case insert(parent: Int, id: Int, index: Int)
|
|
6
|
+
case remove(id: Int)
|
|
7
|
+
/// End of a render pass, optionally animated (`withAnimation`).
|
|
8
|
+
case commit(animation: _JSON? = nil)
|
|
9
|
+
/// Headless mode only: echoes a replayed event (an object with at least
|
|
10
|
+
/// `type`) before its ops.
|
|
11
|
+
case event(_JSON)
|
|
12
|
+
/// The app's `UserDefaults`, whole, after a change; the host stores them
|
|
13
|
+
/// and hands them back at the next launch (`SB_DEFAULTS`).
|
|
14
|
+
case defaults(_JSON)
|
|
15
|
+
/// Phase 13: something only the host can do (`fetch`, an `image` probe);
|
|
16
|
+
/// the host answers with a `response` event carrying the same id.
|
|
17
|
+
case request(id: Int, kind: String, params: _JSON)
|
|
18
|
+
/// Phase 18: one saved batch of a SwiftData store (an object with `store`,
|
|
19
|
+
/// `put` and `delete`); the host writes it to IndexedDB and hands the
|
|
20
|
+
/// store back at the next launch (`SB_SWIFTDATA`).
|
|
21
|
+
case swiftData(_JSON)
|
|
22
|
+
/// A bitmap's source (an image file, or a generator's pixels) under its
|
|
23
|
+
/// content key, sent once before the first element that draws it; the
|
|
24
|
+
/// host keeps it for the run (docs/ops-protocol.md, "Bitmaps and Core Image").
|
|
25
|
+
case imageData(_JSON)
|
|
26
|
+
|
|
27
|
+
public var json: _JSON {
|
|
28
|
+
switch self {
|
|
29
|
+
case .create(let id, let kind, let props):
|
|
30
|
+
return .object(["op": .string("create"), "id": .number(Double(id)), "kind": .string(kind), "props": props])
|
|
31
|
+
case .update(let id, let props):
|
|
32
|
+
return .object(["op": .string("update"), "id": .number(Double(id)), "props": props])
|
|
33
|
+
case .insert(let parent, let id, let index):
|
|
34
|
+
return .object(["op": .string("insert"), "parent": .number(Double(parent)),
|
|
35
|
+
"id": .number(Double(id)), "index": .number(Double(index))])
|
|
36
|
+
case .remove(let id):
|
|
37
|
+
return .object(["op": .string("remove"), "id": .number(Double(id))])
|
|
38
|
+
case .commit(let animation):
|
|
39
|
+
if let animation { return .object(["op": .string("commit"), "animation": animation]) }
|
|
40
|
+
return .object(["op": .string("commit")])
|
|
41
|
+
case .event(let event):
|
|
42
|
+
if case .object(var fields) = event {
|
|
43
|
+
fields["op"] = .string("event")
|
|
44
|
+
return .object(fields)
|
|
45
|
+
}
|
|
46
|
+
return .object(["op": .string("event")])
|
|
47
|
+
case .defaults(let values):
|
|
48
|
+
return .object(["op": .string("defaults"), "values": values])
|
|
49
|
+
case .request(let id, let kind, let params):
|
|
50
|
+
return .object(["op": .string("request"), "id": .number(Double(id)), "kind": .string(kind), "params": params])
|
|
51
|
+
case .swiftData(let change):
|
|
52
|
+
if case .object(var fields) = change {
|
|
53
|
+
fields["op"] = .string("swiftdata")
|
|
54
|
+
return .object(fields)
|
|
55
|
+
}
|
|
56
|
+
return .object(["op": .string("swiftdata")])
|
|
57
|
+
case .imageData(let source):
|
|
58
|
+
if case .object(var fields) = source {
|
|
59
|
+
fields["op"] = .string("imagedata")
|
|
60
|
+
return .object(fields)
|
|
61
|
+
}
|
|
62
|
+
return .object(["op": .string("imagedata")])
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/// Where ops go. The browser build buffers them for JavaScript; headless mode
|
|
68
|
+
/// prints them; tests record them.
|
|
69
|
+
@MainActor
|
|
70
|
+
public protocol _RenderHost: AnyObject {
|
|
71
|
+
func apply(_ ops: [_Op])
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/// Prints one op per line (JSON Lines).
|
|
75
|
+
@MainActor
|
|
76
|
+
final class _HeadlessHost: _RenderHost {
|
|
77
|
+
func apply(_ ops: [_Op]) {
|
|
78
|
+
for op in ops { print(op.json.serialized) }
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/// Keeps pending ops serialized as a JSON array in a heap buffer that the
|
|
83
|
+
/// browser reads out of linear memory via the `sb_ops_*` exports, and their
|
|
84
|
+
/// `.bytes` values beside it (`sb_bytes_*`) once the page has asked for them
|
|
85
|
+
/// (else as base64). The ops are serialized when the page reads them, once
|
|
86
|
+
/// per batch, not on every `apply`.
|
|
87
|
+
@MainActor
|
|
88
|
+
final class _BufferedHost: _RenderHost {
|
|
89
|
+
static let shared = _BufferedHost()
|
|
90
|
+
|
|
91
|
+
private(set) var pending: [_Op] = []
|
|
92
|
+
private var buffer: UnsafeMutableBufferPointer<UInt8> = .allocate(capacity: 2)
|
|
93
|
+
private let outbox = _BytesOutbox()
|
|
94
|
+
private var stale = true
|
|
95
|
+
/// The page reads `.bytes` beside the JSON: it called `sb_bytes_count`.
|
|
96
|
+
private var bytesBeside = false
|
|
97
|
+
|
|
98
|
+
func apply(_ ops: [_Op]) {
|
|
99
|
+
pending.append(contentsOf: ops)
|
|
100
|
+
stale = true
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
func clear() {
|
|
104
|
+
pending.removeAll()
|
|
105
|
+
stale = true
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
var pointer: Int32 { serialize(); return Int32(Int(bitPattern: buffer.baseAddress)) }
|
|
109
|
+
var length: Int32 { serialize(); return Int32(buffer.count) }
|
|
110
|
+
|
|
111
|
+
/// The buffer's text (tests: `pointer` is a wasm32 address).
|
|
112
|
+
var text: String { serialize(); return String(decoding: buffer, as: UTF8.self) }
|
|
113
|
+
|
|
114
|
+
/// The `.bytes` values of the pending ops, by the `n` of their `{"$bytes": n}`.
|
|
115
|
+
/// The first read opts the page in: from then on the ops name them as `{"$bytes": n}`.
|
|
116
|
+
var bytes: [UnsafeMutableBufferPointer<UInt8>] {
|
|
117
|
+
if !bytesBeside {
|
|
118
|
+
bytesBeside = true
|
|
119
|
+
stale = true
|
|
120
|
+
}
|
|
121
|
+
serialize()
|
|
122
|
+
return outbox.items
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
private func serialize() {
|
|
126
|
+
guard stale else { return }
|
|
127
|
+
stale = false
|
|
128
|
+
outbox.removeAll()
|
|
129
|
+
let json = _JSON.array(pending.map(\.json))
|
|
130
|
+
let bytes = Array((bytesBeside ? json.serialized(outbox: outbox) : json.serialized).utf8)
|
|
131
|
+
buffer.deallocate()
|
|
132
|
+
buffer = .allocate(capacity: bytes.count)
|
|
133
|
+
_ = buffer.initialize(from: bytes)
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/// Holds the serialized state snapshot for the `sb_state_*` exports.
|
|
138
|
+
@MainActor
|
|
139
|
+
final class _StateBuffer {
|
|
140
|
+
static let shared = _StateBuffer()
|
|
141
|
+
private var buffer: UnsafeMutableBufferPointer<UInt8> = .allocate(capacity: 0)
|
|
142
|
+
|
|
143
|
+
func refresh(with json: _JSON) {
|
|
144
|
+
let bytes = Array(json.serialized.utf8)
|
|
145
|
+
buffer.deallocate()
|
|
146
|
+
buffer = .allocate(capacity: bytes.count)
|
|
147
|
+
_ = buffer.initialize(from: bytes)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
var pointer: Int32 { Int32(Int(bitPattern: buffer.baseAddress)) }
|
|
151
|
+
var length: Int32 { Int32(buffer.count) }
|
|
152
|
+
}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/// A node of the element tree produced from the mounted view tree each pass.
|
|
2
|
+
struct _Element {
|
|
3
|
+
var kind: String
|
|
4
|
+
var props: _JSON
|
|
5
|
+
var children: [_Element]
|
|
6
|
+
var handler: ((_JSON) -> Void)?
|
|
7
|
+
/// Identity for keyed children (`ForEach`); unkeyed elements match by position.
|
|
8
|
+
var key: AnyHashable?
|
|
9
|
+
/// What makes this element a selectable or deletable `List` row (Phase 8).
|
|
10
|
+
var row: _RowMark?
|
|
11
|
+
/// `accessibilityLabel` / `accessibilityIdentifier`, for event scripts only.
|
|
12
|
+
var accessibility: _AccessibilityMark?
|
|
13
|
+
/// `.layoutValue(key:value:)` above this element, by key type: what a
|
|
14
|
+
/// custom layout's subview reads (CustomLayout.swift).
|
|
15
|
+
var layoutValues: [ObjectIdentifier: Any]?
|
|
16
|
+
/// Identity of this element value: a fresh token per produced element,
|
|
17
|
+
/// kept by copies. Two elements with one token are the same subtree (a
|
|
18
|
+
/// clean node's cached output), which the reconciler skips whole.
|
|
19
|
+
var token: Int = _Element.nextToken()
|
|
20
|
+
|
|
21
|
+
nonisolated(unsafe) private static var tokenCounter = 0
|
|
22
|
+
static func nextToken() -> Int {
|
|
23
|
+
tokenCounter += 1
|
|
24
|
+
return tokenCounter
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/// Row metadata the runtime attaches while producing elements and consumes
|
|
29
|
+
/// when it emits a `list`: a `.tag` (or a `ForEach` id, the implicit tag), a
|
|
30
|
+
/// `NavigationLink(value:)`'s value and handler, and the `onDelete` of the
|
|
31
|
+
/// row's `ForEach`.
|
|
32
|
+
struct _RowMark {
|
|
33
|
+
var tag: AnyHashable?
|
|
34
|
+
var linkValue: AnyHashable?
|
|
35
|
+
var linkHandler: ((_JSON) -> Void)?
|
|
36
|
+
var delete: (() -> Void)?
|
|
37
|
+
var deleteDisabled = false
|
|
38
|
+
|
|
39
|
+
var isEmpty: Bool { tag == nil && linkValue == nil && delete == nil && !deleteDisabled }
|
|
40
|
+
|
|
41
|
+
/// Fills what `self` lacks from an inner element's mark.
|
|
42
|
+
func merged(with inner: _RowMark) -> _RowMark {
|
|
43
|
+
var result = self
|
|
44
|
+
if result.tag == nil { result.tag = inner.tag }
|
|
45
|
+
if result.linkValue == nil {
|
|
46
|
+
result.linkValue = inner.linkValue
|
|
47
|
+
result.linkHandler = inner.linkHandler
|
|
48
|
+
}
|
|
49
|
+
if result.delete == nil { result.delete = inner.delete }
|
|
50
|
+
result.deleteDisabled = result.deleteDisabled || inner.deleteDisabled
|
|
51
|
+
return result
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/// Diffs successive element trees and emits ops. Ids are assigned by position
|
|
56
|
+
/// (or key) and kind: an element that keeps both keeps its id across passes.
|
|
57
|
+
@MainActor
|
|
58
|
+
final class _Reconciler {
|
|
59
|
+
struct Rendered {
|
|
60
|
+
var id: Int
|
|
61
|
+
var kind: String
|
|
62
|
+
var props: _JSON
|
|
63
|
+
var children: [Rendered]
|
|
64
|
+
var key: AnyHashable?
|
|
65
|
+
/// The token of the element this was rendered from.
|
|
66
|
+
var token: Int
|
|
67
|
+
/// Not sent to the host; headless event scripts match it.
|
|
68
|
+
var accessibility: _AccessibilityMark?
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
private(set) var roots: [Rendered] = []
|
|
72
|
+
private var nextId = 1
|
|
73
|
+
private(set) var handlers: [Int: (_JSON) -> Void] = [:]
|
|
74
|
+
|
|
75
|
+
func update(with elements: [_Element], animation: _JSON? = nil) -> [_Op] {
|
|
76
|
+
var ops: [_Op] = []
|
|
77
|
+
roots = diff(parent: 0, old: roots, new: elements, ops: &ops)
|
|
78
|
+
ops.append(.commit(animation: animation))
|
|
79
|
+
return ops
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
private func diff(parent: Int, old: [Rendered], new: [_Element], ops: inout [_Op]) -> [Rendered] {
|
|
83
|
+
let keyed = new.contains { $0.key != nil } || old.contains { $0.key != nil }
|
|
84
|
+
return keyed
|
|
85
|
+
? diffKeyed(parent: parent, old: old, new: new, ops: &ops)
|
|
86
|
+
: diffPositional(parent: parent, old: old, new: new, ops: &ops)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
private func diffPositional(parent: Int, old: [Rendered], new: [_Element], ops: inout [_Op]) -> [Rendered] {
|
|
90
|
+
var result: [Rendered] = []
|
|
91
|
+
result.reserveCapacity(new.count)
|
|
92
|
+
|
|
93
|
+
for (index, element) in new.enumerated() {
|
|
94
|
+
if index < old.count, old[index].kind == element.kind {
|
|
95
|
+
result.append(reuse(old[index], for: element, ops: &ops))
|
|
96
|
+
} else {
|
|
97
|
+
if index < old.count { destroy(old[index], ops: &ops) }
|
|
98
|
+
result.append(create(element, parent: parent, index: index, ops: &ops))
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
for stale in old.dropFirst(new.count) {
|
|
103
|
+
destroy(stale, ops: &ops)
|
|
104
|
+
}
|
|
105
|
+
return result
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/// Keyed children: match by key, move what survives, create the rest.
|
|
109
|
+
/// Unkeyed children in a keyed list are matched by their position.
|
|
110
|
+
private func diffKeyed(parent: Int, old: [Rendered], new: [_Element], ops: inout [_Op]) -> [Rendered] {
|
|
111
|
+
func identity(_ key: AnyHashable?, _ index: Int) -> AnyHashable {
|
|
112
|
+
key ?? AnyHashable(_PositionKey(index: index))
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
var oldByIdentity: [AnyHashable: Rendered] = [:]
|
|
116
|
+
for (index, rendered) in old.enumerated() {
|
|
117
|
+
oldByIdentity[identity(rendered.key, index)] = rendered
|
|
118
|
+
}
|
|
119
|
+
let newIdentities = new.enumerated().map { identity($1.key, $0) }
|
|
120
|
+
let kept = Set(newIdentities.enumerated().compactMap { index, id in
|
|
121
|
+
oldByIdentity[id].map { $0.kind == new[index].kind ? id : nil } ?? nil
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
// 1. Remove everything that does not survive, so the parent's children
|
|
125
|
+
// are exactly the kept old elements in their old order.
|
|
126
|
+
var pending: [AnyHashable] = []
|
|
127
|
+
for (index, rendered) in old.enumerated() {
|
|
128
|
+
let id = identity(rendered.key, index)
|
|
129
|
+
if kept.contains(id) { pending.append(id) } else { destroy(rendered, ops: &ops) }
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// 2. Walk the new order; anything not already at the front is moved there.
|
|
133
|
+
var result: [Rendered] = []
|
|
134
|
+
result.reserveCapacity(new.count)
|
|
135
|
+
for (index, element) in new.enumerated() {
|
|
136
|
+
let id = newIdentities[index]
|
|
137
|
+
if kept.contains(id), let previous = oldByIdentity[id] {
|
|
138
|
+
if pending.first == id {
|
|
139
|
+
pending.removeFirst()
|
|
140
|
+
} else {
|
|
141
|
+
pending.removeAll { $0 == id }
|
|
142
|
+
ops.append(.insert(parent: parent, id: previous.id, index: index))
|
|
143
|
+
}
|
|
144
|
+
var rendered = reuse(previous, for: element, ops: &ops)
|
|
145
|
+
rendered.key = element.key
|
|
146
|
+
result.append(rendered)
|
|
147
|
+
} else {
|
|
148
|
+
var rendered = create(element, parent: parent, index: index, ops: &ops)
|
|
149
|
+
rendered.key = element.key
|
|
150
|
+
result.append(rendered)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return result
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
private func reuse(_ previous: Rendered, for element: _Element, ops: inout [_Op]) -> Rendered {
|
|
157
|
+
// The same element value as last pass (a clean subtree's cached
|
|
158
|
+
// output): nothing below it changed, and its handlers are registered.
|
|
159
|
+
if previous.token == element.token { return previous }
|
|
160
|
+
var rendered = previous
|
|
161
|
+
rendered.token = element.token
|
|
162
|
+
rendered.accessibility = element.accessibility
|
|
163
|
+
if rendered.props != element.props {
|
|
164
|
+
ops.append(.update(id: rendered.id, props: element.props))
|
|
165
|
+
rendered.props = element.props
|
|
166
|
+
}
|
|
167
|
+
setHandler(element.handler, for: rendered.id)
|
|
168
|
+
rendered.children = diff(parent: rendered.id, old: rendered.children, new: element.children, ops: &ops)
|
|
169
|
+
return rendered
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
private func create(_ element: _Element, parent: Int, index: Int, ops: inout [_Op]) -> Rendered {
|
|
173
|
+
let id = nextId
|
|
174
|
+
nextId += 1
|
|
175
|
+
ops.append(.create(id: id, kind: element.kind, props: element.props))
|
|
176
|
+
ops.append(.insert(parent: parent, id: id, index: index))
|
|
177
|
+
setHandler(element.handler, for: id)
|
|
178
|
+
let children = element.children.enumerated().map { childIndex, child in
|
|
179
|
+
create(child, parent: id, index: childIndex, ops: &ops)
|
|
180
|
+
}
|
|
181
|
+
return Rendered(id: id, kind: element.kind, props: element.props, children: children, key: element.key,
|
|
182
|
+
token: element.token, accessibility: element.accessibility)
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
private func destroy(_ rendered: Rendered, ops: inout [_Op]) {
|
|
186
|
+
ops.append(.remove(id: rendered.id))
|
|
187
|
+
forget(rendered)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
private func forget(_ rendered: Rendered) {
|
|
191
|
+
handlers[rendered.id] = nil
|
|
192
|
+
for child in rendered.children { forget(child) }
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
private func setHandler(_ handler: ((_JSON) -> Void)?, for id: Int) {
|
|
196
|
+
if let handler {
|
|
197
|
+
handlers[id] = handler
|
|
198
|
+
} else {
|
|
199
|
+
handlers[id] = nil
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
private struct _PositionKey: Hashable {
|
|
205
|
+
let index: Int
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/// Key given to the elements a keyed mounted node produces.
|
|
209
|
+
struct _ElementKey: Hashable {
|
|
210
|
+
let base: AnyHashable
|
|
211
|
+
let index: Int
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/// `_ElementKey` qualified by the keyed group's position among its siblings,
|
|
215
|
+
/// so two `ForEach`es in one container never share a key.
|
|
216
|
+
struct _GroupKey: Hashable {
|
|
217
|
+
let position: Int
|
|
218
|
+
let key: AnyHashable
|
|
219
|
+
}
|