@swiftbrowser/swift 0.1.0 → 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 +200 -9
- package/README.md +7 -9
- 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 +0 -4
- 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/{_FoundationCommon → FoundationBridge}/Bundle.swift +41 -4
- 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 +24 -72
- 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/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 +6 -1
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/{_FoundationCommon → FoundationBridge}/UserDefaults.swift +17 -4
- 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 +55 -6
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +1 -1
- package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
- package/Sources/SwiftUI/API/Animation.swift +37 -5
- package/Sources/SwiftUI/API/App.swift +31 -1
- 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 +104 -28
- 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 +59 -27
- package/Sources/SwiftUI/API/CustomLayout.swift +49 -10
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +1 -1
- package/Sources/SwiftUI/API/EditMode.swift +25 -82
- package/Sources/SwiftUI/API/Effects.swift +105 -7
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +93 -9
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +11 -3
- package/Sources/SwiftUI/API/Gauge.swift +3 -2
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +13 -2
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +1 -1
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +1 -1
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +13 -6
- package/Sources/SwiftUI/API/Layout.swift +67 -12
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +61 -6
- package/Sources/SwiftUI/API/Menu.swift +8 -1
- package/Sources/SwiftUI/API/Modifiers.swift +80 -10
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +24 -9
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +16 -2
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +48 -31
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +11 -2
- 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 +17 -4
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +164 -37
- package/Sources/SwiftUI/API/Publishers.swift +4 -4
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +3 -2
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +3 -3
- 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 +105 -7
- 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 +18 -1
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -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 +148 -4
- package/Sources/SwiftUI/API/Tasks.swift +2 -2
- 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/Toolbar.swift +52 -16
- 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 +10 -2
- package/Sources/SwiftUI/API/ViewModifier.swift +4 -1
- package/Sources/SwiftUI/API/VisualEffect.swift +74 -1
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +7 -1
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +17 -3
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Localization/Localization.swift +498 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +2 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +37 -1
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +76 -4
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +58 -12
- package/Sources/SwiftUI/Runtime/Reconciler.swift +10 -1
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +977 -198
- 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 +1 -1
- package/index.mjs +2 -2
- package/manifest.d.mts +2 -0
- package/manifest.mjs +39 -0
- package/package.json +5 -3
- package/sync-sources.mjs +21 -7
- package/Sources/FoundationLite/Common.swift +0 -3
- package/Sources/FoundationLite/FoundationLite.swift +0 -171
- package/Sources/FoundationLite/Interaction.swift +0 -146
- package/Sources/FoundationLite/Timer.swift +0 -48
- package/Sources/_FoundationCommon/_FoundationCommon.swift +0 -10
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
// Core ML as a stand-in for the models Create ML makes from tables: linear
|
|
2
|
+
// and logistic regressions, boosted trees and random forests, and the
|
|
3
|
+
// pipelines around them. @swiftbrowser/cli compiles each `.mlmodel` of the
|
|
4
|
+
// app's target into the class Xcode would generate, with the model's
|
|
5
|
+
// specification embedded (packages/cli/src/coreml.ts); `MLModel` evaluates it
|
|
6
|
+
// in Swift, so a prediction is a few multiplications, synchronous and exact.
|
|
7
|
+
// Models of other kinds (neural networks, ML programs, Vision and Natural
|
|
8
|
+
// Language models) are refused by the CLI, by name.
|
|
9
|
+
|
|
10
|
+
import Foundation
|
|
11
|
+
|
|
12
|
+
/// Where a model may run. Every value runs on the CPU here.
|
|
13
|
+
public enum MLComputeUnits: Int, Sendable {
|
|
14
|
+
case cpuOnly = 0
|
|
15
|
+
case cpuAndGPU = 1
|
|
16
|
+
case all = 2
|
|
17
|
+
case cpuAndNeuralEngine = 3
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public final class MLModelConfiguration: @unchecked Sendable {
|
|
21
|
+
public var computeUnits: MLComputeUnits = .all
|
|
22
|
+
public var allowLowPrecisionAccumulationOnGPU = false
|
|
23
|
+
public var modelDisplayName: String?
|
|
24
|
+
|
|
25
|
+
public init() {}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public final class MLPredictionOptions: @unchecked Sendable {
|
|
29
|
+
@available(*, deprecated, message: "Use MLModelConfiguration.computeUnits instead.")
|
|
30
|
+
public var usesCPUOnly = false
|
|
31
|
+
public var outputBackings: [String: Any] = [:]
|
|
32
|
+
|
|
33
|
+
public init() {}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/// Why loading or predicting failed. `code` matches Core ML's codes.
|
|
37
|
+
public struct MLModelError: Error, CustomStringConvertible, LocalizedError, Sendable {
|
|
38
|
+
public enum Code: Int, Sendable {
|
|
39
|
+
case generic = 0
|
|
40
|
+
case featureType = 1
|
|
41
|
+
case io = 3
|
|
42
|
+
case customLayer = 4
|
|
43
|
+
case customModel = 5
|
|
44
|
+
case update = 6
|
|
45
|
+
case parameters = 7
|
|
46
|
+
case modelDecryptionKeyFetch = 8
|
|
47
|
+
case modelDecryption = 9
|
|
48
|
+
case modelCollection = 10
|
|
49
|
+
case predictionCancelled = 11
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public let code: Code
|
|
53
|
+
public let message: String
|
|
54
|
+
|
|
55
|
+
public init(_ code: Code, _ message: String = "") {
|
|
56
|
+
self.code = code
|
|
57
|
+
self.message = message
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public static var generic: Code { .generic }
|
|
61
|
+
public static var featureType: Code { .featureType }
|
|
62
|
+
public static var io: Code { .io }
|
|
63
|
+
|
|
64
|
+
public var errorDescription: String? { message }
|
|
65
|
+
public var description: String { "MLModelError(\(code)): \(message)" }
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/// Keys of `MLModelDescription.metadata`.
|
|
69
|
+
public struct MLModelMetadataKey: RawRepresentable, Hashable, Sendable {
|
|
70
|
+
public let rawValue: String
|
|
71
|
+
public init(rawValue: String) { self.rawValue = rawValue }
|
|
72
|
+
|
|
73
|
+
public static let author = MLModelMetadataKey(rawValue: "MLModelAuthorKey")
|
|
74
|
+
public static let description = MLModelMetadataKey(rawValue: "MLModelDescriptionKey")
|
|
75
|
+
public static let versionString = MLModelMetadataKey(rawValue: "MLModelVersionStringKey")
|
|
76
|
+
public static let license = MLModelMetadataKey(rawValue: "MLModelLicenseKey")
|
|
77
|
+
/// The creator's own key-value pairs, a `[String: String]`.
|
|
78
|
+
public static let creatorDefinedKey = MLModelMetadataKey(rawValue: "MLModelCreatorDefinedKey")
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public final class MLMultiArrayConstraint: @unchecked Sendable {
|
|
82
|
+
public let shape: [NSNumber]
|
|
83
|
+
public let dataType: MLMultiArrayDataType
|
|
84
|
+
|
|
85
|
+
init(shape: [NSNumber], dataType: MLMultiArrayDataType) {
|
|
86
|
+
self.shape = shape
|
|
87
|
+
self.dataType = dataType
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
public final class MLDictionaryConstraint: @unchecked Sendable {
|
|
92
|
+
public let keyType: MLFeatureType
|
|
93
|
+
|
|
94
|
+
init(keyType: MLFeatureType) { self.keyType = keyType }
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/// One input or output of a model.
|
|
98
|
+
public final class MLFeatureDescription: @unchecked Sendable, CustomStringConvertible {
|
|
99
|
+
public let name: String
|
|
100
|
+
public let type: MLFeatureType
|
|
101
|
+
public let isOptional: Bool
|
|
102
|
+
public let multiArrayConstraint: MLMultiArrayConstraint?
|
|
103
|
+
public let dictionaryConstraint: MLDictionaryConstraint?
|
|
104
|
+
|
|
105
|
+
init(_ feature: Specification.Feature) {
|
|
106
|
+
name = feature.name
|
|
107
|
+
type = feature.featureType
|
|
108
|
+
isOptional = feature.isOptional
|
|
109
|
+
if type == .multiArray {
|
|
110
|
+
let dataType: MLMultiArrayDataType = switch feature.dataType {
|
|
111
|
+
case "float32": .float32
|
|
112
|
+
case "float16": .float16
|
|
113
|
+
case "int32": .int32
|
|
114
|
+
case "int8": .int8
|
|
115
|
+
default: .double
|
|
116
|
+
}
|
|
117
|
+
multiArrayConstraint = MLMultiArrayConstraint(shape: (feature.shape ?? []).map { NSNumber(value: $0) }, dataType: dataType)
|
|
118
|
+
} else {
|
|
119
|
+
multiArrayConstraint = nil
|
|
120
|
+
}
|
|
121
|
+
dictionaryConstraint = type == .dictionary ? MLDictionaryConstraint(keyType: feature.keyType == "int64" ? .int64 : .string) : nil
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/// Whether `value` can be given for this feature.
|
|
125
|
+
public func isAllowedValue(_ value: MLFeatureValue) -> Bool {
|
|
126
|
+
if value.isUndefined { return isOptional }
|
|
127
|
+
switch (type, value.type) {
|
|
128
|
+
case (.double, .int64), (.int64, .double): return true
|
|
129
|
+
default: return type == value.type
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
public var description: String { "\(name) : \(type)\(isOptional ? " (optional)" : "")" }
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/// What a model takes and returns, and who made it.
|
|
137
|
+
public final class MLModelDescription: @unchecked Sendable {
|
|
138
|
+
public let inputDescriptionsByName: [String: MLFeatureDescription]
|
|
139
|
+
public let outputDescriptionsByName: [String: MLFeatureDescription]
|
|
140
|
+
public let predictedFeatureName: String?
|
|
141
|
+
public let predictedProbabilitiesName: String?
|
|
142
|
+
public let metadata: [MLModelMetadataKey: Any]
|
|
143
|
+
/// A classifier's labels (`String`s or `Int64`s), else nil.
|
|
144
|
+
public let classLabels: [Any]?
|
|
145
|
+
|
|
146
|
+
init(_ specification: Specification) {
|
|
147
|
+
let description = specification.description
|
|
148
|
+
inputDescriptionsByName = Dictionary(description.inputs.map { ($0.name, MLFeatureDescription($0)) }, uniquingKeysWith: { first, _ in first })
|
|
149
|
+
outputDescriptionsByName = Dictionary(description.outputs.map { ($0.name, MLFeatureDescription($0)) }, uniquingKeysWith: { first, _ in first })
|
|
150
|
+
predictedFeatureName = description.predictedFeatureName
|
|
151
|
+
predictedProbabilitiesName = description.predictedProbabilitiesName
|
|
152
|
+
var metadata: [MLModelMetadataKey: Any] = [:]
|
|
153
|
+
if let given = description.metadata {
|
|
154
|
+
if let author = given.author { metadata[.author] = author }
|
|
155
|
+
if let text = given.shortDescription { metadata[.description] = text }
|
|
156
|
+
if let version = given.versionString { metadata[.versionString] = version }
|
|
157
|
+
if let license = given.license { metadata[.license] = license }
|
|
158
|
+
if let creatorDefined = given.creatorDefined { metadata[.creatorDefinedKey] = creatorDefined }
|
|
159
|
+
}
|
|
160
|
+
self.metadata = metadata
|
|
161
|
+
classLabels = MLModelDescription.labels(of: specification)?.anyValues
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/// The labels of a classifier, or of the classifier ending a pipeline.
|
|
165
|
+
private static func labels(of specification: Specification) -> Specification.Labels? {
|
|
166
|
+
switch specification.model {
|
|
167
|
+
case .glmClassifier(_, _, _, _, let labels), .treeEnsembleClassifier(_, let labels): labels
|
|
168
|
+
case .pipeline(let models): models.last.flatMap { labels(of: $0) }
|
|
169
|
+
default: nil
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/// A model compiled into the app by @swiftbrowser/cli, found by the name of
|
|
175
|
+
/// its `.mlmodelc`.
|
|
176
|
+
private final class CompiledModels: @unchecked Sendable {
|
|
177
|
+
private let lock = NSLock()
|
|
178
|
+
private var specifications: [String: String] = [:]
|
|
179
|
+
private var decoded: [String: Specification] = [:]
|
|
180
|
+
|
|
181
|
+
func register(_ name: String, json: String) {
|
|
182
|
+
lock.lock()
|
|
183
|
+
defer { lock.unlock() }
|
|
184
|
+
if specifications[name] == nil { specifications[name] = json }
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
func specification(named name: String) throws -> Specification? {
|
|
188
|
+
lock.lock()
|
|
189
|
+
defer { lock.unlock() }
|
|
190
|
+
if let cached = decoded[name] { return cached }
|
|
191
|
+
guard let json = specifications[name] else { return nil }
|
|
192
|
+
let specification = try Specification.decode(json)
|
|
193
|
+
decoded[name] = specification
|
|
194
|
+
return specification
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
private let compiledModels = CompiledModels()
|
|
199
|
+
|
|
200
|
+
open class MLModel: @unchecked Sendable {
|
|
201
|
+
public let modelDescription: MLModelDescription
|
|
202
|
+
public let configuration: MLModelConfiguration
|
|
203
|
+
let specification: Specification
|
|
204
|
+
|
|
205
|
+
init(specification: Specification, configuration: MLModelConfiguration) {
|
|
206
|
+
self.specification = specification
|
|
207
|
+
self.configuration = configuration
|
|
208
|
+
modelDescription = MLModelDescription(specification)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/// Loads a compiled model (`<Name>.mlmodelc`): one of the app's models,
|
|
212
|
+
/// which the CLI compiled into its generated class.
|
|
213
|
+
public convenience init(contentsOf url: URL) throws {
|
|
214
|
+
try self.init(contentsOf: url, configuration: MLModelConfiguration())
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
public convenience init(contentsOf url: URL, configuration: MLModelConfiguration) throws {
|
|
218
|
+
let name = url.deletingPathExtension().lastPathComponent
|
|
219
|
+
guard let specification = try compiledModels.specification(named: name) else {
|
|
220
|
+
throw MLModelError(.io, "No compiled model at \(url.path). In the browser, the models are the .mlmodel files of the app's target, compiled by @swiftbrowser/cli.")
|
|
221
|
+
}
|
|
222
|
+
self.init(specification: specification, configuration: configuration)
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/// The `.mlmodelc` URL of a generated model class (`urlOfModelInThisBundle`),
|
|
226
|
+
/// registering the model the CLI embedded in it.
|
|
227
|
+
public static func _compiledModelURL(named name: String, specification json: String) -> URL {
|
|
228
|
+
compiledModels.register(name, json: json)
|
|
229
|
+
return URL(fileURLWithPath: "/bundle").appendingPathComponent("\(name).mlmodelc", isDirectory: true)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
public class func load(contentsOf url: URL, configuration: MLModelConfiguration = MLModelConfiguration()) async throws -> MLModel {
|
|
233
|
+
try MLModel(contentsOf: url, configuration: configuration)
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
public class func load(contentsOf url: URL, configuration: MLModelConfiguration, completionHandler handler: @escaping (Result<MLModel, any Error>) -> Void) {
|
|
237
|
+
handler(Result(catching: { try MLModel(contentsOf: url, configuration: configuration) }))
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
open func prediction(from input: MLFeatureProvider) throws -> MLFeatureProvider {
|
|
241
|
+
try prediction(from: input, options: MLPredictionOptions())
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
open func prediction(from input: MLFeatureProvider, options: MLPredictionOptions) throws -> MLFeatureProvider {
|
|
245
|
+
try predict(input)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
public func prediction(from input: MLFeatureProvider, options: MLPredictionOptions = MLPredictionOptions()) async throws -> MLFeatureProvider {
|
|
249
|
+
try predict(input)
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
open func predictions(from inputs: MLBatchProvider, options: MLPredictionOptions = MLPredictionOptions()) throws -> MLBatchProvider {
|
|
253
|
+
MLArrayBatchProvider(array: try (0..<inputs.count).map { try predict(inputs.features(at: $0)) })
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/// Checks the inputs against the description, evaluates, and returns the declared outputs.
|
|
257
|
+
private func predict(_ input: MLFeatureProvider) throws -> MLFeatureProvider {
|
|
258
|
+
var values: [String: Value] = [:]
|
|
259
|
+
for feature in specification.description.inputs {
|
|
260
|
+
guard let value = input.featureValue(for: feature.name), !value.isUndefined else {
|
|
261
|
+
if feature.isOptional { continue }
|
|
262
|
+
throw MLModelError(.featureType, "Feature \(feature.name) is required but not specified.")
|
|
263
|
+
}
|
|
264
|
+
values[feature.name] = try Value(value).converted(to: feature)
|
|
265
|
+
}
|
|
266
|
+
let outputs = try specification.evaluate(values)
|
|
267
|
+
return try MLDictionaryFeatureProvider(dictionary: outputs.mapValues { $0.featureValue })
|
|
268
|
+
}
|
|
269
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// `MLMultiArray`, as far as tabular models need it: a shaped array of numbers
|
|
2
|
+
// (held as doubles whatever the data type) read and written by index.
|
|
3
|
+
|
|
4
|
+
import Foundation
|
|
5
|
+
|
|
6
|
+
/// The element type of a multiarray, with Core ML's raw values.
|
|
7
|
+
public enum MLMultiArrayDataType: Int, Sendable {
|
|
8
|
+
case double = 65600
|
|
9
|
+
case float32 = 65568
|
|
10
|
+
case float16 = 65552
|
|
11
|
+
case int32 = 131104
|
|
12
|
+
case int8 = 131080
|
|
13
|
+
|
|
14
|
+
public static var float64: MLMultiArrayDataType { .double }
|
|
15
|
+
public static var float: MLMultiArrayDataType { .float32 }
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public final class MLMultiArray: @unchecked Sendable, CustomStringConvertible {
|
|
19
|
+
public let shape: [NSNumber]
|
|
20
|
+
public let strides: [NSNumber]
|
|
21
|
+
public let dataType: MLMultiArrayDataType
|
|
22
|
+
/// The elements in row-major order.
|
|
23
|
+
var values: [Double]
|
|
24
|
+
|
|
25
|
+
public init(shape: [NSNumber], dataType: MLMultiArrayDataType) throws {
|
|
26
|
+
let dimensions = shape.map(\.intValue)
|
|
27
|
+
guard dimensions.allSatisfy({ $0 >= 0 }) else { throw MLModelError(.generic, "A multiarray's shape cannot be negative: \(dimensions).") }
|
|
28
|
+
self.shape = shape
|
|
29
|
+
self.dataType = dataType
|
|
30
|
+
strides = MLMultiArray.strides(of: dimensions).map { NSNumber(value: $0) }
|
|
31
|
+
values = Array(repeating: 0, count: dimensions.reduce(1, *))
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/// A one-dimensional array of `values`.
|
|
35
|
+
init(values: [Double], shape: [Int]? = nil, dataType: MLMultiArrayDataType = .double) {
|
|
36
|
+
let dimensions = shape ?? [values.count]
|
|
37
|
+
self.shape = dimensions.map { NSNumber(value: $0) }
|
|
38
|
+
self.dataType = dataType
|
|
39
|
+
strides = MLMultiArray.strides(of: dimensions).map { NSNumber(value: $0) }
|
|
40
|
+
self.values = values
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
private static func strides(of dimensions: [Int]) -> [Int] {
|
|
44
|
+
var strides = Array(repeating: 1, count: dimensions.count)
|
|
45
|
+
var stride = 1
|
|
46
|
+
for index in dimensions.indices.reversed() {
|
|
47
|
+
strides[index] = stride
|
|
48
|
+
stride *= dimensions[index]
|
|
49
|
+
}
|
|
50
|
+
return strides
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public var count: Int { values.count }
|
|
54
|
+
|
|
55
|
+
private func number(_ value: Double) -> NSNumber {
|
|
56
|
+
switch dataType {
|
|
57
|
+
case .int32, .int8: NSNumber(value: Int32(clamping: Int64(value)))
|
|
58
|
+
case .float32, .float16: NSNumber(value: Float(value))
|
|
59
|
+
case .double: NSNumber(value: value)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
private func stored(_ number: NSNumber) -> Double {
|
|
64
|
+
switch dataType {
|
|
65
|
+
case .int32: Double(number.int32Value)
|
|
66
|
+
case .int8: Double(number.int8Value)
|
|
67
|
+
case .float32, .float16: Double(number.floatValue)
|
|
68
|
+
case .double: number.doubleValue
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/// The element at a linear (row-major) index.
|
|
73
|
+
public subscript(index: Int) -> NSNumber {
|
|
74
|
+
get { number(values[index]) }
|
|
75
|
+
set { values[index] = stored(newValue) }
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/// The element at a multidimensional index.
|
|
79
|
+
public subscript(key: [NSNumber]) -> NSNumber {
|
|
80
|
+
get { self[linearIndex(key)] }
|
|
81
|
+
set { self[linearIndex(key)] = newValue }
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private func linearIndex(_ key: [NSNumber]) -> Int {
|
|
85
|
+
precondition(key.count == strides.count, "MLMultiArray: index \(key.map(\.intValue)) has \(key.count) dimensions; the array has \(strides.count)")
|
|
86
|
+
return zip(key, strides).reduce(0) { $0 + $1.0.intValue * $1.1.intValue }
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public var description: String {
|
|
90
|
+
"MLMultiArray(shape: \(shape.map(\.intValue)), \(values))"
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
// The model specification @swiftbrowser/cli embeds in each generated model
|
|
2
|
+
// class (packages/cli/src/coreml.ts): Core ML's protobuf, read when the app is
|
|
3
|
+
// built and written as JSON, decoded here once per model. The shapes mirror
|
|
4
|
+
// Model.proto in apple/coremltools; trees come resolved (root first, children
|
|
5
|
+
// as positions) and checked by the CLI.
|
|
6
|
+
|
|
7
|
+
import Foundation
|
|
8
|
+
|
|
9
|
+
struct Specification: Decodable {
|
|
10
|
+
var specificationVersion: Int
|
|
11
|
+
var description: Description
|
|
12
|
+
var model: Kind
|
|
13
|
+
|
|
14
|
+
struct Description: Decodable {
|
|
15
|
+
var inputs: [Feature]
|
|
16
|
+
var outputs: [Feature]
|
|
17
|
+
var predictedFeatureName: String?
|
|
18
|
+
var predictedProbabilitiesName: String?
|
|
19
|
+
var metadata: Metadata?
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
struct Metadata: Decodable {
|
|
23
|
+
var shortDescription: String?
|
|
24
|
+
var versionString: String?
|
|
25
|
+
var author: String?
|
|
26
|
+
var license: String?
|
|
27
|
+
var creatorDefined: [String: String]?
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
struct Feature: Decodable {
|
|
31
|
+
var name: String
|
|
32
|
+
var type: String
|
|
33
|
+
var optional: Bool?
|
|
34
|
+
var shape: [Int]?
|
|
35
|
+
var dataType: String?
|
|
36
|
+
var keyType: String?
|
|
37
|
+
|
|
38
|
+
var featureType: MLFeatureType {
|
|
39
|
+
switch type {
|
|
40
|
+
case "int64": .int64
|
|
41
|
+
case "double": .double
|
|
42
|
+
case "string": .string
|
|
43
|
+
case "multiArray": .multiArray
|
|
44
|
+
case "dictionary": .dictionary
|
|
45
|
+
default: .invalid
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
var isOptional: Bool { optional ?? false }
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/// Class labels, or the categories of an encoder: strings or integers.
|
|
53
|
+
enum Labels: Decodable {
|
|
54
|
+
case strings([String])
|
|
55
|
+
case int64s([Int64])
|
|
56
|
+
|
|
57
|
+
private enum CodingKeys: String, CodingKey { case strings, int64s }
|
|
58
|
+
|
|
59
|
+
init(from decoder: Decoder) throws {
|
|
60
|
+
let container = try decoder.container(keyedBy: CodingKeys.self)
|
|
61
|
+
if let strings = try container.decodeIfPresent([String].self, forKey: .strings) {
|
|
62
|
+
self = .strings(strings)
|
|
63
|
+
} else {
|
|
64
|
+
self = .int64s(try container.decode([Int64].self, forKey: .int64s))
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
var count: Int {
|
|
69
|
+
switch self {
|
|
70
|
+
case .strings(let labels): labels.count
|
|
71
|
+
case .int64s(let labels): labels.count
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
func value(at index: Int) -> Value {
|
|
76
|
+
switch self {
|
|
77
|
+
case .strings(let labels): .string(labels[index])
|
|
78
|
+
case .int64s(let labels): .int64(labels[index])
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/// The position of a string or integer value among the labels.
|
|
83
|
+
func index(of value: Value) -> Int? {
|
|
84
|
+
switch (self, value) {
|
|
85
|
+
case (.strings(let labels), .string(let string)): labels.firstIndex(of: string)
|
|
86
|
+
case (.int64s(let labels), .int64(let integer)): labels.firstIndex(of: integer)
|
|
87
|
+
case (.int64s(let labels), .double(let double)): Int64(exactly: double).flatMap { labels.firstIndex(of: $0) }
|
|
88
|
+
default: nil
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
var anyValues: [Any] {
|
|
93
|
+
switch self {
|
|
94
|
+
case .strings(let labels): labels
|
|
95
|
+
case .int64s(let labels): labels
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
struct Tree: Decodable {
|
|
101
|
+
/// TreeNodeBehavior: 0 ≤, 1 <, 2 ≥, 3 >, 4 ==, 5 ≠ (branches), 6 leaf.
|
|
102
|
+
var behaviors: [Int]
|
|
103
|
+
var features: [Int]
|
|
104
|
+
var thresholds: [Double]
|
|
105
|
+
var trueChildren: [Int]
|
|
106
|
+
var falseChildren: [Int]
|
|
107
|
+
var missingTrue: [Bool]
|
|
108
|
+
var leafStarts: [Int]
|
|
109
|
+
var leafIndices: [Int]
|
|
110
|
+
var leafValues: [Double]
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
struct TreeEnsemble: Decodable {
|
|
114
|
+
var dimensions: Int
|
|
115
|
+
var base: [Double]
|
|
116
|
+
var trees: [Tree]
|
|
117
|
+
/// "none", "softmax", "logistic" or "softmaxWithZeroClassReference".
|
|
118
|
+
var transform: String
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
struct Imputed: Decodable {
|
|
122
|
+
var double: Double?
|
|
123
|
+
var int64: Int64?
|
|
124
|
+
var string: String?
|
|
125
|
+
var doubles: [Double]?
|
|
126
|
+
var int64s: [Int64]?
|
|
127
|
+
var stringDictionary: [String: Double]?
|
|
128
|
+
/// Keys in decimal.
|
|
129
|
+
var int64Dictionary: [String: Double]?
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
struct Replace: Decodable {
|
|
133
|
+
var double: Double?
|
|
134
|
+
var int64: Int64?
|
|
135
|
+
var string: String?
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
struct CategoricalMapping: Decodable {
|
|
139
|
+
var stringToInt64: [String: Int64]?
|
|
140
|
+
/// Keys in decimal.
|
|
141
|
+
var int64ToString: [String: String]?
|
|
142
|
+
var defaultString: String?
|
|
143
|
+
var defaultInt64: Int64?
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
struct Column: Decodable {
|
|
147
|
+
var name: String
|
|
148
|
+
var dimensions: Int
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
indirect enum Kind: Decodable {
|
|
152
|
+
case pipeline([Specification])
|
|
153
|
+
case glmRegressor(weights: [[Double]], offsets: [Double], transform: String)
|
|
154
|
+
case glmClassifier(weights: [[Double]], offsets: [Double], transform: String, encoding: String, labels: Labels)
|
|
155
|
+
case treeEnsembleRegressor(TreeEnsemble)
|
|
156
|
+
case treeEnsembleClassifier(TreeEnsemble, labels: Labels)
|
|
157
|
+
case featureVectorizer([Column])
|
|
158
|
+
case oneHotEncoder(categories: Labels, sparse: Bool, ignoreUnknown: Bool)
|
|
159
|
+
case normalizer(String)
|
|
160
|
+
case imputer(Imputed, replace: Replace?)
|
|
161
|
+
case scaler(shift: [Double], scale: [Double])
|
|
162
|
+
case dictVectorizer(Labels)
|
|
163
|
+
case arrayFeatureExtractor([Int])
|
|
164
|
+
case categoricalMapping(CategoricalMapping)
|
|
165
|
+
case identity
|
|
166
|
+
|
|
167
|
+
private enum CodingKeys: String, CodingKey {
|
|
168
|
+
case kind, models, weights, offsets, transform, encoding, labels, columns, categories, sparse, ignoreUnknown
|
|
169
|
+
case norm, imputed, replace, shift, scale, keys, indices
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
init(from decoder: Decoder) throws {
|
|
173
|
+
let container = try decoder.container(keyedBy: CodingKeys.self)
|
|
174
|
+
let kind = try container.decode(String.self, forKey: .kind)
|
|
175
|
+
switch kind {
|
|
176
|
+
case "pipeline", "pipelineClassifier", "pipelineRegressor":
|
|
177
|
+
self = .pipeline(try container.decode([Specification].self, forKey: .models))
|
|
178
|
+
case "glmRegressor":
|
|
179
|
+
self = .glmRegressor(
|
|
180
|
+
weights: try container.decode([[Double]].self, forKey: .weights),
|
|
181
|
+
offsets: try container.decode([Double].self, forKey: .offsets),
|
|
182
|
+
transform: try container.decode(String.self, forKey: .transform))
|
|
183
|
+
case "glmClassifier":
|
|
184
|
+
self = .glmClassifier(
|
|
185
|
+
weights: try container.decode([[Double]].self, forKey: .weights),
|
|
186
|
+
offsets: try container.decode([Double].self, forKey: .offsets),
|
|
187
|
+
transform: try container.decode(String.self, forKey: .transform),
|
|
188
|
+
encoding: try container.decode(String.self, forKey: .encoding),
|
|
189
|
+
labels: try container.decode(Labels.self, forKey: .labels))
|
|
190
|
+
case "treeEnsembleRegressor":
|
|
191
|
+
self = .treeEnsembleRegressor(try TreeEnsemble(from: decoder))
|
|
192
|
+
case "treeEnsembleClassifier":
|
|
193
|
+
self = .treeEnsembleClassifier(try TreeEnsemble(from: decoder), labels: try container.decode(Labels.self, forKey: .labels))
|
|
194
|
+
case "featureVectorizer":
|
|
195
|
+
self = .featureVectorizer(try container.decode([Column].self, forKey: .columns))
|
|
196
|
+
case "oneHotEncoder":
|
|
197
|
+
self = .oneHotEncoder(
|
|
198
|
+
categories: try container.decode(Labels.self, forKey: .categories),
|
|
199
|
+
sparse: try container.decode(Bool.self, forKey: .sparse),
|
|
200
|
+
ignoreUnknown: try container.decode(Bool.self, forKey: .ignoreUnknown))
|
|
201
|
+
case "normalizer":
|
|
202
|
+
self = .normalizer(try container.decode(String.self, forKey: .norm))
|
|
203
|
+
case "imputer":
|
|
204
|
+
self = .imputer(try container.decode(Imputed.self, forKey: .imputed), replace: try container.decodeIfPresent(Replace.self, forKey: .replace))
|
|
205
|
+
case "scaler":
|
|
206
|
+
self = .scaler(shift: try container.decode([Double].self, forKey: .shift), scale: try container.decode([Double].self, forKey: .scale))
|
|
207
|
+
case "dictVectorizer":
|
|
208
|
+
self = .dictVectorizer(try container.decode(Labels.self, forKey: .keys))
|
|
209
|
+
case "arrayFeatureExtractor":
|
|
210
|
+
self = .arrayFeatureExtractor(try container.decode([Int].self, forKey: .indices))
|
|
211
|
+
case "categoricalMapping":
|
|
212
|
+
self = .categoricalMapping(try CategoricalMapping(from: decoder))
|
|
213
|
+
case "identity":
|
|
214
|
+
self = .identity
|
|
215
|
+
default:
|
|
216
|
+
throw MLModelError(.io, "Unknown model type \(kind) in the model specification.")
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/// Decodes the JSON the CLI wrote.
|
|
222
|
+
static func decode(_ json: String) throws -> Specification {
|
|
223
|
+
let decoder = JSONDecoder()
|
|
224
|
+
decoder.nonConformingFloatDecodingStrategy = .convertFromString(positiveInfinity: "inf", negativeInfinity: "-inf", nan: "nan")
|
|
225
|
+
do {
|
|
226
|
+
return try decoder.decode(Specification.self, from: Data(json.utf8))
|
|
227
|
+
} catch let error as MLModelError {
|
|
228
|
+
throw error
|
|
229
|
+
} catch {
|
|
230
|
+
throw MLModelError(.io, "The model specification could not be read: \(error)")
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// `import CoreText` for the browser: the font manager's registration, which
|
|
2
|
+
// packages call for the fonts they ship (`CTFontManagerRegisterFontsForURL`).
|
|
3
|
+
// The page lays out text with the browser's fonts and loads none of these, so
|
|
4
|
+
// registering a font that exists succeeds and changes nothing; a missing file
|
|
5
|
+
// fails with `kCTFontManagerErrorFontFileNotFound`, as on Apple platforms.
|
|
6
|
+
// The rest of Core Text (fonts, lines, frames) is not here.
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
@_exported import CoreFoundationTypes
|
|
10
|
+
|
|
11
|
+
/// Where a registration applies. The page has one process; every scope is it.
|
|
12
|
+
public enum CTFontManagerScope: UInt32, Sendable {
|
|
13
|
+
case none = 0
|
|
14
|
+
case process = 1
|
|
15
|
+
case persistent = 2
|
|
16
|
+
case session = 3
|
|
17
|
+
|
|
18
|
+
public static let user = CTFontManagerScope.persistent
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/// The font manager's error codes, in `kCTFontManagerErrorDomain`.
|
|
22
|
+
public enum CTFontManagerError: CFIndex, Sendable {
|
|
23
|
+
case fileNotFound = 101
|
|
24
|
+
case insufficientPermissions = 102
|
|
25
|
+
case unrecognizedFormat = 103
|
|
26
|
+
case invalidFontData = 104
|
|
27
|
+
case alreadyRegistered = 105
|
|
28
|
+
case exceededResourceLimit = 106
|
|
29
|
+
case assetNotFound = 107
|
|
30
|
+
case notRegistered = 201
|
|
31
|
+
case inUse = 202
|
|
32
|
+
case systemRequired = 203
|
|
33
|
+
case registrationFailed = 301
|
|
34
|
+
case missingEntitlement = 302
|
|
35
|
+
case insufficientInfo = 303
|
|
36
|
+
case cancelledByUser = 304
|
|
37
|
+
case duplicatedName = 305
|
|
38
|
+
case invalidFilePath = 306
|
|
39
|
+
case unsupportedScope = 307
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public let kCTFontManagerErrorDomain: CFString = "com.apple.CoreText.CTFontManagerErrorDomain"
|
|
43
|
+
public let kCTFontManagerErrorFontFileNotFound = CTFontManagerError.fileNotFound.rawValue
|
|
44
|
+
|
|
45
|
+
/// Registers the fonts in the file at `fontURL`: true when the file exists
|
|
46
|
+
/// (the page does not load it), else false with a `fileNotFound` error.
|
|
47
|
+
@discardableResult
|
|
48
|
+
public func CTFontManagerRegisterFontsForURL(_ fontURL: CFURL, _ scope: CTFontManagerScope, _ error: UnsafeMutablePointer<Unmanaged<CFError>?>?) -> Bool {
|
|
49
|
+
_fontFileResult(fontURL, error)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/// Unregisters the fonts in the file at `fontURL`: true when the file exists.
|
|
53
|
+
@discardableResult
|
|
54
|
+
public func CTFontManagerUnregisterFontsForURL(_ fontURL: CFURL, _ scope: CTFontManagerScope, _ error: UnsafeMutablePointer<Unmanaged<CFError>?>?) -> Bool {
|
|
55
|
+
_fontFileResult(fontURL, error)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
func _fontFileResult(_ fontURL: URL, _ error: UnsafeMutablePointer<Unmanaged<CFError>?>?) -> Bool {
|
|
59
|
+
if fontURL.isFileURL, FileManager.default.fileExists(atPath: fontURL.path) { return true }
|
|
60
|
+
let failure = NSError(domain: kCTFontManagerErrorDomain, code: CTFontManagerError.fileNotFound.rawValue,
|
|
61
|
+
userInfo: [NSURLErrorKey: fontURL])
|
|
62
|
+
error?.pointee = Unmanaged.passRetained(failure)
|
|
63
|
+
return false
|
|
64
|
+
}
|