@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,99 @@
|
|
|
1
|
+
// Swift Charts' `Plottable` and `PlottableValue`. The shim reduces every
|
|
2
|
+
// plottable value to `_PlottableValue`, a number, a string or a date (seconds
|
|
3
|
+
// since 1970, UTC), so the chart can scale it without knowing the type.
|
|
4
|
+
// `Date` conforms in the `Charts` target, which links Foundation.
|
|
5
|
+
|
|
6
|
+
/// The primitive a chart scales: numbers and dates are continuous, strings
|
|
7
|
+
/// are categories.
|
|
8
|
+
public enum _PlottableValue: Hashable, Sendable {
|
|
9
|
+
case number(Double)
|
|
10
|
+
case string(String)
|
|
11
|
+
/// Seconds since 1970 (UTC).
|
|
12
|
+
case date(Double)
|
|
13
|
+
|
|
14
|
+
/// The position on a continuous scale, if any.
|
|
15
|
+
var continuous: Double? {
|
|
16
|
+
switch self {
|
|
17
|
+
case .number(let v): v
|
|
18
|
+
case .date(let v): v
|
|
19
|
+
case .string: nil
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
var isDate: Bool { if case .date = self { true } else { false } }
|
|
24
|
+
var isString: Bool { if case .string = self { true } else { false } }
|
|
25
|
+
|
|
26
|
+
/// A plain text form (categories as themselves, numbers formatted).
|
|
27
|
+
var text: String {
|
|
28
|
+
switch self {
|
|
29
|
+
case .number(let v): _formatChartNumber(v)
|
|
30
|
+
case .string(let s): s
|
|
31
|
+
case .date(let s): _formatChartDate(s, as: .dayMonth)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/// A type a chart can place on an axis.
|
|
37
|
+
public protocol Plottable {
|
|
38
|
+
var _plottableValue: _PlottableValue { get }
|
|
39
|
+
init?(_plottableValue: _PlottableValue)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
extension Double: Plottable {
|
|
43
|
+
public var _plottableValue: _PlottableValue { .number(self) }
|
|
44
|
+
public init?(_plottableValue value: _PlottableValue) {
|
|
45
|
+
guard case .number(let v) = value else { return nil }
|
|
46
|
+
self = v
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
extension Float: Plottable {
|
|
51
|
+
public var _plottableValue: _PlottableValue { .number(Double(self)) }
|
|
52
|
+
public init?(_plottableValue value: _PlottableValue) {
|
|
53
|
+
guard case .number(let v) = value else { return nil }
|
|
54
|
+
self = Float(v)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
extension Int: Plottable {
|
|
59
|
+
public var _plottableValue: _PlottableValue { .number(Double(self)) }
|
|
60
|
+
public init?(_plottableValue value: _PlottableValue) {
|
|
61
|
+
guard case .number(let v) = value, v.isFinite, abs(v) < 9e15 else { return nil }
|
|
62
|
+
self = Int(v.rounded())
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
extension String: Plottable {
|
|
67
|
+
public var _plottableValue: _PlottableValue { .string(self) }
|
|
68
|
+
public init?(_plottableValue value: _PlottableValue) {
|
|
69
|
+
guard case .string(let s) = value else { return nil }
|
|
70
|
+
self = s
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/// A labelled value for a mark's dimension: `.value("Sales", sale.sales)`.
|
|
75
|
+
public struct PlottableValue<Value: Plottable> {
|
|
76
|
+
public let label: String
|
|
77
|
+
public let value: Value
|
|
78
|
+
|
|
79
|
+
init(label: String, value: Value) {
|
|
80
|
+
self.label = label
|
|
81
|
+
self.value = value
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
public static func value(_ labelKey: LocalizedStringKey, _ value: Value) -> PlottableValue<Value> {
|
|
85
|
+
PlottableValue(label: labelKey.key, value: value)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
public static func value<S: StringProtocol>(_ label: S, _ value: Value) -> PlottableValue<Value> {
|
|
89
|
+
PlottableValue(label: String(label), value: value)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
var _erased: _LabelledValue { _LabelledValue(label: label, value: value._plottableValue) }
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/// A `PlottableValue` without its type.
|
|
96
|
+
struct _LabelledValue: Hashable {
|
|
97
|
+
var label: String
|
|
98
|
+
var value: _PlottableValue
|
|
99
|
+
}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
// Scale domains, "nice" tick generation for numbers and dates, and the
|
|
2
|
+
// default label formats. No Foundation: dates are UTC epoch seconds and the
|
|
3
|
+
// calendar arithmetic is done here (Howard Hinnant's civil date algorithms).
|
|
4
|
+
|
|
5
|
+
// MARK: - ScaleDomain
|
|
6
|
+
|
|
7
|
+
/// The domain of a chart scale: `.automatic(includesZero:)`, a closed range or
|
|
8
|
+
/// an array of categories / values.
|
|
9
|
+
public protocol ScaleDomain {
|
|
10
|
+
var _domainSpec: _ScaleDomainSpec { get }
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public enum _ScaleDomainSpec: Equatable, Sendable {
|
|
14
|
+
case automatic(includesZero: Bool?, reversed: Bool)
|
|
15
|
+
case values([_PlottableValue])
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public struct AutomaticScaleDomain: ScaleDomain, Sendable {
|
|
19
|
+
let includesZero: Bool?
|
|
20
|
+
let reversed: Bool
|
|
21
|
+
|
|
22
|
+
public var _domainSpec: _ScaleDomainSpec { .automatic(includesZero: includesZero, reversed: reversed) }
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
extension ScaleDomain where Self == AutomaticScaleDomain {
|
|
26
|
+
public static var automatic: AutomaticScaleDomain { AutomaticScaleDomain(includesZero: nil, reversed: false) }
|
|
27
|
+
|
|
28
|
+
public static func automatic(includesZero: Bool? = nil, reversed: Bool? = nil) -> AutomaticScaleDomain {
|
|
29
|
+
AutomaticScaleDomain(includesZero: includesZero, reversed: reversed ?? false)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
extension ClosedRange: ScaleDomain where Bound: Plottable {
|
|
34
|
+
public var _domainSpec: _ScaleDomainSpec {
|
|
35
|
+
.values([lowerBound._plottableValue, upperBound._plottableValue])
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
extension Array: ScaleDomain where Element: Plottable {
|
|
40
|
+
public var _domainSpec: _ScaleDomainSpec { .values(map(\._plottableValue)) }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// MARK: - Nice numbers
|
|
44
|
+
|
|
45
|
+
/// Tick spacing options from `AxisMarks(values: .automatic(...))`.
|
|
46
|
+
struct _TickOptions: Equatable {
|
|
47
|
+
var desiredCount: Int?
|
|
48
|
+
var minimumStride: Double?
|
|
49
|
+
var roundLowerBound = true
|
|
50
|
+
var roundUpperBound = true
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/// A "nice" step for a range: 1, 2, 2.5, 5 or 10 × 10^k, whichever is
|
|
54
|
+
/// nearest (geometrically) to `span / (desiredCount − 1)`; about 5 ticks by
|
|
55
|
+
/// default.
|
|
56
|
+
func _niceStep(span: Double, desiredCount: Int?, minimumStride: Double?) -> Double {
|
|
57
|
+
let count = max(1, (desiredCount ?? 5) - 1)
|
|
58
|
+
guard span > 0, span.isFinite else { return max(minimumStride ?? 1, 1) }
|
|
59
|
+
let raw = span / Double(count)
|
|
60
|
+
var magnitude = 1.0
|
|
61
|
+
while magnitude * 10 <= raw { magnitude *= 10 }
|
|
62
|
+
while magnitude > raw { magnitude /= 10 }
|
|
63
|
+
let residual = raw / magnitude
|
|
64
|
+
// Thresholds are the geometric means of neighbouring candidates.
|
|
65
|
+
let factor: Double = if residual >= 7.0710678 { 10 }
|
|
66
|
+
else if residual >= 3.5355339 { 5 }
|
|
67
|
+
else if residual >= 2.2360680 { 2.5 }
|
|
68
|
+
else if residual >= 1.4142136 { 2 }
|
|
69
|
+
else { 1 }
|
|
70
|
+
var step = factor * magnitude
|
|
71
|
+
if let minimumStride, step < minimumStride {
|
|
72
|
+
// Honor the minimum: the smallest nice multiple of the magnitude at or above it.
|
|
73
|
+
var s = minimumStride
|
|
74
|
+
var m = 1.0
|
|
75
|
+
while m * 10 <= s { m *= 10 }
|
|
76
|
+
while m > s { m /= 10 }
|
|
77
|
+
for candidate in [1.0, 2.0, 2.5, 5.0, 10.0] where candidate * m >= s - 1e-9 {
|
|
78
|
+
s = candidate * m
|
|
79
|
+
break
|
|
80
|
+
}
|
|
81
|
+
step = s
|
|
82
|
+
}
|
|
83
|
+
return step
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/// Rounds away floating noise so `0.30000000000000004` prints as `0.3`.
|
|
87
|
+
func _cleanTick(_ value: Double, step: Double) -> Double {
|
|
88
|
+
var scale = 1.0
|
|
89
|
+
var s = step
|
|
90
|
+
while s < 1, scale < 1e9 { s *= 10; scale *= 10 }
|
|
91
|
+
return (value * scale).rounded() / scale
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/// Nice ticks over `lower...upper`. The ticks always cover the domain
|
|
95
|
+
/// (first ≤ lower, last ≥ upper); the caller decides whether to extend the
|
|
96
|
+
/// domain to them or drop the ones outside.
|
|
97
|
+
func _niceTicks(lower: Double, upper: Double, options: _TickOptions) -> [Double] {
|
|
98
|
+
let step = _niceStep(span: upper - lower, desiredCount: options.desiredCount, minimumStride: options.minimumStride)
|
|
99
|
+
let first = (lower / step).rounded(.down) * step
|
|
100
|
+
let last = (upper / step).rounded(.up) * step
|
|
101
|
+
var ticks: [Double] = []
|
|
102
|
+
var tick = first
|
|
103
|
+
var guardCount = 0
|
|
104
|
+
while tick <= last + step * 1e-9, guardCount < 1000 {
|
|
105
|
+
ticks.append(_cleanTick(tick, step: step))
|
|
106
|
+
tick += step
|
|
107
|
+
guardCount += 1
|
|
108
|
+
}
|
|
109
|
+
return ticks
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// MARK: - Civil dates (UTC)
|
|
113
|
+
|
|
114
|
+
struct _CivilDate: Equatable {
|
|
115
|
+
var year: Int
|
|
116
|
+
var month: Int
|
|
117
|
+
var day: Int
|
|
118
|
+
var hour: Int
|
|
119
|
+
var minute: Int
|
|
120
|
+
var second: Int
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
let _secondsPerDay = 86400.0
|
|
124
|
+
|
|
125
|
+
/// Days since 1970-01-01 for a civil date (Hinnant's `days_from_civil`).
|
|
126
|
+
func _daysFromCivil(year: Int, month: Int, day: Int) -> Int {
|
|
127
|
+
let y = month <= 2 ? year - 1 : year
|
|
128
|
+
let era = (y >= 0 ? y : y - 399) / 400
|
|
129
|
+
let yoe = y - era * 400
|
|
130
|
+
let mp = (month + 9) % 12
|
|
131
|
+
let doy = (153 * mp + 2) / 5 + day - 1
|
|
132
|
+
let doe = yoe * 365 + yoe / 4 - yoe / 100 + doy
|
|
133
|
+
return era * 146097 + doe - 719468
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/// The civil date of a day count since 1970-01-01 (Hinnant's `civil_from_days`).
|
|
137
|
+
func _civilFromDays(_ days: Int) -> (year: Int, month: Int, day: Int) {
|
|
138
|
+
let z = days + 719468
|
|
139
|
+
let era = (z >= 0 ? z : z - 146096) / 146097
|
|
140
|
+
let doe = z - era * 146097
|
|
141
|
+
let yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365
|
|
142
|
+
let y = yoe + era * 400
|
|
143
|
+
let doy = doe - (365 * yoe + yoe / 4 - yoe / 100)
|
|
144
|
+
let mp = (5 * doy + 2) / 153
|
|
145
|
+
let d = doy - (153 * mp + 2) / 5 + 1
|
|
146
|
+
let m = mp < 10 ? mp + 3 : mp - 9
|
|
147
|
+
return (m <= 2 ? y + 1 : y, m, d)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
func _civil(fromSeconds seconds: Double) -> _CivilDate {
|
|
151
|
+
let days = Int((seconds / _secondsPerDay).rounded(.down))
|
|
152
|
+
var rest = Int((seconds - Double(days) * _secondsPerDay).rounded(.down))
|
|
153
|
+
rest = max(0, min(86399, rest))
|
|
154
|
+
let (y, m, d) = _civilFromDays(days)
|
|
155
|
+
return _CivilDate(year: y, month: m, day: d, hour: rest / 3600, minute: (rest % 3600) / 60, second: rest % 60)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
func _seconds(year: Int, month: Int, day: Int, hour: Int = 0) -> Double {
|
|
159
|
+
Double(_daysFromCivil(year: year, month: month, day: day)) * _secondsPerDay + Double(hour) * 3600
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// MARK: - Date ticks
|
|
163
|
+
|
|
164
|
+
/// The calendar unit a date axis labels in.
|
|
165
|
+
enum _DateUnit: Equatable {
|
|
166
|
+
case hour, day, month, year
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
enum _DateFormat: Equatable {
|
|
170
|
+
/// "9 AM", "12 PM"
|
|
171
|
+
case hour
|
|
172
|
+
/// "Sep 30"
|
|
173
|
+
case dayMonth
|
|
174
|
+
/// "Jan"
|
|
175
|
+
case month
|
|
176
|
+
/// "Jan 2026"
|
|
177
|
+
case monthYear
|
|
178
|
+
/// "2026"
|
|
179
|
+
case year
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
let _monthAbbreviations = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
|
|
183
|
+
|
|
184
|
+
func _formatChartDate(_ seconds: Double, as format: _DateFormat) -> String {
|
|
185
|
+
let c = _civil(fromSeconds: seconds)
|
|
186
|
+
switch format {
|
|
187
|
+
case .hour:
|
|
188
|
+
let h12 = c.hour % 12 == 0 ? 12 : c.hour % 12
|
|
189
|
+
let suffix = c.hour < 12 ? "AM" : "PM"
|
|
190
|
+
if c.minute != 0 {
|
|
191
|
+
let minute = c.minute < 10 ? "0\(c.minute)" : "\(c.minute)"
|
|
192
|
+
return "\(h12):\(minute) \(suffix)"
|
|
193
|
+
}
|
|
194
|
+
return "\(h12) \(suffix)"
|
|
195
|
+
case .dayMonth:
|
|
196
|
+
return "\(_monthAbbreviations[c.month - 1]) \(c.day)"
|
|
197
|
+
case .month:
|
|
198
|
+
return _monthAbbreviations[c.month - 1]
|
|
199
|
+
case .monthYear:
|
|
200
|
+
return "\(_monthAbbreviations[c.month - 1]) \(c.year)"
|
|
201
|
+
case .year:
|
|
202
|
+
return "\(c.year)"
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/// The ticks of a date axis: a unit and stride chosen for the span (hours
|
|
207
|
+
/// for up to three days, days for up to about 45, then months and years),
|
|
208
|
+
/// aligned to calendar boundaries and covering `lower...upper`.
|
|
209
|
+
func _niceDateTicks(lower: Double, upper: Double, options: _TickOptions) -> (ticks: [Double], format: _DateFormat) {
|
|
210
|
+
let span = max(upper - lower, 0)
|
|
211
|
+
let maxIntervals = Double(max(2, (options.desiredCount ?? 7) + 1))
|
|
212
|
+
func fits(_ strideSeconds: Double) -> Bool { span / strideSeconds <= maxIntervals }
|
|
213
|
+
|
|
214
|
+
if span <= 3 * _secondsPerDay {
|
|
215
|
+
let hours = [1.0, 3, 6, 12].first { fits($0 * 3600) } ?? 12
|
|
216
|
+
let step = hours * 3600
|
|
217
|
+
var ticks: [Double] = []
|
|
218
|
+
var tick = (lower / step).rounded(.down) * step
|
|
219
|
+
let last = (upper / step).rounded(.up) * step
|
|
220
|
+
while tick <= last + 1e-6, ticks.count < 1000 {
|
|
221
|
+
ticks.append(tick)
|
|
222
|
+
tick += step
|
|
223
|
+
}
|
|
224
|
+
return (ticks, .hour)
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if span <= 45 * _secondsPerDay {
|
|
228
|
+
let days = [1.0, 2, 7, 14].first { fits($0 * _secondsPerDay) } ?? 14
|
|
229
|
+
let step = days * _secondsPerDay
|
|
230
|
+
var ticks: [Double] = []
|
|
231
|
+
var tick = (lower / _secondsPerDay).rounded(.down) * _secondsPerDay
|
|
232
|
+
let last = (upper / _secondsPerDay).rounded(.up) * _secondsPerDay
|
|
233
|
+
while tick <= last + 1e-6, ticks.count < 1000 {
|
|
234
|
+
ticks.append(tick)
|
|
235
|
+
tick += step
|
|
236
|
+
}
|
|
237
|
+
// Make sure the last tick covers the upper bound.
|
|
238
|
+
if let final = ticks.last, final < last { ticks.append(final + step) }
|
|
239
|
+
return (ticks, .dayMonth)
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Months and years: strides in months.
|
|
243
|
+
let lowerCivil = _civil(fromSeconds: lower)
|
|
244
|
+
let upperCivil = _civil(fromSeconds: upper)
|
|
245
|
+
let spanMonths = Double((upperCivil.year - lowerCivil.year) * 12 + (upperCivil.month - lowerCivil.month) + 1)
|
|
246
|
+
let monthStrides = [1, 2, 3, 6, 12, 24, 60, 120]
|
|
247
|
+
let stride = monthStrides.first { spanMonths / Double($0) <= maxIntervals } ?? 120
|
|
248
|
+
var ticks: [Double] = []
|
|
249
|
+
var year = lowerCivil.year
|
|
250
|
+
var month = lowerCivil.month
|
|
251
|
+
if stride >= 12 {
|
|
252
|
+
month = 1
|
|
253
|
+
let yearsStride = stride / 12
|
|
254
|
+
year = (year / yearsStride) * yearsStride
|
|
255
|
+
} else {
|
|
256
|
+
month = ((month - 1) / stride) * stride + 1
|
|
257
|
+
}
|
|
258
|
+
var crossesYear = false
|
|
259
|
+
while ticks.count < 1000 {
|
|
260
|
+
let tick = _seconds(year: year, month: month, day: 1)
|
|
261
|
+
ticks.append(tick)
|
|
262
|
+
if year != lowerCivil.year { crossesYear = true }
|
|
263
|
+
if tick >= upper { break }
|
|
264
|
+
month += stride
|
|
265
|
+
while month > 12 { month -= 12; year += 1 }
|
|
266
|
+
}
|
|
267
|
+
if stride >= 12 { return (ticks, .year) }
|
|
268
|
+
return (ticks, crossesYear || lowerCivil.year != upperCivil.year ? .monthYear : .month)
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/// The format for explicit date values: hours when any value is not at
|
|
272
|
+
/// midnight, days when any is not a month start, else months.
|
|
273
|
+
func _dateFormat(forValues values: [Double]) -> _DateFormat {
|
|
274
|
+
var hasHours = false
|
|
275
|
+
var hasDays = false
|
|
276
|
+
var years = Set<Int>()
|
|
277
|
+
for value in values {
|
|
278
|
+
let c = _civil(fromSeconds: value)
|
|
279
|
+
if c.hour != 0 || c.minute != 0 { hasHours = true }
|
|
280
|
+
if c.day != 1 { hasDays = true }
|
|
281
|
+
years.insert(c.year)
|
|
282
|
+
}
|
|
283
|
+
if hasHours { return .hour }
|
|
284
|
+
if hasDays { return .dayMonth }
|
|
285
|
+
return years.count > 1 ? .monthYear : .month
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// MARK: - Number formatting
|
|
289
|
+
|
|
290
|
+
/// Thousands grouping for a run of digits.
|
|
291
|
+
func _groupThousands(_ digits: String) -> String {
|
|
292
|
+
var out = ""
|
|
293
|
+
for (index, ch) in digits.enumerated() {
|
|
294
|
+
if index > 0, (digits.count - index) % 3 == 0 { out += "," }
|
|
295
|
+
out.append(ch)
|
|
296
|
+
}
|
|
297
|
+
return out
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/// `formatted()`-like: grouped thousands, up to two fraction digits, no
|
|
301
|
+
/// trailing zeros.
|
|
302
|
+
func _formatChartNumber(_ value: Double) -> String {
|
|
303
|
+
guard value.isFinite else { return "\(value)" }
|
|
304
|
+
let negative = value < 0
|
|
305
|
+
let magnitude = abs(value)
|
|
306
|
+
let scaled = (magnitude * 100).rounded()
|
|
307
|
+
var integer = Int(scaled / 100)
|
|
308
|
+
var fraction = Int(scaled) - integer * 100
|
|
309
|
+
if fraction < 0 { fraction = 0 }
|
|
310
|
+
if fraction >= 100 { integer += 1; fraction = 0 }
|
|
311
|
+
var text = _groupThousands(String(integer))
|
|
312
|
+
if fraction != 0 {
|
|
313
|
+
if fraction % 10 == 0 {
|
|
314
|
+
text += ".\(fraction / 10)"
|
|
315
|
+
} else {
|
|
316
|
+
text += fraction < 10 ? ".0\(fraction)" : ".\(fraction)"
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return (negative && (integer != 0 || fraction != 0) ? "-" : "") + text
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/// Four decimals, so unit coordinates are byte-stable in snapshots.
|
|
323
|
+
func _unit(_ value: Double) -> Double {
|
|
324
|
+
guard value.isFinite else { return 0 }
|
|
325
|
+
return (value * 10000).rounded() / 10000
|
|
326
|
+
}
|