@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.
Files changed (400) hide show
  1. package/Package.swift +214 -0
  2. package/README.md +10 -2
  3. package/Sources/AVFoundation/AVFoundation.swift +131 -0
  4. package/Sources/AVFoundation/Asset.swift +487 -0
  5. package/Sources/AVFoundation/AudioSession.swift +144 -0
  6. package/Sources/AVFoundation/CMTime.swift +303 -0
  7. package/Sources/AVFoundation/Capture.swift +688 -0
  8. package/Sources/AVFoundation/Player.swift +749 -0
  9. package/Sources/AVFoundation/PlayerView.swift +117 -0
  10. package/Sources/AVKit/AVKit.swift +132 -0
  11. package/Sources/Accelerate/Accelerate.swift +122 -0
  12. package/Sources/AppIntents/AppIntents.swift +144 -0
  13. package/Sources/AppIntents/Parameters.swift +220 -0
  14. package/Sources/AppIntents/Shortcuts.swift +159 -0
  15. package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
  16. package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
  17. package/Sources/AuthenticationServices/Authorization.swift +251 -0
  18. package/Sources/Charts/Charts.swift +61 -0
  19. package/Sources/Combine/AnyCancellable.swift +65 -0
  20. package/Sources/Combine/AnyPublisher.swift +148 -0
  21. package/Sources/Combine/AnySubscriber.swift +230 -0
  22. package/Sources/Combine/Cancellable.swift +35 -0
  23. package/Sources/Combine/Codable.swift +29 -0
  24. package/Sources/Combine/CombineIdentifier.swift +45 -0
  25. package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
  26. package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
  27. package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
  28. package/Sources/Combine/CurrentValueSubject.swift +252 -0
  29. package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
  30. package/Sources/Combine/Future.swift +228 -0
  31. package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
  32. package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
  33. package/Sources/Combine/Helpers/ConduitList.swift +59 -0
  34. package/Sources/Combine/Helpers/DebugHook.swift +177 -0
  35. package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
  36. package/Sources/Combine/Helpers/Locking.swift +30 -0
  37. package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
  38. package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
  39. package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
  40. package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
  41. package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
  42. package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
  43. package/Sources/Combine/Helpers/Utils.swift +30 -0
  44. package/Sources/Combine/Helpers/Violations.swift +33 -0
  45. package/Sources/Combine/ImmediateScheduler.swift +178 -0
  46. package/Sources/Combine/LICENSE +21 -0
  47. package/Sources/Combine/NotificationPublisher.swift +48 -0
  48. package/Sources/Combine/ObjectWillChange.swift +46 -0
  49. package/Sources/Combine/PassthroughSubject.swift +222 -0
  50. package/Sources/Combine/Publisher+Subscribe.swift +53 -0
  51. package/Sources/Combine/Publishers/Deferred.swift +48 -0
  52. package/Sources/Combine/Publishers/Empty.swift +54 -0
  53. package/Sources/Combine/Publishers/Fail.swift +42 -0
  54. package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
  55. package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
  56. package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
  57. package/Sources/Combine/Publishers/Just.swift +313 -0
  58. package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
  59. package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
  60. package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
  61. package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
  62. package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
  63. package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
  64. package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
  65. package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
  66. package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
  67. package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
  68. package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
  69. package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
  70. package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
  71. package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
  72. package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
  73. package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
  74. package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
  75. package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
  76. package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
  77. package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
  78. package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
  79. package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
  80. package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
  81. package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
  82. package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
  83. package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
  84. package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
  85. package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
  86. package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
  87. package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
  88. package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
  89. package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
  90. package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
  91. package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
  92. package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
  93. package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
  94. package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
  95. package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
  96. package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
  97. package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
  98. package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
  99. package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
  100. package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
  101. package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
  102. package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
  103. package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
  104. package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
  105. package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
  106. package/Sources/Combine/Publishers/Publishers.swift +13 -0
  107. package/Sources/Combine/Publishers/Record.swift +237 -0
  108. package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
  109. package/Sources/Combine/Result.swift +46 -0
  110. package/Sources/Combine/Scheduler.swift +89 -0
  111. package/Sources/Combine/Schedulers.swift +211 -0
  112. package/Sources/Combine/Subject+Void.swift +17 -0
  113. package/Sources/Combine/Subscriber+Void.swift +20 -0
  114. package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
  115. package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
  116. package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
  117. package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
  118. package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
  119. package/Sources/Combine/Subscription.swift +22 -0
  120. package/Sources/Combine/Subscriptions.swift +42 -0
  121. package/Sources/Combine/SwiftUIObservation.swift +10 -0
  122. package/Sources/Combine/_Introspection.swift +107 -0
  123. package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
  124. package/Sources/Compression/Compression.swift +365 -0
  125. package/Sources/Compression/Deflate.swift +407 -0
  126. package/Sources/Compression/Zlib.swift +179 -0
  127. package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
  128. package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
  129. package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
  130. package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
  131. package/Sources/CoreImage/CIColor.swift +41 -0
  132. package/Sources/CoreImage/CIContext.swift +31 -0
  133. package/Sources/CoreImage/CIDetector.swift +57 -0
  134. package/Sources/CoreImage/CIFilter.swift +243 -0
  135. package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
  136. package/Sources/CoreImage/CIImage.swift +162 -0
  137. package/Sources/CoreImage/QRCode.swift +393 -0
  138. package/Sources/CoreLocation/Coordinate.swift +30 -0
  139. package/Sources/CoreLocation/Location.swift +65 -0
  140. package/Sources/CoreML/Evaluation.swift +414 -0
  141. package/Sources/CoreML/FeatureValue.swift +266 -0
  142. package/Sources/CoreML/Model.swift +269 -0
  143. package/Sources/CoreML/MultiArray.swift +92 -0
  144. package/Sources/CoreML/Specification.swift +233 -0
  145. package/Sources/CoreText/CoreText.swift +64 -0
  146. package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
  147. package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
  148. package/Sources/CryptoKit/CryptoKit.swift +375 -0
  149. package/Sources/CryptoKit/Curve25519.swift +317 -0
  150. package/Sources/CryptoKit/P256.swift +321 -0
  151. package/Sources/FoundationBridge/AppStorage.swift +165 -0
  152. package/Sources/FoundationBridge/AssetResources.swift +90 -0
  153. package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
  154. package/Sources/FoundationBridge/AsyncImage.swift +116 -0
  155. package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
  156. package/Sources/FoundationBridge/Bundle.swift +119 -0
  157. package/Sources/FoundationBridge/CombineExports.swift +8 -0
  158. package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
  159. package/Sources/FoundationBridge/Dispatch.swift +458 -0
  160. package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
  161. package/Sources/FoundationBridge/FileImporter.swift +128 -0
  162. package/Sources/FoundationBridge/FileSystem.swift +68 -0
  163. package/Sources/FoundationBridge/FoundationBridge.swift +29 -0
  164. package/Sources/FoundationBridge/HostResolution.swift +31 -0
  165. package/Sources/FoundationBridge/ItemProvider.swift +655 -0
  166. package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
  167. package/Sources/FoundationBridge/Links.swift +127 -0
  168. package/Sources/FoundationBridge/ListFormatter.swift +32 -0
  169. package/Sources/FoundationBridge/Locale.swift +86 -0
  170. package/Sources/FoundationBridge/Localization.swift +149 -0
  171. package/Sources/FoundationBridge/Locks.swift +50 -0
  172. package/Sources/FoundationBridge/Markdown.swift +527 -0
  173. package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
  174. package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
  175. package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
  176. package/Sources/FoundationBridge/Operation.swift +195 -0
  177. package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
  178. package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
  179. package/Sources/FoundationBridge/SceneStorage.swift +78 -0
  180. package/Sources/FoundationBridge/SecurityExports.swift +8 -0
  181. package/Sources/FoundationBridge/Selector.swift +226 -0
  182. package/Sources/FoundationBridge/StringComparators.swift +17 -0
  183. package/Sources/FoundationBridge/Table.swift +211 -0
  184. package/Sources/FoundationBridge/TextAttributes.swift +42 -0
  185. package/Sources/FoundationBridge/Timer.swift +53 -0
  186. package/Sources/FoundationBridge/UITextChecker.swift +30 -0
  187. package/Sources/FoundationBridge/URLSession.swift +718 -0
  188. package/Sources/FoundationBridge/UserDefaults.swift +183 -0
  189. package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
  190. package/Sources/FoundationBridge/WebSocket.swift +187 -0
  191. package/Sources/FoundationModels/FoundationModels.swift +1098 -0
  192. package/Sources/ImageIO/GIF.swift +72 -0
  193. package/Sources/ImageIO/ImageIO.swift +248 -0
  194. package/Sources/ImageIO/ImageTypes.swift +28 -0
  195. package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
  196. package/Sources/LocalAuthentication/LAContext.swift +86 -0
  197. package/Sources/MapKit/Geometry.swift +223 -0
  198. package/Sources/MapKit/Map.swift +638 -0
  199. package/Sources/MapKit/MapView.swift +229 -0
  200. package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
  201. package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
  202. package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
  203. package/Sources/OSLog/OSLog.swift +6 -0
  204. package/Sources/Photos/Photos.swift +572 -0
  205. package/Sources/PhotosUI/PhotosPicker.swift +248 -0
  206. package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
  207. package/Sources/QuickLook/QuickLook.swift +168 -0
  208. package/Sources/SafariServices/SafariServices.swift +106 -0
  209. package/Sources/Security/Security.swift +332 -0
  210. package/Sources/StoreKit/AppStore.swift +207 -0
  211. package/Sources/StoreKit/Products.swift +280 -0
  212. package/Sources/StoreKit/RequestReview.swift +28 -0
  213. package/Sources/StoreKit/StoreKit1.swift +486 -0
  214. package/Sources/StoreKit/StoreViews.swift +428 -0
  215. package/Sources/StoreKit/Transactions.swift +197 -0
  216. package/Sources/SwiftData/Macros.swift +58 -0
  217. package/Sources/SwiftData/ModelActor.swift +38 -0
  218. package/Sources/SwiftData/ModelContainer.swift +129 -0
  219. package/Sources/SwiftData/ModelContext.swift +451 -0
  220. package/Sources/SwiftData/PersistentModel.swift +238 -0
  221. package/Sources/SwiftData/Properties.swift +261 -0
  222. package/Sources/SwiftData/Query.swift +256 -0
  223. package/Sources/SwiftData/Schema.swift +192 -0
  224. package/Sources/SwiftData/Store.swift +146 -0
  225. package/Sources/SwiftData/StringPredicates.swift +125 -0
  226. package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
  227. package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
  228. package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
  229. package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
  230. package/Sources/SwiftDataMacros/Plugin.swift +18 -0
  231. package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
  232. package/Sources/SwiftUI/API/Accessibility.swift +181 -0
  233. package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
  234. package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
  235. package/Sources/SwiftUI/API/Alert.swift +221 -0
  236. package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
  237. package/Sources/SwiftUI/API/Animation.swift +285 -0
  238. package/Sources/SwiftUI/API/App.swift +87 -0
  239. package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
  240. package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
  241. package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
  242. package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
  243. package/Sources/SwiftUI/API/Canvas.swift +337 -0
  244. package/Sources/SwiftUI/API/Color.swift +237 -0
  245. package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
  246. package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
  247. package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
  248. package/Sources/SwiftUI/API/Commands.swift +106 -0
  249. package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
  250. package/Sources/SwiftUI/API/ContentShape.swift +33 -0
  251. package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
  252. package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
  253. package/Sources/SwiftUI/API/Controls.swift +300 -0
  254. package/Sources/SwiftUI/API/CustomLayout.swift +442 -0
  255. package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
  256. package/Sources/SwiftUI/API/Decorations.swift +92 -0
  257. package/Sources/SwiftUI/API/EditMode.swift +212 -0
  258. package/Sources/SwiftUI/API/Effects.swift +388 -0
  259. package/Sources/SwiftUI/API/Entry.swift +8 -0
  260. package/Sources/SwiftUI/API/Environment.swift +439 -0
  261. package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
  262. package/Sources/SwiftUI/API/Focus.swift +137 -0
  263. package/Sources/SwiftUI/API/Font.swift +131 -0
  264. package/Sources/SwiftUI/API/Gauge.swift +290 -0
  265. package/Sources/SwiftUI/API/Geometry.swift +89 -0
  266. package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
  267. package/Sources/SwiftUI/API/GeometryReader.swift +135 -0
  268. package/Sources/SwiftUI/API/GestureState.swift +65 -0
  269. package/Sources/SwiftUI/API/Gestures.swift +342 -0
  270. package/Sources/SwiftUI/API/Glass.swift +127 -0
  271. package/Sources/SwiftUI/API/Grid.swift +188 -0
  272. package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
  273. package/Sources/SwiftUI/API/KeyPress.swift +54 -0
  274. package/Sources/SwiftUI/API/LabelStyle.swift +124 -0
  275. package/Sources/SwiftUI/API/Layout.swift +220 -0
  276. package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
  277. package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
  278. package/Sources/SwiftUI/API/Lists.swift +331 -0
  279. package/Sources/SwiftUI/API/Menu.swift +58 -0
  280. package/Sources/SwiftUI/API/Modifiers.swift +313 -0
  281. package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
  282. package/Sources/SwiftUI/API/Namespace.swift +44 -0
  283. package/Sources/SwiftUI/API/Navigation.swift +386 -0
  284. package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
  285. package/Sources/SwiftUI/API/ObservableObject.swift +293 -0
  286. package/Sources/SwiftUI/API/OnChange.swift +48 -0
  287. package/Sources/SwiftUI/API/Path.swift +543 -0
  288. package/Sources/SwiftUI/API/Phase8Controls.swift +411 -0
  289. package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
  290. package/Sources/SwiftUI/API/Picker.swift +185 -0
  291. package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
  292. package/Sources/SwiftUI/API/Popover.swift +41 -0
  293. package/Sources/SwiftUI/API/Preferences.swift +262 -0
  294. package/Sources/SwiftUI/API/Presentation.swift +122 -0
  295. package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
  296. package/Sources/SwiftUI/API/Primitives.swift +517 -0
  297. package/Sources/SwiftUI/API/Publishers.swift +107 -0
  298. package/Sources/SwiftUI/API/Redaction.swift +75 -0
  299. package/Sources/SwiftUI/API/RowActions.swift +84 -0
  300. package/Sources/SwiftUI/API/Scenes.swift +131 -0
  301. package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
  302. package/Sources/SwiftUI/API/ScrollTargets.swift +104 -0
  303. package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
  304. package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
  305. package/Sources/SwiftUI/API/Shape.swift +214 -0
  306. package/Sources/SwiftUI/API/ShapeStyle.swift +409 -0
  307. package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
  308. package/Sources/SwiftUI/API/Sharing.swift +193 -0
  309. package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
  310. package/Sources/SwiftUI/API/State.swift +144 -0
  311. package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
  312. package/Sources/SwiftUI/API/StrokeStyle.swift +30 -0
  313. package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
  314. package/Sources/SwiftUI/API/TabContent.swift +841 -0
  315. package/Sources/SwiftUI/API/Table.swift +382 -0
  316. package/Sources/SwiftUI/API/Tabs.swift +263 -0
  317. package/Sources/SwiftUI/API/Tasks.swift +35 -0
  318. package/Sources/SwiftUI/API/Text.swift +386 -0
  319. package/Sources/SwiftUI/API/TextDates.swift +61 -0
  320. package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
  321. package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
  322. package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
  323. package/Sources/SwiftUI/API/Timeline.swift +212 -0
  324. package/Sources/SwiftUI/API/Toolbar.swift +251 -0
  325. package/Sources/SwiftUI/API/Transfer.swift +145 -0
  326. package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
  327. package/Sources/SwiftUI/API/Video.swift +64 -0
  328. package/Sources/SwiftUI/API/View.swift +215 -0
  329. package/Sources/SwiftUI/API/ViewModifier.swift +43 -0
  330. package/Sources/SwiftUI/API/VisualEffect.swift +155 -0
  331. package/Sources/SwiftUI/API/Windows.swift +25 -0
  332. package/Sources/SwiftUI/Charts/Axis.swift +325 -0
  333. package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
  334. package/Sources/SwiftUI/Charts/Chart.swift +660 -0
  335. package/Sources/SwiftUI/Charts/ChartContent.swift +376 -0
  336. package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
  337. package/Sources/SwiftUI/Charts/Marks.swift +204 -0
  338. package/Sources/SwiftUI/Charts/Plottable.swift +99 -0
  339. package/Sources/SwiftUI/Charts/Scales.swift +326 -0
  340. package/Sources/SwiftUI/Localization/Localization.swift +498 -0
  341. package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
  342. package/Sources/SwiftUI/Runtime/Executor.swift +85 -0
  343. package/Sources/SwiftUI/Runtime/Exports.swift +101 -0
  344. package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
  345. package/Sources/SwiftUI/Runtime/JSON.swift +143 -0
  346. package/Sources/SwiftUI/Runtime/JSONParser.swift +443 -0
  347. package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
  348. package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
  349. package/Sources/SwiftUI/Runtime/Ops.swift +152 -0
  350. package/Sources/SwiftUI/Runtime/Reconciler.swift +219 -0
  351. package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
  352. package/Sources/SwiftUI/Runtime/Runtime.swift +2146 -0
  353. package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
  354. package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
  355. package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
  356. package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
  357. package/Sources/Symbols/Symbols.swift +25 -0
  358. package/Sources/Translation/Translation.swift +423 -0
  359. package/Sources/UIKit/Activity.swift +213 -0
  360. package/Sources/UIKit/Alerts.swift +69 -0
  361. package/Sources/UIKit/AppDelegate.swift +222 -0
  362. package/Sources/UIKit/Appearance.swift +84 -0
  363. package/Sources/UIKit/ColorConversions.swift +70 -0
  364. package/Sources/UIKit/Controls.swift +225 -0
  365. package/Sources/UIKit/Device.swift +200 -0
  366. package/Sources/UIKit/Feedback.swift +65 -0
  367. package/Sources/UIKit/Font.swift +307 -0
  368. package/Sources/UIKit/Graphics.swift +204 -0
  369. package/Sources/UIKit/HostingController.swift +185 -0
  370. package/Sources/UIKit/Identity.swift +24 -0
  371. package/Sources/UIKit/Introspectable.swift +510 -0
  372. package/Sources/UIKit/Pasteboard.swift +363 -0
  373. package/Sources/UIKit/PhotoAlbum.swift +81 -0
  374. package/Sources/UIKit/RemoteNotifications.swift +15 -0
  375. package/Sources/UIKit/Representable.swift +288 -0
  376. package/Sources/UIKit/SafeArea.swift +12 -0
  377. package/Sources/UIKit/SceneDelegates.swift +132 -0
  378. package/Sources/UIKit/Scenes.swift +40 -0
  379. package/Sources/UIKit/ScrollView.swift +157 -0
  380. package/Sources/UIKit/ShortcutItems.swift +67 -0
  381. package/Sources/UIKit/SymbolConfiguration.swift +124 -0
  382. package/Sources/UIKit/TargetAction.swift +123 -0
  383. package/Sources/UIKit/TextPaste.swift +161 -0
  384. package/Sources/UIKit/TextView.swift +538 -0
  385. package/Sources/UIKit/UIKit.swift +292 -0
  386. package/Sources/UIKit/UIView.swift +855 -0
  387. package/Sources/UIKit/ViewTranslation.swift +311 -0
  388. package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
  389. package/Sources/UserNotifications/Content.swift +370 -0
  390. package/Sources/UserNotifications/NotificationCenter.swift +309 -0
  391. package/Sources/WeatherKit/WeatherKit.swift +228 -0
  392. package/Sources/WebKit/WebKit.swift +245 -0
  393. package/Sources/os/os.swift +376 -0
  394. package/Sources/zlib/zlib.swift +6 -0
  395. package/index.d.ts +2 -0
  396. package/index.mjs +16 -0
  397. package/manifest.d.mts +2 -0
  398. package/manifest.mjs +39 -0
  399. package/package.json +30 -4
  400. 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
+ }