@swiftbrowser/swift 0.1.0 → 0.3.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 (393) hide show
  1. package/Package.swift +200 -9
  2. package/README.md +7 -9
  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 +0 -4
  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/{_FoundationCommon → FoundationBridge}/Bundle.swift +41 -4
  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 +24 -72
  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/Localization.swift +149 -0
  170. package/Sources/FoundationBridge/Locks.swift +50 -0
  171. package/Sources/FoundationBridge/Markdown.swift +527 -0
  172. package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
  173. package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
  174. package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
  175. package/Sources/FoundationBridge/Operation.swift +195 -0
  176. package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
  177. package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
  178. package/Sources/FoundationBridge/SceneStorage.swift +78 -0
  179. package/Sources/FoundationBridge/SecurityExports.swift +8 -0
  180. package/Sources/FoundationBridge/Selector.swift +226 -0
  181. package/Sources/FoundationBridge/StringComparators.swift +17 -0
  182. package/Sources/FoundationBridge/Table.swift +211 -0
  183. package/Sources/FoundationBridge/TextAttributes.swift +42 -0
  184. package/Sources/FoundationBridge/Timer.swift +6 -1
  185. package/Sources/FoundationBridge/URLSession.swift +718 -0
  186. package/Sources/{_FoundationCommon → FoundationBridge}/UserDefaults.swift +17 -4
  187. package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
  188. package/Sources/FoundationBridge/WebSocket.swift +187 -0
  189. package/Sources/FoundationModels/FoundationModels.swift +1098 -0
  190. package/Sources/ImageIO/GIF.swift +72 -0
  191. package/Sources/ImageIO/ImageIO.swift +248 -0
  192. package/Sources/ImageIO/ImageTypes.swift +28 -0
  193. package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
  194. package/Sources/LocalAuthentication/LAContext.swift +86 -0
  195. package/Sources/MapKit/Geometry.swift +223 -0
  196. package/Sources/MapKit/Map.swift +638 -0
  197. package/Sources/MapKit/MapView.swift +229 -0
  198. package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
  199. package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
  200. package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
  201. package/Sources/OSLog/OSLog.swift +6 -0
  202. package/Sources/Photos/Photos.swift +572 -0
  203. package/Sources/PhotosUI/PhotosPicker.swift +248 -0
  204. package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
  205. package/Sources/QuickLook/QuickLook.swift +168 -0
  206. package/Sources/SafariServices/SafariServices.swift +106 -0
  207. package/Sources/Security/Security.swift +332 -0
  208. package/Sources/StoreKit/AppStore.swift +207 -0
  209. package/Sources/StoreKit/Products.swift +280 -0
  210. package/Sources/StoreKit/RequestReview.swift +28 -0
  211. package/Sources/StoreKit/StoreKit1.swift +486 -0
  212. package/Sources/StoreKit/StoreViews.swift +428 -0
  213. package/Sources/StoreKit/Transactions.swift +197 -0
  214. package/Sources/SwiftData/Macros.swift +58 -0
  215. package/Sources/SwiftData/ModelActor.swift +38 -0
  216. package/Sources/SwiftData/ModelContainer.swift +129 -0
  217. package/Sources/SwiftData/ModelContext.swift +451 -0
  218. package/Sources/SwiftData/PersistentModel.swift +238 -0
  219. package/Sources/SwiftData/Properties.swift +261 -0
  220. package/Sources/SwiftData/Query.swift +256 -0
  221. package/Sources/SwiftData/Schema.swift +192 -0
  222. package/Sources/SwiftData/Store.swift +146 -0
  223. package/Sources/SwiftData/StringPredicates.swift +125 -0
  224. package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
  225. package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
  226. package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
  227. package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
  228. package/Sources/SwiftDataMacros/Plugin.swift +18 -0
  229. package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
  230. package/Sources/SwiftUI/API/Accessibility.swift +55 -6
  231. package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
  232. package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
  233. package/Sources/SwiftUI/API/Alert.swift +1 -1
  234. package/Sources/SwiftUI/API/AlignmentGuides.swift +68 -0
  235. package/Sources/SwiftUI/API/Animation.swift +37 -5
  236. package/Sources/SwiftUI/API/App.swift +31 -1
  237. package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
  238. package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
  239. package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
  240. package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
  241. package/Sources/SwiftUI/API/Canvas.swift +337 -0
  242. package/Sources/SwiftUI/API/Color.swift +104 -28
  243. package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
  244. package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
  245. package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
  246. package/Sources/SwiftUI/API/Commands.swift +106 -0
  247. package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
  248. package/Sources/SwiftUI/API/ContentShape.swift +33 -0
  249. package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
  250. package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
  251. package/Sources/SwiftUI/API/Controls.swift +59 -27
  252. package/Sources/SwiftUI/API/CustomLayout.swift +49 -10
  253. package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
  254. package/Sources/SwiftUI/API/Decorations.swift +1 -1
  255. package/Sources/SwiftUI/API/EditMode.swift +25 -82
  256. package/Sources/SwiftUI/API/Effects.swift +125 -10
  257. package/Sources/SwiftUI/API/Entry.swift +8 -0
  258. package/Sources/SwiftUI/API/Environment.swift +100 -9
  259. package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
  260. package/Sources/SwiftUI/API/Focus.swift +11 -3
  261. package/Sources/SwiftUI/API/Gauge.swift +26 -10
  262. package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
  263. package/Sources/SwiftUI/API/GeometryReader.swift +13 -2
  264. package/Sources/SwiftUI/API/GestureState.swift +65 -0
  265. package/Sources/SwiftUI/API/Gestures.swift +1 -1
  266. package/Sources/SwiftUI/API/Glass.swift +127 -0
  267. package/Sources/SwiftUI/API/Grid.swift +1 -1
  268. package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
  269. package/Sources/SwiftUI/API/KeyPress.swift +54 -0
  270. package/Sources/SwiftUI/API/LabelStyle.swift +13 -6
  271. package/Sources/SwiftUI/API/Layout.swift +71 -12
  272. package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
  273. package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
  274. package/Sources/SwiftUI/API/Lists.swift +61 -6
  275. package/Sources/SwiftUI/API/Menu.swift +8 -1
  276. package/Sources/SwiftUI/API/Modifiers.swift +88 -12
  277. package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
  278. package/Sources/SwiftUI/API/Namespace.swift +44 -0
  279. package/Sources/SwiftUI/API/Navigation.swift +24 -9
  280. package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
  281. package/Sources/SwiftUI/API/ObservableObject.swift +16 -2
  282. package/Sources/SwiftUI/API/Path.swift +543 -0
  283. package/Sources/SwiftUI/API/Phase8Controls.swift +48 -31
  284. package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
  285. package/Sources/SwiftUI/API/Picker.swift +14 -4
  286. package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
  287. package/Sources/SwiftUI/API/Popover.swift +41 -0
  288. package/Sources/SwiftUI/API/Preferences.swift +262 -0
  289. package/Sources/SwiftUI/API/Presentation.swift +17 -4
  290. package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
  291. package/Sources/SwiftUI/API/Primitives.swift +168 -39
  292. package/Sources/SwiftUI/API/Publishers.swift +4 -4
  293. package/Sources/SwiftUI/API/Redaction.swift +75 -0
  294. package/Sources/SwiftUI/API/RowActions.swift +3 -2
  295. package/Sources/SwiftUI/API/Scenes.swift +131 -0
  296. package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
  297. package/Sources/SwiftUI/API/ScrollTargets.swift +3 -3
  298. package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
  299. package/Sources/SwiftUI/API/SectionSupplements.swift +86 -0
  300. package/Sources/SwiftUI/API/Shape.swift +214 -0
  301. package/Sources/SwiftUI/API/ShapeStyle.swift +187 -8
  302. package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
  303. package/Sources/SwiftUI/API/Sharing.swift +193 -0
  304. package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
  305. package/Sources/SwiftUI/API/State.swift +18 -1
  306. package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
  307. package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
  308. package/Sources/SwiftUI/API/TabContent.swift +841 -0
  309. package/Sources/SwiftUI/API/Table.swift +382 -0
  310. package/Sources/SwiftUI/API/Tabs.swift +148 -4
  311. package/Sources/SwiftUI/API/Tasks.swift +2 -2
  312. package/Sources/SwiftUI/API/Text.swift +386 -0
  313. package/Sources/SwiftUI/API/TextDates.swift +61 -0
  314. package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
  315. package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
  316. package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
  317. package/Sources/SwiftUI/API/Toolbar.swift +52 -16
  318. package/Sources/SwiftUI/API/Transfer.swift +145 -0
  319. package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
  320. package/Sources/SwiftUI/API/Video.swift +64 -0
  321. package/Sources/SwiftUI/API/View.swift +46 -2
  322. package/Sources/SwiftUI/API/ViewModifier.swift +4 -1
  323. package/Sources/SwiftUI/API/VisualEffect.swift +74 -1
  324. package/Sources/SwiftUI/API/Windows.swift +25 -0
  325. package/Sources/SwiftUI/Charts/Axis.swift +7 -1
  326. package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
  327. package/Sources/SwiftUI/Charts/Chart.swift +17 -3
  328. package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
  329. package/Sources/SwiftUI/Localization/Localization.swift +524 -0
  330. package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
  331. package/Sources/SwiftUI/Runtime/Executor.swift +2 -0
  332. package/Sources/SwiftUI/Runtime/Exports.swift +37 -1
  333. package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
  334. package/Sources/SwiftUI/Runtime/JSON.swift +76 -4
  335. package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
  336. package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
  337. package/Sources/SwiftUI/Runtime/Ops.swift +58 -12
  338. package/Sources/SwiftUI/Runtime/Reconciler.swift +10 -1
  339. package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
  340. package/Sources/SwiftUI/Runtime/Runtime.swift +977 -198
  341. package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
  342. package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
  343. package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
  344. package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
  345. package/Sources/Symbols/Symbols.swift +25 -0
  346. package/Sources/Translation/Translation.swift +423 -0
  347. package/Sources/UIKit/Activity.swift +213 -0
  348. package/Sources/UIKit/Alerts.swift +69 -0
  349. package/Sources/UIKit/AppDelegate.swift +222 -0
  350. package/Sources/UIKit/Appearance.swift +84 -0
  351. package/Sources/UIKit/ColorConversions.swift +70 -0
  352. package/Sources/UIKit/Controls.swift +225 -0
  353. package/Sources/UIKit/Device.swift +200 -0
  354. package/Sources/UIKit/Feedback.swift +65 -0
  355. package/Sources/UIKit/Font.swift +307 -0
  356. package/Sources/UIKit/Graphics.swift +204 -0
  357. package/Sources/UIKit/HostingController.swift +185 -0
  358. package/Sources/UIKit/Identity.swift +24 -0
  359. package/Sources/UIKit/Introspectable.swift +510 -0
  360. package/Sources/UIKit/Pasteboard.swift +363 -0
  361. package/Sources/UIKit/PhotoAlbum.swift +81 -0
  362. package/Sources/UIKit/RemoteNotifications.swift +15 -0
  363. package/Sources/UIKit/Representable.swift +288 -0
  364. package/Sources/UIKit/SafeArea.swift +12 -0
  365. package/Sources/UIKit/SceneDelegates.swift +132 -0
  366. package/Sources/UIKit/Scenes.swift +40 -0
  367. package/Sources/UIKit/ScrollView.swift +157 -0
  368. package/Sources/UIKit/ShortcutItems.swift +67 -0
  369. package/Sources/UIKit/SymbolConfiguration.swift +124 -0
  370. package/Sources/UIKit/TargetAction.swift +123 -0
  371. package/Sources/UIKit/TextPaste.swift +161 -0
  372. package/Sources/UIKit/TextView.swift +538 -0
  373. package/Sources/UIKit/UIKit.swift +292 -0
  374. package/Sources/UIKit/UIView.swift +855 -0
  375. package/Sources/UIKit/ViewTranslation.swift +311 -0
  376. package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
  377. package/Sources/UserNotifications/Content.swift +370 -0
  378. package/Sources/UserNotifications/NotificationCenter.swift +309 -0
  379. package/Sources/WeatherKit/WeatherKit.swift +228 -0
  380. package/Sources/WebKit/WebKit.swift +245 -0
  381. package/Sources/os/os.swift +376 -0
  382. package/Sources/zlib/zlib.swift +6 -0
  383. package/index.d.ts +1 -1
  384. package/index.mjs +2 -2
  385. package/manifest.d.mts +2 -0
  386. package/manifest.mjs +41 -0
  387. package/package.json +5 -3
  388. package/sync-sources.mjs +21 -7
  389. package/Sources/FoundationLite/Common.swift +0 -3
  390. package/Sources/FoundationLite/FoundationLite.swift +0 -171
  391. package/Sources/FoundationLite/Interaction.swift +0 -146
  392. package/Sources/FoundationLite/Timer.swift +0 -48
  393. package/Sources/_FoundationCommon/_FoundationCommon.swift +0 -10
@@ -0,0 +1,393 @@
1
+ // A QR code encoder for `CIQRCodeGenerator` (ISO/IEC 18004): byte mode, the
2
+ // smallest version (1...40) that holds the message at the requested error
3
+ // correction level, and the mask with the lowest penalty score. The
4
+ // structure follows Project Nayuki's reference implementation (MIT).
5
+
6
+ struct _QRCode {
7
+ enum ErrorCorrection: Int, CaseIterable {
8
+ case low, medium, quartile, high
9
+
10
+ /// Core Image's `inputCorrectionLevel` letters.
11
+ init?(letter: String) {
12
+ switch letter.uppercased() {
13
+ case "L": self = .low
14
+ case "M": self = .medium
15
+ case "Q": self = .quartile
16
+ case "H": self = .high
17
+ default: return nil
18
+ }
19
+ }
20
+
21
+ /// The two format bits.
22
+ var formatBits: Int {
23
+ switch self {
24
+ case .low: 1
25
+ case .medium: 0
26
+ case .quartile: 3
27
+ case .high: 2
28
+ }
29
+ }
30
+ }
31
+
32
+ let version: Int
33
+ let size: Int
34
+ let correction: ErrorCorrection
35
+ /// The mask applied (0...7).
36
+ private(set) var mask: Int = 0
37
+ /// Row-major, true for a dark module.
38
+ private var modules: [Bool]
39
+ private var isFunction: [Bool]
40
+
41
+ func module(x: Int, y: Int) -> Bool { modules[y * size + x] }
42
+
43
+ /// The code for `data`; nil when it does not fit version 40. `mask`
44
+ /// forces a mask pattern instead of the one with the lowest penalty.
45
+ static func encode(_ data: [UInt8], correction: ErrorCorrection, mask forcedMask: Int? = nil) -> _QRCode? {
46
+ var chosen: Int?
47
+ for version in 1...40 {
48
+ let capacity = numDataCodewords(version: version, correction: correction) * 8
49
+ let countBits = version <= 9 ? 8 : 16
50
+ if data.count < (1 << countBits), 4 + countBits + data.count * 8 <= capacity {
51
+ chosen = version
52
+ break
53
+ }
54
+ }
55
+ guard let version = chosen else { return nil }
56
+ let capacity = numDataCodewords(version: version, correction: correction) * 8
57
+
58
+ // Mode indicator (byte), character count, the bytes, then a
59
+ // terminator, zero bits to a byte boundary and alternating pad bytes.
60
+ var bits: [Bool] = []
61
+ func append(_ value: Int, _ count: Int) {
62
+ for i in stride(from: count - 1, through: 0, by: -1) { bits.append((value >> i) & 1 == 1) }
63
+ }
64
+ append(0b0100, 4)
65
+ append(data.count, version <= 9 ? 8 : 16)
66
+ for byte in data { append(Int(byte), 8) }
67
+ append(0, min(4, capacity - bits.count))
68
+ append(0, (8 - bits.count % 8) % 8)
69
+ var pad = 0xEC
70
+ while bits.count < capacity {
71
+ append(pad, 8)
72
+ pad ^= 0xEC ^ 0x11
73
+ }
74
+ var codewords = [UInt8](repeating: 0, count: bits.count / 8)
75
+ for (index, bit) in bits.enumerated() where bit { codewords[index >> 3] |= 1 << (7 - UInt8(index & 7)) }
76
+
77
+ var code = _QRCode(version: version, correction: correction)
78
+ code.drawFunctionPatterns()
79
+ code.drawCodewords(code.interleavedWithErrorCorrection(codewords))
80
+ var best = forcedMask ?? 0
81
+ if forcedMask == nil {
82
+ var lowest = Int.max
83
+ for candidate in 0..<8 {
84
+ code.applyMask(candidate)
85
+ code.drawFormatBits(mask: candidate)
86
+ let penalty = code.penaltyScore()
87
+ if penalty < lowest {
88
+ lowest = penalty
89
+ best = candidate
90
+ }
91
+ code.applyMask(candidate) // undo: masking is an XOR
92
+ }
93
+ }
94
+ code.applyMask(best)
95
+ code.drawFormatBits(mask: best)
96
+ code.mask = best
97
+ return code
98
+ }
99
+
100
+ private init(version: Int, correction: ErrorCorrection) {
101
+ self.version = version
102
+ self.correction = correction
103
+ size = version * 4 + 17
104
+ modules = [Bool](repeating: false, count: size * size)
105
+ isFunction = [Bool](repeating: false, count: size * size)
106
+ }
107
+
108
+ // MARK: Function patterns
109
+
110
+ private mutating func setFunction(_ x: Int, _ y: Int, _ dark: Bool) {
111
+ modules[y * size + x] = dark
112
+ isFunction[y * size + x] = true
113
+ }
114
+
115
+ private mutating func drawFunctionPatterns() {
116
+ for i in 0..<size {
117
+ setFunction(6, i, i % 2 == 0)
118
+ setFunction(i, 6, i % 2 == 0)
119
+ }
120
+ drawFinder(3, 3)
121
+ drawFinder(size - 4, 3)
122
+ drawFinder(3, size - 4)
123
+ let positions = alignmentPatternPositions()
124
+ let count = positions.count
125
+ for i in 0..<count {
126
+ for j in 0..<count {
127
+ // Not over the three finder patterns.
128
+ if (i == 0 && j == 0) || (i == 0 && j == count - 1) || (i == count - 1 && j == 0) { continue }
129
+ drawAlignment(positions[i], positions[j])
130
+ }
131
+ }
132
+ drawFormatBits(mask: 0) // reserves the area; redrawn once the mask is chosen
133
+ drawVersion()
134
+ }
135
+
136
+ private mutating func drawFinder(_ x: Int, _ y: Int) {
137
+ for dy in -4...4 {
138
+ for dx in -4...4 {
139
+ let distance = max(abs(dx), abs(dy))
140
+ let xx = x + dx, yy = y + dy
141
+ if xx >= 0, xx < size, yy >= 0, yy < size { setFunction(xx, yy, distance != 2 && distance != 4) }
142
+ }
143
+ }
144
+ }
145
+
146
+ private mutating func drawAlignment(_ x: Int, _ y: Int) {
147
+ for dy in -2...2 {
148
+ for dx in -2...2 { setFunction(x + dx, y + dy, max(abs(dx), abs(dy)) != 1) }
149
+ }
150
+ }
151
+
152
+ private func alignmentPatternPositions() -> [Int] {
153
+ if version == 1 { return [] }
154
+ let count = version / 7 + 2
155
+ let step = (version * 8 + count * 3 + 5) / (count * 4 - 4) * 2
156
+ var result = [6]
157
+ var position = size - 7
158
+ for _ in 0..<(count - 1) {
159
+ result.insert(position, at: 1)
160
+ position -= step
161
+ }
162
+ return result
163
+ }
164
+
165
+ private mutating func drawFormatBits(mask: Int) {
166
+ let data = correction.formatBits << 3 | mask
167
+ var remainder = data
168
+ for _ in 0..<10 { remainder = (remainder << 1) ^ ((remainder >> 9) * 0x537) }
169
+ let bits = (data << 10 | remainder) ^ 0x5412
170
+ func bit(_ i: Int) -> Bool { (bits >> i) & 1 == 1 }
171
+ // Around the top left finder.
172
+ for i in 0...5 { setFunction(8, i, bit(i)) }
173
+ setFunction(8, 7, bit(6))
174
+ setFunction(8, 8, bit(7))
175
+ setFunction(7, 8, bit(8))
176
+ for i in 9..<15 { setFunction(14 - i, 8, bit(i)) }
177
+ // Beside the other two.
178
+ for i in 0..<8 { setFunction(size - 1 - i, 8, bit(i)) }
179
+ for i in 8..<15 { setFunction(8, size - 15 + i, bit(i)) }
180
+ setFunction(8, size - 8, true) // the dark module
181
+ }
182
+
183
+ private mutating func drawVersion() {
184
+ guard version >= 7 else { return }
185
+ var remainder = version
186
+ for _ in 0..<12 { remainder = (remainder << 1) ^ ((remainder >> 11) * 0x1F25) }
187
+ let bits = version << 12 | remainder
188
+ for i in 0..<18 {
189
+ let dark = (bits >> i) & 1 == 1
190
+ let a = size - 11 + i % 3, b = i / 3
191
+ setFunction(a, b, dark)
192
+ setFunction(b, a, dark)
193
+ }
194
+ }
195
+
196
+ // MARK: Data
197
+
198
+ /// The data codewords split into blocks, each followed by its
199
+ /// Reed-Solomon error correction, interleaved.
200
+ private func interleavedWithErrorCorrection(_ data: [UInt8]) -> [UInt8] {
201
+ let blocks = Self.blockCount[correction.rawValue][version]
202
+ let eccLength = Self.eccPerBlock[correction.rawValue][version]
203
+ let raw = Self.numRawDataModules(version: version) / 8
204
+ let shortBlocks = blocks - raw % blocks
205
+ let shortLength = raw / blocks
206
+ let divisor = Self.reedSolomonDivisor(degree: eccLength)
207
+ var split: [[UInt8]] = []
208
+ var offset = 0
209
+ for i in 0..<blocks {
210
+ let length = shortLength - eccLength + (i < shortBlocks ? 0 : 1)
211
+ var block = Array(data[offset..<(offset + length)])
212
+ offset += length
213
+ let ecc = Self.reedSolomonRemainder(block, divisor: divisor)
214
+ if i < shortBlocks { block.append(0) } // a placeholder, skipped below
215
+ split.append(block + ecc)
216
+ }
217
+ var result: [UInt8] = []
218
+ result.reserveCapacity(raw)
219
+ for i in 0..<split[0].count {
220
+ for (j, block) in split.enumerated() where i != shortLength - eccLength || j >= shortBlocks {
221
+ result.append(block[i])
222
+ }
223
+ }
224
+ return result
225
+ }
226
+
227
+ /// Two columns at a time from the right, zigzagging up and down, skipping
228
+ /// the timing column and the function patterns.
229
+ private mutating func drawCodewords(_ data: [UInt8]) {
230
+ var index = 0
231
+ var right = size - 1
232
+ while right >= 1 {
233
+ if right == 6 { right = 5 }
234
+ for vertical in 0..<size {
235
+ for j in 0..<2 {
236
+ let x = right - j
237
+ let upward = (right + 1) & 2 == 0
238
+ let y = upward ? size - 1 - vertical : vertical
239
+ if !isFunction[y * size + x], index < data.count * 8 {
240
+ modules[y * size + x] = (data[index >> 3] >> (7 - UInt8(index & 7))) & 1 == 1
241
+ index += 1
242
+ }
243
+ }
244
+ }
245
+ right -= 2
246
+ }
247
+ }
248
+
249
+ private mutating func applyMask(_ mask: Int) {
250
+ for y in 0..<size {
251
+ for x in 0..<size where !isFunction[y * size + x] {
252
+ let invert: Bool
253
+ switch mask {
254
+ case 0: invert = (x + y) % 2 == 0
255
+ case 1: invert = y % 2 == 0
256
+ case 2: invert = x % 3 == 0
257
+ case 3: invert = (x + y) % 3 == 0
258
+ case 4: invert = (x / 3 + y / 2) % 2 == 0
259
+ case 5: invert = x * y % 2 + x * y % 3 == 0
260
+ case 6: invert = (x * y % 2 + x * y % 3) % 2 == 0
261
+ default: invert = ((x + y) % 2 + x * y % 3) % 2 == 0
262
+ }
263
+ if invert { modules[y * size + x].toggle() }
264
+ }
265
+ }
266
+ }
267
+
268
+ // MARK: Penalty
269
+
270
+ /// The mask selection score: runs of five or more, 2×2 blocks, finder-like
271
+ /// patterns and the dark/light balance.
272
+ func penaltyScore() -> Int {
273
+ var result = 0
274
+ for horizontal in [true, false] {
275
+ for a in 0..<size {
276
+ var runColor = false
277
+ var run = 0
278
+ var history = [Int](repeating: 0, count: 7)
279
+ for b in 0..<size {
280
+ let dark = horizontal ? module(x: b, y: a) : module(x: a, y: b)
281
+ if dark == runColor {
282
+ run += 1
283
+ if run == 5 { result += 3 } else if run > 5 { result += 1 }
284
+ } else {
285
+ addHistory(run, &history)
286
+ if !runColor { result += finderLikePatterns(history) * 40 }
287
+ runColor = dark
288
+ run = 1
289
+ }
290
+ }
291
+ // The light border closes the last run.
292
+ if runColor {
293
+ addHistory(run, &history)
294
+ run = 0
295
+ }
296
+ addHistory(run + size, &history)
297
+ result += finderLikePatterns(history) * 40
298
+ }
299
+ }
300
+ for y in 0..<(size - 1) {
301
+ for x in 0..<(size - 1) {
302
+ let color = module(x: x, y: y)
303
+ if color == module(x: x + 1, y: y), color == module(x: x, y: y + 1), color == module(x: x + 1, y: y + 1) { result += 3 }
304
+ }
305
+ }
306
+ let dark = modules.reduce(0) { $0 + ($1 ? 1 : 0) }
307
+ let total = size * size
308
+ let k = (abs(dark * 20 - total * 10) + total - 1) / total - 1
309
+ result += k * 10
310
+ return result
311
+ }
312
+
313
+ private func addHistory(_ run: Int, _ history: inout [Int]) {
314
+ // The light border before the first run.
315
+ let length = history[0] == 0 ? run + size : run
316
+ history.removeLast()
317
+ history.insert(length, at: 0)
318
+ }
319
+
320
+ private func finderLikePatterns(_ history: [Int]) -> Int {
321
+ let n = history[1]
322
+ let core = n > 0 && history[2] == n && history[3] == n * 3 && history[4] == n && history[5] == n
323
+ return (core && history[0] >= n * 4 && history[6] >= n ? 1 : 0) + (core && history[6] >= n * 4 && history[0] >= n ? 1 : 0)
324
+ }
325
+
326
+ // MARK: Tables and arithmetic
327
+
328
+ static func numRawDataModules(version: Int) -> Int {
329
+ var result = (16 * version + 128) * version + 64
330
+ if version >= 2 {
331
+ let alignments = version / 7 + 2
332
+ result -= (25 * alignments - 10) * alignments - 55
333
+ if version >= 7 { result -= 36 }
334
+ }
335
+ return result
336
+ }
337
+
338
+ static func numDataCodewords(version: Int, correction: ErrorCorrection) -> Int {
339
+ numRawDataModules(version: version) / 8
340
+ - eccPerBlock[correction.rawValue][version] * blockCount[correction.rawValue][version]
341
+ }
342
+
343
+ /// Error correction codewords per block, by level (L, M, Q, H) and version (index 0 unused).
344
+ static let eccPerBlock: [[Int]] = [
345
+ [-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],
346
+ [-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28],
347
+ [-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],
348
+ [-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],
349
+ ]
350
+
351
+ /// Error correction blocks, by level (L, M, Q, H) and version (index 0 unused).
352
+ static let blockCount: [[Int]] = [
353
+ [-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25],
354
+ [-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49],
355
+ [-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68],
356
+ [-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81],
357
+ ]
358
+
359
+ /// The generator polynomial's coefficients for `degree` codewords, highest first.
360
+ static func reedSolomonDivisor(degree: Int) -> [UInt8] {
361
+ var result = [UInt8](repeating: 0, count: degree)
362
+ result[degree - 1] = 1
363
+ var root: UInt8 = 1
364
+ for _ in 0..<degree {
365
+ for j in 0..<degree {
366
+ result[j] = multiply(result[j], root)
367
+ if j + 1 < degree { result[j] ^= result[j + 1] }
368
+ }
369
+ root = multiply(root, 0x02)
370
+ }
371
+ return result
372
+ }
373
+
374
+ static func reedSolomonRemainder(_ data: [UInt8], divisor: [UInt8]) -> [UInt8] {
375
+ var result = [UInt8](repeating: 0, count: divisor.count)
376
+ for byte in data {
377
+ let factor = byte ^ result.removeFirst()
378
+ result.append(0)
379
+ for i in 0..<result.count { result[i] ^= multiply(divisor[i], factor) }
380
+ }
381
+ return result
382
+ }
383
+
384
+ /// Multiplication in GF(2^8) modulo x^8 + x^4 + x^3 + x^2 + 1.
385
+ static func multiply(_ x: UInt8, _ y: UInt8) -> UInt8 {
386
+ var z = 0
387
+ for i in stride(from: 7, through: 0, by: -1) {
388
+ z = (z << 1) ^ ((z >> 7) * 0x11D)
389
+ z ^= ((Int(y) >> i) & 1) * Int(x)
390
+ }
391
+ return UInt8(z)
392
+ }
393
+ }
@@ -0,0 +1,30 @@
1
+ // Core Location's value types, without location services: a coordinate is a
2
+ // plain latitude and longitude. No protocol conformances are added, as on
3
+ // Apple platforms (where it is a C struct), so an app's own
4
+ // `extension CLLocationCoordinate2D: Equatable` or `Codable` still compiles.
5
+
6
+ public typealias CLLocationDegrees = Double
7
+ public typealias CLLocationDistance = Double
8
+
9
+ public struct CLLocationCoordinate2D: Sendable {
10
+ public var latitude: CLLocationDegrees
11
+ public var longitude: CLLocationDegrees
12
+
13
+ public init() {
14
+ latitude = 0
15
+ longitude = 0
16
+ }
17
+
18
+ public init(latitude: CLLocationDegrees, longitude: CLLocationDegrees) {
19
+ self.latitude = latitude
20
+ self.longitude = longitude
21
+ }
22
+ }
23
+
24
+ /// Whether `coordinate` is a valid latitude and longitude.
25
+ public func CLLocationCoordinate2DIsValid(_ coordinate: CLLocationCoordinate2D) -> Bool {
26
+ (-90...90).contains(coordinate.latitude) && (-180...180).contains(coordinate.longitude)
27
+ }
28
+
29
+ /// An invalid coordinate, as Core Location returns when it has none.
30
+ public let kCLLocationCoordinate2DInvalid = CLLocationCoordinate2D(latitude: -180, longitude: -180)
@@ -0,0 +1,65 @@
1
+ // `CLLocation`: a coordinate with its altitude, accuracy and time, as apps
2
+ // keep one for a place (Food Truck's parking spots). There are no location
3
+ // services, so nothing produces one but the app. Like Apple's (an `NSObject`
4
+ // that does not override `isEqual`), two locations are equal when they are
5
+ // the same object.
6
+
7
+ #if canImport(WASILibc)
8
+ import WASILibc
9
+ #elseif canImport(Glibc)
10
+ import Glibc
11
+ #elseif canImport(Musl)
12
+ import Musl
13
+ #elseif canImport(Darwin)
14
+ import Darwin
15
+ #endif
16
+
17
+ public typealias CLLocationAccuracy = Double
18
+ public typealias CLLocationSpeed = Double
19
+ public typealias CLLocationDirection = Double
20
+
21
+ open class CLLocation: Hashable, @unchecked Sendable {
22
+ public let coordinate: CLLocationCoordinate2D
23
+ public let altitude: CLLocationDistance
24
+ public let horizontalAccuracy: CLLocationAccuracy
25
+ public let verticalAccuracy: CLLocationAccuracy
26
+ public let course: CLLocationDirection
27
+ public let speed: CLLocationSpeed
28
+ /// Seconds since 1970 (`timestamp` is Foundation's `Date`, which this module does not import).
29
+ public let _timestamp: Double
30
+
31
+ public init(latitude: CLLocationDegrees, longitude: CLLocationDegrees) {
32
+ coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
33
+ altitude = 0
34
+ horizontalAccuracy = 0
35
+ verticalAccuracy = -1
36
+ course = -1
37
+ speed = -1
38
+ _timestamp = 0
39
+ }
40
+
41
+ public init(coordinate: CLLocationCoordinate2D, altitude: CLLocationDistance,
42
+ horizontalAccuracy: CLLocationAccuracy, verticalAccuracy: CLLocationAccuracy,
43
+ course: CLLocationDirection = -1, speed: CLLocationSpeed = -1, timestamp: Double = 0) {
44
+ self.coordinate = coordinate
45
+ self.altitude = altitude
46
+ self.horizontalAccuracy = horizontalAccuracy
47
+ self.verticalAccuracy = verticalAccuracy
48
+ self.course = course
49
+ self.speed = speed
50
+ _timestamp = timestamp
51
+ }
52
+
53
+ /// The great-circle distance to `location`, in meters.
54
+ public func distance(from location: CLLocation) -> CLLocationDistance {
55
+ let radians = Double.pi / 180
56
+ let lat1 = coordinate.latitude * radians, lat2 = location.coordinate.latitude * radians
57
+ let dLat = lat2 - lat1
58
+ let dLon = (location.coordinate.longitude - coordinate.longitude) * radians
59
+ let a = sin(dLat / 2) * sin(dLat / 2) + cos(lat1) * cos(lat2) * sin(dLon / 2) * sin(dLon / 2)
60
+ return 6_371_000 * 2 * atan2(a.squareRoot(), (1 - a).squareRoot())
61
+ }
62
+
63
+ public static func == (lhs: CLLocation, rhs: CLLocation) -> Bool { lhs === rhs }
64
+ public func hash(into hasher: inout Hasher) { hasher.combine(ObjectIdentifier(self)) }
65
+ }