@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,197 @@
1
+ //
2
+ // Publishers.SubscribeOn.swift
3
+ //
4
+ //
5
+ // Created by Sergej Jaskiewicz on 02.12.2019.
6
+ //
7
+
8
+ extension Publisher {
9
+
10
+ /// Specifies the scheduler on which to perform subscribe, cancel, and request
11
+ /// operations.
12
+ ///
13
+ /// In contrast with `receive(on:options:)`, which affects downstream messages,
14
+ /// `subscribe(on:options:)` changes the execution context of upstream messages.
15
+ ///
16
+ /// In the following example, the `subscribe(on:options:)` operator causes
17
+ /// `ioPerformingPublisher` to receive requests on `backgroundQueue`, while
18
+ /// the `receive(on:options:)` causes `uiUpdatingSubscriber` to receive elements and
19
+ /// completion on `RunLoop.main`.
20
+ ///
21
+ /// let ioPerformingPublisher == // Some publisher.
22
+ /// let uiUpdatingSubscriber == // Some subscriber that updates the UI.
23
+ ///
24
+ /// ioPerformingPublisher
25
+ /// .subscribe(on: backgroundQueue)
26
+ /// .receive(on: RunLoop.main)
27
+ /// .subscribe(uiUpdatingSubscriber)
28
+ ///
29
+ ///
30
+ /// Using `subscribe(on:options:)` also causes the upstream publisher to perform
31
+ /// `cancel()` using the specfied scheduler.
32
+ ///
33
+ /// - Parameters:
34
+ /// - scheduler: The scheduler used to send messages to upstream publishers.
35
+ /// - options: Options that customize the delivery of elements.
36
+ /// - Returns: A publisher which performs upstream operations on the specified
37
+ /// scheduler.
38
+ public func subscribe<Context: Scheduler>(
39
+ on scheduler: Context,
40
+ options: Context.SchedulerOptions? = nil
41
+ ) -> Publishers.SubscribeOn<Self, Context> {
42
+ return .init(upstream: self, scheduler: scheduler, options: options)
43
+ }
44
+ }
45
+
46
+ extension Publishers {
47
+
48
+ /// A publisher that receives elements from an upstream publisher on a specific
49
+ /// scheduler.
50
+ public struct SubscribeOn<Upstream: Publisher, Context: Scheduler>: Publisher {
51
+
52
+ public typealias Output = Upstream.Output
53
+
54
+ public typealias Failure = Upstream.Failure
55
+
56
+ /// The publisher from which this publisher receives elements.
57
+ public let upstream: Upstream
58
+
59
+ /// The scheduler the publisher should use to receive elements.
60
+ public let scheduler: Context
61
+
62
+ /// Scheduler options that customize the delivery of elements.
63
+ public let options: Context.SchedulerOptions?
64
+
65
+ public init(upstream: Upstream,
66
+ scheduler: Context,
67
+ options: Context.SchedulerOptions?) {
68
+ self.upstream = upstream
69
+ self.scheduler = scheduler
70
+ self.options = options
71
+ }
72
+
73
+ public func receive<Downstream: Subscriber>(subscriber: Downstream)
74
+ where Upstream.Failure == Downstream.Failure,
75
+ Upstream.Output == Downstream.Input
76
+ {
77
+ let inner = Inner(scheduler: scheduler,
78
+ options: options,
79
+ downstream: subscriber)
80
+ scheduler.schedule(options: options) {
81
+ self.upstream.subscribe(inner)
82
+ }
83
+ }
84
+ }
85
+ }
86
+
87
+ extension Publishers.SubscribeOn {
88
+ private final class Inner<Downstream: Subscriber>
89
+ : Subscriber,
90
+ Subscription,
91
+ CustomStringConvertible,
92
+ CustomReflectable,
93
+ CustomPlaygroundDisplayConvertible
94
+ where Downstream.Input == Upstream.Output, Downstream.Failure == Upstream.Failure
95
+ {
96
+ typealias Input = Upstream.Output
97
+
98
+ typealias Failure = Upstream.Failure
99
+
100
+ private let lock = UnfairLock.allocate()
101
+ private let downstream: Downstream
102
+ private let scheduler: Context
103
+ private let options: Context.SchedulerOptions?
104
+ private var state = SubscriptionStatus.awaitingSubscription
105
+ private let upstreamLock = UnfairLock.allocate()
106
+
107
+ init(scheduler: Context,
108
+ options: Context.SchedulerOptions?,
109
+ downstream: Downstream) {
110
+ self.downstream = downstream
111
+ self.scheduler = scheduler
112
+ self.options = options
113
+ }
114
+
115
+ deinit {
116
+ lock.deallocate()
117
+ upstreamLock.deallocate()
118
+ }
119
+
120
+ func receive(subscription: Subscription) {
121
+ lock.lock()
122
+ guard case .awaitingSubscription = state else {
123
+ lock.unlock()
124
+ subscription.cancel()
125
+ return
126
+ }
127
+ state = .subscribed(subscription)
128
+ lock.unlock()
129
+ downstream.receive(subscription: self)
130
+ }
131
+
132
+ func receive(_ input: Input) -> Subscribers.Demand {
133
+ lock.lock()
134
+ guard case .subscribed = state else {
135
+ lock.unlock()
136
+ return .none
137
+ }
138
+ lock.unlock()
139
+ return downstream.receive(input)
140
+ }
141
+
142
+ func receive(completion: Subscribers.Completion<Failure>) {
143
+ lock.lock()
144
+ guard case .subscribed = state else {
145
+ lock.unlock()
146
+ return
147
+ }
148
+ state = .terminal
149
+ lock.unlock()
150
+ downstream.receive(completion: completion)
151
+ }
152
+
153
+ func request(_ demand: Subscribers.Demand) {
154
+ lock.lock()
155
+ guard case let .subscribed(subscription) = state else {
156
+ lock.unlock()
157
+ return
158
+ }
159
+ lock.unlock()
160
+ scheduler.schedule(options: options) {
161
+ self.scheduledRequest(demand, subscription: subscription)
162
+ }
163
+ }
164
+
165
+ private func scheduledRequest(_ demand: Subscribers.Demand,
166
+ subscription: Subscription) {
167
+ upstreamLock.lock()
168
+ subscription.request(demand)
169
+ upstreamLock.unlock()
170
+ }
171
+
172
+ func cancel() {
173
+ lock.lock()
174
+ guard case let .subscribed(subscription) = state else {
175
+ lock.unlock()
176
+ return
177
+ }
178
+ state = .terminal
179
+ lock.unlock()
180
+ scheduler.schedule(options: options) {
181
+ self.scheduledCancel(subscription)
182
+ }
183
+ }
184
+
185
+ private func scheduledCancel(_ subscription: Subscription) {
186
+ upstreamLock.lock()
187
+ subscription.cancel()
188
+ upstreamLock.unlock()
189
+ }
190
+
191
+ var description: String { return "SubscribeOn" }
192
+
193
+ var customMirror: Mirror { return Mirror(self, children: EmptyCollection()) }
194
+
195
+ var playgroundDescription: Any { return description }
196
+ }
197
+ }
@@ -0,0 +1,444 @@
1
+ //
2
+ // Publishers.SwitchToLatest.swift
3
+ //
4
+ //
5
+ // Created by Sergej Jaskiewicz on 07.01.2020.
6
+ //
7
+
8
+ extension Publisher where Output: Publisher, Output.Failure == Failure {
9
+
10
+ /// Republishes elements sent by the most recently received publisher.
11
+ ///
12
+ /// This operator works with an upstream publisher of publishers, flattening
13
+ /// the stream of elements to appear as if they were coming from a single stream of
14
+ /// elements. It switches the inner publisher as new ones arrive but keeps the outer
15
+ /// publisher constant for downstream subscribers.
16
+ ///
17
+ /// For example, given the type `AnyPublisher<URLSession.DataTaskPublisher, NSError>`,
18
+ /// calling `switchToLatest()` results in the type
19
+ /// `SwitchToLatest<(Data, URLResponse), URLError>`.
20
+ /// The downstream subscriber sees a continuous stream of `(Data, URLResponse)`
21
+ /// elements from what looks like a single `URLSession.DataTaskPublisher` even though
22
+ /// the elements are coming from different upstream publishers.
23
+ ///
24
+ /// When this operator receives a new publisher from the upstream publisher, it
25
+ /// cancels its previous subscription. Use this feature to prevent earlier publishers
26
+ /// from performing unnecessary work, such as creating network request publishers from
27
+ /// frequently updating user interface publishers.
28
+ ///
29
+ /// The following example updates a `PassthroughSubject` with a new value every
30
+ /// `0.1` seconds. A `map(_:)` operator receives the new value and uses it to create
31
+ /// a new `URLSession.DataTaskPublisher`. By using the `switchToLatest()` operator,
32
+ /// the downstream sink subscriber receives the `(Data, URLResponse)` output type from
33
+ /// the data task publishers, rather than the `URLSession.DataTaskPublisher` type
34
+ /// produced by the `map(_:)` operator. Furthermore, creating each new data task
35
+ /// publisher cancels the previous data task publisher.
36
+ ///
37
+ /// let subject = PassthroughSubject<Int, Never>()
38
+ /// cancellable = subject
39
+ /// .setFailureType(to: URLError.self)
40
+ /// .map() { index -> URLSession.DataTaskPublisher in
41
+ /// let url = URL(string: "https://example.org/get?index=\(index)")!
42
+ /// return URLSession.shared.dataTaskPublisher(for: url)
43
+ /// }
44
+ /// .switchToLatest()
45
+ /// .sink(receiveCompletion: { print("Complete: \($0)") },
46
+ /// receiveValue: { (data, response) in
47
+ /// guard let url = response.url else {
48
+ /// print("Bad response.")
49
+ /// return
50
+ /// }
51
+ /// print("URL: \(url)")
52
+ /// })
53
+ ///
54
+ /// for index in 1...5 {
55
+ /// DispatchQueue.main.asyncAfter(deadline: .now() + TimeInterval(index/10)) {
56
+ /// subject.send(index)
57
+ /// }
58
+ /// }
59
+ ///
60
+ /// // Prints "URL: https://example.org/get?index=5"
61
+ ///
62
+ /// The exact behavior of this example depends on the value of `asyncAfter` and
63
+ /// the speed of the network connection. If the delay value is longer, or the network
64
+ /// connection is fast, the earlier data tasks may complete before `switchToLatest()`
65
+ /// can cancel them. If this happens, the output includes multiple URLs whose tasks
66
+ /// complete before cancellation.
67
+ public func switchToLatest() -> Publishers.SwitchToLatest<Output, Self> {
68
+ return .init(upstream: self)
69
+ }
70
+ }
71
+
72
+ extension Publisher where Output: Publisher, Failure == Never {
73
+
74
+ /// Republishes elements sent by the most recently received publisher.
75
+ ///
76
+ /// This operator works with an upstream publisher of publishers, flattening
77
+ /// the stream of elements to appear as if they were coming from a single stream of
78
+ /// elements. It switches the inner publisher as new ones arrive but keeps the outer
79
+ /// publisher constant for downstream subscribers.
80
+ ///
81
+ /// When this operator receives a new publisher from the upstream publisher, it
82
+ /// cancels its previous subscription. Use this feature to prevent earlier publishers
83
+ /// from performing unnecessary work, such as creating network request publishers from
84
+ /// frequently updating user interface publishers.
85
+ public func switchToLatest() -> Publishers.SwitchToLatest<
86
+ Output, Publishers.SetFailureType<Self, Output.Failure>
87
+ > {
88
+ return setFailureType(to: Output.Failure.self).switchToLatest()
89
+ }
90
+ }
91
+
92
+ extension Publisher where Output: Publisher, Failure == Never, Output.Failure == Never {
93
+
94
+ /// Republishes elements sent by the most recently received publisher.
95
+ ///
96
+ /// This operator works with an upstream publisher of publishers, flattening
97
+ /// the stream of elements to appear as if they were coming from a single stream of
98
+ /// elements. It switches the inner publisher as new ones arrive but keeps the outer
99
+ /// publisher constant for downstream subscribers.
100
+ ///
101
+ /// When this operator receives a new publisher from the upstream publisher, it
102
+ /// cancels its previous subscription. Use this feature to prevent earlier publishers
103
+ /// from performing unnecessary work, such as creating network request publishers from
104
+ /// frequently updating user interface publishers.
105
+ public func switchToLatest() -> Publishers.SwitchToLatest<Output, Self> {
106
+ return .init(upstream: self)
107
+ }
108
+ }
109
+
110
+ extension Publisher where Output: Publisher, Output.Failure == Never {
111
+
112
+ /// Republishes elements sent by the most recently received publisher.
113
+ ///
114
+ /// This operator works with an upstream publisher of publishers, flattening
115
+ /// the stream of elements to appear as if they were coming from a single stream of
116
+ /// elements. It switches the inner publisher as new ones arrive but keeps the outer
117
+ /// publisher constant for downstream subscribers.
118
+ ///
119
+ /// When this operator receives a new publisher from the upstream publisher, it
120
+ /// cancels its previous subscription. Use this feature to prevent earlier publishers
121
+ /// from performing unnecessary work, such as creating network request publishers from
122
+ /// frequently updating user interface publishers.
123
+ public func switchToLatest() -> Publishers.SwitchToLatest<
124
+ Publishers.SetFailureType<Output, Failure>,
125
+ Publishers.Map<Self, Publishers.SetFailureType<Output, Failure>>
126
+ > {
127
+ return map { $0.setFailureType(to: Failure.self) }.switchToLatest()
128
+ }
129
+ }
130
+
131
+ extension Publishers {
132
+
133
+ /// A publisher that flattens nested publishers.
134
+ ///
135
+ /// Given a publisher that publishes `Publisher` instances,
136
+ /// the `Publishers.SwitchToLatest` publisher produces a sequence of events from only
137
+ /// the most recent one. For example, given the type
138
+ /// `AnyPublisher<URLSession.DataTaskPublisher, NSError>`, calling `switchToLatest()`
139
+ /// results in the type `SwitchToLatest<(Data, URLResponse), URLError>`.
140
+ /// The downstream subscriber sees a continuous stream of `(Data, URLResponse)`
141
+ /// elements from what looks like a single `URLSession.DataTaskPublisher` even though
142
+ /// the elements are coming from different upstream publishers.
143
+ ///
144
+ /// When `Publishers.SwitchToLatest` receives a new publisher from the upstream
145
+ /// publisher, it cancels its previous subscription. Use this feature to prevent
146
+ /// earlier publishers from performing unnecessary work, such as creating network
147
+ /// request publishers from frequently-updating user interface publishers.
148
+ public struct SwitchToLatest<NestedPublisher: Publisher, Upstream: Publisher>
149
+ : Publisher
150
+ where Upstream.Output == NestedPublisher,
151
+ Upstream.Failure == NestedPublisher.Failure
152
+ {
153
+ public typealias Output = NestedPublisher.Output
154
+
155
+ public typealias Failure = NestedPublisher.Failure
156
+
157
+ /// The publisher from which this publisher receives elements.
158
+ public let upstream: Upstream
159
+
160
+ /// Creates a publisher that “flattens” nested publishers.
161
+ ///
162
+ /// - Parameter upstream: The publisher from which this publisher receives
163
+ /// elements.
164
+ public init(upstream: Upstream) {
165
+ self.upstream = upstream
166
+ }
167
+
168
+ public func receive<Downstream: Subscriber>(subscriber: Downstream)
169
+ where Downstream.Input == Output, Downstream.Failure == Failure
170
+ {
171
+ let outer = Outer(downstream: subscriber)
172
+ subscriber.receive(subscription: outer)
173
+ upstream.subscribe(outer)
174
+ }
175
+ }
176
+ }
177
+
178
+ extension Publishers.SwitchToLatest {
179
+ fileprivate final class Outer<Downstream: Subscriber>
180
+ : Subscriber,
181
+ Subscription,
182
+ CustomStringConvertible,
183
+ CustomReflectable,
184
+ CustomPlaygroundDisplayConvertible
185
+ where Downstream.Input == NestedPublisher.Output,
186
+ Downstream.Failure == Upstream.Failure
187
+ {
188
+ typealias Input = Upstream.Output
189
+
190
+ typealias Failure = Upstream.Failure
191
+
192
+ private let downstream: Downstream
193
+ private var outerSubscription: Subscription?
194
+ private var currentInnerSubscription: Subscription?
195
+ private var currentInnerIndex: UInt64 = 0
196
+ private var nextInnerIndex: UInt64 = 1
197
+ private let lock = UnfairLock.allocate()
198
+ private let downstreamLock = UnfairRecursiveLock.allocate()
199
+ private var cancelled = false
200
+ private var finished = false
201
+ private var sentCompletion = false
202
+ private var awaitingInnerSubscription = false
203
+ private var downstreamDemand = Subscribers.Demand.none
204
+
205
+ init(downstream: Downstream) {
206
+ self.downstream = downstream
207
+ }
208
+
209
+ deinit {
210
+ lock.deallocate()
211
+ downstreamLock.deallocate()
212
+ }
213
+
214
+ func receive(subscription: Subscription) {
215
+ lock.lock()
216
+ guard outerSubscription == nil && !cancelled else {
217
+ lock.unlock()
218
+ subscription.cancel()
219
+ return
220
+ }
221
+ outerSubscription = subscription
222
+ lock.unlock()
223
+ subscription.request(.unlimited)
224
+ }
225
+
226
+ func receive(_ input: Input) -> Subscribers.Demand {
227
+ lock.lock()
228
+ if cancelled || finished {
229
+ lock.unlock()
230
+ return .none
231
+ }
232
+
233
+ if let currentInnerSubscription = self.currentInnerSubscription.take() {
234
+ lock.unlock()
235
+ currentInnerSubscription.cancel()
236
+ lock.lock()
237
+ }
238
+
239
+ let index = nextInnerIndex
240
+ currentInnerIndex = index
241
+ nextInnerIndex += 1
242
+ awaitingInnerSubscription = true
243
+ lock.unlock()
244
+ input.subscribe(Side(inner: self, index: index))
245
+ return .none
246
+ }
247
+
248
+ func receive(completion: Subscribers.Completion<Failure>) {
249
+ lock.lock()
250
+ outerSubscription = nil
251
+ finished = true
252
+
253
+ if cancelled {
254
+ lock.unlock()
255
+ return
256
+ }
257
+
258
+ switch completion {
259
+ case .finished:
260
+ if awaitingInnerSubscription {
261
+ lock.unlock()
262
+ return
263
+ }
264
+ if currentInnerSubscription == nil {
265
+ sentCompletion = true
266
+ lock.unlock()
267
+ downstreamLock.lock()
268
+ downstream.receive(completion: completion)
269
+ downstreamLock.unlock()
270
+ } else {
271
+ lock.unlock()
272
+ }
273
+ case .failure:
274
+ let currentInnerSubscription = self.currentInnerSubscription.take()
275
+ sentCompletion = true
276
+ lock.unlock()
277
+ currentInnerSubscription?.cancel()
278
+ downstreamLock.lock()
279
+ downstream.receive(completion: completion)
280
+ downstreamLock.unlock()
281
+ }
282
+ }
283
+
284
+ func request(_ demand: Subscribers.Demand) {
285
+ demand.assertNonZero()
286
+ lock.lock()
287
+ downstreamDemand += demand
288
+ if let currentInnerSubscription = self.currentInnerSubscription {
289
+ lock.unlock()
290
+ currentInnerSubscription.request(demand)
291
+ } else {
292
+ lock.unlock()
293
+ }
294
+ }
295
+
296
+ func cancel() {
297
+ lock.lock()
298
+ cancelled = true
299
+ let currentInnerSubscription = self.currentInnerSubscription.take()
300
+ let outerSubscription = self.outerSubscription.take()
301
+ lock.unlock()
302
+
303
+ currentInnerSubscription?.cancel()
304
+ outerSubscription?.cancel()
305
+ }
306
+
307
+ var description: String { return "SwitchToLatest" }
308
+
309
+ var customMirror: Mirror {
310
+ return Mirror(self, children: EmptyCollection())
311
+ }
312
+
313
+ var playgroundDescription: Any { return description }
314
+
315
+ private func receiveInner(subscription: Subscription, _ index: UInt64) {
316
+ lock.lock()
317
+ guard currentInnerIndex == index &&
318
+ !cancelled &&
319
+ currentInnerSubscription == nil else {
320
+ lock.unlock()
321
+ subscription.cancel()
322
+ return
323
+ }
324
+
325
+ currentInnerSubscription = subscription
326
+ awaitingInnerSubscription = false
327
+ let downstreamDemand = self.downstreamDemand
328
+ lock.unlock()
329
+ if downstreamDemand > 0 {
330
+ subscription.request(downstreamDemand)
331
+ }
332
+ }
333
+
334
+ private func receiveInner(_ input: NestedPublisher.Output,
335
+ _ index: UInt64) -> Subscribers.Demand {
336
+ lock.lock()
337
+ guard currentInnerIndex == index && !cancelled else {
338
+ lock.unlock()
339
+ return .none
340
+ }
341
+
342
+ // This will crash if we don't have any demand yet.
343
+ // Combine crashes here too.
344
+ downstreamDemand -= 1
345
+
346
+ lock.unlock()
347
+ downstreamLock.lock()
348
+ let newDemand = downstream.receive(input)
349
+ downstreamLock.unlock()
350
+ if newDemand > 0 {
351
+ lock.lock()
352
+ downstreamDemand += newDemand
353
+ lock.unlock()
354
+ }
355
+
356
+ return newDemand
357
+ }
358
+
359
+ private func receiveInner(completion: Subscribers.Completion<Failure>,
360
+ _ index: UInt64) {
361
+ lock.lock()
362
+ guard currentInnerIndex == index && !cancelled else {
363
+ lock.unlock()
364
+ return
365
+ }
366
+ precondition(!awaitingInnerSubscription, "Unexpected completion")
367
+ currentInnerSubscription = nil
368
+ switch completion {
369
+ case .finished:
370
+ if sentCompletion || !finished {
371
+ lock.unlock()
372
+ return
373
+ }
374
+ sentCompletion = true
375
+ lock.unlock()
376
+ downstreamLock.lock()
377
+ downstream.receive(completion: completion)
378
+ downstreamLock.unlock()
379
+ case .failure:
380
+ if sentCompletion {
381
+ lock.unlock()
382
+ return
383
+ }
384
+ cancelled = true
385
+ let outerSubscription = self.outerSubscription.take()
386
+ sentCompletion = true
387
+ lock.unlock()
388
+ outerSubscription?.cancel()
389
+ downstreamLock.lock()
390
+ downstream.receive(completion: completion)
391
+ downstreamLock.unlock()
392
+ }
393
+ }
394
+ }
395
+ }
396
+
397
+ extension Publishers.SwitchToLatest.Outer {
398
+ private struct Side
399
+ : Subscriber,
400
+ CustomStringConvertible,
401
+ CustomReflectable,
402
+ CustomPlaygroundDisplayConvertible
403
+ {
404
+ typealias Input = NestedPublisher.Output
405
+
406
+ typealias Failure = NestedPublisher.Failure
407
+
408
+ typealias Outer =
409
+ Publishers.SwitchToLatest<NestedPublisher, Upstream>.Outer<Downstream>
410
+
411
+ private let index: UInt64
412
+ private let outer: Outer
413
+
414
+ let combineIdentifier = CombineIdentifier()
415
+
416
+ init(inner: Outer, index: UInt64) {
417
+ self.index = index
418
+ self.outer = inner
419
+ }
420
+
421
+ func receive(subscription: Subscription) {
422
+ outer.receiveInner(subscription: subscription, index)
423
+ }
424
+
425
+ func receive(_ input: Input) -> Subscribers.Demand {
426
+ return outer.receiveInner(input, index)
427
+ }
428
+
429
+ func receive(completion: Subscribers.Completion<Failure>) {
430
+ outer.receiveInner(completion: completion, index)
431
+ }
432
+
433
+ var description: String { return "SwitchToLatest" }
434
+
435
+ var customMirror: Mirror {
436
+ let children = CollectionOfOne<Mirror.Child>(
437
+ ("parentSubscription", outer.combineIdentifier)
438
+ )
439
+ return Mirror(self, children: children)
440
+ }
441
+
442
+ var playgroundDescription: Any { return description }
443
+ }
444
+ }