@swiftbrowser/swift 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/Package.swift +200 -9
  2. package/README.md +7 -9
  3. package/Sources/AVFoundation/AVFoundation.swift +131 -0
  4. package/Sources/AVFoundation/Asset.swift +487 -0
  5. package/Sources/AVFoundation/AudioSession.swift +144 -0
  6. package/Sources/AVFoundation/CMTime.swift +303 -0
  7. package/Sources/AVFoundation/Capture.swift +688 -0
  8. package/Sources/AVFoundation/Player.swift +749 -0
  9. package/Sources/AVFoundation/PlayerView.swift +117 -0
  10. package/Sources/AVKit/AVKit.swift +132 -0
  11. package/Sources/Accelerate/Accelerate.swift +122 -0
  12. package/Sources/AppIntents/AppIntents.swift +144 -0
  13. package/Sources/AppIntents/Parameters.swift +220 -0
  14. package/Sources/AppIntents/Shortcuts.swift +159 -0
  15. package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
  16. package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
  17. package/Sources/AuthenticationServices/Authorization.swift +251 -0
  18. package/Sources/Charts/Charts.swift +0 -4
  19. package/Sources/Combine/AnyCancellable.swift +65 -0
  20. package/Sources/Combine/AnyPublisher.swift +148 -0
  21. package/Sources/Combine/AnySubscriber.swift +230 -0
  22. package/Sources/Combine/Cancellable.swift +35 -0
  23. package/Sources/Combine/Codable.swift +29 -0
  24. package/Sources/Combine/CombineIdentifier.swift +45 -0
  25. package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
  26. package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
  27. package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
  28. package/Sources/Combine/CurrentValueSubject.swift +252 -0
  29. package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
  30. package/Sources/Combine/Future.swift +228 -0
  31. package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
  32. package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
  33. package/Sources/Combine/Helpers/ConduitList.swift +59 -0
  34. package/Sources/Combine/Helpers/DebugHook.swift +177 -0
  35. package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
  36. package/Sources/Combine/Helpers/Locking.swift +30 -0
  37. package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
  38. package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
  39. package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
  40. package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
  41. package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
  42. package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
  43. package/Sources/Combine/Helpers/Utils.swift +30 -0
  44. package/Sources/Combine/Helpers/Violations.swift +33 -0
  45. package/Sources/Combine/ImmediateScheduler.swift +178 -0
  46. package/Sources/Combine/LICENSE +21 -0
  47. package/Sources/Combine/NotificationPublisher.swift +48 -0
  48. package/Sources/Combine/ObjectWillChange.swift +46 -0
  49. package/Sources/Combine/PassthroughSubject.swift +222 -0
  50. package/Sources/Combine/Publisher+Subscribe.swift +53 -0
  51. package/Sources/Combine/Publishers/Deferred.swift +48 -0
  52. package/Sources/Combine/Publishers/Empty.swift +54 -0
  53. package/Sources/Combine/Publishers/Fail.swift +42 -0
  54. package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
  55. package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
  56. package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
  57. package/Sources/Combine/Publishers/Just.swift +313 -0
  58. package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
  59. package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
  60. package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
  61. package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
  62. package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
  63. package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
  64. package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
  65. package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
  66. package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
  67. package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
  68. package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
  69. package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
  70. package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
  71. package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
  72. package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
  73. package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
  74. package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
  75. package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
  76. package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
  77. package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
  78. package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
  79. package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
  80. package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
  81. package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
  82. package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
  83. package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
  84. package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
  85. package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
  86. package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
  87. package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
  88. package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
  89. package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
  90. package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
  91. package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
  92. package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
  93. package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
  94. package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
  95. package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
  96. package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
  97. package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
  98. package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
  99. package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
  100. package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
  101. package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
  102. package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
  103. package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
  104. package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
  105. package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
  106. package/Sources/Combine/Publishers/Publishers.swift +13 -0
  107. package/Sources/Combine/Publishers/Record.swift +237 -0
  108. package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
  109. package/Sources/Combine/Result.swift +46 -0
  110. package/Sources/Combine/Scheduler.swift +89 -0
  111. package/Sources/Combine/Schedulers.swift +211 -0
  112. package/Sources/Combine/Subject+Void.swift +17 -0
  113. package/Sources/Combine/Subscriber+Void.swift +20 -0
  114. package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
  115. package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
  116. package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
  117. package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
  118. package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
  119. package/Sources/Combine/Subscription.swift +22 -0
  120. package/Sources/Combine/Subscriptions.swift +42 -0
  121. package/Sources/Combine/SwiftUIObservation.swift +10 -0
  122. package/Sources/Combine/_Introspection.swift +107 -0
  123. package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
  124. package/Sources/Compression/Compression.swift +365 -0
  125. package/Sources/Compression/Deflate.swift +407 -0
  126. package/Sources/Compression/Zlib.swift +179 -0
  127. package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
  128. package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
  129. package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
  130. package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
  131. package/Sources/CoreImage/CIColor.swift +41 -0
  132. package/Sources/CoreImage/CIContext.swift +31 -0
  133. package/Sources/CoreImage/CIDetector.swift +57 -0
  134. package/Sources/CoreImage/CIFilter.swift +243 -0
  135. package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
  136. package/Sources/CoreImage/CIImage.swift +162 -0
  137. package/Sources/CoreImage/QRCode.swift +393 -0
  138. package/Sources/CoreLocation/Coordinate.swift +30 -0
  139. package/Sources/CoreLocation/Location.swift +65 -0
  140. package/Sources/CoreML/Evaluation.swift +414 -0
  141. package/Sources/CoreML/FeatureValue.swift +266 -0
  142. package/Sources/CoreML/Model.swift +269 -0
  143. package/Sources/CoreML/MultiArray.swift +92 -0
  144. package/Sources/CoreML/Specification.swift +233 -0
  145. package/Sources/CoreText/CoreText.swift +64 -0
  146. package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
  147. package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
  148. package/Sources/CryptoKit/CryptoKit.swift +375 -0
  149. package/Sources/CryptoKit/Curve25519.swift +317 -0
  150. package/Sources/CryptoKit/P256.swift +321 -0
  151. package/Sources/FoundationBridge/AppStorage.swift +165 -0
  152. package/Sources/FoundationBridge/AssetResources.swift +90 -0
  153. package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
  154. package/Sources/FoundationBridge/AsyncImage.swift +116 -0
  155. package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
  156. package/Sources/{_FoundationCommon → FoundationBridge}/Bundle.swift +41 -4
  157. package/Sources/FoundationBridge/CombineExports.swift +8 -0
  158. package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
  159. package/Sources/FoundationBridge/Dispatch.swift +458 -0
  160. package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
  161. package/Sources/FoundationBridge/FileImporter.swift +128 -0
  162. package/Sources/FoundationBridge/FileSystem.swift +68 -0
  163. package/Sources/FoundationBridge/FoundationBridge.swift +24 -72
  164. package/Sources/FoundationBridge/HostResolution.swift +31 -0
  165. package/Sources/FoundationBridge/ItemProvider.swift +655 -0
  166. package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
  167. package/Sources/FoundationBridge/Links.swift +127 -0
  168. package/Sources/FoundationBridge/ListFormatter.swift +32 -0
  169. package/Sources/FoundationBridge/Localization.swift +149 -0
  170. package/Sources/FoundationBridge/Locks.swift +50 -0
  171. package/Sources/FoundationBridge/Markdown.swift +527 -0
  172. package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
  173. package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
  174. package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
  175. package/Sources/FoundationBridge/Operation.swift +195 -0
  176. package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
  177. package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
  178. package/Sources/FoundationBridge/SceneStorage.swift +78 -0
  179. package/Sources/FoundationBridge/SecurityExports.swift +8 -0
  180. package/Sources/FoundationBridge/Selector.swift +226 -0
  181. package/Sources/FoundationBridge/StringComparators.swift +17 -0
  182. package/Sources/FoundationBridge/Table.swift +211 -0
  183. package/Sources/FoundationBridge/TextAttributes.swift +42 -0
  184. package/Sources/FoundationBridge/Timer.swift +6 -1
  185. package/Sources/FoundationBridge/URLSession.swift +718 -0
  186. package/Sources/{_FoundationCommon → FoundationBridge}/UserDefaults.swift +17 -4
  187. package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
  188. package/Sources/FoundationBridge/WebSocket.swift +187 -0
  189. package/Sources/FoundationModels/FoundationModels.swift +1098 -0
  190. package/Sources/ImageIO/GIF.swift +72 -0
  191. package/Sources/ImageIO/ImageIO.swift +248 -0
  192. package/Sources/ImageIO/ImageTypes.swift +28 -0
  193. package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
  194. package/Sources/LocalAuthentication/LAContext.swift +86 -0
  195. package/Sources/MapKit/Geometry.swift +223 -0
  196. package/Sources/MapKit/Map.swift +638 -0
  197. package/Sources/MapKit/MapView.swift +229 -0
  198. package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
  199. package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
  200. package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
  201. package/Sources/OSLog/OSLog.swift +6 -0
  202. package/Sources/Photos/Photos.swift +572 -0
  203. package/Sources/PhotosUI/PhotosPicker.swift +248 -0
  204. package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
  205. package/Sources/QuickLook/QuickLook.swift +168 -0
  206. package/Sources/SafariServices/SafariServices.swift +106 -0
  207. package/Sources/Security/Security.swift +332 -0
  208. package/Sources/StoreKit/AppStore.swift +207 -0
  209. package/Sources/StoreKit/Products.swift +280 -0
  210. package/Sources/StoreKit/RequestReview.swift +28 -0
  211. package/Sources/StoreKit/StoreKit1.swift +486 -0
  212. package/Sources/StoreKit/StoreViews.swift +428 -0
  213. package/Sources/StoreKit/Transactions.swift +197 -0
  214. package/Sources/SwiftData/Macros.swift +58 -0
  215. package/Sources/SwiftData/ModelActor.swift +38 -0
  216. package/Sources/SwiftData/ModelContainer.swift +129 -0
  217. package/Sources/SwiftData/ModelContext.swift +451 -0
  218. package/Sources/SwiftData/PersistentModel.swift +238 -0
  219. package/Sources/SwiftData/Properties.swift +261 -0
  220. package/Sources/SwiftData/Query.swift +256 -0
  221. package/Sources/SwiftData/Schema.swift +192 -0
  222. package/Sources/SwiftData/Store.swift +146 -0
  223. package/Sources/SwiftData/StringPredicates.swift +125 -0
  224. package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
  225. package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
  226. package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
  227. package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
  228. package/Sources/SwiftDataMacros/Plugin.swift +18 -0
  229. package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
  230. package/Sources/SwiftUI/API/Accessibility.swift +55 -6
  231. package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
  232. package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
  233. package/Sources/SwiftUI/API/Alert.swift +1 -1
  234. package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
  235. package/Sources/SwiftUI/API/Animation.swift +37 -5
  236. package/Sources/SwiftUI/API/App.swift +31 -1
  237. package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
  238. package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
  239. package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
  240. package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
  241. package/Sources/SwiftUI/API/Canvas.swift +337 -0
  242. package/Sources/SwiftUI/API/Color.swift +104 -28
  243. package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
  244. package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
  245. package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
  246. package/Sources/SwiftUI/API/Commands.swift +106 -0
  247. package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
  248. package/Sources/SwiftUI/API/ContentShape.swift +33 -0
  249. package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
  250. package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
  251. package/Sources/SwiftUI/API/Controls.swift +59 -27
  252. package/Sources/SwiftUI/API/CustomLayout.swift +49 -10
  253. package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
  254. package/Sources/SwiftUI/API/Decorations.swift +1 -1
  255. package/Sources/SwiftUI/API/EditMode.swift +25 -82
  256. package/Sources/SwiftUI/API/Effects.swift +105 -7
  257. package/Sources/SwiftUI/API/Entry.swift +8 -0
  258. package/Sources/SwiftUI/API/Environment.swift +93 -9
  259. package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
  260. package/Sources/SwiftUI/API/Focus.swift +11 -3
  261. package/Sources/SwiftUI/API/Gauge.swift +3 -2
  262. package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
  263. package/Sources/SwiftUI/API/GeometryReader.swift +13 -2
  264. package/Sources/SwiftUI/API/GestureState.swift +65 -0
  265. package/Sources/SwiftUI/API/Gestures.swift +1 -1
  266. package/Sources/SwiftUI/API/Glass.swift +127 -0
  267. package/Sources/SwiftUI/API/Grid.swift +1 -1
  268. package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
  269. package/Sources/SwiftUI/API/KeyPress.swift +54 -0
  270. package/Sources/SwiftUI/API/LabelStyle.swift +13 -6
  271. package/Sources/SwiftUI/API/Layout.swift +67 -12
  272. package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
  273. package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
  274. package/Sources/SwiftUI/API/Lists.swift +61 -6
  275. package/Sources/SwiftUI/API/Menu.swift +8 -1
  276. package/Sources/SwiftUI/API/Modifiers.swift +80 -10
  277. package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
  278. package/Sources/SwiftUI/API/Namespace.swift +44 -0
  279. package/Sources/SwiftUI/API/Navigation.swift +24 -9
  280. package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
  281. package/Sources/SwiftUI/API/ObservableObject.swift +16 -2
  282. package/Sources/SwiftUI/API/Path.swift +543 -0
  283. package/Sources/SwiftUI/API/Phase8Controls.swift +48 -31
  284. package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
  285. package/Sources/SwiftUI/API/Picker.swift +11 -2
  286. package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
  287. package/Sources/SwiftUI/API/Popover.swift +41 -0
  288. package/Sources/SwiftUI/API/Preferences.swift +262 -0
  289. package/Sources/SwiftUI/API/Presentation.swift +17 -4
  290. package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
  291. package/Sources/SwiftUI/API/Primitives.swift +164 -37
  292. package/Sources/SwiftUI/API/Publishers.swift +4 -4
  293. package/Sources/SwiftUI/API/Redaction.swift +75 -0
  294. package/Sources/SwiftUI/API/RowActions.swift +3 -2
  295. package/Sources/SwiftUI/API/Scenes.swift +131 -0
  296. package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
  297. package/Sources/SwiftUI/API/ScrollTargets.swift +3 -3
  298. package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
  299. package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
  300. package/Sources/SwiftUI/API/Shape.swift +214 -0
  301. package/Sources/SwiftUI/API/ShapeStyle.swift +105 -7
  302. package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
  303. package/Sources/SwiftUI/API/Sharing.swift +193 -0
  304. package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
  305. package/Sources/SwiftUI/API/State.swift +18 -1
  306. package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
  307. package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
  308. package/Sources/SwiftUI/API/TabContent.swift +841 -0
  309. package/Sources/SwiftUI/API/Table.swift +382 -0
  310. package/Sources/SwiftUI/API/Tabs.swift +148 -4
  311. package/Sources/SwiftUI/API/Tasks.swift +2 -2
  312. package/Sources/SwiftUI/API/Text.swift +386 -0
  313. package/Sources/SwiftUI/API/TextDates.swift +61 -0
  314. package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
  315. package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
  316. package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
  317. package/Sources/SwiftUI/API/Toolbar.swift +52 -16
  318. package/Sources/SwiftUI/API/Transfer.swift +145 -0
  319. package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
  320. package/Sources/SwiftUI/API/Video.swift +64 -0
  321. package/Sources/SwiftUI/API/View.swift +10 -2
  322. package/Sources/SwiftUI/API/ViewModifier.swift +4 -1
  323. package/Sources/SwiftUI/API/VisualEffect.swift +74 -1
  324. package/Sources/SwiftUI/API/Windows.swift +25 -0
  325. package/Sources/SwiftUI/Charts/Axis.swift +7 -1
  326. package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
  327. package/Sources/SwiftUI/Charts/Chart.swift +17 -3
  328. package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
  329. package/Sources/SwiftUI/Localization/Localization.swift +498 -0
  330. package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
  331. package/Sources/SwiftUI/Runtime/Executor.swift +2 -0
  332. package/Sources/SwiftUI/Runtime/Exports.swift +37 -1
  333. package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
  334. package/Sources/SwiftUI/Runtime/JSON.swift +76 -4
  335. package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
  336. package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
  337. package/Sources/SwiftUI/Runtime/Ops.swift +58 -12
  338. package/Sources/SwiftUI/Runtime/Reconciler.swift +10 -1
  339. package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
  340. package/Sources/SwiftUI/Runtime/Runtime.swift +977 -198
  341. package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
  342. package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
  343. package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
  344. package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
  345. package/Sources/Symbols/Symbols.swift +25 -0
  346. package/Sources/Translation/Translation.swift +423 -0
  347. package/Sources/UIKit/Activity.swift +213 -0
  348. package/Sources/UIKit/Alerts.swift +69 -0
  349. package/Sources/UIKit/AppDelegate.swift +222 -0
  350. package/Sources/UIKit/Appearance.swift +84 -0
  351. package/Sources/UIKit/ColorConversions.swift +70 -0
  352. package/Sources/UIKit/Controls.swift +225 -0
  353. package/Sources/UIKit/Device.swift +200 -0
  354. package/Sources/UIKit/Feedback.swift +65 -0
  355. package/Sources/UIKit/Font.swift +307 -0
  356. package/Sources/UIKit/Graphics.swift +204 -0
  357. package/Sources/UIKit/HostingController.swift +185 -0
  358. package/Sources/UIKit/Identity.swift +24 -0
  359. package/Sources/UIKit/Introspectable.swift +510 -0
  360. package/Sources/UIKit/Pasteboard.swift +363 -0
  361. package/Sources/UIKit/PhotoAlbum.swift +81 -0
  362. package/Sources/UIKit/RemoteNotifications.swift +15 -0
  363. package/Sources/UIKit/Representable.swift +288 -0
  364. package/Sources/UIKit/SafeArea.swift +12 -0
  365. package/Sources/UIKit/SceneDelegates.swift +132 -0
  366. package/Sources/UIKit/Scenes.swift +40 -0
  367. package/Sources/UIKit/ScrollView.swift +157 -0
  368. package/Sources/UIKit/ShortcutItems.swift +67 -0
  369. package/Sources/UIKit/SymbolConfiguration.swift +124 -0
  370. package/Sources/UIKit/TargetAction.swift +123 -0
  371. package/Sources/UIKit/TextPaste.swift +161 -0
  372. package/Sources/UIKit/TextView.swift +538 -0
  373. package/Sources/UIKit/UIKit.swift +292 -0
  374. package/Sources/UIKit/UIView.swift +855 -0
  375. package/Sources/UIKit/ViewTranslation.swift +311 -0
  376. package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
  377. package/Sources/UserNotifications/Content.swift +370 -0
  378. package/Sources/UserNotifications/NotificationCenter.swift +309 -0
  379. package/Sources/WeatherKit/WeatherKit.swift +228 -0
  380. package/Sources/WebKit/WebKit.swift +245 -0
  381. package/Sources/os/os.swift +376 -0
  382. package/Sources/zlib/zlib.swift +6 -0
  383. package/index.d.ts +1 -1
  384. package/index.mjs +2 -2
  385. package/manifest.d.mts +2 -0
  386. package/manifest.mjs +39 -0
  387. package/package.json +5 -3
  388. package/sync-sources.mjs +21 -7
  389. package/Sources/FoundationLite/Common.swift +0 -3
  390. package/Sources/FoundationLite/FoundationLite.swift +0 -171
  391. package/Sources/FoundationLite/Interaction.swift +0 -146
  392. package/Sources/FoundationLite/Timer.swift +0 -48
  393. package/Sources/_FoundationCommon/_FoundationCommon.swift +0 -10
@@ -0,0 +1,476 @@
1
+ //
2
+ // Subscribers.Demand.swift
3
+ //
4
+ //
5
+ // Created by Sergej Jaskiewicz on 10.06.2019.
6
+ //
7
+
8
+ // swiftlint:disable attributes
9
+
10
+ #if canImport(_Concurrency) && compiler(>=5.5)
11
+ import _Concurrency
12
+ #endif
13
+
14
+ extension Subscribers {
15
+
16
+ /// A requested number of items, sent to a publisher from a subscriber through
17
+ /// the subscription.
18
+ public struct Demand: Equatable,
19
+ Comparable,
20
+ Hashable,
21
+ Codable,
22
+ CustomStringConvertible
23
+ {
24
+ @usableFromInline
25
+ internal let rawValue: UInt
26
+
27
+ @inline(__always)
28
+ @inlinable
29
+ internal init(rawValue: UInt) {
30
+ self.rawValue = min(UInt(Int.max) + 1, rawValue)
31
+ }
32
+
33
+ /// A request for as many values as the publisher can produce.
34
+ @inline(__always)
35
+ @inlinable
36
+ public static var unlimited: Demand {
37
+ return Demand(rawValue: .max)
38
+ }
39
+
40
+ /// A request for no elements from the publisher.
41
+ ///
42
+ /// This is equivalent to `Demand.max(0)`.
43
+ @inline(__always)
44
+ @inlinable
45
+ public static var none: Demand { return .max(0) }
46
+
47
+ /// Creates a demand for the given maximum number of elements.
48
+ ///
49
+ /// The publisher is free to send fewer than the requested maximum number of
50
+ /// elements.
51
+ ///
52
+ /// - Parameter value: The maximum number of elements. Providing a negative value
53
+ /// for this parameter results in a fatal error.
54
+ @inline(__always)
55
+ @inlinable
56
+ public static func max(_ value: Int) -> Demand {
57
+ precondition(value >= 0, "demand cannot be negative")
58
+ return Demand(rawValue: UInt(value))
59
+ }
60
+
61
+ public var description: String {
62
+ if self == .unlimited {
63
+ return "unlimited"
64
+ } else {
65
+ return "max(\(rawValue))"
66
+ }
67
+ }
68
+
69
+ /// Returns the result of adding two demands.
70
+ /// When adding any value to `.unlimited`, the result is `.unlimited`.
71
+ @inline(__always)
72
+ @inlinable
73
+ public static func + (lhs: Demand, rhs: Demand) -> Demand {
74
+ switch (lhs, rhs) {
75
+ case (.unlimited, _):
76
+ return .unlimited
77
+ case (_, .unlimited):
78
+ return .unlimited
79
+ default:
80
+ let (sum, isOverflow) = Int(lhs.rawValue)
81
+ .addingReportingOverflow(Int(rhs.rawValue))
82
+ return isOverflow ? .unlimited : .max(sum)
83
+ }
84
+ }
85
+
86
+ /// Adds two demands, and assigns the result to the first demand.
87
+ /// When adding any value to `.unlimited`, the result is `.unlimited`.
88
+ @inline(__always)
89
+ @inlinable
90
+ public static func += (lhs: inout Demand, rhs: Demand) {
91
+ if lhs == .unlimited { return }
92
+ lhs = lhs + rhs
93
+ }
94
+
95
+ /// Returns the result of adding an integer to a demand.
96
+ /// When adding any value to` .unlimited`, the result is `.unlimited`.
97
+ @inline(__always)
98
+ @inlinable
99
+ public static func + (lhs: Demand, rhs: Int) -> Demand {
100
+ if lhs == .unlimited {
101
+ return .unlimited
102
+ }
103
+ let (sum, isOverflow) = Int(lhs.rawValue).addingReportingOverflow(rhs)
104
+ return isOverflow ? .unlimited : .max(sum)
105
+ }
106
+
107
+ /// Adds an integer to a demand, and assigns the result to the demand.
108
+ /// When adding any value to `.unlimited`, the result is `.unlimited`.
109
+ @inline(__always)
110
+ @inlinable
111
+ public static func += (lhs: inout Demand, rhs: Int) {
112
+ lhs = lhs + rhs
113
+ }
114
+
115
+ /// Returns the result of multiplying a demand by an integer.
116
+ /// When multiplying any value by `.unlimited`, the result is `.unlimited`. If
117
+ /// the multiplication operation overflows, the result is `.unlimited`.
118
+ public static func * (lhs: Demand, rhs: Int) -> Demand {
119
+ if lhs == .unlimited {
120
+ return .unlimited
121
+ }
122
+ let (product, isOverflow) = Int(lhs.rawValue)
123
+ .multipliedReportingOverflow(by: rhs)
124
+ return isOverflow ? .unlimited : .max(product)
125
+ }
126
+
127
+ /// Multiplies a demand by an integer, and assigns the result to the demand.
128
+ /// When multiplying any value by `.unlimited`, the result is `.unlimited`. If
129
+ /// the multiplication operation overflows, the result is `.unlimited`.
130
+ @inline(__always)
131
+ @inlinable
132
+ public static func *= (lhs: inout Demand, rhs: Int) {
133
+ lhs = lhs * rhs
134
+ }
135
+
136
+ /// Returns the result of subtracting one demand from another.
137
+ /// When subtracting any value (including `.unlimited`) from `.unlimited`,
138
+ /// the result is still `.unlimited`. Subtracting `.unlimited` from any value
139
+ /// (except `.unlimited`) results in `.max(0)`. A negative demand is not possible;
140
+ /// any operation that would result in a negative value is clamped to `.max(0)`.
141
+ @inline(__always)
142
+ @inlinable
143
+ public static func - (lhs: Demand, rhs: Demand) -> Demand {
144
+ switch (lhs, rhs) {
145
+ case (.unlimited, _):
146
+ return .unlimited
147
+ case (_, .unlimited):
148
+ return .none
149
+ default:
150
+ let (difference, isOverflow) = Int(lhs.rawValue)
151
+ .subtractingReportingOverflow(Int(rhs.rawValue))
152
+ return isOverflow ? .none : .max(difference)
153
+ }
154
+ }
155
+
156
+ /// Subtracts one demand from another, and assigns the result to the first demand.
157
+ /// When subtracting any value (including `.unlimited`) from `.unlimited`,
158
+ /// the result is still `.unlimited`. Subtracting unlimited from any value
159
+ /// (except `.unlimited`) results in `.max(0)`. A negative demand is not possible;
160
+ /// any operation that would result in a negative value is clamped to `.max(0)`.
161
+ /// but be aware that it is not usable when requesting values in a subscription.
162
+ @inline(__always)
163
+ @inlinable
164
+ public static func -= (lhs: inout Demand, rhs: Demand) {
165
+ lhs = lhs - rhs
166
+ }
167
+
168
+ /// Returns the result of subtracting an integer from a demand.
169
+ /// When subtracting any value from `.unlimited`, the result is still
170
+ /// `.unlimited`.
171
+ /// A negative demand is not possible; any operation that would result in
172
+ /// a negative value is clamped to `.max(0)`
173
+ @inline(__always)
174
+ @inlinable
175
+ public static func - (lhs: Demand, rhs: Int) -> Demand {
176
+ if lhs == .unlimited {
177
+ return .unlimited
178
+ }
179
+
180
+ let (difference, isOverflow) = Int(lhs.rawValue)
181
+ .subtractingReportingOverflow(rhs)
182
+ return isOverflow ? .none : .max(difference)
183
+ }
184
+
185
+ /// Subtracts an integer from a demand, and assigns the result to the demand.
186
+ /// When subtracting any value from `.unlimited,` the result is still
187
+ /// `.unlimited`.
188
+ /// A negative demand is not possible; any operation that would result in
189
+ /// a negative value is clamped to `.max(0)`
190
+ @inline(__always)
191
+ @inlinable
192
+ public static func -= (lhs: inout Demand, rhs: Int) {
193
+ if lhs == .unlimited { return }
194
+ lhs = lhs - rhs
195
+ }
196
+
197
+ /// Returns a Boolean that indicates whether the demand requests more than
198
+ /// the given number of elements.
199
+ /// If `lhs` is `.unlimited`, then the result is always `true`.
200
+ /// Otherwise, the operator compares the demand’s `max` value to `rhs`.
201
+ @inline(__always)
202
+ @inlinable
203
+ public static func > (lhs: Demand, rhs: Int) -> Bool {
204
+ if lhs == .unlimited {
205
+ return true
206
+ } else {
207
+ return Int(lhs.rawValue) > rhs
208
+ }
209
+ }
210
+
211
+ /// Returns a Boolean that indicates whether the first demand requests more or
212
+ /// the same number of elements as the second.
213
+ /// If `lhs` is `.unlimited`, then the result is always `true`.
214
+ /// Otherwise, the operator compares the demand’s `max` value to `rhs`.
215
+ @inline(__always)
216
+ @inlinable
217
+ public static func >= (lhs: Demand, rhs: Int) -> Bool {
218
+ if lhs == .unlimited {
219
+ return true
220
+ } else {
221
+ return Int(lhs.rawValue) >= rhs
222
+ }
223
+ }
224
+
225
+ /// Returns a Boolean that indicates a given number of elements is greater than
226
+ /// the maximum specified by the demand.
227
+ /// If `rhs` is `.unlimited`, then the result is always `false`.
228
+ /// Otherwise, the operator compares the demand’s `max` value to `lhs`.
229
+ @inline(__always)
230
+ @inlinable
231
+ public static func > (lhs: Int, rhs: Demand) -> Bool {
232
+ if rhs == .unlimited {
233
+ return false
234
+ } else {
235
+ return lhs > Int(rhs.rawValue)
236
+ }
237
+ }
238
+
239
+ /// Returns a Boolean that indicates a given number of elements is greater than
240
+ /// or equal to the maximum specified by the demand.
241
+ /// If `rhs` is `.unlimited`, then the result is always `false`.
242
+ /// Otherwise, the operator compares the demand’s `max` value to `lhs`.
243
+ @inline(__always)
244
+ @inlinable
245
+ public static func >= (lhs: Int, rhs: Demand) -> Bool {
246
+ if rhs == .unlimited {
247
+ return false
248
+ } else {
249
+ return lhs >= Int(rhs.rawValue)
250
+ }
251
+ }
252
+
253
+ /// Returns a Boolean that indicates whether the demand requests fewer than
254
+ /// the given number of elements.
255
+ /// If `lhs` is `.unlimited`, then the result is always `false`.
256
+ /// Otherwise, the operator compares the demand’s `max` value to `rhs`.
257
+ @inline(__always)
258
+ @inlinable
259
+ public static func < (lhs: Demand, rhs: Int) -> Bool {
260
+ if lhs == .unlimited {
261
+ return false
262
+ } else {
263
+ return Int(lhs.rawValue) < rhs
264
+ }
265
+ }
266
+
267
+ /// Returns a Boolean that indicates a given number of elements is less than
268
+ /// the maximum specified by the demand.
269
+ /// If `rhs` is `.unlimited`, then the result is always `true`.
270
+ /// Otherwise, the operator compares the demand’s `max` value to `lhs`.
271
+ @inline(__always)
272
+ @inlinable
273
+ public static func < (lhs: Int, rhs: Demand) -> Bool {
274
+ if rhs == .unlimited {
275
+ return true
276
+ } else {
277
+ return lhs < Int(rhs.rawValue)
278
+ }
279
+ }
280
+
281
+ /// Returns a Boolean that indicates whether the demand requests fewer or
282
+ /// the same number of elements as the given integer.
283
+ /// If `lhs` is `.unlimited`, then the result is always `false`.
284
+ /// Otherwise, the operator compares the demand’s `max` value to `rhs`.
285
+ @inline(__always)
286
+ @inlinable
287
+ public static func <= (lhs: Demand, rhs: Int) -> Bool {
288
+ if lhs == .unlimited {
289
+ return false
290
+ } else {
291
+ return Int(lhs.rawValue) <= rhs
292
+ }
293
+ }
294
+
295
+ /// Returns a Boolean value that indicates a given number of elements is less
296
+ /// than or equal the maximum specified by the demand.
297
+ /// If `rhs` is `.unlimited`, then the result is always `true`.
298
+ /// Otherwise, the operator compares the demand’s `max` value to `lhs`.
299
+ @inline(__always)
300
+ @inlinable
301
+ public static func <= (lhs: Int, rhs: Demand) -> Bool {
302
+ if rhs == .unlimited {
303
+ return true
304
+ } else {
305
+ return lhs <= Int(rhs.rawValue)
306
+ }
307
+ }
308
+
309
+ /// Returns a Boolean value that indicates whether the first demand requests fewer
310
+ /// elements than the second.
311
+ /// If both sides are `.unlimited`, the result is always `false`.
312
+ /// If `lhs` is `.unlimited`, then the result is always `false`.
313
+ /// If `rhs` is `.unlimited`, then the result is always `true`.
314
+ /// Otherwise, this operator compares the demands’ `max` values.
315
+ @inline(__always)
316
+ @inlinable
317
+ public static func < (lhs: Demand, rhs: Demand) -> Bool {
318
+ switch (lhs, rhs) {
319
+ case (.unlimited, _):
320
+ return false
321
+ case (_, .unlimited):
322
+ return true
323
+ default:
324
+ return lhs.rawValue < rhs.rawValue
325
+ }
326
+ }
327
+
328
+ /// Returns a Boolean value that indicates whether the first demand requests fewer
329
+ /// or the same number of elements as the second.
330
+ /// If both sides are `.unlimited`, the result is always `true`.
331
+ /// If `lhs` is `.unlimited`, then the result is always `false`.
332
+ /// If `rhs` is `.unlimited` then the result is always `true`.
333
+ /// Otherwise, this operator compares the demands’ `max` values.
334
+ @inline(__always)
335
+ @inlinable
336
+ public static func <= (lhs: Demand, rhs: Demand) -> Bool {
337
+ switch (lhs, rhs) {
338
+ case (.unlimited, .unlimited):
339
+ return true
340
+ case (.unlimited, _):
341
+ return false
342
+ case (_, .unlimited):
343
+ return true
344
+ default:
345
+ return lhs.rawValue <= rhs.rawValue
346
+ }
347
+ }
348
+
349
+ /// Returns a Boolean that indicates whether the first demand requests more or
350
+ /// the same number of elements as the second.
351
+ /// If both sides are `.unlimited`, the result is always `false`.
352
+ /// If `lhs` is `.unlimited`, then the result is always `true`.
353
+ /// If rhs is `.unlimited` then the result is always `false`.
354
+ /// Otherwise, this operator compares the demands’ `max` values.
355
+ @inline(__always)
356
+ @inlinable
357
+ public static func >= (lhs: Demand, rhs: Demand) -> Bool {
358
+ switch (lhs, rhs) {
359
+ case (.unlimited, .unlimited):
360
+ return true
361
+ case (.unlimited, _):
362
+ return true
363
+ case (_, .unlimited):
364
+ return false
365
+ default:
366
+ return lhs.rawValue >= rhs.rawValue
367
+ }
368
+ }
369
+
370
+ /// Returns a Boolean that indicates whether the first demand requests more
371
+ /// elements than the second.
372
+ /// If both sides are `.unlimited`, the result is always `false`.
373
+ /// If `lhs` is `.unlimited`, then the result is always `true`.
374
+ /// If `rhs` is `.unlimited` then the result is always `false`.
375
+ /// Otherwise, this operator compares the demands’ `max` values.
376
+ @inline(__always)
377
+ @inlinable
378
+ public static func > (lhs: Demand, rhs: Demand) -> Bool {
379
+ switch (lhs, rhs) {
380
+ case (.unlimited, .unlimited):
381
+ return false
382
+ case (.unlimited, _):
383
+ return true
384
+ case (_, .unlimited):
385
+ return false
386
+ default:
387
+ return lhs.rawValue > rhs.rawValue
388
+ }
389
+ }
390
+
391
+ /// Returns a Boolean value indicating whether a demand requests the given number
392
+ /// of elements.
393
+ /// An `.unlimited` demand doesn’t match any integer.
394
+ @inline(__always)
395
+ @inlinable
396
+ public static func == (lhs: Demand, rhs: Int) -> Bool {
397
+ if lhs == .unlimited {
398
+ return false
399
+ } else {
400
+ return Int(lhs.rawValue) == rhs
401
+ }
402
+ }
403
+
404
+ /// Returns a Boolean value indicating whether a demand is not equal to
405
+ /// an integer.
406
+ /// The `.unlimited` value isn’t equal to any integer.
407
+ @inlinable
408
+ public static func != (lhs: Demand, rhs: Int) -> Bool {
409
+ if lhs == .unlimited {
410
+ return true
411
+ } else {
412
+ return Int(lhs.rawValue) != rhs
413
+ }
414
+ }
415
+
416
+ /// Returns a Boolean value indicating whether a given number of elements matches
417
+ /// the request of a given demand.
418
+ /// An `.unlimited` demand doesn’t match any integer.
419
+ @inlinable
420
+ public static func == (lhs: Int, rhs: Demand) -> Bool {
421
+ if rhs == .unlimited {
422
+ return false
423
+ } else {
424
+ return rhs.rawValue == lhs
425
+ }
426
+ }
427
+
428
+ /// Returns a Boolean value indicating whether an integer is not equal to
429
+ /// a demand.
430
+ /// The `.unlimited` value isn’t equal to any integer.
431
+ @inlinable
432
+ public static func != (lhs: Int, rhs: Demand) -> Bool {
433
+ if rhs == .unlimited {
434
+ return true
435
+ } else {
436
+ return Int(rhs.rawValue) != lhs
437
+ }
438
+ }
439
+
440
+ @inlinable
441
+ public static func == (lhs: Demand, rhs: Demand) -> Bool {
442
+ return lhs.rawValue == rhs.rawValue
443
+ }
444
+
445
+ /// The number of requested values.
446
+ ///
447
+ /// The value is `nil` if the demand is `Subscribers.Demand.unlimited`.
448
+ @inlinable public var max: Int? {
449
+ if self == .unlimited {
450
+ return nil
451
+ } else {
452
+ return Int(rawValue)
453
+ }
454
+ }
455
+
456
+ /// Creates a demand instance from a decoder.
457
+ ///
458
+ /// - Parameter decoder: The decoder of a previously-encoded `Subscribers.Demand`
459
+ /// instance.
460
+ public init(from decoder: Decoder) throws {
461
+ try self.init(rawValue: decoder.singleValueContainer().decode(UInt.self))
462
+ }
463
+
464
+ /// Encodes the demand to the provided encoder.
465
+ ///
466
+ /// - Parameter encoder: An encoder instance.
467
+ public func encode(to encoder: Encoder) throws {
468
+ var container = encoder.singleValueContainer()
469
+ try container.encode(rawValue)
470
+ }
471
+ }
472
+ }
473
+
474
+ #if canImport(_Concurrency) && compiler(>=5.5) || compiler(>=5.5.1)
475
+ extension Subscribers.Demand: Sendable {}
476
+ #endif
@@ -0,0 +1,206 @@
1
+ //
2
+ // Subscribers.Sink.swift
3
+ //
4
+ //
5
+ // Created by Sergej Jaskiewicz on 16.06.2019.
6
+ //
7
+
8
+ extension Subscribers {
9
+
10
+ /// A simple subscriber that requests an unlimited number of values upon subscription.
11
+ public final class Sink<Input, Failure: Error>
12
+ : Subscriber,
13
+ Cancellable,
14
+ CustomStringConvertible,
15
+ CustomReflectable,
16
+ CustomPlaygroundDisplayConvertible
17
+ {
18
+
19
+ /// The closure to execute on receipt of a value.
20
+ public var receiveValue: (Input) -> Void
21
+
22
+ /// The closure to execute on completion.
23
+ public var receiveCompletion: (Subscribers.Completion<Failure>) -> Void
24
+
25
+ private var status = SubscriptionStatus.awaitingSubscription
26
+
27
+ private let lock = UnfairLock.allocate()
28
+
29
+ public var description: String { return "Sink" }
30
+
31
+ public var customMirror: Mirror {
32
+ return Mirror(self, children: EmptyCollection())
33
+ }
34
+
35
+ public var playgroundDescription: Any { return description }
36
+
37
+ /// Initializes a sink with the provided closures.
38
+ ///
39
+ /// - Parameters:
40
+ /// - receiveCompletion: The closure to execute on completion.
41
+ /// - receiveValue: The closure to execute on receipt of a value.
42
+ public init(
43
+ receiveCompletion: @escaping (Subscribers.Completion<Failure>) -> Void,
44
+ receiveValue: @escaping ((Input) -> Void)
45
+ ) {
46
+ self.receiveCompletion = receiveCompletion
47
+ self.receiveValue = receiveValue
48
+ }
49
+
50
+ deinit {
51
+ lock.deallocate()
52
+ }
53
+
54
+ public func receive(subscription: Subscription) {
55
+ lock.lock()
56
+ guard case .awaitingSubscription = status else {
57
+ lock.unlock()
58
+ subscription.cancel()
59
+ return
60
+ }
61
+ status = .subscribed(subscription)
62
+ lock.unlock()
63
+ subscription.request(.unlimited)
64
+ }
65
+
66
+ public func receive(_ value: Input) -> Subscribers.Demand {
67
+ lock.lock()
68
+ let receiveValue = self.receiveValue
69
+ lock.unlock()
70
+ receiveValue(value)
71
+ return .none
72
+ }
73
+
74
+ public func receive(completion: Subscribers.Completion<Failure>) {
75
+ lock.lock()
76
+ status = .terminal
77
+ let receiveCompletion = self.receiveCompletion
78
+ self.receiveCompletion = { _ in }
79
+
80
+ // We MUST release the closures AFTER unlocking the lock,
81
+ // since releasing a closure may trigger execution of arbitrary code,
82
+ // for example, if the closure captures an object with a deinit.
83
+ // When closure deallocates, the object's deinit is called, and holding
84
+ // the lock at that moment can lead to deadlocks.
85
+ // See https://github.com/OpenCombine/OpenCombine/issues/208
86
+
87
+ withExtendedLifetime(receiveValue) {
88
+ receiveValue = { _ in }
89
+ lock.unlock()
90
+ }
91
+
92
+ receiveCompletion(completion)
93
+ }
94
+
95
+ public func cancel() {
96
+ lock.lock()
97
+ guard case let .subscribed(subscription) = status else {
98
+ lock.unlock()
99
+ return
100
+ }
101
+ status = .terminal
102
+
103
+ // We MUST release the closures AFTER unlocking the lock,
104
+ // since releasing a closure may trigger execution of arbitrary code,
105
+ // for example, if the closure captures an object with a deinit.
106
+ // When closure deallocates, the object's deinit is called, and holding
107
+ // the lock at that moment can lead to deadlocks.
108
+ // See https://github.com/OpenCombine/OpenCombine/issues/208
109
+
110
+ withExtendedLifetime((receiveValue, receiveCompletion)) {
111
+ receiveCompletion = { _ in }
112
+ receiveValue = { _ in }
113
+ lock.unlock()
114
+ }
115
+ subscription.cancel()
116
+ }
117
+ }
118
+ }
119
+
120
+ extension Publisher {
121
+
122
+ /// Attaches a subscriber with closure-based behavior.
123
+ ///
124
+ /// Use `sink(receiveCompletion:receiveValue:)` to observe values received by
125
+ /// the publisher and process them using a closure you specify.
126
+ ///
127
+ /// In this example, a `Range` publisher publishes integers to
128
+ /// a `sink(receiveCompletion:receiveValue:)` operator’s `receiveValue` closure that
129
+ /// prints them to the console. Upon completion
130
+ /// the `sink(receiveCompletion:receiveValue:)` operator’s `receiveCompletion` closure
131
+ /// indicates the successful termination of the stream.
132
+ ///
133
+ /// let myRange = (0...3)
134
+ /// cancellable = myRange.publisher
135
+ /// .sink(receiveCompletion: { print ("completion: \($0)") },
136
+ /// receiveValue: { print ("value: \($0)") })
137
+ ///
138
+ /// // Prints:
139
+ /// // value: 0
140
+ /// // value: 1
141
+ /// // value: 2
142
+ /// // value: 3
143
+ /// // completion: finished
144
+ ///
145
+ /// This method creates the subscriber and immediately requests an unlimited number
146
+ /// of values, prior to returning the subscriber.
147
+ /// The return value should be held, otherwise the stream will be canceled.
148
+ ///
149
+ /// - parameter receiveComplete: The closure to execute on completion.
150
+ /// - parameter receiveValue: The closure to execute on receipt of a value.
151
+ /// - Returns: A cancellable instance, which you use when you end assignment of
152
+ /// the received value. Deallocation of the result will tear down the subscription
153
+ /// stream.
154
+ public func sink(
155
+ receiveCompletion: @escaping (Subscribers.Completion<Failure>) -> Void,
156
+ receiveValue: @escaping ((Output) -> Void)
157
+ ) -> AnyCancellable {
158
+ let subscriber = Subscribers.Sink<Output, Failure>(
159
+ receiveCompletion: receiveCompletion,
160
+ receiveValue: receiveValue
161
+ )
162
+ subscribe(subscriber)
163
+ return AnyCancellable(subscriber)
164
+ }
165
+ }
166
+
167
+ extension Publisher where Failure == Never {
168
+
169
+ /// Attaches a subscriber with closure-based behavior to a publisher that never fails.
170
+ ///
171
+ /// Use `sink(receiveValue:)` to observe values received by the publisher and print
172
+ /// them to the console. This operator can only be used when the stream doesn’t fail,
173
+ /// that is, when the publisher’s `Failure` type is `Never`.
174
+ ///
175
+ /// In this example, a `Range` publisher publishes integers to a `sink(receiveValue:)`
176
+ /// operator’s `receiveValue` closure that prints them to the console:
177
+ ///
178
+ /// let integers = (0...3)
179
+ /// integers.publisher
180
+ /// .sink { print("Received \($0)") }
181
+ ///
182
+ /// // Prints:
183
+ /// // Received 0
184
+ /// // Received 1
185
+ /// // Received 2
186
+ /// // Received 3
187
+ ///
188
+ /// This method creates the subscriber and immediately requests an unlimited number of
189
+ /// values, prior to returning the subscriber.
190
+ /// The return value should be held, otherwise the stream will be canceled.
191
+ ///
192
+ /// - parameter receiveValue: The closure to execute on receipt of a value.
193
+ /// - Returns: A cancellable instance, which you use when you end assignment of
194
+ /// the received value. Deallocation of the result will tear down the subscription
195
+ /// stream.
196
+ public func sink(
197
+ receiveValue: @escaping (Output) -> Void
198
+ ) -> AnyCancellable {
199
+ let subscriber = Subscribers.Sink<Output, Failure>(
200
+ receiveCompletion: { _ in },
201
+ receiveValue: receiveValue
202
+ )
203
+ subscribe(subscriber)
204
+ return AnyCancellable(subscriber)
205
+ }
206
+ }
@@ -0,0 +1,9 @@
1
+ //
2
+ // Subscribers.swift
3
+ //
4
+ //
5
+ // Created by Sergej Jaskiewicz on 10.06.2019.
6
+ //
7
+
8
+ /// A namespace for types related to the `Subscriber` protocol.
9
+ public enum Subscribers {}