@swiftbrowser/swift 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +65 -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 +105 -7
  257. package/Sources/SwiftUI/API/Entry.swift +8 -0
  258. package/Sources/SwiftUI/API/Environment.swift +93 -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 +3 -2
  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 +67 -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 +80 -10
  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 +11 -2
  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 +164 -37
  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 +96 -0
  300. package/Sources/SwiftUI/API/Shape.swift +214 -0
  301. package/Sources/SwiftUI/API/ShapeStyle.swift +105 -7
  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 +10 -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 +498 -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 +39 -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,89 @@
1
+ //
2
+ // Scheduler.swift
3
+ //
4
+ //
5
+ // Created by Sergej Jaskiewicz on 11.06.2019.
6
+ //
7
+
8
+ /// A protocol that provides a scheduler with an expression for relative time.
9
+ public protocol SchedulerTimeIntervalConvertible {
10
+
11
+ /// Converts the specified number of seconds into an instance of this scheduler time
12
+ /// type.
13
+ static func seconds(_ s: Int) -> Self
14
+
15
+ /// Converts the specified number of seconds, as a floating-point value, into
16
+ /// an instance of this scheduler time type.
17
+ static func seconds(_ s: Double) -> Self
18
+
19
+ /// Converts the specified number of milliseconds into an instance of this scheduler
20
+ /// time type.
21
+ static func milliseconds(_ ms: Int) -> Self
22
+
23
+ /// Converts the specified number of microseconds into an instance of this scheduler
24
+ /// time type.
25
+ static func microseconds(_ us: Int) -> Self
26
+
27
+ /// Converts the specified number of nanoseconds into an instance of this scheduler
28
+ /// time type.
29
+ static func nanoseconds(_ ns: Int) -> Self
30
+ }
31
+
32
+ extension Scheduler {
33
+
34
+ /// Performs the action at some time after the specified date, using the scheduler’s
35
+ /// minimum tolerance.
36
+ ///
37
+ /// The immediate scheduler ignores `date` and performs the action immediately.
38
+ @inlinable
39
+ public func schedule(after date: SchedulerTimeType,
40
+ _ action: @escaping () -> Void) {
41
+ schedule(after: date, tolerance: minimumTolerance, action)
42
+ }
43
+
44
+ /// Performs the action at the next possible opportunity, without options.
45
+ @inlinable
46
+ public func schedule(_ action: @escaping () -> Void) {
47
+ schedule(options: nil, action)
48
+ }
49
+
50
+ /// Performs the action at some time after the specified date.
51
+ ///
52
+ /// The immediate scheduler ignores `date` and performs the action immediately.
53
+ @inlinable
54
+ public func schedule(after date: SchedulerTimeType,
55
+ tolerance: SchedulerTimeType.Stride,
56
+ _ action: @escaping () -> Void) {
57
+ schedule(after: date, tolerance: tolerance, options: nil, action)
58
+ }
59
+
60
+ /// Performs the action at some time after the specified date, at the specified
61
+ /// frequency, taking into account tolerance if possible.
62
+ ///
63
+ /// The immediate scheduler ignores `date` and performs the action immediately.
64
+ @inlinable
65
+ public func schedule(after date: SchedulerTimeType,
66
+ interval: SchedulerTimeType.Stride,
67
+ tolerance: SchedulerTimeType.Stride,
68
+ _ action: @escaping () -> Void) -> Cancellable {
69
+ return schedule(after: date,
70
+ interval: interval,
71
+ tolerance: tolerance,
72
+ options: nil,
73
+ action)
74
+ }
75
+
76
+ /// Performs the action at some time after the specified date, at the specified
77
+ /// frequency, using minimum tolerance possible for this Scheduler.
78
+ ///
79
+ /// The immediate scheduler ignores `date` and performs the action immediately.
80
+ @inlinable
81
+ public func schedule(after date: SchedulerTimeType,
82
+ interval: SchedulerTimeType.Stride,
83
+ _ action: @escaping () -> Void) -> Cancellable {
84
+ return schedule(after: date,
85
+ interval: interval,
86
+ tolerance: minimumTolerance,
87
+ action)
88
+ }
89
+ }
@@ -0,0 +1,211 @@
1
+ // FoundationBridge's `DispatchQueue` and `RunLoop` as Combine schedulers, as
2
+ // Apple's Combine makes Dispatch's and Foundation's, so that
3
+ // `.debounce(for: .milliseconds(500), scheduler: DispatchQueue.main)` and
4
+ // `.receive(on: RunLoop.main)` work. Every queue is the main queue
5
+ // (FoundationBridge/Dispatch.swift): an action runs on the main actor's next
6
+ // turn, a later one after a sleep on the executor's clock (so headless runs
7
+ // keep their virtual time), and a repeating one until cancelled. Tolerances
8
+ // and options are accepted.
9
+ //
10
+ // `View.onReceive` takes Combine's publishers too (the SwiftUI shim's own
11
+ // takes its `_Publisher`s): values are delivered on the main actor while the
12
+ // view is on screen.
13
+
14
+ import Foundation
15
+ import FoundationBridge
16
+ import SwiftUI
17
+
18
+ // MARK: - DispatchQueue
19
+
20
+ extension FoundationBridge.DispatchQueue: Scheduler {
21
+ /// An instant: a `DispatchTime`.
22
+ public struct SchedulerTimeType: Strideable, Codable, Hashable, Sendable {
23
+ public var dispatchTime: FoundationBridge.DispatchTime
24
+
25
+ public init(_ time: FoundationBridge.DispatchTime) { dispatchTime = time }
26
+
27
+ public func distance(to other: SchedulerTimeType) -> Stride {
28
+ Stride(Int(Int64(bitPattern: other.dispatchTime.uptimeNanoseconds &- dispatchTime.uptimeNanoseconds)))
29
+ }
30
+
31
+ public func advanced(by n: Stride) -> SchedulerTimeType {
32
+ SchedulerTimeType(dispatchTime._adding(nanoseconds: Double(n.magnitude)))
33
+ }
34
+
35
+ public init(from decoder: any Decoder) throws {
36
+ self.init(FoundationBridge.DispatchTime(uptimeNanoseconds: try UInt64(from: decoder)))
37
+ }
38
+
39
+ public func encode(to encoder: any Encoder) throws {
40
+ try dispatchTime.uptimeNanoseconds.encode(to: encoder)
41
+ }
42
+
43
+ /// A span of time, in nanoseconds.
44
+ public struct Stride: SchedulerTimeIntervalConvertible, Comparable, SignedNumeric, ExpressibleByFloatLiteral,
45
+ Hashable, Codable, Sendable {
46
+ public var magnitude: Int
47
+
48
+ public init(_ nanoseconds: Int) { magnitude = nanoseconds }
49
+ public init(integerLiteral value: Int) { magnitude = value * 1_000_000_000 }
50
+ public init(floatLiteral value: Double) { magnitude = Int(value * 1_000_000_000) }
51
+ public init?<T: BinaryInteger>(exactly source: T) {
52
+ guard let value = Int(exactly: source) else { return nil }
53
+ magnitude = value
54
+ }
55
+
56
+ public static func seconds(_ s: Int) -> Stride { Stride(s * 1_000_000_000) }
57
+ public static func seconds(_ s: Double) -> Stride { Stride(Int(s * 1_000_000_000)) }
58
+ public static func milliseconds(_ ms: Int) -> Stride { Stride(ms * 1_000_000) }
59
+ public static func microseconds(_ us: Int) -> Stride { Stride(us * 1_000) }
60
+ public static func nanoseconds(_ ns: Int) -> Stride { Stride(ns) }
61
+
62
+ public static func < (lhs: Stride, rhs: Stride) -> Bool { lhs.magnitude < rhs.magnitude }
63
+ public static func + (lhs: Stride, rhs: Stride) -> Stride { Stride(lhs.magnitude + rhs.magnitude) }
64
+ public static func - (lhs: Stride, rhs: Stride) -> Stride { Stride(lhs.magnitude - rhs.magnitude) }
65
+ public static func * (lhs: Stride, rhs: Stride) -> Stride { Stride(lhs.magnitude * rhs.magnitude) }
66
+ public static func += (lhs: inout Stride, rhs: Stride) { lhs = lhs + rhs }
67
+ public static func -= (lhs: inout Stride, rhs: Stride) { lhs = lhs - rhs }
68
+ public static func *= (lhs: inout Stride, rhs: Stride) { lhs = lhs * rhs }
69
+ }
70
+ }
71
+
72
+ public struct SchedulerOptions: Sendable {}
73
+
74
+ public var now: SchedulerTimeType { SchedulerTimeType(.now()) }
75
+ public var minimumTolerance: SchedulerTimeType.Stride { SchedulerTimeType.Stride(0) }
76
+
77
+ public func schedule(options: SchedulerOptions?, _ action: @escaping () -> Void) {
78
+ async(execute: action)
79
+ }
80
+
81
+ public func schedule(after date: SchedulerTimeType, tolerance: SchedulerTimeType.Stride,
82
+ options: SchedulerOptions?, _ action: @escaping () -> Void) {
83
+ asyncAfter(deadline: date.dispatchTime, execute: action)
84
+ }
85
+
86
+ public func schedule(after date: SchedulerTimeType, interval: SchedulerTimeType.Stride,
87
+ tolerance: SchedulerTimeType.Stride, options: SchedulerOptions?,
88
+ _ action: @escaping () -> Void) -> any Cancellable {
89
+ _RepeatingSchedule.start(delay: max(0, Double(now.distance(to: date).magnitude)) / 1e9,
90
+ interval: Double(interval.magnitude) / 1e9, action: action)
91
+ }
92
+ }
93
+
94
+ // MARK: - RunLoop
95
+
96
+ extension FoundationBridge.RunLoop: Scheduler {
97
+ /// An instant: a `Date`.
98
+ public struct SchedulerTimeType: Strideable, Codable, Hashable, Sendable {
99
+ public var date: Date
100
+
101
+ public init(_ date: Date) { self.date = date }
102
+
103
+ public func distance(to other: SchedulerTimeType) -> Stride {
104
+ Stride(other.date.timeIntervalSince(date))
105
+ }
106
+
107
+ public func advanced(by n: Stride) -> SchedulerTimeType {
108
+ SchedulerTimeType(date.addingTimeInterval(n.magnitude))
109
+ }
110
+
111
+ /// A span of time, in seconds.
112
+ public struct Stride: SchedulerTimeIntervalConvertible, Comparable, SignedNumeric, ExpressibleByFloatLiteral,
113
+ Hashable, Codable, Sendable {
114
+ public var magnitude: TimeInterval
115
+
116
+ public init(_ timeInterval: TimeInterval) { magnitude = timeInterval }
117
+ public init(integerLiteral value: Int) { magnitude = TimeInterval(value) }
118
+ public init(floatLiteral value: Double) { magnitude = value }
119
+ public init?<T: BinaryInteger>(exactly source: T) {
120
+ guard let value = TimeInterval(exactly: source) else { return nil }
121
+ magnitude = value
122
+ }
123
+
124
+ public static func seconds(_ s: Int) -> Stride { Stride(TimeInterval(s)) }
125
+ public static func seconds(_ s: Double) -> Stride { Stride(s) }
126
+ public static func milliseconds(_ ms: Int) -> Stride { Stride(TimeInterval(ms) / 1e3) }
127
+ public static func microseconds(_ us: Int) -> Stride { Stride(TimeInterval(us) / 1e6) }
128
+ public static func nanoseconds(_ ns: Int) -> Stride { Stride(TimeInterval(ns) / 1e9) }
129
+
130
+ public static func < (lhs: Stride, rhs: Stride) -> Bool { lhs.magnitude < rhs.magnitude }
131
+ public static func + (lhs: Stride, rhs: Stride) -> Stride { Stride(lhs.magnitude + rhs.magnitude) }
132
+ public static func - (lhs: Stride, rhs: Stride) -> Stride { Stride(lhs.magnitude - rhs.magnitude) }
133
+ public static func * (lhs: Stride, rhs: Stride) -> Stride { Stride(lhs.magnitude * rhs.magnitude) }
134
+ public static func += (lhs: inout Stride, rhs: Stride) { lhs = lhs + rhs }
135
+ public static func -= (lhs: inout Stride, rhs: Stride) { lhs = lhs - rhs }
136
+ public static func *= (lhs: inout Stride, rhs: Stride) { lhs = lhs * rhs }
137
+ }
138
+ }
139
+
140
+ public struct SchedulerOptions: Sendable {}
141
+
142
+ public var now: SchedulerTimeType { SchedulerTimeType(Date()) }
143
+ public var minimumTolerance: SchedulerTimeType.Stride { SchedulerTimeType.Stride(0) }
144
+
145
+ public func schedule(options: SchedulerOptions?, _ action: @escaping () -> Void) {
146
+ FoundationBridge.DispatchQueue.main.async(execute: action)
147
+ }
148
+
149
+ public func schedule(after date: SchedulerTimeType, tolerance: SchedulerTimeType.Stride,
150
+ options: SchedulerOptions?, _ action: @escaping () -> Void) {
151
+ FoundationBridge.DispatchQueue.main.asyncAfter(deadline: .now() + max(0, date.date.timeIntervalSinceNow),
152
+ execute: action)
153
+ }
154
+
155
+ public func schedule(after date: SchedulerTimeType, interval: SchedulerTimeType.Stride,
156
+ tolerance: SchedulerTimeType.Stride, options: SchedulerOptions?,
157
+ _ action: @escaping () -> Void) -> any Cancellable {
158
+ _RepeatingSchedule.start(delay: max(0, date.date.timeIntervalSinceNow), interval: interval.magnitude, action: action)
159
+ }
160
+ }
161
+
162
+ /// A repeating action on the executor's clock, until cancelled.
163
+ final class _RepeatingSchedule: Cancellable, @unchecked Sendable {
164
+ private var task: Task<Void, Never>?
165
+
166
+ static func start(delay: Double, interval: Double, action: @escaping () -> Void) -> _RepeatingSchedule {
167
+ let schedule = _RepeatingSchedule()
168
+ nonisolated(unsafe) let action = action
169
+ schedule.task = Task { @MainActor in
170
+ try? await Task.sleep(for: .seconds(delay))
171
+ while !Task.isCancelled {
172
+ action()
173
+ try? await Task.sleep(for: .seconds(max(interval, 0.001)))
174
+ }
175
+ }
176
+ return schedule
177
+ }
178
+
179
+ func cancel() {
180
+ task?.cancel()
181
+ task = nil
182
+ }
183
+ }
184
+
185
+ // MARK: - onReceive
186
+
187
+ /// A Combine publisher as the shim's `_Publisher`, for `onReceive`.
188
+ struct _CombinePublisher<Upstream: Publisher>: _Publisher where Upstream.Failure == Never {
189
+ let upstream: Upstream
190
+
191
+ @MainActor func _subscribe(_ receive: @escaping @MainActor (Upstream.Output) -> Void) -> any _Cancellable {
192
+ let cancellable = upstream.sink { value in
193
+ MainActor.assumeIsolated { receive(value) }
194
+ }
195
+ return _CombineCancellable(cancellable: cancellable)
196
+ }
197
+ }
198
+
199
+ struct _CombineCancellable: _Cancellable, @unchecked Sendable {
200
+ let cancellable: AnyCancellable
201
+ func cancel() { cancellable.cancel() }
202
+ }
203
+
204
+ extension View {
205
+ /// Runs `action` with each value the Combine publisher sends while the view is on screen.
206
+ @_disfavoredOverload
207
+ public func onReceive<P: Publisher>(_ publisher: P, perform action: @escaping (P.Output) -> Void) -> some View
208
+ where P.Failure == Never {
209
+ onReceive(_CombinePublisher(upstream: publisher), perform: action)
210
+ }
211
+ }
@@ -0,0 +1,17 @@
1
+ //
2
+ // Subject+Void.swift
3
+ // OpenCombine
4
+ //
5
+ // Created by Sergej Jaskiewicz on 10.06.2019.
6
+ //
7
+
8
+ extension Subject where Output == Void {
9
+
10
+ /// Sends a void value to the subscriber.
11
+ ///
12
+ /// Use `Void` inputs and outputs when you want to signal that an event has occurred,
13
+ /// but don’t need to send the event itself.
14
+ public func send() {
15
+ send(())
16
+ }
17
+ }
@@ -0,0 +1,20 @@
1
+ //
2
+ // Subscriber+Void.swift
3
+ // OpenCombine
4
+ //
5
+ // Created by Sergej Jaskiewicz on 10.06.2019.
6
+ //
7
+
8
+ extension Subscriber where Input == Void {
9
+
10
+ /// Tells the subscriber that a publisher of void elements is ready to receive further
11
+ /// requests.
12
+ ///
13
+ /// Use `Void` inputs and outputs when you want to signal that an event has occurred,
14
+ /// but don’t need to send the event itself.
15
+ /// - Returns: A `Subscribers.Demand` instance indicating how many more elements
16
+ /// the subscriber expects to receive.
17
+ public func receive() -> Subscribers.Demand {
18
+ return receive(())
19
+ }
20
+ }
@@ -0,0 +1,175 @@
1
+ //
2
+ // Subscribers.Assign.swift
3
+ //
4
+ //
5
+ // Created by Sergej Jaskiewicz on 15.06.2019.
6
+ //
7
+
8
+ extension Subscribers {
9
+
10
+ /// A simple subscriber that assigns received elements to a property indicated by
11
+ /// a key path.
12
+ public final class Assign<Root, Input>: Subscriber,
13
+ Cancellable,
14
+ CustomStringConvertible,
15
+ CustomReflectable,
16
+ CustomPlaygroundDisplayConvertible
17
+ {
18
+ public typealias Failure = Never
19
+
20
+ private let lock = UnfairLock.allocate()
21
+
22
+ /// The object that contains the property to assign.
23
+ ///
24
+ /// The subscriber holds a strong reference to this object until the upstream
25
+ /// publisher calls `Subscriber.receive(completion:)`, at which point
26
+ /// the subscriber sets this property to `nil`.
27
+ public private(set) var object: Root?
28
+
29
+ /// The key path that indicates the property to assign.
30
+ public let keyPath: ReferenceWritableKeyPath<Root, Input>
31
+
32
+ private var status = SubscriptionStatus.awaitingSubscription
33
+
34
+ /// A textual representation of this subscriber.
35
+ public var description: String { return "Assign \(Root.self)." }
36
+
37
+ /// A mirror that reflects the subscriber.
38
+ public var customMirror: Mirror {
39
+ let children: [Mirror.Child] = [
40
+ ("object", object as Any),
41
+ ("keyPath", keyPath),
42
+ ("status", status as Any)
43
+ ]
44
+ return Mirror(self, children: children)
45
+ }
46
+
47
+ public var playgroundDescription: Any { return description }
48
+
49
+ /// Creates a subscriber to assign the value of a property indicated by
50
+ /// a key path.
51
+ ///
52
+ /// - Parameters:
53
+ /// - object: The object that contains the property. The subscriber assigns
54
+ /// the object’s property every time it receives a new value.
55
+ /// - keyPath: A key path that indicates the property to assign. See
56
+ /// [Key-Path Expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#ID563)
57
+ /// in _The Swift Programming Language_ to learn how to use key paths to
58
+ /// specify a property of an object.
59
+ public init(object: Root, keyPath: ReferenceWritableKeyPath<Root, Input>) {
60
+ self.object = object
61
+ self.keyPath = keyPath
62
+ }
63
+
64
+ deinit {
65
+ lock.deallocate()
66
+ }
67
+
68
+ public func receive(subscription: Subscription) {
69
+ lock.lock()
70
+ guard case .awaitingSubscription = status else {
71
+ lock.unlock()
72
+ subscription.cancel()
73
+ return
74
+ }
75
+ status = .subscribed(subscription)
76
+ lock.unlock()
77
+ subscription.request(.unlimited)
78
+ }
79
+
80
+ public func receive(_ value: Input) -> Subscribers.Demand {
81
+ lock.lock()
82
+ guard case .subscribed = status, let object = self.object else {
83
+ lock.unlock()
84
+ return .none
85
+ }
86
+ lock.unlock()
87
+ object[keyPath: keyPath] = value
88
+ return .none
89
+ }
90
+
91
+ public func receive(completion: Subscribers.Completion<Never>) {
92
+ lock.lock()
93
+ guard case .subscribed = status else {
94
+ lock.unlock()
95
+ return
96
+ }
97
+ terminateAndConsumeLock()
98
+ }
99
+
100
+ public func cancel() {
101
+ lock.lock()
102
+ guard case let .subscribed(subscription) = status else {
103
+ lock.unlock()
104
+ return
105
+ }
106
+ terminateAndConsumeLock()
107
+ subscription.cancel()
108
+ }
109
+
110
+ private func terminateAndConsumeLock() {
111
+ #if DEBUG
112
+ lock.assertOwner()
113
+ #endif
114
+ status = .terminal
115
+
116
+ // We MUST release the object AFTER unlocking the lock,
117
+ // since releasing it may trigger execution of arbitrary code,
118
+ // for example, if the object has a deinit.
119
+ // When the object deallocates, its deinit is called, and holding
120
+ // the lock at that moment can lead to deadlocks.
121
+
122
+ withExtendedLifetime(object) {
123
+ object = nil
124
+ lock.unlock()
125
+ }
126
+ }
127
+ }
128
+ }
129
+
130
+ extension Publisher where Failure == Never {
131
+
132
+ /// Assigns each element from a publisher to a property on an object.
133
+ ///
134
+ /// Use the `assign(to:on:)` subscriber when you want to set a given property each
135
+ /// time a publisher produces a value.
136
+ ///
137
+ /// In this example, the `assign(to:on:)` sets the value of the `anInt` property on
138
+ /// an instance of `MyClass`:
139
+ ///
140
+ /// class MyClass {
141
+ /// var anInt: Int = 0 {
142
+ /// didSet {
143
+ /// print("anInt was set to: \(anInt)", terminator: "; ")
144
+ /// }
145
+ /// }
146
+ /// }
147
+ ///
148
+ /// var myObject = MyClass()
149
+ /// let myRange = (0...2)
150
+ /// cancellable = myRange.publisher
151
+ /// .assign(to: \.anInt, on: myObject)
152
+ ///
153
+ /// // Prints: "anInt was set to: 0; anInt was set to: 1; anInt was set to: 2"
154
+ ///
155
+ /// > Important: The `Subscribers.Assign` instance created by this operator maintains
156
+ /// a strong reference to `object`, and sets it to `nil` when the upstream publisher
157
+ /// completes (either normally or with an error).
158
+ ///
159
+ /// - Parameters:
160
+ /// - keyPath: A key path that indicates the property to assign. See
161
+ /// [Key-Path Expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#ID563)
162
+ /// in _The Swift Programming Language_ to learn how to use key paths to specify
163
+ /// a property of an object.
164
+ /// - object: The object that contains the property. The subscriber assigns
165
+ /// the object’s property every time it receives a new value.
166
+ /// - Returns: An `AnyCancellable` instance. Call `cancel()` on this instance when you
167
+ /// no longer want the publisher to automatically assign the property.
168
+ /// Deinitializing this instance will also cancel automatic assignment.
169
+ public func assign<Root>(to keyPath: ReferenceWritableKeyPath<Root, Output>,
170
+ on object: Root) -> AnyCancellable {
171
+ let subscriber = Subscribers.Assign(object: object, keyPath: keyPath)
172
+ subscribe(subscriber)
173
+ return AnyCancellable(subscriber)
174
+ }
175
+ }
@@ -0,0 +1,90 @@
1
+ //
2
+ // Subscribers.Completion.swift
3
+ //
4
+ //
5
+ // Created by Sergej Jaskiewicz on 11.06.2019.
6
+ //
7
+
8
+ #if canImport(_Concurrency) && compiler(>=5.5)
9
+ import _Concurrency
10
+ #endif
11
+
12
+ extension Subscribers {
13
+
14
+ /// A signal that a publisher doesn’t produce additional elements, either due to
15
+ /// normal completion or an error.
16
+ public enum Completion<Failure: Error> {
17
+
18
+ /// The publisher finished normally.
19
+ case finished
20
+
21
+ /// The publisher stopped publishing due to the indicated error.
22
+ case failure(Failure)
23
+ }
24
+ }
25
+
26
+ extension Subscribers.Completion: Equatable where Failure: Equatable {}
27
+
28
+ extension Subscribers.Completion: Hashable where Failure: Hashable {}
29
+
30
+ #if canImport(_Concurrency) && compiler(>=5.5) || compiler(>=5.5.1)
31
+ extension Subscribers.Completion: Sendable {}
32
+ #endif
33
+
34
+ extension Subscribers.Completion {
35
+ private enum CodingKeys: String, CodingKey {
36
+ case success = "success"
37
+ case error = "error"
38
+ }
39
+ }
40
+
41
+ extension Subscribers.Completion: Encodable where Failure: Encodable {
42
+
43
+ public func encode(to encoder: Encoder) throws {
44
+ var container = encoder.container(keyedBy: CodingKeys.self)
45
+ switch self {
46
+ case .finished:
47
+ try container.encode(true, forKey: .success)
48
+ case .failure(let error):
49
+ try container.encode(false, forKey: .success)
50
+ try container.encode(error, forKey: .error)
51
+ }
52
+ }
53
+ }
54
+
55
+ extension Subscribers.Completion: Decodable where Failure: Decodable {
56
+ public init(from decoder: Decoder) throws {
57
+ let container = try decoder.container(keyedBy: CodingKeys.self)
58
+ let success = try container.decode(Bool.self, forKey: .success)
59
+ if success {
60
+ self = .finished
61
+ } else {
62
+ let error = try container.decode(Failure.self, forKey: .error)
63
+ self = .failure(error)
64
+ }
65
+ }
66
+ }
67
+
68
+ extension Subscribers.Completion {
69
+
70
+ /// Erases the `Failure` type to `Swift.Error`. This function exists
71
+ /// because in Swift user-defined generic types are always
72
+ /// [invariant](https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)).
73
+ internal func eraseError() -> Subscribers.Completion<Error> {
74
+ switch self {
75
+ case .finished:
76
+ return .finished
77
+ case .failure(let error):
78
+ return .failure(error)
79
+ }
80
+ }
81
+
82
+ internal var failure: Failure? {
83
+ switch self {
84
+ case .finished:
85
+ return nil
86
+ case .failure(let failure):
87
+ return failure
88
+ }
89
+ }
90
+ }