@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,397 @@
1
+ // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2
+ // ┃ ┃
3
+ // ┃ Auto-generated from GYB template. DO NOT EDIT! ┃
4
+ // ┃ ┃
5
+ // ┃ ┃
6
+ // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
7
+ //
8
+ // Publisher+Concurrency.swift
9
+ //
10
+ //
11
+ // Created by Sergej Jaskiewicz on 28.08.2021.
12
+ //
13
+
14
+ #if canImport(_Concurrency) && compiler(>=5.5)
15
+ import _Concurrency
16
+ #endif
17
+
18
+ #if canImport(_Concurrency) && compiler(>=5.5) || compiler(>=5.5.1)
19
+ extension Publisher where Failure == Never {
20
+
21
+ /// The elements produced by the publisher, as an asynchronous sequence.
22
+ ///
23
+ /// This property provides an `AsyncPublisher`, which allows you to use
24
+ /// the Swift `async`-`await` syntax to receive the publisher's elements.
25
+ /// Because `AsyncPublisher` conforms to `AsyncSequence`, you iterate over its
26
+ /// elements with a `for`-`await`-`in` loop, rather than attaching a subscriber.
27
+ @available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
28
+ public var values: AsyncPublisher<Self> {
29
+ return .init(self)
30
+ }
31
+ }
32
+
33
+ /// A publisher that exposes its elements as an asynchronous sequence.
34
+ ///
35
+ /// `AsyncPublisher` conforms to `AsyncSequence`, which allows callers to receive
36
+ /// values with the `for`-`await`-`in` syntax, rather than attaching a `Subscriber`.
37
+ ///
38
+ /// Use the `values` property of the `Publisher` protocol to wrap an existing publisher
39
+ /// with an instance of this type.
40
+ @available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
41
+ public struct AsyncPublisher<Upstream: Publisher>: AsyncSequence
42
+ where Upstream.Failure == Never
43
+ {
44
+
45
+ public typealias Element = Upstream.Output
46
+
47
+ /// The iterator that produces elements of the asynchronous publisher sequence.
48
+ public struct Iterator: AsyncIteratorProtocol {
49
+
50
+ public typealias Element = Upstream.Output
51
+
52
+ fileprivate let inner: Inner
53
+
54
+ /// Produces the next element in the prefix sequence.
55
+ ///
56
+ /// - Returns: The next published element, or `nil` if the publisher finishes
57
+ /// normally.
58
+ public mutating func next() async -> Element? {
59
+ return await withTaskCancellationHandler(
60
+ operation: { [inner] in await inner.next() },
61
+ onCancel: { [inner] in inner.cancel() }
62
+ )
63
+ }
64
+ }
65
+
66
+ /// The type of asynchronous iterator that produces elements of this
67
+ /// asynchronous sequence.
68
+ public typealias AsyncIterator = Iterator
69
+
70
+ private let publisher: Upstream
71
+
72
+ /// Creates a publisher that exposes elements received from an upstream publisher as
73
+ /// a throwing asynchronous sequence.
74
+ ///
75
+ /// - Parameter publisher: An upstream publisher. The asynchronous publisher converts
76
+ /// elements received from this publisher into an asynchronous sequence.
77
+ public init(_ publisher: Upstream) {
78
+ self.publisher = publisher
79
+ }
80
+
81
+ /// Creates the asynchronous iterator that produces elements of this asynchronous
82
+ /// sequence.
83
+ ///
84
+ /// - Returns: An instance of the `AsyncIterator` type used to produce elements of
85
+ /// the asynchronous sequence.
86
+ public func makeAsyncIterator() -> Iterator {
87
+ let inner = Iterator.Inner()
88
+ publisher.subscribe(inner)
89
+ return Iterator(inner: inner)
90
+ }
91
+ }
92
+
93
+ @available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
94
+ extension AsyncPublisher.Iterator {
95
+
96
+ fileprivate final class Inner: Subscriber, Cancellable {
97
+ typealias Input = Upstream.Output
98
+ typealias Failure = Upstream.Failure
99
+
100
+ private enum State {
101
+ case awaitingSubscription
102
+ case subscribed(Subscription)
103
+ case terminal
104
+ }
105
+
106
+ private let lock = UnfairLock.allocate()
107
+ private var pending: [UnsafeContinuation<Input?, Never>] = []
108
+ private var state = State.awaitingSubscription
109
+ private var pendingDemand = Subscribers.Demand.none
110
+
111
+ deinit {
112
+ lock.deallocate()
113
+ }
114
+
115
+ func receive(subscription: Subscription) {
116
+ lock.lock()
117
+ guard case .awaitingSubscription = state else {
118
+ lock.unlock()
119
+ subscription.cancel()
120
+ return
121
+ }
122
+ state = .subscribed(subscription)
123
+ let pendingDemand = self.pendingDemand
124
+ self.pendingDemand = .none
125
+ lock.unlock()
126
+ if pendingDemand != .none {
127
+ subscription.request(pendingDemand)
128
+ }
129
+ }
130
+
131
+ func receive(_ input: Input) -> Subscribers.Demand {
132
+ lock.lock()
133
+ guard case .subscribed = state else {
134
+ let pending = self.pending.take()
135
+ lock.unlock()
136
+ pending.resumeAllWithNil()
137
+ return .none
138
+ }
139
+ precondition(!pending.isEmpty, "Received an output without requesting demand")
140
+ let continuation = pending.removeFirst()
141
+ lock.unlock()
142
+ continuation.resume(returning: input)
143
+ return .none
144
+ }
145
+
146
+ func receive(completion: Subscribers.Completion<Failure>) {
147
+ lock.lock()
148
+ state = .terminal
149
+ let pending = self.pending.take()
150
+ lock.unlock()
151
+ pending.resumeAllWithNil()
152
+ }
153
+
154
+ func cancel() {
155
+ lock.lock()
156
+ let pending = self.pending.take()
157
+ guard case .subscribed(let subscription) = state else {
158
+ state = .terminal
159
+ lock.unlock()
160
+ pending.resumeAllWithNil()
161
+ return
162
+ }
163
+ state = .terminal
164
+ lock.unlock()
165
+ subscription.cancel()
166
+ pending.resumeAllWithNil()
167
+ }
168
+
169
+ fileprivate func next() async -> Input? {
170
+ return await withUnsafeContinuation { continuation in
171
+ lock.lock()
172
+ switch state {
173
+ case .awaitingSubscription:
174
+ pending.append(continuation)
175
+ pendingDemand += 1
176
+ lock.unlock()
177
+ case .subscribed(let subscription):
178
+ pending.append(continuation)
179
+ lock.unlock()
180
+ subscription.request(.max(1))
181
+ case .terminal:
182
+ lock.unlock()
183
+ continuation.resume(returning: nil)
184
+ }
185
+ }
186
+ }
187
+ }
188
+ }
189
+ extension Publisher {
190
+
191
+ /// The elements produced by the publisher, as a throwing asynchronous sequence.
192
+ ///
193
+ /// This property provides an `AsyncThrowingPublisher`, which allows you to use
194
+ /// the Swift `async`-`await` syntax to receive the publisher's elements.
195
+ /// Because `AsyncPublisher` conforms to `AsyncSequence`, you iterate over its
196
+ /// elements with a `for`-`await`-`in` loop, rather than attaching a subscriber.
197
+ /// If the publisher terminates with an error, the awaiting caller receives the error
198
+ /// as a `throw`.
199
+ @available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
200
+ public var values: AsyncThrowingPublisher<Self> {
201
+ return .init(self)
202
+ }
203
+ }
204
+
205
+ /// A publisher that exposes its elements as a throwing asynchronous sequence.
206
+ ///
207
+ /// `AsyncThrowingPublisher` conforms to `AsyncSequence`, which allows callers to receive
208
+ /// values with the `for`-`await`-`in` syntax, rather than attaching a `Subscriber`.
209
+ /// If the upstream publisher terminates with an error, `AsyncThrowingPublisher` throws
210
+ /// the error to the awaiting caller.
211
+ ///
212
+ /// Use the `values` property of the `Publisher` protocol to wrap an existing publisher
213
+ /// with an instance of this type.
214
+ @available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
215
+ public struct AsyncThrowingPublisher<Upstream: Publisher>: AsyncSequence
216
+ {
217
+
218
+ public typealias Element = Upstream.Output
219
+
220
+ /// The iterator that produces elements of the asynchronous publisher sequence.
221
+ public struct Iterator: AsyncIteratorProtocol {
222
+
223
+ public typealias Element = Upstream.Output
224
+
225
+ fileprivate let inner: Inner
226
+
227
+ /// Produces the next element in the prefix sequence.
228
+ ///
229
+ /// - Returns: The next published element, or `nil` if the publisher finishes
230
+ /// normally.
231
+ /// If the publisher terminates with an error, the call point receives
232
+ /// the error as a `throw`.
233
+ public mutating func next() async throws -> Element? {
234
+ return try await withTaskCancellationHandler(
235
+ operation: { [inner] in try await inner.next() },
236
+ onCancel: { [inner] in inner.cancel() }
237
+ )
238
+ }
239
+ }
240
+
241
+ /// The type of asynchronous iterator that produces elements of this
242
+ /// asynchronous sequence.
243
+ public typealias AsyncIterator = Iterator
244
+
245
+ private let publisher: Upstream
246
+
247
+ /// Creates a publisher that exposes elements received from an upstream publisher as
248
+ /// an asynchronous sequence.
249
+ ///
250
+ /// - Parameter publisher: An upstream publisher. The asynchronous publisher converts
251
+ /// elements received from this publisher into an asynchronous sequence.
252
+ public init(_ publisher: Upstream) {
253
+ self.publisher = publisher
254
+ }
255
+
256
+ /// Creates the asynchronous iterator that produces elements of this asynchronous
257
+ /// sequence.
258
+ ///
259
+ /// - Returns: An instance of the `AsyncIterator` type used to produce elements of
260
+ /// the asynchronous sequence.
261
+ public func makeAsyncIterator() -> Iterator {
262
+ let inner = Iterator.Inner()
263
+ publisher.subscribe(inner)
264
+ return Iterator(inner: inner)
265
+ }
266
+ }
267
+
268
+ @available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
269
+ extension AsyncThrowingPublisher.Iterator {
270
+
271
+ fileprivate final class Inner: Subscriber, Cancellable {
272
+ typealias Input = Upstream.Output
273
+ typealias Failure = Upstream.Failure
274
+
275
+ private enum State {
276
+ case awaitingSubscription
277
+ case subscribed(Subscription)
278
+ case terminal(Error?)
279
+ }
280
+
281
+ private let lock = UnfairLock.allocate()
282
+ private var pending: [UnsafeContinuation<Input?, Error>] = []
283
+ private var state = State.awaitingSubscription
284
+ private var pendingDemand = Subscribers.Demand.none
285
+
286
+ deinit {
287
+ lock.deallocate()
288
+ }
289
+
290
+ func receive(subscription: Subscription) {
291
+ lock.lock()
292
+ guard case .awaitingSubscription = state else {
293
+ lock.unlock()
294
+ subscription.cancel()
295
+ return
296
+ }
297
+ state = .subscribed(subscription)
298
+ let pendingDemand = self.pendingDemand
299
+ self.pendingDemand = .none
300
+ lock.unlock()
301
+ if pendingDemand != .none {
302
+ subscription.request(pendingDemand)
303
+ }
304
+ }
305
+
306
+ func receive(_ input: Input) -> Subscribers.Demand {
307
+ lock.lock()
308
+ guard case .subscribed = state else {
309
+ let pending = self.pending.take()
310
+ lock.unlock()
311
+ pending.resumeAllWithNil()
312
+ return .none
313
+ }
314
+ precondition(!pending.isEmpty, "Received an output without requesting demand")
315
+ let continuation = pending.removeFirst()
316
+ lock.unlock()
317
+ continuation.resume(returning: input)
318
+ return .none
319
+ }
320
+
321
+ func receive(completion: Subscribers.Completion<Failure>) {
322
+ lock.lock()
323
+ switch state {
324
+ case .awaitingSubscription, .subscribed:
325
+ if let continuation = pending.first {
326
+ state = .terminal(nil)
327
+ let remaining = pending.take().dropFirst()
328
+ lock.unlock()
329
+ switch completion {
330
+ case .finished:
331
+ continuation.resume(returning: nil)
332
+ case .failure(let error):
333
+ continuation.resume(throwing: error)
334
+ }
335
+ remaining.resumeAllWithNil()
336
+ } else {
337
+ state = .terminal(completion.failure)
338
+ lock.unlock()
339
+ }
340
+ case .terminal:
341
+ let pending = self.pending.take()
342
+ lock.unlock()
343
+ pending.resumeAllWithNil()
344
+ }
345
+ }
346
+
347
+ func cancel() {
348
+ lock.lock()
349
+ let pending = self.pending.take()
350
+ guard case .subscribed(let subscription) = state else {
351
+ state = .terminal(nil)
352
+ lock.unlock()
353
+ pending.resumeAllWithNil()
354
+ return
355
+ }
356
+ state = .terminal(nil)
357
+ lock.unlock()
358
+ subscription.cancel()
359
+ pending.resumeAllWithNil()
360
+ }
361
+
362
+ fileprivate func next() async throws -> Input? {
363
+ return try await withUnsafeThrowingContinuation { continuation in
364
+ lock.lock()
365
+ switch state {
366
+ case .awaitingSubscription:
367
+ pending.append(continuation)
368
+ pendingDemand += 1
369
+ lock.unlock()
370
+ case .subscribed(let subscription):
371
+ pending.append(continuation)
372
+ lock.unlock()
373
+ subscription.request(.max(1))
374
+ case .terminal(nil):
375
+ lock.unlock()
376
+ continuation.resume(returning: nil)
377
+ case .terminal(let error?):
378
+ state = .terminal(nil)
379
+ lock.unlock()
380
+ continuation.resume(throwing: error)
381
+ }
382
+ }
383
+ }
384
+ }
385
+ }
386
+
387
+ @available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
388
+ extension Sequence {
389
+ fileprivate func resumeAllWithNil<Output, Failure: Error>()
390
+ where Element == UnsafeContinuation<Output?, Failure>
391
+ {
392
+ for continuation in self {
393
+ continuation.resume(returning: nil)
394
+ }
395
+ }
396
+ }
397
+ #endif
@@ -0,0 +1,252 @@
1
+ //
2
+ // CurrentValueSubject.swift
3
+ //
4
+ //
5
+ // Created by Sergej Jaskiewicz on 11.06.2019.
6
+ //
7
+
8
+ /// A subject that wraps a single value and publishes a new element whenever the value
9
+ /// changes.
10
+ ///
11
+ /// Unlike `PassthroughSubject`, `CurrentValueSubject` maintains a buffer of the most
12
+ /// recently published element.
13
+ ///
14
+ /// Calling `send(_:)` on a `CurrentValueSubject` also updates the current value, making
15
+ /// it equivalent to updating the `value` directly.
16
+ public final class CurrentValueSubject<Output, Failure: Error>: Subject {
17
+
18
+ private let lock = UnfairLock.allocate()
19
+
20
+ private var active = true
21
+
22
+ private var completion: Subscribers.Completion<Failure>?
23
+
24
+ private var downstreams = ConduitList<Output, Failure>.empty
25
+
26
+ private var currentValue: Output
27
+
28
+ private var upstreamSubscriptions: [Subscription] = []
29
+
30
+ /// The value wrapped by this subject, published as a new element whenever it changes.
31
+ public var value: Output {
32
+ get {
33
+ lock.lock()
34
+ defer { lock.unlock() }
35
+ return currentValue
36
+ }
37
+ set {
38
+ lock.lock()
39
+ currentValue = newValue
40
+ sendValueAndConsumeLock(newValue)
41
+ }
42
+ }
43
+
44
+ /// Creates a current value subject with the given initial value.
45
+ ///
46
+ /// - Parameter value: The initial value to publish.
47
+ public init(_ value: Output) {
48
+ self.currentValue = value
49
+ }
50
+
51
+ deinit {
52
+ for subscription in upstreamSubscriptions {
53
+ subscription.cancel()
54
+ }
55
+ lock.deallocate()
56
+ }
57
+
58
+ public func send(subscription: Subscription) {
59
+ lock.lock()
60
+ upstreamSubscriptions.append(subscription)
61
+ lock.unlock()
62
+ subscription.request(.unlimited)
63
+ }
64
+
65
+ public func receive<Downstream: Subscriber>(subscriber: Downstream)
66
+ where Output == Downstream.Input, Failure == Downstream.Failure
67
+ {
68
+ lock.lock()
69
+ if active {
70
+ let conduit = Conduit(parent: self, downstream: subscriber)
71
+ downstreams.insert(conduit)
72
+ lock.unlock()
73
+ subscriber.receive(subscription: conduit)
74
+ } else {
75
+ let completion = self.completion!
76
+ lock.unlock()
77
+ subscriber.receive(subscription: Subscriptions.empty)
78
+ subscriber.receive(completion: completion)
79
+ }
80
+ }
81
+
82
+ public func send(_ input: Output) {
83
+ lock.lock()
84
+ sendValueAndConsumeLock(input)
85
+ }
86
+
87
+ private func sendValueAndConsumeLock(_ newValue: Output) {
88
+ #if DEBUG
89
+ lock.assertOwner()
90
+ #endif
91
+ guard active else {
92
+ lock.unlock()
93
+ return
94
+ }
95
+ currentValue = newValue
96
+ let downstreams = self.downstreams
97
+ lock.unlock()
98
+ downstreams.forEach { conduit in
99
+ conduit.offer(newValue)
100
+ }
101
+ }
102
+
103
+ public func send(completion: Subscribers.Completion<Failure>) {
104
+ lock.lock()
105
+ guard active else {
106
+ lock.unlock()
107
+ return
108
+ }
109
+ active = false
110
+ self.completion = completion
111
+ let downstreams = self.downstreams.take()
112
+ lock.unlock()
113
+ downstreams.forEach { conduit in
114
+ conduit.finish(completion: completion)
115
+ }
116
+ }
117
+
118
+ private func disassociate(_ conduit: ConduitBase<Output, Failure>) {
119
+ lock.lock()
120
+ guard active else {
121
+ lock.unlock()
122
+ return
123
+ }
124
+ downstreams.remove(conduit)
125
+ lock.unlock()
126
+ }
127
+ }
128
+
129
+ extension CurrentValueSubject {
130
+
131
+ private final class Conduit<Downstream: Subscriber>
132
+ : ConduitBase<Output, Failure>,
133
+ CustomStringConvertible,
134
+ CustomReflectable,
135
+ CustomPlaygroundDisplayConvertible
136
+ where Downstream.Input == Output, Downstream.Failure == Failure
137
+ {
138
+
139
+ fileprivate var parent: CurrentValueSubject?
140
+
141
+ fileprivate var downstream: Downstream?
142
+
143
+ fileprivate var demand = Subscribers.Demand.none
144
+
145
+ private var lock = UnfairLock.allocate()
146
+
147
+ private var downstreamLock = UnfairRecursiveLock.allocate()
148
+
149
+ private var deliveredCurrentValue = false
150
+
151
+ fileprivate init(parent: CurrentValueSubject,
152
+ downstream: Downstream) {
153
+ self.parent = parent
154
+ self.downstream = downstream
155
+ }
156
+
157
+ deinit {
158
+ lock.deallocate()
159
+ downstreamLock.deallocate()
160
+ }
161
+
162
+ override func offer(_ output: Output) {
163
+ lock.lock()
164
+ guard demand > 0, let downstream = self.downstream else {
165
+ deliveredCurrentValue = false
166
+ lock.unlock()
167
+ return
168
+ }
169
+ demand -= 1
170
+ deliveredCurrentValue = true
171
+ lock.unlock()
172
+ downstreamLock.lock()
173
+ let newDemand = downstream.receive(output)
174
+ downstreamLock.unlock()
175
+ guard newDemand > 0 else { return }
176
+ lock.lock()
177
+ demand += newDemand
178
+ lock.unlock()
179
+ }
180
+
181
+ override func finish(completion: Subscribers.Completion<Failure>) {
182
+ lock.lock()
183
+ guard let downstream = self.downstream.take() else {
184
+ lock.unlock()
185
+ return
186
+ }
187
+ let parent = self.parent.take()
188
+ lock.unlock()
189
+ parent?.disassociate(self)
190
+ downstreamLock.lock()
191
+ downstream.receive(completion: completion)
192
+ downstreamLock.unlock()
193
+ }
194
+
195
+ override func request(_ demand: Subscribers.Demand) {
196
+ demand.assertNonZero()
197
+ lock.lock()
198
+ guard let downstream = self.downstream else {
199
+ lock.unlock()
200
+ return
201
+ }
202
+ if deliveredCurrentValue {
203
+ self.demand += demand
204
+ lock.unlock()
205
+ return
206
+ }
207
+
208
+ // Hasn't yet delivered the current value
209
+
210
+ self.demand += demand
211
+ deliveredCurrentValue = true
212
+ if let currentValue = self.parent?.value {
213
+ self.demand -= 1
214
+ lock.unlock()
215
+ downstreamLock.lock()
216
+ let newDemand = downstream.receive(currentValue)
217
+ downstreamLock.unlock()
218
+ guard newDemand > 0 else { return }
219
+ lock.lock()
220
+ self.demand += newDemand
221
+ }
222
+ lock.unlock()
223
+ }
224
+
225
+ override func cancel() {
226
+ lock.lock()
227
+ if downstream.take() == nil {
228
+ lock.unlock()
229
+ return
230
+ }
231
+ let parent = self.parent.take()
232
+ lock.unlock()
233
+ parent?.disassociate(self)
234
+ }
235
+
236
+ var description: String { return "CurrentValueSubject" }
237
+
238
+ var customMirror: Mirror {
239
+ lock.lock()
240
+ defer { lock.unlock() }
241
+ let children: [Mirror.Child] = [
242
+ ("parent", parent as Any),
243
+ ("downstream", downstream as Any),
244
+ ("demand", demand),
245
+ ("subject", parent as Any)
246
+ ]
247
+ return Mirror(self, children: children)
248
+ }
249
+
250
+ var playgroundDescription: Any { return description }
251
+ }
252
+ }
@@ -0,0 +1,28 @@
1
+ //
2
+ // CustomCombineIdentifierConvertible.swift
3
+ // OpenCombine
4
+ //
5
+ // Created by Sergej Jaskiewicz on 10.06.2019.
6
+ //
7
+
8
+ /// A protocol for uniquely identifying publisher streams.
9
+ ///
10
+ /// If you create a custom `Subscription` or `Subscriber` type, implement this protocol
11
+ /// so that development tools can uniquely identify publisher chains in your app.
12
+ /// If your type is a class, OpenCombine provides an implementation of `combineIdentifier`
13
+ /// for you.
14
+ /// If your type is a structure, set up the identifier as follows:
15
+ ///
16
+ /// let combineIdentifier = CombineIdentifier()
17
+ public protocol CustomCombineIdentifierConvertible {
18
+
19
+ /// A unique identifier for identifying publisher streams.
20
+ var combineIdentifier: CombineIdentifier { get }
21
+ }
22
+
23
+ extension CustomCombineIdentifierConvertible where Self: AnyObject {
24
+
25
+ public var combineIdentifier: CombineIdentifier {
26
+ return CombineIdentifier(self)
27
+ }
28
+ }