@swiftbrowser/swift 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/Package.swift +214 -0
  2. package/README.md +10 -2
  3. package/Sources/AVFoundation/AVFoundation.swift +131 -0
  4. package/Sources/AVFoundation/Asset.swift +487 -0
  5. package/Sources/AVFoundation/AudioSession.swift +144 -0
  6. package/Sources/AVFoundation/CMTime.swift +303 -0
  7. package/Sources/AVFoundation/Capture.swift +688 -0
  8. package/Sources/AVFoundation/Player.swift +749 -0
  9. package/Sources/AVFoundation/PlayerView.swift +117 -0
  10. package/Sources/AVKit/AVKit.swift +132 -0
  11. package/Sources/Accelerate/Accelerate.swift +122 -0
  12. package/Sources/AppIntents/AppIntents.swift +144 -0
  13. package/Sources/AppIntents/Parameters.swift +220 -0
  14. package/Sources/AppIntents/Shortcuts.swift +159 -0
  15. package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
  16. package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
  17. package/Sources/AuthenticationServices/Authorization.swift +251 -0
  18. package/Sources/Charts/Charts.swift +61 -0
  19. package/Sources/Combine/AnyCancellable.swift +65 -0
  20. package/Sources/Combine/AnyPublisher.swift +148 -0
  21. package/Sources/Combine/AnySubscriber.swift +230 -0
  22. package/Sources/Combine/Cancellable.swift +35 -0
  23. package/Sources/Combine/Codable.swift +29 -0
  24. package/Sources/Combine/CombineIdentifier.swift +45 -0
  25. package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
  26. package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
  27. package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
  28. package/Sources/Combine/CurrentValueSubject.swift +252 -0
  29. package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
  30. package/Sources/Combine/Future.swift +228 -0
  31. package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
  32. package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
  33. package/Sources/Combine/Helpers/ConduitList.swift +59 -0
  34. package/Sources/Combine/Helpers/DebugHook.swift +177 -0
  35. package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
  36. package/Sources/Combine/Helpers/Locking.swift +30 -0
  37. package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
  38. package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
  39. package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
  40. package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
  41. package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
  42. package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
  43. package/Sources/Combine/Helpers/Utils.swift +30 -0
  44. package/Sources/Combine/Helpers/Violations.swift +33 -0
  45. package/Sources/Combine/ImmediateScheduler.swift +178 -0
  46. package/Sources/Combine/LICENSE +21 -0
  47. package/Sources/Combine/NotificationPublisher.swift +48 -0
  48. package/Sources/Combine/ObjectWillChange.swift +46 -0
  49. package/Sources/Combine/PassthroughSubject.swift +222 -0
  50. package/Sources/Combine/Publisher+Subscribe.swift +53 -0
  51. package/Sources/Combine/Publishers/Deferred.swift +48 -0
  52. package/Sources/Combine/Publishers/Empty.swift +54 -0
  53. package/Sources/Combine/Publishers/Fail.swift +42 -0
  54. package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
  55. package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
  56. package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
  57. package/Sources/Combine/Publishers/Just.swift +313 -0
  58. package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
  59. package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
  60. package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
  61. package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
  62. package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
  63. package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
  64. package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
  65. package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
  66. package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
  67. package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
  68. package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
  69. package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
  70. package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
  71. package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
  72. package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
  73. package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
  74. package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
  75. package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
  76. package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
  77. package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
  78. package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
  79. package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
  80. package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
  81. package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
  82. package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
  83. package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
  84. package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
  85. package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
  86. package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
  87. package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
  88. package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
  89. package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
  90. package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
  91. package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
  92. package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
  93. package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
  94. package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
  95. package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
  96. package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
  97. package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
  98. package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
  99. package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
  100. package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
  101. package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
  102. package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
  103. package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
  104. package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
  105. package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
  106. package/Sources/Combine/Publishers/Publishers.swift +13 -0
  107. package/Sources/Combine/Publishers/Record.swift +237 -0
  108. package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
  109. package/Sources/Combine/Result.swift +46 -0
  110. package/Sources/Combine/Scheduler.swift +89 -0
  111. package/Sources/Combine/Schedulers.swift +211 -0
  112. package/Sources/Combine/Subject+Void.swift +17 -0
  113. package/Sources/Combine/Subscriber+Void.swift +20 -0
  114. package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
  115. package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
  116. package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
  117. package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
  118. package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
  119. package/Sources/Combine/Subscription.swift +22 -0
  120. package/Sources/Combine/Subscriptions.swift +42 -0
  121. package/Sources/Combine/SwiftUIObservation.swift +10 -0
  122. package/Sources/Combine/_Introspection.swift +107 -0
  123. package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
  124. package/Sources/Compression/Compression.swift +365 -0
  125. package/Sources/Compression/Deflate.swift +407 -0
  126. package/Sources/Compression/Zlib.swift +179 -0
  127. package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
  128. package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
  129. package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
  130. package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
  131. package/Sources/CoreImage/CIColor.swift +41 -0
  132. package/Sources/CoreImage/CIContext.swift +31 -0
  133. package/Sources/CoreImage/CIDetector.swift +57 -0
  134. package/Sources/CoreImage/CIFilter.swift +243 -0
  135. package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
  136. package/Sources/CoreImage/CIImage.swift +162 -0
  137. package/Sources/CoreImage/QRCode.swift +393 -0
  138. package/Sources/CoreLocation/Coordinate.swift +30 -0
  139. package/Sources/CoreLocation/Location.swift +65 -0
  140. package/Sources/CoreML/Evaluation.swift +414 -0
  141. package/Sources/CoreML/FeatureValue.swift +266 -0
  142. package/Sources/CoreML/Model.swift +269 -0
  143. package/Sources/CoreML/MultiArray.swift +92 -0
  144. package/Sources/CoreML/Specification.swift +233 -0
  145. package/Sources/CoreText/CoreText.swift +64 -0
  146. package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
  147. package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
  148. package/Sources/CryptoKit/CryptoKit.swift +375 -0
  149. package/Sources/CryptoKit/Curve25519.swift +317 -0
  150. package/Sources/CryptoKit/P256.swift +321 -0
  151. package/Sources/FoundationBridge/AppStorage.swift +165 -0
  152. package/Sources/FoundationBridge/AssetResources.swift +90 -0
  153. package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
  154. package/Sources/FoundationBridge/AsyncImage.swift +116 -0
  155. package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
  156. package/Sources/FoundationBridge/Bundle.swift +119 -0
  157. package/Sources/FoundationBridge/CombineExports.swift +8 -0
  158. package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
  159. package/Sources/FoundationBridge/Dispatch.swift +458 -0
  160. package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
  161. package/Sources/FoundationBridge/FileImporter.swift +128 -0
  162. package/Sources/FoundationBridge/FileSystem.swift +68 -0
  163. package/Sources/FoundationBridge/FoundationBridge.swift +29 -0
  164. package/Sources/FoundationBridge/HostResolution.swift +31 -0
  165. package/Sources/FoundationBridge/ItemProvider.swift +655 -0
  166. package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
  167. package/Sources/FoundationBridge/Links.swift +127 -0
  168. package/Sources/FoundationBridge/ListFormatter.swift +32 -0
  169. package/Sources/FoundationBridge/Locale.swift +86 -0
  170. package/Sources/FoundationBridge/Localization.swift +149 -0
  171. package/Sources/FoundationBridge/Locks.swift +50 -0
  172. package/Sources/FoundationBridge/Markdown.swift +527 -0
  173. package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
  174. package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
  175. package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
  176. package/Sources/FoundationBridge/Operation.swift +195 -0
  177. package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
  178. package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
  179. package/Sources/FoundationBridge/SceneStorage.swift +78 -0
  180. package/Sources/FoundationBridge/SecurityExports.swift +8 -0
  181. package/Sources/FoundationBridge/Selector.swift +226 -0
  182. package/Sources/FoundationBridge/StringComparators.swift +17 -0
  183. package/Sources/FoundationBridge/Table.swift +211 -0
  184. package/Sources/FoundationBridge/TextAttributes.swift +42 -0
  185. package/Sources/FoundationBridge/Timer.swift +53 -0
  186. package/Sources/FoundationBridge/UITextChecker.swift +30 -0
  187. package/Sources/FoundationBridge/URLSession.swift +718 -0
  188. package/Sources/FoundationBridge/UserDefaults.swift +183 -0
  189. package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
  190. package/Sources/FoundationBridge/WebSocket.swift +187 -0
  191. package/Sources/FoundationModels/FoundationModels.swift +1098 -0
  192. package/Sources/ImageIO/GIF.swift +72 -0
  193. package/Sources/ImageIO/ImageIO.swift +248 -0
  194. package/Sources/ImageIO/ImageTypes.swift +28 -0
  195. package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
  196. package/Sources/LocalAuthentication/LAContext.swift +86 -0
  197. package/Sources/MapKit/Geometry.swift +223 -0
  198. package/Sources/MapKit/Map.swift +638 -0
  199. package/Sources/MapKit/MapView.swift +229 -0
  200. package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
  201. package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
  202. package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
  203. package/Sources/OSLog/OSLog.swift +6 -0
  204. package/Sources/Photos/Photos.swift +572 -0
  205. package/Sources/PhotosUI/PhotosPicker.swift +248 -0
  206. package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
  207. package/Sources/QuickLook/QuickLook.swift +168 -0
  208. package/Sources/SafariServices/SafariServices.swift +106 -0
  209. package/Sources/Security/Security.swift +332 -0
  210. package/Sources/StoreKit/AppStore.swift +207 -0
  211. package/Sources/StoreKit/Products.swift +280 -0
  212. package/Sources/StoreKit/RequestReview.swift +28 -0
  213. package/Sources/StoreKit/StoreKit1.swift +486 -0
  214. package/Sources/StoreKit/StoreViews.swift +428 -0
  215. package/Sources/StoreKit/Transactions.swift +197 -0
  216. package/Sources/SwiftData/Macros.swift +58 -0
  217. package/Sources/SwiftData/ModelActor.swift +38 -0
  218. package/Sources/SwiftData/ModelContainer.swift +129 -0
  219. package/Sources/SwiftData/ModelContext.swift +451 -0
  220. package/Sources/SwiftData/PersistentModel.swift +238 -0
  221. package/Sources/SwiftData/Properties.swift +261 -0
  222. package/Sources/SwiftData/Query.swift +256 -0
  223. package/Sources/SwiftData/Schema.swift +192 -0
  224. package/Sources/SwiftData/Store.swift +146 -0
  225. package/Sources/SwiftData/StringPredicates.swift +125 -0
  226. package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
  227. package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
  228. package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
  229. package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
  230. package/Sources/SwiftDataMacros/Plugin.swift +18 -0
  231. package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
  232. package/Sources/SwiftUI/API/Accessibility.swift +181 -0
  233. package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
  234. package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
  235. package/Sources/SwiftUI/API/Alert.swift +221 -0
  236. package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
  237. package/Sources/SwiftUI/API/Animation.swift +285 -0
  238. package/Sources/SwiftUI/API/App.swift +87 -0
  239. package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
  240. package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
  241. package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
  242. package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
  243. package/Sources/SwiftUI/API/Canvas.swift +337 -0
  244. package/Sources/SwiftUI/API/Color.swift +237 -0
  245. package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
  246. package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
  247. package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
  248. package/Sources/SwiftUI/API/Commands.swift +106 -0
  249. package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
  250. package/Sources/SwiftUI/API/ContentShape.swift +33 -0
  251. package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
  252. package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
  253. package/Sources/SwiftUI/API/Controls.swift +300 -0
  254. package/Sources/SwiftUI/API/CustomLayout.swift +442 -0
  255. package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
  256. package/Sources/SwiftUI/API/Decorations.swift +92 -0
  257. package/Sources/SwiftUI/API/EditMode.swift +212 -0
  258. package/Sources/SwiftUI/API/Effects.swift +388 -0
  259. package/Sources/SwiftUI/API/Entry.swift +8 -0
  260. package/Sources/SwiftUI/API/Environment.swift +439 -0
  261. package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
  262. package/Sources/SwiftUI/API/Focus.swift +137 -0
  263. package/Sources/SwiftUI/API/Font.swift +131 -0
  264. package/Sources/SwiftUI/API/Gauge.swift +290 -0
  265. package/Sources/SwiftUI/API/Geometry.swift +89 -0
  266. package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
  267. package/Sources/SwiftUI/API/GeometryReader.swift +135 -0
  268. package/Sources/SwiftUI/API/GestureState.swift +65 -0
  269. package/Sources/SwiftUI/API/Gestures.swift +342 -0
  270. package/Sources/SwiftUI/API/Glass.swift +127 -0
  271. package/Sources/SwiftUI/API/Grid.swift +188 -0
  272. package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
  273. package/Sources/SwiftUI/API/KeyPress.swift +54 -0
  274. package/Sources/SwiftUI/API/LabelStyle.swift +124 -0
  275. package/Sources/SwiftUI/API/Layout.swift +220 -0
  276. package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
  277. package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
  278. package/Sources/SwiftUI/API/Lists.swift +331 -0
  279. package/Sources/SwiftUI/API/Menu.swift +58 -0
  280. package/Sources/SwiftUI/API/Modifiers.swift +313 -0
  281. package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
  282. package/Sources/SwiftUI/API/Namespace.swift +44 -0
  283. package/Sources/SwiftUI/API/Navigation.swift +386 -0
  284. package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
  285. package/Sources/SwiftUI/API/ObservableObject.swift +293 -0
  286. package/Sources/SwiftUI/API/OnChange.swift +48 -0
  287. package/Sources/SwiftUI/API/Path.swift +543 -0
  288. package/Sources/SwiftUI/API/Phase8Controls.swift +411 -0
  289. package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
  290. package/Sources/SwiftUI/API/Picker.swift +185 -0
  291. package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
  292. package/Sources/SwiftUI/API/Popover.swift +41 -0
  293. package/Sources/SwiftUI/API/Preferences.swift +262 -0
  294. package/Sources/SwiftUI/API/Presentation.swift +122 -0
  295. package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
  296. package/Sources/SwiftUI/API/Primitives.swift +517 -0
  297. package/Sources/SwiftUI/API/Publishers.swift +107 -0
  298. package/Sources/SwiftUI/API/Redaction.swift +75 -0
  299. package/Sources/SwiftUI/API/RowActions.swift +84 -0
  300. package/Sources/SwiftUI/API/Scenes.swift +131 -0
  301. package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
  302. package/Sources/SwiftUI/API/ScrollTargets.swift +104 -0
  303. package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
  304. package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
  305. package/Sources/SwiftUI/API/Shape.swift +214 -0
  306. package/Sources/SwiftUI/API/ShapeStyle.swift +409 -0
  307. package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
  308. package/Sources/SwiftUI/API/Sharing.swift +193 -0
  309. package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
  310. package/Sources/SwiftUI/API/State.swift +144 -0
  311. package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
  312. package/Sources/SwiftUI/API/StrokeStyle.swift +30 -0
  313. package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
  314. package/Sources/SwiftUI/API/TabContent.swift +841 -0
  315. package/Sources/SwiftUI/API/Table.swift +382 -0
  316. package/Sources/SwiftUI/API/Tabs.swift +263 -0
  317. package/Sources/SwiftUI/API/Tasks.swift +35 -0
  318. package/Sources/SwiftUI/API/Text.swift +386 -0
  319. package/Sources/SwiftUI/API/TextDates.swift +61 -0
  320. package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
  321. package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
  322. package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
  323. package/Sources/SwiftUI/API/Timeline.swift +212 -0
  324. package/Sources/SwiftUI/API/Toolbar.swift +251 -0
  325. package/Sources/SwiftUI/API/Transfer.swift +145 -0
  326. package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
  327. package/Sources/SwiftUI/API/Video.swift +64 -0
  328. package/Sources/SwiftUI/API/View.swift +215 -0
  329. package/Sources/SwiftUI/API/ViewModifier.swift +43 -0
  330. package/Sources/SwiftUI/API/VisualEffect.swift +155 -0
  331. package/Sources/SwiftUI/API/Windows.swift +25 -0
  332. package/Sources/SwiftUI/Charts/Axis.swift +325 -0
  333. package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
  334. package/Sources/SwiftUI/Charts/Chart.swift +660 -0
  335. package/Sources/SwiftUI/Charts/ChartContent.swift +376 -0
  336. package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
  337. package/Sources/SwiftUI/Charts/Marks.swift +204 -0
  338. package/Sources/SwiftUI/Charts/Plottable.swift +99 -0
  339. package/Sources/SwiftUI/Charts/Scales.swift +326 -0
  340. package/Sources/SwiftUI/Localization/Localization.swift +498 -0
  341. package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
  342. package/Sources/SwiftUI/Runtime/Executor.swift +85 -0
  343. package/Sources/SwiftUI/Runtime/Exports.swift +101 -0
  344. package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
  345. package/Sources/SwiftUI/Runtime/JSON.swift +143 -0
  346. package/Sources/SwiftUI/Runtime/JSONParser.swift +443 -0
  347. package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
  348. package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
  349. package/Sources/SwiftUI/Runtime/Ops.swift +152 -0
  350. package/Sources/SwiftUI/Runtime/Reconciler.swift +219 -0
  351. package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
  352. package/Sources/SwiftUI/Runtime/Runtime.swift +2146 -0
  353. package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
  354. package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
  355. package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
  356. package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
  357. package/Sources/Symbols/Symbols.swift +25 -0
  358. package/Sources/Translation/Translation.swift +423 -0
  359. package/Sources/UIKit/Activity.swift +213 -0
  360. package/Sources/UIKit/Alerts.swift +69 -0
  361. package/Sources/UIKit/AppDelegate.swift +222 -0
  362. package/Sources/UIKit/Appearance.swift +84 -0
  363. package/Sources/UIKit/ColorConversions.swift +70 -0
  364. package/Sources/UIKit/Controls.swift +225 -0
  365. package/Sources/UIKit/Device.swift +200 -0
  366. package/Sources/UIKit/Feedback.swift +65 -0
  367. package/Sources/UIKit/Font.swift +307 -0
  368. package/Sources/UIKit/Graphics.swift +204 -0
  369. package/Sources/UIKit/HostingController.swift +185 -0
  370. package/Sources/UIKit/Identity.swift +24 -0
  371. package/Sources/UIKit/Introspectable.swift +510 -0
  372. package/Sources/UIKit/Pasteboard.swift +363 -0
  373. package/Sources/UIKit/PhotoAlbum.swift +81 -0
  374. package/Sources/UIKit/RemoteNotifications.swift +15 -0
  375. package/Sources/UIKit/Representable.swift +288 -0
  376. package/Sources/UIKit/SafeArea.swift +12 -0
  377. package/Sources/UIKit/SceneDelegates.swift +132 -0
  378. package/Sources/UIKit/Scenes.swift +40 -0
  379. package/Sources/UIKit/ScrollView.swift +157 -0
  380. package/Sources/UIKit/ShortcutItems.swift +67 -0
  381. package/Sources/UIKit/SymbolConfiguration.swift +124 -0
  382. package/Sources/UIKit/TargetAction.swift +123 -0
  383. package/Sources/UIKit/TextPaste.swift +161 -0
  384. package/Sources/UIKit/TextView.swift +538 -0
  385. package/Sources/UIKit/UIKit.swift +292 -0
  386. package/Sources/UIKit/UIView.swift +855 -0
  387. package/Sources/UIKit/ViewTranslation.swift +311 -0
  388. package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
  389. package/Sources/UserNotifications/Content.swift +370 -0
  390. package/Sources/UserNotifications/NotificationCenter.swift +309 -0
  391. package/Sources/WeatherKit/WeatherKit.swift +228 -0
  392. package/Sources/WebKit/WebKit.swift +245 -0
  393. package/Sources/os/os.swift +376 -0
  394. package/Sources/zlib/zlib.swift +6 -0
  395. package/index.d.ts +2 -0
  396. package/index.mjs +16 -0
  397. package/manifest.d.mts +2 -0
  398. package/manifest.mjs +39 -0
  399. package/package.json +30 -4
  400. package/sync-sources.mjs +33 -0
@@ -0,0 +1,720 @@
1
+ //
2
+ // Publishers.Zip.swift
3
+ //
4
+ // Created by Eric Patey on 29.08.2019.
5
+ //
6
+
7
+ // swiftlint:disable large_tuple
8
+
9
+ #if canImport(COpenCombineHelpers)
10
+ import COpenCombineHelpers
11
+ #endif
12
+
13
+ extension Publishers {
14
+
15
+ /// A publisher created by applying the zip function to two upstream publishers.
16
+ public struct Zip<UpstreamA: Publisher, UpstreamB: Publisher>: Publisher
17
+ where UpstreamA.Failure == UpstreamB.Failure
18
+ {
19
+
20
+ /// The kind of values published by this publisher.
21
+ public typealias Output = (UpstreamA.Output, UpstreamB.Output)
22
+
23
+ /// The kind of errors this publisher might publish.
24
+ ///
25
+ /// Use `Never` if this `Publisher` does not publish errors.
26
+ public typealias Failure = UpstreamA.Failure
27
+
28
+ public let a: UpstreamA
29
+
30
+ public let b: UpstreamB
31
+
32
+ public init(_ a: UpstreamA, _ b: UpstreamB) {
33
+ self.a = a
34
+ self.b = b
35
+ }
36
+
37
+ /// This function is called to attach the specified `Subscriber` to this
38
+ /// `Publisher` by `subscribe(_:)`
39
+ ///
40
+ /// - SeeAlso: `subscribe(_:)`
41
+ /// - Parameters:
42
+ /// - subscriber: The subscriber to attach to this `Publisher`.
43
+ /// once attached it can begin to receive values.
44
+ public func receive<Downstream: Subscriber>(subscriber: Downstream) where
45
+ UpstreamB.Failure == Downstream.Failure,
46
+ Downstream.Input == (UpstreamA.Output, UpstreamB.Output)
47
+ {
48
+ _ = Inner<Downstream>(downstream: subscriber, a, b)
49
+ }
50
+ }
51
+
52
+ /// A publisher created by applying the zip function to three upstream publishers.
53
+ public struct Zip3<UpstreamA: Publisher,
54
+ UpstreamB: Publisher,
55
+ UpstreamC: Publisher>
56
+ : Publisher
57
+ where UpstreamA.Failure == UpstreamB.Failure,
58
+ UpstreamB.Failure == UpstreamC.Failure
59
+ {
60
+ /// The kind of values published by this publisher.
61
+ public typealias Output = (UpstreamA.Output, UpstreamB.Output, UpstreamC.Output)
62
+
63
+ /// The kind of errors this publisher might publish.
64
+ ///
65
+ /// Use `Never` if this `Publisher` does not publish errors.
66
+ public typealias Failure = UpstreamA.Failure
67
+
68
+ public let a: UpstreamA
69
+
70
+ public let b: UpstreamB
71
+
72
+ public let c: UpstreamC
73
+
74
+ public init(_ a: UpstreamA, _ b: UpstreamB, _ c: UpstreamC) {
75
+ self.a = a
76
+ self.b = b
77
+ self.c = c
78
+ }
79
+
80
+ /// This function is called to attach the specified `Subscriber` to this
81
+ /// `Publisher` by `subscribe(_:)`
82
+ ///
83
+ /// - SeeAlso: `subscribe(_:)`
84
+ /// - Parameters:
85
+ /// - subscriber: The subscriber to attach to this `Publisher`.
86
+ /// once attached it can begin to receive values.
87
+ public func receive<Downstream>(subscriber: Downstream)
88
+ where Downstream: Subscriber,
89
+ UpstreamC.Failure == Downstream.Failure,
90
+ Downstream.Input == (UpstreamA.Output, UpstreamB.Output, UpstreamC.Output)
91
+ {
92
+ _ = Inner<Downstream>(downstream: subscriber, a, b, c)
93
+ }
94
+ }
95
+
96
+ /// A publisher created by applying the zip function to four upstream publishers.
97
+ public struct Zip4<
98
+ UpstreamA: Publisher,
99
+ UpstreamB: Publisher,
100
+ UpstreamC: Publisher,
101
+ UpstreamD: Publisher
102
+ >: Publisher where
103
+ UpstreamA.Failure == UpstreamB.Failure,
104
+ UpstreamB.Failure == UpstreamC.Failure,
105
+ UpstreamC.Failure == UpstreamD.Failure
106
+ {
107
+
108
+ /// The kind of values published by this publisher.
109
+ public typealias Output = (
110
+ UpstreamA.Output,
111
+ UpstreamB.Output,
112
+ UpstreamC.Output,
113
+ UpstreamD.Output)
114
+
115
+ /// The kind of errors this publisher might publish.
116
+ ///
117
+ /// Use `Never` if this `Publisher` does not publish errors.
118
+ public typealias Failure = UpstreamA.Failure
119
+
120
+ public let a: UpstreamA
121
+
122
+ public let b: UpstreamB
123
+
124
+ public let c: UpstreamC
125
+
126
+ public let d: UpstreamD
127
+
128
+ public init(_ a: UpstreamA, _ b: UpstreamB, _ c: UpstreamC, _ d: UpstreamD) {
129
+ self.a = a
130
+ self.b = b
131
+ self.c = c
132
+ self.d = d
133
+ }
134
+
135
+ /// This function is called to attach the specified `Subscriber` to this
136
+ /// `Publisher` by `subscribe(_:)`
137
+ ///
138
+ /// - SeeAlso: `subscribe(_:)`
139
+ /// - Parameters:
140
+ /// - subscriber: The subscriber to attach to this `Publisher`.
141
+ /// once attached it can begin to receive values.
142
+ public func receive<Downstream: Subscriber>(subscriber: Downstream)
143
+ where UpstreamD.Failure == Downstream.Failure,
144
+ Downstream.Input == (
145
+ UpstreamA.Output,
146
+ UpstreamB.Output,
147
+ UpstreamC.Output,
148
+ UpstreamD.Output)
149
+ {
150
+ _ = Inner<Downstream>(downstream: subscriber, a, b, c, d)
151
+ }
152
+ }
153
+ }
154
+
155
+ extension Publisher {
156
+
157
+ /// Combine elements from another publisher and deliver pairs of elements as tuples.
158
+ ///
159
+ /// The returned publisher waits until both publishers have emitted an event, then
160
+ /// delivers the oldest unconsumed event from each publisher together as a tuple to
161
+ /// the subscriber.
162
+ /// For example, if publisher `P1` emits elements `a` and `b`, and publisher `P2`
163
+ /// emits event `c`, the zip publisher emits the tuple `(a, c)`. It won’t emit a
164
+ /// tuple with event `b` until `P2` emits another event.
165
+ /// If either upstream publisher finishes successfuly or fails with an error, the
166
+ /// zipped publisher does the same.
167
+ ///
168
+ /// - Parameter other: Another publisher.
169
+ /// - Returns: A publisher that emits pairs of elements from the upstream publishers
170
+ /// as tuples.
171
+ public func zip<Other>(_ other: Other) -> Publishers.Zip<Self, Other>
172
+ where Other: Publisher, Self.Failure == Other.Failure
173
+ {
174
+ return Publishers.Zip(self, other)
175
+ }
176
+
177
+ /// Combine elements from another publisher and deliver a transformed output.
178
+ ///
179
+ /// The returned publisher waits until both publishers have emitted an event, then
180
+ /// delivers the oldest unconsumed event from each publisher together as a tuple to
181
+ /// the subscriber.
182
+ /// For example, if publisher `P1` emits elements `a` and `b`, and publisher `P2`
183
+ /// emits event `c`, the zip publisher emits the tuple `(a, c)`. It won’t emit a tuple
184
+ /// with event `b` until `P2` emits another event.
185
+ /// If either upstream publisher finishes successfuly or fails with an error, the
186
+ /// zipped publisher does the same.
187
+ ///
188
+ /// - Parameter other: Another publisher.
189
+ /// - transform: A closure that receives the most recent value from each publisher
190
+ /// and returns a new value to publish.
191
+ /// - Returns: A publisher that emits pairs of elements from the upstream publishers
192
+ /// as tuples.
193
+ public func zip<Other, Result>(
194
+ _ other: Other,
195
+ _ transform: @escaping (Self.Output, Other.Output) -> Result)
196
+ -> Publishers.Map<Publishers.Zip<Self, Other>, Result>
197
+ where Other: Publisher, Self.Failure == Other.Failure
198
+ {
199
+ return Publishers.Map(upstream: Publishers.Zip(self, other), transform: transform)
200
+ }
201
+
202
+ /// Combine elements from two other publishers and deliver groups of elements as
203
+ /// tuples.
204
+ ///
205
+ /// The returned publisher waits until all three publishers have emitted an event,
206
+ /// then delivers the oldest unconsumed event from each publisher as a tuple to the
207
+ /// subscriber.
208
+ /// For example, if publisher `P1` emits elements `a` and `b`, and publisher `P2`
209
+ /// emits elements `c` and `d`, and publisher `P3` emits the event `e`, the zip
210
+ /// publisher emits the tuple `(a, c, e)`. It won’t emit a tuple with elements `b` or
211
+ /// `d` until `P3` emits another event.
212
+ /// If any upstream publisher finishes successfuly or fails with an error, the zipped
213
+ /// publisher does the same.
214
+ ///
215
+ /// - Parameters:
216
+ /// - publisher1: A second publisher.
217
+ /// - publisher2: A third publisher.
218
+ /// - Returns: A publisher that emits groups of elements from the upstream publishers
219
+ /// as tuples.
220
+ public func zip<Other1, Other2>(_ publisher1: Other1, _ publisher2: Other2)
221
+ -> Publishers.Zip3<Self, Other1, Other2>
222
+ where Other1: Publisher,
223
+ Other2: Publisher,
224
+ Self.Failure == Other1.Failure,
225
+ Other1.Failure == Other2.Failure
226
+ {
227
+ return Publishers.Zip3(self, publisher1, publisher2)
228
+ }
229
+
230
+ /// Combine elements from two other publishers and deliver a transformed output.
231
+ ///
232
+ /// The returned publisher waits until all three publishers have emitted an event,
233
+ /// then delivers the oldest unconsumed event from each publisher as a tuple to the
234
+ /// subscriber.
235
+ /// For example, if publisher `P1` emits elements `a` and `b`, and publisher `P2`
236
+ /// emits elements `c` and `d`, and publisher `P3` emits the event `e`, the zip
237
+ /// publisher emits the tuple `(a, c, e)`. It won’t emit a tuple with elements `b` or
238
+ /// `d` until `P3` emits another event.
239
+ /// If any upstream publisher finishes successfuly or fails with an error, the zipped
240
+ /// publisher does the same.
241
+ ///
242
+ /// - Parameters:
243
+ /// - publisher1: A second publisher.
244
+ /// - publisher2: A third publisher.
245
+ /// - transform: A closure that receives the most recent value from each publisher
246
+ /// and returns a new value to publish.
247
+ /// - Returns: A publisher that emits groups of elements from the upstream publishers
248
+ /// as tuples.
249
+ public func zip<Other1, Other2, Result>(
250
+ _ publisher1: Other1,
251
+ _ publisher2: Other2,
252
+ _ transform: @escaping (Self.Output, Other1.Output, Other2.Output) -> Result)
253
+ -> Publishers.Map<Publishers.Zip3<Self, Other1, Other2>, Result>
254
+ where Other1: Publisher,
255
+ Other2: Publisher,
256
+ Self.Failure == Other1.Failure,
257
+ Other1.Failure == Other2.Failure
258
+ {
259
+ return Publishers.Map(upstream: Publishers.Zip3(self, publisher1, publisher2),
260
+ transform: transform)
261
+ }
262
+
263
+ /// Combine elements from three other publishers and deliver groups of elements as
264
+ /// tuples.
265
+ ///
266
+ /// The returned publisher waits until all four publishers have emitted an event, then
267
+ /// delivers the oldest unconsumed event from each publisher as a tuple to the
268
+ /// subscriber.
269
+ /// For example, if publisher `P1` emits elements `a` and `b`, and publisher `P2`
270
+ /// emits elements `c` and `d`, and publisher `P3` emits the elements `e` and `f`, and
271
+ /// publisher `P4` emits the event `g`, the zip publisher emits the tuple
272
+ /// `(a, c, e, g)`. It won’t emit a tuple with elements `b`, `d`, or `f` until `P4`
273
+ /// emits another event.
274
+ /// If any upstream publisher finishes successfuly or fails with an error, the zipped
275
+ /// publisher does the same.
276
+ ///
277
+ /// - Parameters:
278
+ /// - publisher1: A second publisher.
279
+ /// - publisher2: A third publisher.
280
+ /// - publisher3: A fourth publisher.
281
+ /// - Returns: A publisher that emits groups of elements from the upstream publishers
282
+ /// as tuples.
283
+ public func zip<Other1, Other2, Other3>(_ publisher1: Other1,
284
+ _ publisher2: Other2,
285
+ _ publisher3: Other3)
286
+ -> Publishers.Zip4<Self, Other1, Other2, Other3>
287
+ where Other1: Publisher,
288
+ Other2: Publisher,
289
+ Other3: Publisher,
290
+ Self.Failure == Other1.Failure,
291
+ Other1.Failure == Other2.Failure,
292
+ Other2.Failure == Other3.Failure
293
+ {
294
+ return Publishers.Zip4(self, publisher1, publisher2, publisher3)
295
+ }
296
+
297
+ /// Combine elements from three other publishers and deliver a transformed output.
298
+ ///
299
+ /// The returned publisher waits until all four publishers have emitted an event, then
300
+ /// delivers the oldest unconsumed event from each publisher as a tuple to the
301
+ /// subscriber.
302
+ /// For example, if publisher `P1` emits elements `a` and `b`, and publisher `P2`
303
+ /// emits elements `c` and `d`, and publisher `P3` emits the elements `e` and `f`, and
304
+ /// publisher `P4` emits the event `g`, the zip publisher emits the tuple
305
+ /// `(a, c, e, g)`. It won’t emit a tuple with elements `b`, `d`, or `f` until `P4`
306
+ /// emits another event.
307
+ /// If any upstream publisher finishes successfuly or fails with an error, the zipped
308
+ /// publisher does the same.
309
+ ///
310
+ /// - Parameters:
311
+ /// - publisher1: A second publisher.
312
+ /// - publisher2: A third publisher.
313
+ /// - publisher3: A fourth publisher.
314
+ /// - transform: A closure that receives the most recent value from each publisher
315
+ /// and returns a new value to publish.
316
+ /// - Returns: A publisher that emits groups of elements from the upstream publishers
317
+ /// as tuples.
318
+ public func zip<Other1, Other2, Other3, Result>(
319
+ _ publisher1: Other1,
320
+ _ publisher2: Other2,
321
+ _ publisher3: Other3,
322
+ _ transform: @escaping (Self.Output, Other1.Output, Other2.Output, Other3.Output)
323
+ -> Result)
324
+ -> Publishers.Map<Publishers.Zip4<Self, Other1, Other2, Other3>, Result>
325
+ where Other1: Publisher,
326
+ Other2: Publisher,
327
+ Other3: Publisher,
328
+ Self.Failure == Other1.Failure,
329
+ Other1.Failure == Other2.Failure,
330
+ Other2.Failure == Other3.Failure
331
+ {
332
+ return Publishers.Map(upstream: Publishers.Zip4(self,
333
+ publisher1,
334
+ publisher2,
335
+ publisher3),
336
+ transform: transform)
337
+ }
338
+ }
339
+
340
+ extension Publishers.Zip {
341
+ private class Inner<Downstream: Subscriber>: InnerBase<Downstream>
342
+ where Downstream.Failure == Failure,
343
+ Downstream.Input == (UpstreamA.Output, UpstreamB.Output)
344
+ {
345
+ private lazy var aSubscriber = ChildSubscriber<UpstreamA, Downstream>(self, 0)
346
+ private lazy var bSubscriber = ChildSubscriber<UpstreamB, Downstream>(self, 1)
347
+
348
+ init(downstream: Downstream, _ a: UpstreamA, _ b: UpstreamB) {
349
+ super.init(downstream: downstream)
350
+
351
+ a.subscribe(aSubscriber)
352
+ b.subscribe(bSubscriber)
353
+ }
354
+
355
+ override fileprivate var upstreamSubscriptions: [ChildSubscription] {
356
+ return [aSubscriber, bSubscriber]
357
+ }
358
+
359
+ override fileprivate func dequeueValue() -> Downstream.Input {
360
+ return (aSubscriber.dequeueValue(), bSubscriber.dequeueValue())
361
+ }
362
+ }
363
+ }
364
+
365
+ extension Publishers.Zip3 {
366
+ private class Inner<Downstream: Subscriber>: InnerBase<Downstream>
367
+ where Downstream.Failure == Failure,
368
+ Downstream.Input == (UpstreamA.Output, UpstreamB.Output, UpstreamC.Output)
369
+ {
370
+ private lazy var aSubscriber = ChildSubscriber<UpstreamA, Downstream>(self, 0)
371
+ private lazy var bSubscriber = ChildSubscriber<UpstreamB, Downstream>(self, 1)
372
+ private lazy var cSubscriber = ChildSubscriber<UpstreamC, Downstream>(self, 2)
373
+
374
+ init(downstream: Downstream, _ a: UpstreamA, _ b: UpstreamB, _ c: UpstreamC) {
375
+ super.init(downstream: downstream)
376
+
377
+ a.subscribe(aSubscriber)
378
+ b.subscribe(bSubscriber)
379
+ c.subscribe(cSubscriber)
380
+ }
381
+
382
+ override fileprivate var upstreamSubscriptions: [ChildSubscription] {
383
+ return [aSubscriber, bSubscriber, cSubscriber]
384
+ }
385
+
386
+ override fileprivate func dequeueValue() -> Downstream.Input {
387
+ return (aSubscriber.dequeueValue(),
388
+ bSubscriber.dequeueValue(),
389
+ cSubscriber.dequeueValue())
390
+ }
391
+ }
392
+ }
393
+
394
+ extension Publishers.Zip4 {
395
+ private class Inner<Downstream: Subscriber>: InnerBase<Downstream>
396
+ where Downstream.Failure == Failure,
397
+ Downstream.Input == (
398
+ UpstreamA.Output,
399
+ UpstreamB.Output,
400
+ UpstreamC.Output,
401
+ UpstreamD.Output)
402
+ {
403
+ private lazy var aSubscriber = ChildSubscriber<UpstreamA, Downstream>(self, 0)
404
+ private lazy var bSubscriber = ChildSubscriber<UpstreamB, Downstream>(self, 1)
405
+ private lazy var cSubscriber = ChildSubscriber<UpstreamC, Downstream>(self, 2)
406
+ private lazy var dSubscriber = ChildSubscriber<UpstreamD, Downstream>(self, 3)
407
+
408
+ init(downstream: Downstream,
409
+ _ a: UpstreamA,
410
+ _ b: UpstreamB,
411
+ _ c: UpstreamC,
412
+ _ d: UpstreamD)
413
+ {
414
+ super.init(downstream: downstream)
415
+
416
+ a.subscribe(aSubscriber)
417
+ b.subscribe(bSubscriber)
418
+ c.subscribe(cSubscriber)
419
+ d.subscribe(dSubscriber)
420
+ }
421
+
422
+ override fileprivate var upstreamSubscriptions: [ChildSubscription] {
423
+ return [aSubscriber, bSubscriber, cSubscriber, dSubscriber]
424
+ }
425
+
426
+ override fileprivate func dequeueValue() -> Downstream.Input {
427
+ return (aSubscriber.dequeueValue(),
428
+ bSubscriber.dequeueValue(),
429
+ cSubscriber.dequeueValue(),
430
+ dSubscriber.dequeueValue())
431
+ }
432
+ }
433
+ }
434
+
435
+ private class InnerBase<Downstream: Subscriber>: CustomStringConvertible {
436
+ let description = "Zip"
437
+
438
+ private let lock = UnfairRecursiveLock.allocate()
439
+
440
+ private let downstream: Downstream
441
+ private var downstreamDemand = Subscribers.Demand.none
442
+ private var valueIsBeingProcessed = false
443
+ private var value: Downstream.Input?
444
+ private var isFinished = false
445
+
446
+ // The following two pieces of state are a hacky implementation of subtle Apple
447
+ // concurrency behaviors. Specifically, when Zip is processing an upstream child value
448
+ // and sending a resulting value downstream, multiple behaviors are changed.
449
+ // 1. If a downstream demand request comes in during this period, the demand request
450
+ // for that specific triggering upstream child will be communiated via the result
451
+ // of `.receive(_ input:)` INSTEAD of a later `.request(_ demand:)` call.
452
+ // (AppleRef: 001)
453
+ // 2. If an upstream `.finished` comes in during this time period, the "finished
454
+ // asssessment check" (AppleRef: 002) is skipped.
455
+ // If an upstream value is being processed when a downstream demand request comes in,
456
+ // the demand for that specfic upstream child will be communiated via the result
457
+ // of `.receive(_ input:)` INSTEAD of a later `.request(_ demand:)` call.
458
+ private final var processingValueForChild: ChildSubscription?
459
+ private final var demandReceivedWhileProcessing: Subscribers.Demand?
460
+
461
+ init(downstream: Downstream) {
462
+ self.downstream = downstream
463
+ }
464
+
465
+ deinit {
466
+ lock.deallocate()
467
+ }
468
+
469
+ fileprivate var upstreamSubscriptions: [ChildSubscription] {
470
+ abstractMethod()
471
+ }
472
+
473
+ fileprivate func dequeueValue() -> Downstream.Input {
474
+ abstractMethod()
475
+ }
476
+
477
+ fileprivate final func receivedSubscription(for child: ChildSubscription) {
478
+ lock.lock()
479
+ child.state = .active
480
+ let sendSubscriptionDownstream = upstreamSubscriptions
481
+ .filter { $0.state == .waitingForSubscription }
482
+ .isEmpty
483
+ lock.unlock()
484
+
485
+ if sendSubscriptionDownstream {
486
+ self.sendSubscriptionDownstream()
487
+ }
488
+ }
489
+
490
+ fileprivate final func receivedChildValue(
491
+ child: ChildSubscription,
492
+ _ lockedStoreValue: () -> Void
493
+ ) -> Subscribers.Demand {
494
+ lock.lock()
495
+ lockedStoreValue()
496
+ defer {
497
+ checkShouldFinish()
498
+ lock.unlock()
499
+ }
500
+ if let dequeuedValue = maybeDequeueValue() {
501
+ value = dequeuedValue
502
+ assert(processingValueForChild == nil)
503
+ processingValueForChild = child
504
+ valueIsBeingProcessed = true
505
+ return processValue() ?? .none
506
+ } else {
507
+ return .none
508
+ }
509
+ }
510
+
511
+ fileprivate final func receivedCompletion(
512
+ _ completion: Subscribers.Completion<Downstream.Failure>,
513
+ forChild child: ChildSubscription)
514
+ {
515
+ switch completion {
516
+ case .failure:
517
+ downstream.receive(completion: completion)
518
+ lock.lock()
519
+ child.state = .failed
520
+ let subscriptionsToCancel = upstreamSubscriptions
521
+ lock.unlock()
522
+ subscriptionsToCancel.forEach { $0.cancel() }
523
+ case .finished:
524
+ lock.lock()
525
+ child.state = .finished
526
+ if !valueIsBeingProcessed {
527
+ valueIsBeingProcessed = true
528
+ if processingValueForChild == nil &&
529
+ !areMoreValuesPossible &&
530
+ !isFinished {
531
+ sendFinishDownstream()
532
+ } else {
533
+ processValue()
534
+ }
535
+ }
536
+ lock.unlock()
537
+ }
538
+ }
539
+
540
+ private func checkShouldFinish() {
541
+ if processingValueForChild == nil && upstreamSubscriptions.shouldFinish() {
542
+ sendFinishDownstream()
543
+ isFinished = true
544
+ }
545
+ }
546
+
547
+ private func maybeDequeueValue() -> Downstream.Input? {
548
+ return hasCompleteValueAvailable ? dequeueValue() : nil
549
+ }
550
+
551
+ private func sendSubscriptionDownstream() {
552
+ downstream.receive(subscription: self)
553
+ }
554
+
555
+ private var hasCompleteValueAvailable: Bool {
556
+ return upstreamSubscriptions.allSatisfy { $0.hasValue }
557
+ }
558
+
559
+ private var areMoreValuesPossible: Bool {
560
+ // More values are possible if all children are (active || have surplus)
561
+ return upstreamSubscriptions
562
+ .allSatisfy { $0.state == .active || $0.hasValue }
563
+ }
564
+
565
+ @discardableResult
566
+ private func processValue() -> Subscribers.Demand? {
567
+ assert(valueIsBeingProcessed)
568
+
569
+ lock.lock()
570
+ defer {
571
+ valueIsBeingProcessed = false
572
+ processingValueForChild = nil
573
+ demandReceivedWhileProcessing = nil
574
+ lock.unlock()
575
+ }
576
+
577
+ if let value = self.value {
578
+ if downstreamDemand != .none {
579
+ downstreamDemand -= 1
580
+ }
581
+ let newDemand = downstream.receive(value)
582
+ if newDemand != .none {
583
+ downstreamDemand += newDemand
584
+ demandReceivedWhileProcessing = newDemand
585
+ }
586
+ self.value = nil
587
+ }
588
+
589
+ return demandReceivedWhileProcessing
590
+ }
591
+
592
+ private func sendRequestUpstream(demand: Subscribers.Demand) {
593
+ lock.lock()
594
+ let subscriptionsToRequest = upstreamSubscriptions
595
+ .filter { $0.childIndex != processingValueForChild?.childIndex }
596
+ lock.unlock()
597
+ subscriptionsToRequest.forEach { $0.request(demand) }
598
+ }
599
+
600
+ private func sendFinishDownstream() {
601
+ downstream.receive(completion: .finished)
602
+ lock.lock()
603
+ let activeChildren = upstreamSubscriptions.filter { $0.state == .active }
604
+ lock.unlock()
605
+ activeChildren.forEach { $0.cancel() }
606
+ }
607
+ }
608
+
609
+ extension InnerBase: Subscription {
610
+ fileprivate final func request(_ demand: Subscribers.Demand) {
611
+ guard demand != .none else {
612
+ fatalError()
613
+ }
614
+ lock.lock()
615
+ downstreamDemand += demand
616
+ sendRequestUpstream(demand: demand)
617
+ if valueIsBeingProcessed {
618
+ demandReceivedWhileProcessing = demand
619
+ } else {
620
+ valueIsBeingProcessed = true
621
+ processValue()
622
+ }
623
+ lock.unlock()
624
+ }
625
+
626
+ fileprivate final func cancel() {
627
+ lock.lock()
628
+ let subscriptionsToCancel = upstreamSubscriptions
629
+ lock.unlock()
630
+ subscriptionsToCancel.forEach { $0.cancel() }
631
+ }
632
+ }
633
+
634
+ extension Array where Element == ChildSubscription {
635
+ func shouldFinish() -> Bool {
636
+ for subscription in self
637
+ where subscription.state == .finished && !subscription.hasValue{
638
+ return true
639
+ }
640
+ return false
641
+ }
642
+ }
643
+
644
+ private enum ChildState {
645
+ case waitingForSubscription
646
+ case active
647
+ case finished
648
+ case failed
649
+ case canceled
650
+ }
651
+
652
+ // Note that it's critical that this protocol not have any associated types - specifically
653
+ // note that it does not refer to `Upstream`.
654
+ // This allows `InnerBase` to do most of the heavy lifting without regard to the
655
+ // upstream publisher's value type.
656
+ private protocol ChildSubscription: AnyObject, Subscription {
657
+ var state: ChildState { get set }
658
+ var childIndex: Int { get }
659
+ var hasValue: Bool { get }
660
+ }
661
+
662
+ private final class ChildSubscriber<Upstream: Publisher, Downstream: Subscriber>
663
+ where Upstream.Failure == Downstream.Failure
664
+ {
665
+ typealias Input = Upstream.Output
666
+ typealias Failure = Upstream.Failure
667
+
668
+ fileprivate final var state: ChildState = .waitingForSubscription
669
+ fileprivate final var upstreamSubscription: Subscription?
670
+ private var values = [Upstream.Output]()
671
+ private unowned let parent: InnerBase<Downstream>
672
+ fileprivate let childIndex: Int
673
+
674
+ init(_ parent: InnerBase<Downstream>, _ childIndex: Int) {
675
+ self.parent = parent
676
+ self.childIndex = childIndex
677
+ }
678
+
679
+ fileprivate final func dequeueValue() -> Upstream.Output {
680
+ return values.remove(at: 0)
681
+ }
682
+ }
683
+
684
+ extension ChildSubscriber: ChildSubscription {
685
+ fileprivate final var hasValue: Bool {
686
+ return !values.isEmpty
687
+ }
688
+ }
689
+
690
+ extension ChildSubscriber: Subscription {
691
+ fileprivate final func request(_ demand: Subscribers.Demand) {
692
+ upstreamSubscription?.request(demand)
693
+ }
694
+ }
695
+
696
+ extension ChildSubscriber: Cancellable {
697
+ fileprivate final func cancel() {
698
+ upstreamSubscription?.cancel()
699
+ upstreamSubscription = nil
700
+ }
701
+ }
702
+
703
+ extension ChildSubscriber: Subscriber {
704
+ fileprivate final func receive(subscription: Subscription) {
705
+ if upstreamSubscription == nil {
706
+ upstreamSubscription = subscription
707
+ parent.receivedSubscription(for: self)
708
+ } else {
709
+ subscription.cancel()
710
+ }
711
+ }
712
+
713
+ fileprivate final func receive(_ input: Input) -> Subscribers.Demand {
714
+ return parent.receivedChildValue(child: self) { values.append(input) }
715
+ }
716
+
717
+ fileprivate final func receive(completion: Subscribers.Completion<Failure>) {
718
+ parent.receivedCompletion(completion, forChild: self)
719
+ }
720
+ }