@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,264 @@
1
+ //
2
+ // Publishers.RemoveDuplicates.swift
3
+ //
4
+ //
5
+ // Created by Sergej Jaskiewicz on 24.10.2019.
6
+ //
7
+
8
+ extension Publisher where Output: Equatable {
9
+
10
+ /// Publishes only elements that don’t match the previous element.
11
+ ///
12
+ /// Use `removeDuplicates()` to remove repeating elements from an upstream publisher.
13
+ /// This operator has a two-element memory: the operator uses the current and
14
+ /// previously published elements as the basis for its comparison.
15
+ ///
16
+ /// In the example below, `removeDuplicates()` triggers on the doubled, tripled, and
17
+ /// quadrupled occurrences of `1`, `3`, and `4` respectively. Because the two-element
18
+ /// memory considers only the current element and the previous element, the operator
19
+ /// prints the final `0` in the example data since its immediate predecessor is `4`.
20
+ ///
21
+ /// let numbers = [0, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 0]
22
+ /// cancellable = numbers.publisher
23
+ /// .removeDuplicates()
24
+ /// .sink { print("\($0)", terminator: " ") }
25
+ ///
26
+ /// // Prints: "0 1 2 3 4 0"
27
+ ///
28
+ /// - Returns: A publisher that consumes — rather than publishes — duplicate elements.
29
+ public func removeDuplicates() -> Publishers.RemoveDuplicates<Self> {
30
+ return removeDuplicates(by: ==)
31
+ }
32
+ }
33
+
34
+ extension Publisher {
35
+
36
+ /// Publishes only elements that don’t match the previous element, as evaluated by
37
+ /// a provided closure.
38
+ ///
39
+ /// Use `removeDuplicates(by:)` to remove repeating elements from an upstream
40
+ /// publisher based upon the evaluation of the current and previously published
41
+ /// elements using a closure you provide.
42
+ ///
43
+ /// Use the `removeDuplicates(by:)` operator when comparing types that don’t
44
+ /// themselves implement `Equatable`, or if you need to compare values differently
45
+ /// than the type’s `Equatable` implementation.
46
+ ///
47
+ /// In the example below, the `removeDuplicates(by:)` functionality triggers when
48
+ /// the `x` property of the current and previous elements are equal, otherwise
49
+ /// the operator publishes the current `Point` to the downstream subscriber:
50
+ ///
51
+ /// struct Point {
52
+ /// let x: Int
53
+ /// let y: Int
54
+ /// }
55
+ ///
56
+ /// let points = [Point(x: 0, y: 0), Point(x: 0, y: 1),
57
+ /// Point(x: 1, y: 1), Point(x: 2, y: 1)]
58
+ /// cancellable = points.publisher
59
+ /// .removeDuplicates { prev, current in
60
+ /// // Considers points to be duplicate if the x coordinate
61
+ /// // is equal, and ignores the y coordinate
62
+ /// prev.x == current.x
63
+ /// }
64
+ /// .sink { print("\($0)", terminator: " ") }
65
+ ///
66
+ /// // Prints: Point(x: 0, y: 0) Point(x: 1, y: 1) Point(x: 2, y: 1)
67
+ ///
68
+ /// - Parameter predicate: A closure to evaluate whether two elements are equivalent,
69
+ /// for purposes of filtering. Return `true` from this closure to indicate that
70
+ /// the second element is a duplicate of the first.
71
+ /// - Returns: A publisher that consumes — rather than publishes — duplicate elements.
72
+ public func removeDuplicates(
73
+ by predicate: @escaping (Output, Output) -> Bool
74
+ ) -> Publishers.RemoveDuplicates<Self> {
75
+ return .init(upstream: self, predicate: predicate)
76
+ }
77
+
78
+ /// Publishes only elements that don’t match the previous element, as evaluated by
79
+ /// a provided error-throwing closure.
80
+ ///
81
+ /// Use `tryRemoveDuplicates(by:)` to remove repeating elements from an upstream
82
+ /// publisher based upon the evaluation of elements using an error-throwing closure
83
+ /// you provide. If your closure throws an error, the publisher terminates with
84
+ /// the error.
85
+ ///
86
+ /// In the example below, the closure provided to `tryRemoveDuplicates(by:)` returns
87
+ /// `true` when two consecutive elements are equal, thereby filtering out `0`,
88
+ /// `1`, `2`, and `3`. However, the closure throws an error when it encounters `4`.
89
+ /// The publisher then terminates with this error.
90
+ ///
91
+ /// struct BadValuesError: Error {}
92
+ /// let numbers = [0, 0, 0, 0, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
93
+ /// cancellable = numbers.publisher
94
+ /// .tryRemoveDuplicates { first, second -> Bool in
95
+ /// if (first == 4 && second == 4) {
96
+ /// throw BadValuesError()
97
+ /// }
98
+ /// return first == second
99
+ /// }
100
+ /// .sink(
101
+ /// receiveCompletion: { print ("\($0)") },
102
+ /// receiveValue: { print ("\($0)", terminator: " ") }
103
+ /// )
104
+ ///
105
+ /// // Prints: "0 1 2 3 4 failure(BadValuesError()"
106
+ ///
107
+ /// - Parameter predicate: A closure to evaluate whether two elements are equivalent,
108
+ /// for purposes of filtering. Return `true` from this closure to indicate that
109
+ /// the second element is a duplicate of the first. If this closure throws an error,
110
+ /// the publisher terminates with the thrown error.
111
+ /// - Returns: A publisher that consumes — rather than publishes — duplicate elements.
112
+ public func tryRemoveDuplicates(
113
+ by predicate: @escaping (Output, Output) throws -> Bool
114
+ ) -> Publishers.TryRemoveDuplicates<Self> {
115
+ return .init(upstream: self, predicate: predicate)
116
+ }
117
+ }
118
+
119
+ extension Publishers {
120
+
121
+ /// A publisher that publishes only elements that don’t match the previous element.
122
+ public struct RemoveDuplicates<Upstream: Publisher>: Publisher {
123
+
124
+ public typealias Output = Upstream.Output
125
+
126
+ public typealias Failure = Upstream.Failure
127
+
128
+ /// The publisher from which this publisher receives elements.
129
+ public let upstream: Upstream
130
+
131
+ /// The predicate closure used to evaluate whether two elements are duplicates.
132
+ public let predicate: (Output, Output) -> Bool
133
+
134
+ /// Creates a publisher that publishes only elements that don’t match the previous
135
+ /// element, as evaluated by a provided closure.
136
+ ///
137
+ /// - Parameter upstream: The publisher from which this publisher receives
138
+ /// elements.
139
+ /// - Parameter predicate: A closure to evaluate whether two elements are
140
+ /// equivalent, for purposes of filtering. Return `true` from this closure
141
+ /// to indicate that the second element is a duplicate of the first.
142
+ public init(upstream: Upstream, predicate: @escaping (Output, Output) -> Bool) {
143
+ self.upstream = upstream
144
+ self.predicate = predicate
145
+ }
146
+
147
+ public func receive<Downstream: Subscriber>(subscriber: Downstream)
148
+ where Upstream.Failure == Downstream.Failure,
149
+ Upstream.Output == Downstream.Input
150
+ {
151
+ upstream.subscribe(Inner(downstream: subscriber, filter: predicate))
152
+ }
153
+ }
154
+
155
+ /// A publisher that publishes only elements that don’t match the previous element,
156
+ /// as evaluated by a provided error-throwing closure.
157
+ public struct TryRemoveDuplicates<Upstream: Publisher>: Publisher {
158
+
159
+ public typealias Output = Upstream.Output
160
+
161
+ public typealias Failure = Error
162
+
163
+ /// The publisher from which this publisher receives elements.
164
+ public let upstream: Upstream
165
+
166
+ /// An error-throwing closure to evaluate whether two elements are equivalent,
167
+ /// for purposes of filtering.
168
+ public let predicate: (Output, Output) throws -> Bool
169
+
170
+ /// Creates a publisher that publishes only elements that don’t match the previous
171
+ /// element, as evaluated by a provided error-throwing closure.
172
+ ///
173
+ /// - Parameter upstream: The publisher from which this publisher receives
174
+ /// elements.
175
+ /// - Parameter predicate: An error-throwing closure to evaluate whether two
176
+ /// elements are equivalent, for purposes of filtering. Return `true` from this
177
+ /// closure to indicate that the second element is a duplicate of the first.
178
+ /// If this closure throws an error, the publisher terminates
179
+ /// with the thrown error.
180
+ public init(upstream: Upstream,
181
+ predicate: @escaping (Output, Output) throws -> Bool) {
182
+ self.upstream = upstream
183
+ self.predicate = predicate
184
+ }
185
+
186
+ public func receive<Downstream: Subscriber>(subscriber: Downstream)
187
+ where Upstream.Output == Downstream.Input, Downstream.Failure == Error
188
+ {
189
+ upstream.subscribe(Inner(downstream: subscriber, filter: predicate))
190
+ }
191
+ }
192
+ }
193
+
194
+ extension Publishers.RemoveDuplicates {
195
+ private final class Inner<Downstream: Subscriber>
196
+ : FilterProducer<Downstream,
197
+ Upstream.Output,
198
+ Upstream.Output,
199
+ Upstream.Failure,
200
+ (Output, Output) -> Bool>
201
+ where Downstream.Input == Upstream.Output, Downstream.Failure == Upstream.Failure
202
+ {
203
+ private var last: Upstream.Output?
204
+
205
+ override func receive(
206
+ newValue: Input
207
+ ) -> PartialCompletion<Upstream.Output?, Downstream.Failure> {
208
+ let last = self.last
209
+ self.last = newValue
210
+ return last.map {
211
+ filter($0, newValue) ? .continue(nil) : .continue(newValue)
212
+ } ?? .continue(newValue)
213
+ }
214
+
215
+ override var description: String { return "RemoveDuplicates" }
216
+
217
+ override var customMirror: Mirror {
218
+ let children: [Mirror.Child] = [
219
+ ("downstream", downstream),
220
+ ("last", last as Any)
221
+ ]
222
+ return Mirror(self, children: children)
223
+ }
224
+ }
225
+ }
226
+
227
+ extension Publishers.TryRemoveDuplicates {
228
+ private final class Inner<Downstream: Subscriber>
229
+ : FilterProducer<Downstream,
230
+ Upstream.Output,
231
+ Upstream.Output,
232
+ Upstream.Failure,
233
+ (Output, Output) throws -> Bool>
234
+ where Downstream.Input == Upstream.Output, Downstream.Failure == Error
235
+ {
236
+ private var last: Upstream.Output?
237
+
238
+ override func receive(
239
+ newValue: Input
240
+ ) -> PartialCompletion<Upstream.Output?, Downstream.Failure> {
241
+ let last = self.last
242
+ self.last = newValue
243
+ return last.map {
244
+ do {
245
+ return try filter($0, newValue)
246
+ ? .continue(nil)
247
+ : .continue(newValue)
248
+ } catch {
249
+ return .failure(error)
250
+ }
251
+ } ?? .continue(newValue)
252
+ }
253
+
254
+ override var description: String { return "TryRemoveDuplicates" }
255
+
256
+ override var customMirror: Mirror {
257
+ let children: [Mirror.Child] = [
258
+ ("downstream", downstream),
259
+ ("last", last as Any)
260
+ ]
261
+ return Mirror(self, children: children)
262
+ }
263
+ }
264
+ }
@@ -0,0 +1,201 @@
1
+ //
2
+ // Publishers.ReplaceEmpty.swift
3
+ // OpenCombine
4
+ //
5
+ // Created by Joe Spadafora on 12/10/19.
6
+ //
7
+
8
+ extension Publisher {
9
+
10
+ /// Replaces an empty stream with the provided element.
11
+ ///
12
+ /// Use `replaceEmpty(with:)` to provide a replacement element if the upstream
13
+ /// publisher finishes without producing any elements.
14
+ ///
15
+ /// In the example below, the empty `Double` array publisher doesn’t produce any
16
+ /// elements, so `replaceEmpty(with:)` publishes `Double.nan` and finishes normally.
17
+ ///
18
+ /// let numbers: [Double] = []
19
+ /// cancellable = numbers.publisher
20
+ /// .replaceEmpty(with: Double.nan)
21
+ /// .sink { print("\($0)", terminator: " ") }
22
+ ///
23
+ /// // Prints "(nan)".
24
+ ///
25
+ /// Conversely, providing a non-empty publisher publishes all elements and
26
+ /// the publisher then terminates normally:
27
+ ///
28
+ /// let otherNumbers: [Double] = [1.0, 2.0, 3.0]
29
+ /// cancellable2 = otherNumbers.publisher
30
+ /// .replaceEmpty(with: Double.nan)
31
+ /// .sink { print("\($0)", terminator: " ") }
32
+ ///
33
+ /// // Prints: 1.0 2.0 3.0
34
+ ///
35
+ /// - Parameter output: An element to emit when the upstream publisher finishes
36
+ /// without emitting any elements.
37
+ /// - Returns: A publisher that replaces an empty stream with the provided output
38
+ /// element.
39
+ public func replaceEmpty(with output: Output) -> Publishers.ReplaceEmpty<Self> {
40
+ return .init(upstream: self, output: output)
41
+ }
42
+ }
43
+
44
+ extension Publishers {
45
+
46
+ /// A publisher that replaces an empty stream with a provided element.
47
+ public struct ReplaceEmpty<Upstream: Publisher>: Publisher {
48
+
49
+ public typealias Output = Upstream.Output
50
+
51
+ public typealias Failure = Upstream.Failure
52
+
53
+ /// The element to deliver when the upstream publisher finishes
54
+ /// without delivering any elements.
55
+ public let output: Upstream.Output
56
+
57
+ /// The publisher from which this publisher receives elements.
58
+ public let upstream: Upstream
59
+
60
+ public init(upstream: Upstream, output: Output) {
61
+ self.upstream = upstream
62
+ self.output = output
63
+ }
64
+
65
+ public func receive<Downstream: Subscriber>(subscriber: Downstream)
66
+ where Upstream.Failure == Downstream.Failure,
67
+ Upstream.Output == Downstream.Input
68
+ {
69
+ let inner = Inner(downstream: subscriber, output: output)
70
+ upstream.subscribe(inner)
71
+ }
72
+ }
73
+ }
74
+
75
+ extension Publishers.ReplaceEmpty: Equatable
76
+ where Upstream: Equatable, Upstream.Output: Equatable {}
77
+
78
+ extension Publishers.ReplaceEmpty {
79
+
80
+ private final class Inner<Downstream: Subscriber>
81
+ : Subscriber,
82
+ Subscription,
83
+ CustomStringConvertible,
84
+ CustomReflectable,
85
+ CustomPlaygroundDisplayConvertible
86
+ where Upstream.Failure == Downstream.Failure,
87
+ Upstream.Output == Downstream.Input
88
+ {
89
+
90
+ typealias Input = Upstream.Output
91
+ typealias Failure = Upstream.Failure
92
+
93
+ private let output: Output
94
+ private let downstream: Downstream
95
+
96
+ private var receivedUpstream = false
97
+ private var lock = UnfairLock.allocate()
98
+ private var downstreamRequested = false
99
+ private var finishedWithoutUpstream = false
100
+
101
+ private var status = SubscriptionStatus.awaitingSubscription
102
+
103
+ fileprivate init(downstream: Downstream, output: Output) {
104
+ self.downstream = downstream
105
+ self.output = output
106
+ }
107
+
108
+ deinit {
109
+ lock.deallocate()
110
+ }
111
+
112
+ func receive(subscription: Subscription) {
113
+ lock.lock()
114
+ guard case .awaitingSubscription = status else {
115
+ lock.unlock()
116
+ subscription.cancel()
117
+ return
118
+ }
119
+ status = .subscribed(subscription)
120
+ lock.unlock()
121
+ downstream.receive(subscription: self)
122
+ subscription.request(.unlimited)
123
+ }
124
+
125
+ func receive(_ input: Upstream.Output) -> Subscribers.Demand {
126
+ lock.lock()
127
+ guard case .subscribed = status else {
128
+ lock.unlock()
129
+ return .none
130
+ }
131
+ receivedUpstream = true
132
+ lock.unlock()
133
+ return downstream.receive(input)
134
+ }
135
+
136
+ func receive(completion: Subscribers.Completion<Upstream.Failure>) {
137
+ lock.lock()
138
+ guard case .subscribed = status else {
139
+ lock.unlock()
140
+ return
141
+ }
142
+ status = .terminal
143
+ if receivedUpstream {
144
+ lock.unlock()
145
+ downstream.receive(completion: completion)
146
+ return
147
+ }
148
+ switch completion {
149
+ case .finished:
150
+ if downstreamRequested {
151
+ lock.unlock()
152
+ _ = downstream.receive(output)
153
+ downstream.receive(completion: completion)
154
+ return
155
+ }
156
+ finishedWithoutUpstream = true
157
+ lock.unlock()
158
+ case .failure:
159
+ lock.unlock()
160
+ downstream.receive(completion: completion)
161
+ }
162
+ }
163
+
164
+ func request(_ demand: Subscribers.Demand) {
165
+ demand.assertNonZero()
166
+ lock.lock()
167
+ downstreamRequested = true
168
+ if finishedWithoutUpstream {
169
+ lock.unlock()
170
+ _ = downstream.receive(output)
171
+ downstream.receive(completion: .finished)
172
+ return
173
+ }
174
+ guard case let .subscribed(subscription) = status else {
175
+ lock.unlock()
176
+ return
177
+ }
178
+ lock.unlock()
179
+ subscription.request(demand)
180
+ }
181
+
182
+ func cancel() {
183
+ lock.lock()
184
+ guard case let .subscribed(subscription) = status else {
185
+ lock.unlock()
186
+ return
187
+ }
188
+ status = .terminal
189
+ lock.unlock()
190
+ subscription.cancel()
191
+ }
192
+
193
+ var description: String { return "ReplaceEmpty" }
194
+
195
+ var customMirror: Mirror {
196
+ return Mirror(self, children: EmptyCollection())
197
+ }
198
+
199
+ var playgroundDescription: Any { return description }
200
+ }
201
+ }
@@ -0,0 +1,211 @@
1
+ //
2
+ // Publishers.ReplaceError.swift
3
+ // OpenCombine
4
+ //
5
+ // Created by Bogdan Vlad on 8/29/19.
6
+ //
7
+
8
+ extension Publisher {
9
+
10
+ /// Replaces any errors in the stream with the provided element.
11
+ ///
12
+ /// If the upstream publisher fails with an error, this publisher emits the provided
13
+ /// element, then finishes normally.
14
+ ///
15
+ /// In the example below, a publisher of strings fails with a `MyError` instance,
16
+ /// which sends a failure completion downstream. The `replaceError(with:)` operator
17
+ /// handles the failure by publishing the string `(replacement element)` and
18
+ /// completing normally.
19
+ ///
20
+ /// struct MyError: Error {}
21
+ /// let fail = Fail<String, MyError>(error: MyError())
22
+ /// cancellable = fail
23
+ /// .replaceError(with: "(replacement element)")
24
+ /// .sink(
25
+ /// receiveCompletion: { print ("\($0)") },
26
+ /// receiveValue: { print ("\($0)", terminator: " ") }
27
+ /// )
28
+ ///
29
+ /// // Prints: "(replacement element) finished".
30
+ ///
31
+ /// This `replaceError(with:)` functionality is useful when you want to handle
32
+ /// an error by sending a single replacement element and end the stream.
33
+ /// Use `catch(_:)` to recover from an error and provide a replacement publisher
34
+ /// to continue providing elements to the downstream subscriber.
35
+ ///
36
+ /// - Parameter output: An element to emit when the upstream publisher fails.
37
+ /// - Returns: A publisher that replaces an error from the upstream publisher with
38
+ /// the provided output element.
39
+ public func replaceError(with output: Output) -> Publishers.ReplaceError<Self> {
40
+ return .init(upstream: self, output: output)
41
+ }
42
+ }
43
+
44
+ extension Publishers {
45
+ /// A publisher that replaces any errors in the stream with a provided element.
46
+ public struct ReplaceError<Upstream: Publisher>: Publisher {
47
+
48
+ /// The kind of values published by this publisher.
49
+ public typealias Output = Upstream.Output
50
+
51
+ /// The kind of errors this publisher might publish.
52
+ ///
53
+ /// Use `Never` if this `Publisher` does not publish errors.
54
+ public typealias Failure = Never
55
+
56
+ /// The element with which to replace errors from the upstream publisher.
57
+ public let output: Upstream.Output
58
+
59
+ /// The publisher from which this publisher receives elements.
60
+ public let upstream: Upstream
61
+
62
+ public init(upstream: Upstream,
63
+ output: Output) {
64
+ self.upstream = upstream
65
+ self.output = output
66
+ }
67
+
68
+ /// This function is called to attach the specified `Subscriber`
69
+ /// to this `Publisher` by `subscribe(_:)`
70
+ ///
71
+ /// - SeeAlso: `subscribe(_:)`
72
+ /// - Parameters:
73
+ /// - subscriber: The subscriber to attach to this `Publisher`.
74
+ /// once attached it can begin to receive values.
75
+ public func receive<Downstream: Subscriber>(subscriber: Downstream)
76
+ where Upstream.Output == Downstream.Input, Downstream.Failure == Failure
77
+ {
78
+ upstream.subscribe(Inner(downstream: subscriber, output: output))
79
+ }
80
+ }
81
+ }
82
+
83
+ extension Publishers.ReplaceError: Equatable
84
+ where Upstream: Equatable, Upstream.Output: Equatable
85
+ {}
86
+
87
+ extension Publishers.ReplaceError {
88
+
89
+ private final class Inner<Downstream: Subscriber>
90
+ : Subscriber,
91
+ Subscription,
92
+ CustomStringConvertible,
93
+ CustomReflectable,
94
+ CustomPlaygroundDisplayConvertible
95
+ where Upstream.Output == Downstream.Input
96
+ {
97
+ typealias Input = Upstream.Output
98
+ typealias Failure = Upstream.Failure
99
+
100
+ private let output: Upstream.Output
101
+ private let downstream: Downstream
102
+ private var status = SubscriptionStatus.awaitingSubscription
103
+ private var terminated = false
104
+ private var pendingDemand = Subscribers.Demand.none
105
+ private var lock = UnfairLock.allocate()
106
+
107
+ fileprivate init(downstream: Downstream, output: Upstream.Output) {
108
+ self.downstream = downstream
109
+ self.output = output
110
+ }
111
+
112
+ deinit {
113
+ lock.deallocate()
114
+ }
115
+
116
+ func receive(subscription: Subscription) {
117
+ lock.lock()
118
+ guard case .awaitingSubscription = status else {
119
+ lock.unlock()
120
+ subscription.cancel()
121
+ return
122
+ }
123
+ status = .subscribed(subscription)
124
+ lock.unlock()
125
+ downstream.receive(subscription: self)
126
+ }
127
+
128
+ func receive(_ input: Input) -> Subscribers.Demand {
129
+ lock.lock()
130
+ guard case .subscribed = status else {
131
+ lock.unlock()
132
+ return .none
133
+ }
134
+ pendingDemand -= 1
135
+ lock.unlock()
136
+ let demand = downstream.receive(input)
137
+ if demand == .none {
138
+ return .none
139
+ }
140
+ lock.lock()
141
+ pendingDemand += demand
142
+ lock.unlock()
143
+ return demand
144
+ }
145
+
146
+ func receive(completion: Subscribers.Completion<Failure>) {
147
+ lock.lock()
148
+ guard case .subscribed = status, !terminated else {
149
+ lock.unlock()
150
+ return
151
+ }
152
+ switch completion {
153
+ case .finished:
154
+ status = .terminal
155
+ lock.unlock()
156
+ downstream.receive(completion: .finished)
157
+ case .failure:
158
+ // If there was no demand from downstream,
159
+ // ReplaceError does not forward the value that
160
+ // replaces the error until it is requested.
161
+ if pendingDemand == .none {
162
+ terminated = true
163
+ lock.unlock()
164
+ return
165
+ }
166
+ status = .terminal
167
+ lock.unlock()
168
+ _ = downstream.receive(output)
169
+ downstream.receive(completion: .finished)
170
+ }
171
+ }
172
+
173
+ func request(_ demand: Subscribers.Demand) {
174
+ demand.assertNonZero()
175
+ lock.lock()
176
+ if terminated {
177
+ status = .terminal
178
+ lock.unlock()
179
+ _ = downstream.receive(output)
180
+ downstream.receive(completion: .finished)
181
+ return
182
+ }
183
+ pendingDemand += demand
184
+ guard case let .subscribed(subscription) = status else {
185
+ lock.unlock()
186
+ return
187
+ }
188
+ lock.unlock()
189
+ subscription.request(demand)
190
+ }
191
+
192
+ func cancel() {
193
+ lock.lock()
194
+ guard case let .subscribed(subscription) = status else {
195
+ lock.unlock()
196
+ return
197
+ }
198
+ status = .terminal
199
+ lock.unlock()
200
+ subscription.cancel()
201
+ }
202
+
203
+ var description: String { return "ReplaceError" }
204
+
205
+ var customMirror: Mirror {
206
+ return Mirror(self, children: EmptyCollection())
207
+ }
208
+
209
+ var playgroundDescription: Any { return description }
210
+ }
211
+ }