@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,356 @@
1
+ //
2
+ // Publishers.Buffer.swift
3
+ //
4
+ //
5
+ // Created by Sergej Jaskiewicz on 08.01.2020.
6
+ //
7
+
8
+ extension Publisher {
9
+
10
+ /// Buffers elements received from an upstream publisher.
11
+ ///
12
+ /// Use `buffer(size:prefetch:whenFull:)` to collect a specific number of elements
13
+ /// from an upstream publisher before republishing them to the downstream subscriber
14
+ /// according to the `Publishers.BufferingStrategy` and `Publishers.PrefetchStrategy`
15
+ /// strategy you specify.
16
+ ///
17
+ /// If the publisher completes before reaching the `size` threshold, it buffers
18
+ /// the elements and publishes them downstream prior to completion.
19
+ ///
20
+ /// - Parameters:
21
+ /// - size: The maximum number of elements to store.
22
+ /// - prefetch: The strategy to initially populate the buffer.
23
+ /// - whenFull: The action to take when the buffer becomes full.
24
+ /// - Returns: A publisher that buffers elements received from an upstream publisher.
25
+ public func buffer(
26
+ size: Int,
27
+ prefetch: Publishers.PrefetchStrategy,
28
+ whenFull: Publishers.BufferingStrategy<Failure>
29
+ ) -> Publishers.Buffer<Self> {
30
+ return .init(upstream: self,
31
+ size: size,
32
+ prefetch: prefetch,
33
+ whenFull: whenFull)
34
+ }
35
+ }
36
+
37
+ extension Publishers {
38
+
39
+ /// A strategy for filling a buffer.
40
+ public enum PrefetchStrategy {
41
+
42
+ /// A strategy to fill the buffer at subscription time, and keep it full
43
+ /// thereafter.
44
+ ///
45
+ /// This strategy starts by making a demand equal to the buffer’s size from
46
+ /// the upstream when the subscriber first connects. Afterwards, it continues
47
+ /// to demand elements from the upstream to try to keep the buffer full.
48
+ case keepFull
49
+
50
+ /// A strategy that avoids prefetching and instead performs requests on demand.
51
+ ///
52
+ /// This strategy just forwards the downstream’s requests to the upstream
53
+ /// publisher.
54
+ case byRequest
55
+ }
56
+
57
+ /// A strategy that handles exhaustion of a buffer’s capacity.
58
+ public enum BufferingStrategy<Failure: Error> {
59
+
60
+ /// When the buffer is full, discard the newly received element.
61
+ case dropNewest
62
+
63
+ /// When the buffer is full, discard the oldest element in the buffer.
64
+ case dropOldest
65
+
66
+ /// When the buffer is full, execute the closure to provide a custom error.
67
+ case customError(() -> Failure)
68
+ }
69
+
70
+ /// A publisher that buffers elements received from an upstream publisher.
71
+ public struct Buffer<Upstream: Publisher>: Publisher {
72
+
73
+ public typealias Output = Upstream.Output
74
+
75
+ public typealias Failure = Upstream.Failure
76
+
77
+ /// The publisher from which this publisher receives elements.
78
+ public let upstream: Upstream
79
+
80
+ /// The maximum number of elements to store.
81
+ public let size: Int
82
+
83
+ /// The strategy for initially populating the buffer.
84
+ public let prefetch: Publishers.PrefetchStrategy
85
+
86
+ /// The action to take when the buffer becomes full.
87
+ public let whenFull: Publishers.BufferingStrategy<Failure>
88
+
89
+ /// Creates a publisher that buffers elements received from an upstream publisher.
90
+ /// - Parameter upstream: The publisher from which this publisher receives
91
+ /// elements.
92
+ /// - Parameter size: The maximum number of elements to store.
93
+ /// - Parameter prefetch: The strategy for initially populating the buffer.
94
+ /// - Parameter whenFull: The action to take when the buffer becomes full.
95
+ public init(upstream: Upstream,
96
+ size: Int,
97
+ prefetch: Publishers.PrefetchStrategy,
98
+ whenFull: Publishers.BufferingStrategy<Failure>) {
99
+ self.upstream = upstream
100
+ self.size = size
101
+ self.prefetch = prefetch
102
+ self.whenFull = whenFull
103
+ }
104
+
105
+ public func receive<Downstream: Subscriber>(subscriber: Downstream)
106
+ where Downstream.Input == Output, Downstream.Failure == Failure
107
+ {
108
+ let inner = Inner(downstream: subscriber,
109
+ size: size,
110
+ prefetch: prefetch,
111
+ whenFull: whenFull)
112
+ upstream.subscribe(inner)
113
+ }
114
+ }
115
+ }
116
+
117
+ extension Publishers.PrefetchStrategy: Equatable {}
118
+
119
+ extension Publishers.PrefetchStrategy: Hashable {}
120
+
121
+ extension Publishers.Buffer {
122
+ private final class Inner<Downstream: Subscriber>
123
+ : Subscriber,
124
+ Subscription,
125
+ CustomStringConvertible,
126
+ CustomReflectable,
127
+ CustomPlaygroundDisplayConvertible
128
+ where Downstream.Input == Upstream.Output, Downstream.Failure == Upstream.Failure
129
+ {
130
+ typealias Input = Upstream.Output
131
+
132
+ typealias Failure = Upstream.Failure
133
+
134
+ private let lock = UnfairLock.allocate()
135
+
136
+ private var recursion = false
137
+
138
+ private let size: Int
139
+
140
+ private let prefetch: Publishers.PrefetchStrategy // keepFull is 0x0
141
+
142
+ private let whenFull: Publishers.BufferingStrategy<Failure>
143
+
144
+ private let downstream: Downstream
145
+
146
+ private var state = SubscriptionStatus.awaitingSubscription
147
+
148
+ private var downstreamDemand = Subscribers.Demand.none
149
+
150
+ // TODO: Use a deque here?
151
+ // Need to measure performance with large buffers and `dropOldest` strategy.
152
+ private var values = [Input]()
153
+
154
+ private var upstreamFailed = false
155
+
156
+ private var terminal: Subscribers.Completion<Failure>?
157
+
158
+ init(downstream: Downstream,
159
+ size: Int,
160
+ prefetch: Publishers.PrefetchStrategy,
161
+ whenFull: Publishers.BufferingStrategy<Failure>) {
162
+ self.size = size
163
+ self.prefetch = prefetch
164
+ self.whenFull = whenFull
165
+ self.downstream = downstream
166
+ }
167
+
168
+ deinit {
169
+ lock.deallocate()
170
+ }
171
+
172
+ func receive(subscription: Subscription) {
173
+ lock.lock()
174
+ guard case .awaitingSubscription = state else {
175
+ lock.unlock()
176
+ subscription.cancel()
177
+ return
178
+ }
179
+ state = .subscribed(subscription)
180
+ lock.unlock()
181
+
182
+ let upstreamDemand: Subscribers.Demand
183
+ switch prefetch {
184
+ case .keepFull:
185
+ upstreamDemand = .max(size)
186
+ case .byRequest:
187
+ upstreamDemand = .unlimited
188
+ }
189
+ subscription.request(upstreamDemand)
190
+ downstream.receive(subscription: self)
191
+ }
192
+
193
+ func receive(_ input: Input) -> Subscribers.Demand {
194
+ lock.lock()
195
+ guard case let .subscribed(subscription) = state else {
196
+ lock.unlock()
197
+ return .none
198
+ }
199
+ switch terminal {
200
+ case nil, .finished?:
201
+ if values.count >= size {
202
+ switch whenFull {
203
+ case .dropNewest:
204
+ lock.unlock()
205
+ return drain()
206
+ case .dropOldest:
207
+ values.removeFirst()
208
+ case let .customError(makeError):
209
+ terminal = .failure(makeError())
210
+ lock.unlock()
211
+ subscription.cancel()
212
+ return .none
213
+ }
214
+ }
215
+
216
+ values.append(input)
217
+ lock.unlock()
218
+ return drain()
219
+ case .failure?:
220
+ lock.unlock()
221
+ return .none
222
+ }
223
+ }
224
+
225
+ func receive(completion: Subscribers.Completion<Upstream.Failure>) {
226
+ lock.lock()
227
+ guard case .subscribed = state, terminal == nil else {
228
+ lock.unlock()
229
+ return
230
+ }
231
+ terminal = completion
232
+ lock.unlock()
233
+ _ = drain()
234
+ }
235
+
236
+ func request(_ demand: Subscribers.Demand) {
237
+ lock.lock()
238
+ guard case let .subscribed(subscription) = state else {
239
+ lock.unlock()
240
+ return
241
+ }
242
+ downstreamDemand += demand
243
+ let recursion = self.recursion
244
+ lock.unlock()
245
+ if recursion {
246
+ return
247
+ }
248
+
249
+ let more = drain()
250
+ if more != .none {
251
+ // Request the number of items just enough to fill the buffer.
252
+ subscription.request(more)
253
+ }
254
+ }
255
+
256
+ func cancel() {
257
+ lock.lock()
258
+ guard case let .subscribed(subscription) = state else {
259
+ lock.unlock()
260
+ return
261
+ }
262
+ state = .terminal
263
+ values = []
264
+ lock.unlock()
265
+ subscription.cancel()
266
+ }
267
+
268
+ private func drain() -> Subscribers.Demand {
269
+ var upstreamDemand = Subscribers.Demand.none
270
+ lock.lock()
271
+ while true {
272
+ guard case .subscribed = state else {
273
+ lock.unlock()
274
+ return upstreamDemand
275
+ }
276
+
277
+ if downstreamDemand > 0 {
278
+ if values.isEmpty {
279
+ if let completion = terminal {
280
+ state = .terminal
281
+ lock.unlock()
282
+ downstream.receive(completion: completion)
283
+ } else {
284
+ lock.unlock()
285
+ }
286
+ return upstreamDemand
287
+ }
288
+ } else {
289
+ if let completion = terminal, case .failure = completion {
290
+ state = .terminal
291
+ lock.unlock()
292
+ downstream.receive(completion: completion)
293
+ } else {
294
+ lock.unlock()
295
+ }
296
+ return upstreamDemand
297
+ }
298
+
299
+ let poppedValues = lockedPop(downstreamDemand)
300
+ assert(poppedValues.count > 0,
301
+ """
302
+ We check that the buffer is not empty and downstreamDemand is \
303
+ nonzero, how can this be triggered?
304
+ """)
305
+
306
+ // This should not crash because `lockedPop(_:)` returns at most
307
+ // `downstreamDemand` items.
308
+ downstreamDemand -= poppedValues.count
309
+
310
+ recursion = true
311
+ lock.unlock()
312
+
313
+ var newDownstreamDemand = Subscribers.Demand.none
314
+ var additionalUpstreamDemand = 0
315
+
316
+ for value in poppedValues {
317
+ newDownstreamDemand += downstream.receive(value)
318
+ additionalUpstreamDemand += 1
319
+ }
320
+
321
+ if prefetch == .keepFull {
322
+ upstreamDemand += additionalUpstreamDemand
323
+ }
324
+
325
+ lock.lock()
326
+ recursion = false
327
+ downstreamDemand += newDownstreamDemand
328
+ }
329
+ }
330
+
331
+ private func lockedPop(_ demand: Subscribers.Demand) -> [Input] {
332
+ assert(demand > 0)
333
+ guard let max = demand.max else {
334
+ return values.take()
335
+ }
336
+
337
+ let poppedValues = Array(values.prefix(max))
338
+ values.removeFirst(poppedValues.count)
339
+ return poppedValues
340
+ }
341
+
342
+ var description: String { return "Buffer" }
343
+
344
+ var customMirror: Mirror {
345
+ let children: [Mirror.Child] = [
346
+ ("values", values),
347
+ ("state", state),
348
+ ("downstreamDemand", downstreamDemand),
349
+ ("terminal", terminal as Any)
350
+ ]
351
+ return Mirror(self, children: children)
352
+ }
353
+
354
+ var playgroundDescription: Any { return description }
355
+ }
356
+ }
@@ -0,0 +1,102 @@
1
+ //
2
+ // Publishers.Collect.swift
3
+ //
4
+ //
5
+ // Created by Sergej Jaskiewicz on 09.10.2019.
6
+ //
7
+
8
+ extension Publisher {
9
+
10
+ /// Collects all received elements, and emits a single array of the collection when
11
+ /// the upstream publisher finishes.
12
+ ///
13
+ /// Use `collect()` to gather elements into an array that the operator emits after
14
+ /// the upstream publisher finishes.
15
+ ///
16
+ /// If the upstream publisher fails with an error, this publisher forwards the error
17
+ /// to the downstream receiver instead of sending its output.
18
+ ///
19
+ /// This publisher requests an unlimited number of elements from the upstream
20
+ /// publisher and uses an unbounded amount of memory to store the received values.
21
+ /// The publisher may exert memory pressure on the system for very large sets of
22
+ /// elements.
23
+ ///
24
+ /// The `collect()` operator only sends the collected array to its downstream receiver
25
+ /// after a request whose demand is greater than 0 items. Otherwise, `collect()` waits
26
+ /// until it receives a non-zero request.
27
+ ///
28
+ /// In the example below, an Integer range is a publisher that emits an array of
29
+ /// integers:
30
+ ///
31
+ /// let numbers = (0...10)
32
+ /// cancellable = numbers.publisher
33
+ /// .collect()
34
+ /// .sink { print("\($0)") }
35
+ ///
36
+ /// // Prints: "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"
37
+ ///
38
+ /// - Returns: A publisher that collects all received items and returns them as
39
+ /// an array upon completion.
40
+ public func collect() -> Publishers.Collect<Self> {
41
+ return .init(upstream: self)
42
+ }
43
+ }
44
+
45
+ extension Publishers {
46
+
47
+ /// A publisher that buffers items.
48
+ public struct Collect<Upstream: Publisher>: Publisher {
49
+
50
+ public typealias Output = [Upstream.Output]
51
+
52
+ public typealias Failure = Upstream.Failure
53
+
54
+ /// The publisher that this publisher receives elements from.
55
+ public let upstream: Upstream
56
+
57
+ public init(upstream: Upstream) {
58
+ self.upstream = upstream
59
+ }
60
+
61
+ public func receive<Downstream: Subscriber>(subscriber: Downstream)
62
+ where Upstream.Failure == Downstream.Failure,
63
+ Downstream.Input == [Upstream.Output]
64
+ {
65
+ upstream.subscribe(Inner(downstream: subscriber))
66
+ }
67
+ }
68
+ }
69
+
70
+ extension Publishers.Collect: Equatable where Upstream: Equatable {}
71
+
72
+ extension Publishers.Collect {
73
+ private final class Inner<Downstream: Subscriber>
74
+ : ReduceProducer<Downstream,
75
+ Upstream.Output,
76
+ [Upstream.Output],
77
+ Upstream.Failure,
78
+ Void>
79
+ where Downstream.Input == [Upstream.Output],
80
+ Downstream.Failure == Upstream.Failure
81
+ {
82
+ fileprivate init(downstream: Downstream) {
83
+ super.init(downstream: downstream, initial: [], reduce: ())
84
+ }
85
+
86
+ override func receive(
87
+ newValue: Upstream.Output
88
+ ) -> PartialCompletion<Void, Downstream.Failure> {
89
+ result!.append(newValue)
90
+ return .continue
91
+ }
92
+
93
+ override var description: String {
94
+ return "Collect"
95
+ }
96
+
97
+ override var customMirror: Mirror {
98
+ let children: CollectionOfOne<Mirror.Child> = .init(("count", result!.count))
99
+ return Mirror(self, children: children)
100
+ }
101
+ }
102
+ }
@@ -0,0 +1,195 @@
1
+ //
2
+ // Publishers.CollectByCount.swift
3
+ //
4
+ //
5
+ // Created by Sergej Jaskiewicz on 24.12.2019.
6
+ //
7
+
8
+ extension Publisher {
9
+
10
+ /// Collects up to the specified number of elements, and then emits a single array of
11
+ /// the collection.
12
+ ///
13
+ /// Use `collect(_:)` to emit arrays of at most `count` elements from an upstream
14
+ /// publisher. If the upstream publisher finishes before collecting the specified
15
+ /// number of elements, the publisher sends an array of only the items it received
16
+ /// This may be fewer than `count` elements.
17
+ ///
18
+ /// If the upstream publisher fails with an error, this publisher forwards the error
19
+ /// to the downstream receiver instead of sending its output.
20
+ ///
21
+ /// In the example below, the `collect(_:)` operator emits one partial and two full
22
+ /// arrays based on the requested collection size of `5`:
23
+ ///
24
+ /// let numbers = (0...10)
25
+ /// cancellable = numbers.publisher
26
+ /// .collect(5)
27
+ /// .sink { print("\($0), terminator: " "") }
28
+ ///
29
+ /// // Prints "[0, 1, 2, 3, 4] [5, 6, 7, 8, 9] [10] "
30
+ ///
31
+ /// > Note: When this publisher receives a request for `.max(n)` elements, it requests
32
+ /// `.max(count * n)` from the upstream publisher.
33
+ ///
34
+ /// - Parameter count: The maximum number of received elements to buffer before
35
+ /// publishing.
36
+ /// - Returns: A publisher that collects up to the specified number of elements, and
37
+ /// then publishes them as an array.
38
+ public func collect(_ count: Int) -> Publishers.CollectByCount<Self> {
39
+ return .init(upstream: self, count: count)
40
+ }
41
+ }
42
+
43
+ extension Publishers {
44
+
45
+ /// A publisher that buffers a maximum number of items.
46
+ public struct CollectByCount<Upstream: Publisher>: Publisher {
47
+
48
+ public typealias Output = [Upstream.Output]
49
+
50
+ public typealias Failure = Upstream.Failure
51
+
52
+ /// The publisher from which this publisher receives elements.
53
+ public let upstream: Upstream
54
+
55
+ /// The maximum number of received elements to buffer before publishing.
56
+ public let count: Int
57
+
58
+ public init(upstream: Upstream, count: Int) {
59
+ self.upstream = upstream
60
+ self.count = count
61
+ }
62
+
63
+ public func receive<Downstream: Subscriber>(subscriber: Downstream)
64
+ where Downstream.Failure == Failure, Downstream.Input == Output
65
+ {
66
+ upstream.subscribe(Inner(downstream: subscriber, count: count))
67
+ }
68
+ }
69
+ }
70
+
71
+ extension Publishers.CollectByCount: Equatable where Upstream: Equatable {}
72
+
73
+ extension Publishers.CollectByCount {
74
+ private final class Inner<Downstream: Subscriber>
75
+ : Subscriber,
76
+ Subscription,
77
+ CustomStringConvertible,
78
+ CustomReflectable,
79
+ CustomPlaygroundDisplayConvertible
80
+ where Downstream.Input == [Upstream.Output],
81
+ Downstream.Failure == Upstream.Failure
82
+ {
83
+ typealias Input = Upstream.Output
84
+
85
+ typealias Failure = Upstream.Failure
86
+
87
+ private let downstream: Downstream
88
+
89
+ private let count: Int
90
+
91
+ private var buffer: [Input] = []
92
+
93
+ private var subscription: Subscription?
94
+
95
+ private var finished = false
96
+
97
+ private let lock = UnfairLock.allocate()
98
+
99
+ init(downstream: Downstream, count: Int) {
100
+ self.downstream = downstream
101
+ self.count = count
102
+ }
103
+
104
+ deinit {
105
+ lock.deallocate()
106
+ }
107
+
108
+ func receive(subscription: Subscription) {
109
+ lock.lock()
110
+ if finished || self.subscription != nil {
111
+ lock.unlock()
112
+ subscription.cancel()
113
+ return
114
+ }
115
+ self.subscription = subscription
116
+ lock.unlock()
117
+ downstream.receive(subscription: self)
118
+ }
119
+
120
+ func receive(_ input: Upstream.Output) -> Subscribers.Demand {
121
+ lock.lock()
122
+ if subscription == nil {
123
+ lock.unlock()
124
+ return .none
125
+ }
126
+ buffer.append(input)
127
+ guard buffer.count == count else {
128
+ lock.unlock()
129
+ return .none
130
+ }
131
+ let output = self.buffer.take()
132
+ lock.unlock()
133
+ return downstream.receive(output) * count
134
+ }
135
+
136
+ func receive(completion: Subscribers.Completion<Upstream.Failure>) {
137
+ lock.lock()
138
+ subscription = nil
139
+ finished = true
140
+ switch completion {
141
+ case .finished:
142
+ if buffer.isEmpty {
143
+ lock.unlock()
144
+ } else {
145
+ let buffer = self.buffer.take()
146
+ lock.unlock()
147
+ _ = downstream.receive(buffer)
148
+ }
149
+ case .failure:
150
+ buffer = []
151
+ lock.unlock()
152
+ }
153
+ downstream.receive(completion: completion)
154
+ }
155
+
156
+ func request(_ demand: Subscribers.Demand) {
157
+ demand.assertNonZero()
158
+ lock.lock()
159
+ if let subscription = self.subscription {
160
+ lock.unlock()
161
+ subscription.request(demand * count)
162
+ } else {
163
+ lock.unlock()
164
+ }
165
+ }
166
+
167
+ func cancel() {
168
+ lock.lock()
169
+ if let subscription = self.subscription.take() {
170
+ buffer = []
171
+ finished = true
172
+ lock.unlock()
173
+ subscription.cancel()
174
+ } else {
175
+ lock.unlock()
176
+ }
177
+ }
178
+
179
+ var description: String { return "CollectByCount" }
180
+
181
+ var customMirror: Mirror {
182
+ lock.lock()
183
+ defer { lock.unlock() }
184
+ let children: [Mirror.Child] = [
185
+ ("downstream", downstream),
186
+ ("upstreamSubscription", subscription as Any),
187
+ ("buffer", buffer),
188
+ ("count", count)
189
+ ]
190
+ return Mirror(self, children: children)
191
+ }
192
+
193
+ var playgroundDescription: Any { return description }
194
+ }
195
+ }