@swiftbrowser/swift 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/Package.swift +200 -9
  2. package/README.md +7 -9
  3. package/Sources/AVFoundation/AVFoundation.swift +131 -0
  4. package/Sources/AVFoundation/Asset.swift +487 -0
  5. package/Sources/AVFoundation/AudioSession.swift +144 -0
  6. package/Sources/AVFoundation/CMTime.swift +303 -0
  7. package/Sources/AVFoundation/Capture.swift +688 -0
  8. package/Sources/AVFoundation/Player.swift +749 -0
  9. package/Sources/AVFoundation/PlayerView.swift +117 -0
  10. package/Sources/AVKit/AVKit.swift +132 -0
  11. package/Sources/Accelerate/Accelerate.swift +122 -0
  12. package/Sources/AppIntents/AppIntents.swift +144 -0
  13. package/Sources/AppIntents/Parameters.swift +220 -0
  14. package/Sources/AppIntents/Shortcuts.swift +159 -0
  15. package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
  16. package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
  17. package/Sources/AuthenticationServices/Authorization.swift +251 -0
  18. package/Sources/Charts/Charts.swift +0 -4
  19. package/Sources/Combine/AnyCancellable.swift +65 -0
  20. package/Sources/Combine/AnyPublisher.swift +148 -0
  21. package/Sources/Combine/AnySubscriber.swift +230 -0
  22. package/Sources/Combine/Cancellable.swift +35 -0
  23. package/Sources/Combine/Codable.swift +29 -0
  24. package/Sources/Combine/CombineIdentifier.swift +45 -0
  25. package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
  26. package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
  27. package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
  28. package/Sources/Combine/CurrentValueSubject.swift +252 -0
  29. package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
  30. package/Sources/Combine/Future.swift +228 -0
  31. package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
  32. package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
  33. package/Sources/Combine/Helpers/ConduitList.swift +59 -0
  34. package/Sources/Combine/Helpers/DebugHook.swift +177 -0
  35. package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
  36. package/Sources/Combine/Helpers/Locking.swift +30 -0
  37. package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
  38. package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
  39. package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
  40. package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
  41. package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
  42. package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
  43. package/Sources/Combine/Helpers/Utils.swift +30 -0
  44. package/Sources/Combine/Helpers/Violations.swift +33 -0
  45. package/Sources/Combine/ImmediateScheduler.swift +178 -0
  46. package/Sources/Combine/LICENSE +21 -0
  47. package/Sources/Combine/NotificationPublisher.swift +48 -0
  48. package/Sources/Combine/ObjectWillChange.swift +46 -0
  49. package/Sources/Combine/PassthroughSubject.swift +222 -0
  50. package/Sources/Combine/Publisher+Subscribe.swift +53 -0
  51. package/Sources/Combine/Publishers/Deferred.swift +48 -0
  52. package/Sources/Combine/Publishers/Empty.swift +54 -0
  53. package/Sources/Combine/Publishers/Fail.swift +42 -0
  54. package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
  55. package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
  56. package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
  57. package/Sources/Combine/Publishers/Just.swift +313 -0
  58. package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
  59. package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
  60. package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
  61. package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
  62. package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
  63. package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
  64. package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
  65. package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
  66. package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
  67. package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
  68. package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
  69. package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
  70. package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
  71. package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
  72. package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
  73. package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
  74. package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
  75. package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
  76. package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
  77. package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
  78. package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
  79. package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
  80. package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
  81. package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
  82. package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
  83. package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
  84. package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
  85. package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
  86. package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
  87. package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
  88. package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
  89. package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
  90. package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
  91. package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
  92. package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
  93. package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
  94. package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
  95. package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
  96. package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
  97. package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
  98. package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
  99. package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
  100. package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
  101. package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
  102. package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
  103. package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
  104. package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
  105. package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
  106. package/Sources/Combine/Publishers/Publishers.swift +13 -0
  107. package/Sources/Combine/Publishers/Record.swift +237 -0
  108. package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
  109. package/Sources/Combine/Result.swift +46 -0
  110. package/Sources/Combine/Scheduler.swift +89 -0
  111. package/Sources/Combine/Schedulers.swift +211 -0
  112. package/Sources/Combine/Subject+Void.swift +17 -0
  113. package/Sources/Combine/Subscriber+Void.swift +20 -0
  114. package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
  115. package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
  116. package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
  117. package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
  118. package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
  119. package/Sources/Combine/Subscription.swift +22 -0
  120. package/Sources/Combine/Subscriptions.swift +42 -0
  121. package/Sources/Combine/SwiftUIObservation.swift +10 -0
  122. package/Sources/Combine/_Introspection.swift +107 -0
  123. package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
  124. package/Sources/Compression/Compression.swift +365 -0
  125. package/Sources/Compression/Deflate.swift +407 -0
  126. package/Sources/Compression/Zlib.swift +179 -0
  127. package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
  128. package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
  129. package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
  130. package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
  131. package/Sources/CoreImage/CIColor.swift +41 -0
  132. package/Sources/CoreImage/CIContext.swift +31 -0
  133. package/Sources/CoreImage/CIDetector.swift +57 -0
  134. package/Sources/CoreImage/CIFilter.swift +243 -0
  135. package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
  136. package/Sources/CoreImage/CIImage.swift +162 -0
  137. package/Sources/CoreImage/QRCode.swift +393 -0
  138. package/Sources/CoreLocation/Coordinate.swift +30 -0
  139. package/Sources/CoreLocation/Location.swift +65 -0
  140. package/Sources/CoreML/Evaluation.swift +414 -0
  141. package/Sources/CoreML/FeatureValue.swift +266 -0
  142. package/Sources/CoreML/Model.swift +269 -0
  143. package/Sources/CoreML/MultiArray.swift +92 -0
  144. package/Sources/CoreML/Specification.swift +233 -0
  145. package/Sources/CoreText/CoreText.swift +64 -0
  146. package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
  147. package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
  148. package/Sources/CryptoKit/CryptoKit.swift +375 -0
  149. package/Sources/CryptoKit/Curve25519.swift +317 -0
  150. package/Sources/CryptoKit/P256.swift +321 -0
  151. package/Sources/FoundationBridge/AppStorage.swift +165 -0
  152. package/Sources/FoundationBridge/AssetResources.swift +90 -0
  153. package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
  154. package/Sources/FoundationBridge/AsyncImage.swift +116 -0
  155. package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
  156. package/Sources/{_FoundationCommon → FoundationBridge}/Bundle.swift +41 -4
  157. package/Sources/FoundationBridge/CombineExports.swift +8 -0
  158. package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
  159. package/Sources/FoundationBridge/Dispatch.swift +458 -0
  160. package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
  161. package/Sources/FoundationBridge/FileImporter.swift +128 -0
  162. package/Sources/FoundationBridge/FileSystem.swift +68 -0
  163. package/Sources/FoundationBridge/FoundationBridge.swift +24 -72
  164. package/Sources/FoundationBridge/HostResolution.swift +31 -0
  165. package/Sources/FoundationBridge/ItemProvider.swift +655 -0
  166. package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
  167. package/Sources/FoundationBridge/Links.swift +127 -0
  168. package/Sources/FoundationBridge/ListFormatter.swift +32 -0
  169. package/Sources/FoundationBridge/Localization.swift +149 -0
  170. package/Sources/FoundationBridge/Locks.swift +50 -0
  171. package/Sources/FoundationBridge/Markdown.swift +527 -0
  172. package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
  173. package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
  174. package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
  175. package/Sources/FoundationBridge/Operation.swift +195 -0
  176. package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
  177. package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
  178. package/Sources/FoundationBridge/SceneStorage.swift +78 -0
  179. package/Sources/FoundationBridge/SecurityExports.swift +8 -0
  180. package/Sources/FoundationBridge/Selector.swift +226 -0
  181. package/Sources/FoundationBridge/StringComparators.swift +17 -0
  182. package/Sources/FoundationBridge/Table.swift +211 -0
  183. package/Sources/FoundationBridge/TextAttributes.swift +42 -0
  184. package/Sources/FoundationBridge/Timer.swift +6 -1
  185. package/Sources/FoundationBridge/URLSession.swift +718 -0
  186. package/Sources/{_FoundationCommon → FoundationBridge}/UserDefaults.swift +17 -4
  187. package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
  188. package/Sources/FoundationBridge/WebSocket.swift +187 -0
  189. package/Sources/FoundationModels/FoundationModels.swift +1098 -0
  190. package/Sources/ImageIO/GIF.swift +72 -0
  191. package/Sources/ImageIO/ImageIO.swift +248 -0
  192. package/Sources/ImageIO/ImageTypes.swift +28 -0
  193. package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
  194. package/Sources/LocalAuthentication/LAContext.swift +86 -0
  195. package/Sources/MapKit/Geometry.swift +223 -0
  196. package/Sources/MapKit/Map.swift +638 -0
  197. package/Sources/MapKit/MapView.swift +229 -0
  198. package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
  199. package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
  200. package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
  201. package/Sources/OSLog/OSLog.swift +6 -0
  202. package/Sources/Photos/Photos.swift +572 -0
  203. package/Sources/PhotosUI/PhotosPicker.swift +248 -0
  204. package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
  205. package/Sources/QuickLook/QuickLook.swift +168 -0
  206. package/Sources/SafariServices/SafariServices.swift +106 -0
  207. package/Sources/Security/Security.swift +332 -0
  208. package/Sources/StoreKit/AppStore.swift +207 -0
  209. package/Sources/StoreKit/Products.swift +280 -0
  210. package/Sources/StoreKit/RequestReview.swift +28 -0
  211. package/Sources/StoreKit/StoreKit1.swift +486 -0
  212. package/Sources/StoreKit/StoreViews.swift +428 -0
  213. package/Sources/StoreKit/Transactions.swift +197 -0
  214. package/Sources/SwiftData/Macros.swift +58 -0
  215. package/Sources/SwiftData/ModelActor.swift +38 -0
  216. package/Sources/SwiftData/ModelContainer.swift +129 -0
  217. package/Sources/SwiftData/ModelContext.swift +451 -0
  218. package/Sources/SwiftData/PersistentModel.swift +238 -0
  219. package/Sources/SwiftData/Properties.swift +261 -0
  220. package/Sources/SwiftData/Query.swift +256 -0
  221. package/Sources/SwiftData/Schema.swift +192 -0
  222. package/Sources/SwiftData/Store.swift +146 -0
  223. package/Sources/SwiftData/StringPredicates.swift +125 -0
  224. package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
  225. package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
  226. package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
  227. package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
  228. package/Sources/SwiftDataMacros/Plugin.swift +18 -0
  229. package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
  230. package/Sources/SwiftUI/API/Accessibility.swift +55 -6
  231. package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
  232. package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
  233. package/Sources/SwiftUI/API/Alert.swift +1 -1
  234. package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
  235. package/Sources/SwiftUI/API/Animation.swift +37 -5
  236. package/Sources/SwiftUI/API/App.swift +31 -1
  237. package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
  238. package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
  239. package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
  240. package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
  241. package/Sources/SwiftUI/API/Canvas.swift +337 -0
  242. package/Sources/SwiftUI/API/Color.swift +104 -28
  243. package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
  244. package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
  245. package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
  246. package/Sources/SwiftUI/API/Commands.swift +106 -0
  247. package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
  248. package/Sources/SwiftUI/API/ContentShape.swift +33 -0
  249. package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
  250. package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
  251. package/Sources/SwiftUI/API/Controls.swift +59 -27
  252. package/Sources/SwiftUI/API/CustomLayout.swift +49 -10
  253. package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
  254. package/Sources/SwiftUI/API/Decorations.swift +1 -1
  255. package/Sources/SwiftUI/API/EditMode.swift +25 -82
  256. package/Sources/SwiftUI/API/Effects.swift +105 -7
  257. package/Sources/SwiftUI/API/Entry.swift +8 -0
  258. package/Sources/SwiftUI/API/Environment.swift +93 -9
  259. package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
  260. package/Sources/SwiftUI/API/Focus.swift +11 -3
  261. package/Sources/SwiftUI/API/Gauge.swift +3 -2
  262. package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
  263. package/Sources/SwiftUI/API/GeometryReader.swift +13 -2
  264. package/Sources/SwiftUI/API/GestureState.swift +65 -0
  265. package/Sources/SwiftUI/API/Gestures.swift +1 -1
  266. package/Sources/SwiftUI/API/Glass.swift +127 -0
  267. package/Sources/SwiftUI/API/Grid.swift +1 -1
  268. package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
  269. package/Sources/SwiftUI/API/KeyPress.swift +54 -0
  270. package/Sources/SwiftUI/API/LabelStyle.swift +13 -6
  271. package/Sources/SwiftUI/API/Layout.swift +67 -12
  272. package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
  273. package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
  274. package/Sources/SwiftUI/API/Lists.swift +61 -6
  275. package/Sources/SwiftUI/API/Menu.swift +8 -1
  276. package/Sources/SwiftUI/API/Modifiers.swift +80 -10
  277. package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
  278. package/Sources/SwiftUI/API/Namespace.swift +44 -0
  279. package/Sources/SwiftUI/API/Navigation.swift +24 -9
  280. package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
  281. package/Sources/SwiftUI/API/ObservableObject.swift +16 -2
  282. package/Sources/SwiftUI/API/Path.swift +543 -0
  283. package/Sources/SwiftUI/API/Phase8Controls.swift +48 -31
  284. package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
  285. package/Sources/SwiftUI/API/Picker.swift +11 -2
  286. package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
  287. package/Sources/SwiftUI/API/Popover.swift +41 -0
  288. package/Sources/SwiftUI/API/Preferences.swift +262 -0
  289. package/Sources/SwiftUI/API/Presentation.swift +17 -4
  290. package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
  291. package/Sources/SwiftUI/API/Primitives.swift +164 -37
  292. package/Sources/SwiftUI/API/Publishers.swift +4 -4
  293. package/Sources/SwiftUI/API/Redaction.swift +75 -0
  294. package/Sources/SwiftUI/API/RowActions.swift +3 -2
  295. package/Sources/SwiftUI/API/Scenes.swift +131 -0
  296. package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
  297. package/Sources/SwiftUI/API/ScrollTargets.swift +3 -3
  298. package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
  299. package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
  300. package/Sources/SwiftUI/API/Shape.swift +214 -0
  301. package/Sources/SwiftUI/API/ShapeStyle.swift +105 -7
  302. package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
  303. package/Sources/SwiftUI/API/Sharing.swift +193 -0
  304. package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
  305. package/Sources/SwiftUI/API/State.swift +18 -1
  306. package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
  307. package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
  308. package/Sources/SwiftUI/API/TabContent.swift +841 -0
  309. package/Sources/SwiftUI/API/Table.swift +382 -0
  310. package/Sources/SwiftUI/API/Tabs.swift +148 -4
  311. package/Sources/SwiftUI/API/Tasks.swift +2 -2
  312. package/Sources/SwiftUI/API/Text.swift +386 -0
  313. package/Sources/SwiftUI/API/TextDates.swift +61 -0
  314. package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
  315. package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
  316. package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
  317. package/Sources/SwiftUI/API/Toolbar.swift +52 -16
  318. package/Sources/SwiftUI/API/Transfer.swift +145 -0
  319. package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
  320. package/Sources/SwiftUI/API/Video.swift +64 -0
  321. package/Sources/SwiftUI/API/View.swift +10 -2
  322. package/Sources/SwiftUI/API/ViewModifier.swift +4 -1
  323. package/Sources/SwiftUI/API/VisualEffect.swift +74 -1
  324. package/Sources/SwiftUI/API/Windows.swift +25 -0
  325. package/Sources/SwiftUI/Charts/Axis.swift +7 -1
  326. package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
  327. package/Sources/SwiftUI/Charts/Chart.swift +17 -3
  328. package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
  329. package/Sources/SwiftUI/Localization/Localization.swift +498 -0
  330. package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
  331. package/Sources/SwiftUI/Runtime/Executor.swift +2 -0
  332. package/Sources/SwiftUI/Runtime/Exports.swift +37 -1
  333. package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
  334. package/Sources/SwiftUI/Runtime/JSON.swift +76 -4
  335. package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
  336. package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
  337. package/Sources/SwiftUI/Runtime/Ops.swift +58 -12
  338. package/Sources/SwiftUI/Runtime/Reconciler.swift +10 -1
  339. package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
  340. package/Sources/SwiftUI/Runtime/Runtime.swift +977 -198
  341. package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
  342. package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
  343. package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
  344. package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
  345. package/Sources/Symbols/Symbols.swift +25 -0
  346. package/Sources/Translation/Translation.swift +423 -0
  347. package/Sources/UIKit/Activity.swift +213 -0
  348. package/Sources/UIKit/Alerts.swift +69 -0
  349. package/Sources/UIKit/AppDelegate.swift +222 -0
  350. package/Sources/UIKit/Appearance.swift +84 -0
  351. package/Sources/UIKit/ColorConversions.swift +70 -0
  352. package/Sources/UIKit/Controls.swift +225 -0
  353. package/Sources/UIKit/Device.swift +200 -0
  354. package/Sources/UIKit/Feedback.swift +65 -0
  355. package/Sources/UIKit/Font.swift +307 -0
  356. package/Sources/UIKit/Graphics.swift +204 -0
  357. package/Sources/UIKit/HostingController.swift +185 -0
  358. package/Sources/UIKit/Identity.swift +24 -0
  359. package/Sources/UIKit/Introspectable.swift +510 -0
  360. package/Sources/UIKit/Pasteboard.swift +363 -0
  361. package/Sources/UIKit/PhotoAlbum.swift +81 -0
  362. package/Sources/UIKit/RemoteNotifications.swift +15 -0
  363. package/Sources/UIKit/Representable.swift +288 -0
  364. package/Sources/UIKit/SafeArea.swift +12 -0
  365. package/Sources/UIKit/SceneDelegates.swift +132 -0
  366. package/Sources/UIKit/Scenes.swift +40 -0
  367. package/Sources/UIKit/ScrollView.swift +157 -0
  368. package/Sources/UIKit/ShortcutItems.swift +67 -0
  369. package/Sources/UIKit/SymbolConfiguration.swift +124 -0
  370. package/Sources/UIKit/TargetAction.swift +123 -0
  371. package/Sources/UIKit/TextPaste.swift +161 -0
  372. package/Sources/UIKit/TextView.swift +538 -0
  373. package/Sources/UIKit/UIKit.swift +292 -0
  374. package/Sources/UIKit/UIView.swift +855 -0
  375. package/Sources/UIKit/ViewTranslation.swift +311 -0
  376. package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
  377. package/Sources/UserNotifications/Content.swift +370 -0
  378. package/Sources/UserNotifications/NotificationCenter.swift +309 -0
  379. package/Sources/WeatherKit/WeatherKit.swift +228 -0
  380. package/Sources/WebKit/WebKit.swift +245 -0
  381. package/Sources/os/os.swift +376 -0
  382. package/Sources/zlib/zlib.swift +6 -0
  383. package/index.d.ts +1 -1
  384. package/index.mjs +2 -2
  385. package/manifest.d.mts +2 -0
  386. package/manifest.mjs +39 -0
  387. package/package.json +5 -3
  388. package/sync-sources.mjs +21 -7
  389. package/Sources/FoundationLite/Common.swift +0 -3
  390. package/Sources/FoundationLite/FoundationLite.swift +0 -171
  391. package/Sources/FoundationLite/Interaction.swift +0 -146
  392. package/Sources/FoundationLite/Timer.swift +0 -48
  393. package/Sources/_FoundationCommon/_FoundationCommon.swift +0 -10
@@ -0,0 +1,359 @@
1
+ //
2
+ // Publishers.Throttle.swift
3
+ //
4
+ //
5
+ // Created by Stuart Austin on 14/11/2020.
6
+ //
7
+
8
+ extension Publisher {
9
+ // swiftlint:disable generic_type_name line_length
10
+
11
+ /// Publishes either the most-recent or first element published by the upstream
12
+ /// publisher in the specified time interval.
13
+ ///
14
+ /// Use `throttle(for:scheduler:latest:`` to selectively republish elements from
15
+ /// an upstream publisher during an interval you specify. Other elements received from
16
+ /// the upstream in the throttling interval aren’t republished.
17
+ ///
18
+ /// In the example below, a `Timer.TimerPublisher` produces elements on 3-second
19
+ /// intervals; the `throttle(for:scheduler:latest:)` operator delivers the first
20
+ /// event, then republishes only the latest event in the following ten second
21
+ /// intervals:
22
+ ///
23
+ /// cancellable = Timer.publish(every: 3.0, on: .main, in: .default)
24
+ /// .autoconnect()
25
+ /// .print("\(Date().description)")
26
+ /// .throttle(for: 10.0, scheduler: RunLoop.main, latest: true)
27
+ /// .sink(
28
+ /// receiveCompletion: { print ("Completion: \($0).") },
29
+ /// receiveValue: { print("Received Timestamp \($0).") }
30
+ /// )
31
+ ///
32
+ /// // Prints:
33
+ /// // Publish at: 2020-03-19 18:26:54 +0000: receive value: (2020-03-19 18:26:57 +0000)
34
+ /// // Received Timestamp 2020-03-19 18:26:57 +0000.
35
+ /// // Publish at: 2020-03-19 18:26:54 +0000: receive value: (2020-03-19 18:27:00 +0000)
36
+ /// // Publish at: 2020-03-19 18:26:54 +0000: receive value: (2020-03-19 18:27:03 +0000)
37
+ /// // Publish at: 2020-03-19 18:26:54 +0000: receive value: (2020-03-19 18:27:06 +0000)
38
+ /// // Publish at: 2020-03-19 18:26:54 +0000: receive value: (2020-03-19 18:27:09 +0000)
39
+ /// // Received Timestamp 2020-03-19 18:27:09 +0000.
40
+ ///
41
+ /// - Parameters:
42
+ /// - interval: The interval at which to find and emit either the most recent or
43
+ /// the first element, expressed in the time system of the scheduler.
44
+ /// - scheduler: The scheduler on which to publish elements.
45
+ /// - latest: A Boolean value that indicates whether to publish the most recent
46
+ /// element. If `false`, the publisher emits the first element received during
47
+ /// the interval.
48
+ /// - Returns: A publisher that emits either the most-recent or first element received
49
+ /// during the specified interval.
50
+ public func throttle<S>(for interval: S.SchedulerTimeType.Stride,
51
+ scheduler: S,
52
+ latest: Bool) -> Publishers.Throttle<Self, S>
53
+ where S: Scheduler
54
+ {
55
+ return .init(upstream: self,
56
+ interval: interval,
57
+ scheduler: scheduler,
58
+ latest: latest)
59
+ }
60
+
61
+ // swiftlint:enable generic_type_name line_length
62
+ }
63
+
64
+ extension Publishers {
65
+
66
+ /// A publisher that publishes either the most-recent or first element published by
67
+ /// the upstream publisher in a specified time interval.
68
+ public struct Throttle<Upstream, Context>: Publisher
69
+ where Upstream: Publisher, Context: Scheduler
70
+ {
71
+
72
+ /// The kind of values published by this publisher.
73
+ public typealias Output = Upstream.Output
74
+
75
+ /// The kind of errors this publisher might publish.
76
+ ///
77
+ /// Use `Never` if this `Publisher` does not publish errors.
78
+ public typealias Failure = Upstream.Failure
79
+
80
+ /// The publisher from which this publisher receives elements.
81
+ public let upstream: Upstream
82
+
83
+ /// The interval in which to find and emit the most recent element.
84
+ public let interval: Context.SchedulerTimeType.Stride
85
+
86
+ /// The scheduler on which to publish elements.
87
+ public let scheduler: Context
88
+
89
+ /// A Boolean value indicating whether to publish the most recent element.
90
+ ///
91
+ /// If `false`, the publisher emits the first element received during
92
+ /// the interval.
93
+ public let latest: Bool
94
+
95
+ public init(upstream: Upstream,
96
+ interval: Context.SchedulerTimeType.Stride,
97
+ scheduler: Context,
98
+ latest: Bool) {
99
+
100
+ self.upstream = upstream
101
+ self.interval = interval
102
+ self.scheduler = scheduler
103
+ self.latest = latest
104
+ }
105
+
106
+ // swiftlint:disable generic_type_name
107
+
108
+ /// Attaches the specified subscriber to this publisher.
109
+ ///
110
+ /// Implementations of ``Publisher`` must implement this method.
111
+ ///
112
+ /// The provided implementation of ``Publisher/subscribe(_:)-4u8kn``calls
113
+ /// this method.
114
+ ///
115
+ /// - Parameter subscriber: The subscriber to attach to this ``Publisher``,
116
+ /// after which it can receive values.
117
+ public func receive<S>(subscriber: S)
118
+ where S: Subscriber, Upstream.Failure == S.Failure, Upstream.Output == S.Input
119
+ {
120
+ let inner = Inner(interval: interval,
121
+ scheduler: scheduler,
122
+ latest: latest,
123
+ downstream: subscriber)
124
+ upstream.subscribe(inner)
125
+ }
126
+
127
+ // swiftlint:enable generic_type_name
128
+ }
129
+ }
130
+
131
+ extension Publishers.Throttle {
132
+ private final class Inner<Downstream: Subscriber>
133
+ : Subscriber,
134
+ Subscription,
135
+ CustomStringConvertible,
136
+ CustomReflectable,
137
+ CustomPlaygroundDisplayConvertible
138
+ where Downstream.Input == Upstream.Output, Downstream.Failure == Upstream.Failure
139
+ {
140
+ typealias Input = Upstream.Output
141
+ typealias Failure = Upstream.Failure
142
+
143
+ private enum State {
144
+ case awaitingSubscription(Downstream)
145
+ case subscribed(Subscription, Downstream)
146
+ case pendingTerminal(Subscription, Downstream)
147
+ case terminal
148
+ }
149
+
150
+ private let lock = UnfairLock.allocate()
151
+ private let interval: Context.SchedulerTimeType.Stride
152
+ private let scheduler: Context
153
+ private let latest: Bool
154
+ private var state: State
155
+ private let downstreamLock = UnfairRecursiveLock.allocate()
156
+
157
+ private var lastEmissionTime: Context.SchedulerTimeType?
158
+
159
+ private var pendingInput: Input?
160
+ private var pendingCompletion: Subscribers.Completion<Failure>?
161
+
162
+ private var demand: Subscribers.Demand = .none
163
+
164
+ private var lastTime: Context.SchedulerTimeType
165
+
166
+ init(interval: Context.SchedulerTimeType.Stride,
167
+ scheduler: Context,
168
+ latest: Bool,
169
+ downstream: Downstream) {
170
+ self.state = .awaitingSubscription(downstream)
171
+ self.interval = interval
172
+ self.scheduler = scheduler
173
+ self.latest = latest
174
+
175
+ self.lastTime = scheduler.now
176
+ }
177
+
178
+ deinit {
179
+ lock.deallocate()
180
+ downstreamLock.deallocate()
181
+ }
182
+
183
+ func receive(subscription: Subscription) {
184
+ lock.lock()
185
+ guard case let .awaitingSubscription(downstream) = state else {
186
+ lock.unlock()
187
+ subscription.cancel()
188
+ return
189
+ }
190
+ self.lastTime = scheduler.now
191
+
192
+ state = .subscribed(subscription, downstream)
193
+ lock.unlock()
194
+
195
+ subscription.request(.unlimited)
196
+
197
+ downstreamLock.lock()
198
+ downstream.receive(subscription: self)
199
+ downstreamLock.unlock()
200
+ }
201
+
202
+ func receive(_ input: Input) -> Subscribers.Demand {
203
+ lock.lock()
204
+ guard case .subscribed = state else {
205
+ lock.unlock()
206
+ return .none
207
+ }
208
+
209
+ let lastTime = scheduler.now
210
+ self.lastTime = lastTime
211
+
212
+ guard demand > .none else {
213
+ lock.unlock()
214
+ return .none
215
+ }
216
+
217
+ let hasScheduledOutput = (pendingInput != nil || pendingCompletion != nil)
218
+
219
+ if hasScheduledOutput && latest {
220
+ pendingInput = input
221
+ lock.unlock()
222
+ } else if !hasScheduledOutput {
223
+ let minimumEmissionTime =
224
+ lastEmissionTime.map { $0.advanced(by: interval) }
225
+
226
+ let emissionTime =
227
+ minimumEmissionTime.map { Swift.max(lastTime, $0) } ?? lastTime
228
+
229
+ demand -= 1
230
+
231
+ pendingInput = input
232
+ lock.unlock()
233
+
234
+ let action: () -> Void = { [weak self] in
235
+ self?.scheduledEmission()
236
+ }
237
+
238
+ if emissionTime == lastTime {
239
+ scheduler.schedule(action)
240
+ } else {
241
+ scheduler.schedule(after: emissionTime, action)
242
+ }
243
+ } else {
244
+ lock.unlock()
245
+ }
246
+
247
+ return .none
248
+ }
249
+
250
+ func receive(completion: Subscribers.Completion<Failure>) {
251
+ lock.lock()
252
+ guard case let .subscribed(subscription, downstream) = state else {
253
+ lock.unlock()
254
+ return
255
+ }
256
+ let lastTime = scheduler.now
257
+ self.lastTime = lastTime
258
+ state = .pendingTerminal(subscription, downstream)
259
+
260
+ let hasScheduledOutput = (pendingInput != nil || pendingCompletion != nil)
261
+
262
+ if hasScheduledOutput && pendingCompletion == nil {
263
+ pendingCompletion = completion
264
+ lock.unlock()
265
+ } else if !hasScheduledOutput {
266
+ pendingCompletion = completion
267
+ lock.unlock()
268
+
269
+ scheduler.schedule { [weak self] in
270
+ self?.scheduledEmission()
271
+ }
272
+ } else {
273
+ lock.unlock()
274
+ }
275
+ }
276
+
277
+ private func scheduledEmission() {
278
+ lock.lock()
279
+
280
+ let downstream: Downstream
281
+
282
+ switch state {
283
+ case .awaitingSubscription, .terminal:
284
+ lock.unlock()
285
+ return
286
+ case let .subscribed(_, foundDownstream),
287
+ let .pendingTerminal(_, foundDownstream):
288
+ downstream = foundDownstream
289
+ }
290
+
291
+ if self.pendingInput != nil && self.pendingCompletion == nil {
292
+ lastEmissionTime = scheduler.now
293
+ }
294
+
295
+ let pendingInput = self.pendingInput.take()
296
+ let pendingCompletion = self.pendingCompletion.take()
297
+
298
+ if pendingCompletion != nil {
299
+ state = .terminal
300
+ }
301
+
302
+ lock.unlock()
303
+
304
+ downstreamLock.lock()
305
+
306
+ let newDemand: Subscribers.Demand
307
+ if let input = pendingInput {
308
+ newDemand = downstream.receive(input)
309
+ } else {
310
+ newDemand = .none
311
+ }
312
+
313
+ if let completion = pendingCompletion {
314
+ downstream.receive(completion: completion)
315
+ }
316
+ downstreamLock.unlock()
317
+
318
+ guard newDemand > 0 else { return }
319
+ self.lock.lock()
320
+ demand += newDemand
321
+ self.lock.unlock()
322
+ }
323
+
324
+ func request(_ demand: Subscribers.Demand) {
325
+ guard demand > 0 else { return }
326
+ lock.lock()
327
+ guard case .subscribed = state else {
328
+ lock.unlock()
329
+ return
330
+ }
331
+ self.demand += demand
332
+ lock.unlock()
333
+ }
334
+
335
+ func cancel() {
336
+ lock.lock()
337
+
338
+ let subscription: Subscription?
339
+ switch state {
340
+ case let .subscribed(existingSubscription, _),
341
+ let .pendingTerminal(existingSubscription, _):
342
+ subscription = existingSubscription
343
+ case .awaitingSubscription, .terminal:
344
+ subscription = nil
345
+ }
346
+
347
+ state = .terminal
348
+ lock.unlock()
349
+
350
+ subscription?.cancel()
351
+ }
352
+
353
+ var description: String { return "Throttle" }
354
+
355
+ var customMirror: Mirror { return Mirror(self, children: EmptyCollection()) }
356
+
357
+ var playgroundDescription: Any { return description }
358
+ }
359
+ }
@@ -0,0 +1,301 @@
1
+ //
2
+ // Publishers.Timeout.swift
3
+ //
4
+ //
5
+ // Created by Sergej Jaskiewicz on 14.06.2020.
6
+ //
7
+
8
+ extension Publisher {
9
+
10
+ /// Terminates publishing if the upstream publisher exceeds the specified time
11
+ /// interval without producing an element.
12
+ ///
13
+ /// Use `timeout(_:scheduler:options:customError:)` to terminate a publisher if
14
+ /// an element isn’t delivered within a timeout interval you specify.
15
+ ///
16
+ /// In the example below, a `PassthroughSubject` publishes `String` elements and is
17
+ /// configured to time out if no new elements are received within its `TIME_OUT`
18
+ /// window of 5 seconds. A single value is published after the specified 2-second
19
+ /// `WAIT_TIME`, after which no more elements are available; the publisher then times
20
+ /// out and completes normally.
21
+ ///
22
+ /// var WAIT_TIME : Int = 2
23
+ /// var TIMEOUT_TIME : Int = 5
24
+ ///
25
+ /// let subject = PassthroughSubject<String, Never>()
26
+ /// let cancellable = subject
27
+ /// .timeout(.seconds(TIMEOUT_TIME),
28
+ /// scheduler: DispatchQueue.main,
29
+ /// options: nil,
30
+ /// customError: nil)
31
+ /// .sink(
32
+ /// receiveCompletion: { print ("completion: \($0) at \(Date())") },
33
+ /// receiveValue: { print ("value: \($0) at \(Date())") }
34
+ /// )
35
+ ///
36
+ /// DispatchQueue.main.asyncAfter(
37
+ /// deadline: .now() + .seconds(WAIT_TIME),
38
+ /// execute: {
39
+ /// subject.send("Some data - sent after a delay of \(WAIT_TIME) seconds")
40
+ /// }
41
+ /// )
42
+ ///
43
+ /// // Prints:
44
+ /// // value: Some data - sent after a delay of 2 seconds at
45
+ /// // 2020-03-10 23:47:59 +0000
46
+ /// // completion: finished at 2020-03-10 23:48:04 +0000
47
+ ///
48
+ /// If `customError` is `nil`, the publisher completes normally; if you provide
49
+ /// a closure for the `customError` argument, the upstream publisher is instead
50
+ /// terminated upon timeout, and the error is delivered to the downstream.
51
+ ///
52
+ /// - Parameters:
53
+ /// - interval: The maximum time interval the publisher can go without emitting
54
+ /// an element, expressed in the time system of the scheduler.
55
+ /// - scheduler: The scheduler to deliver events on.
56
+ /// - options: Scheduler options that customize the delivery of elements.
57
+ /// - customError: A closure that executes if the publisher times out.
58
+ /// The publisher sends the failure returned by this closure to the subscriber as
59
+ /// the reason for termination.
60
+ /// - Returns: A publisher that terminates if the specified interval elapses with no
61
+ /// events received from the upstream publisher.
62
+ public func timeout<Context: Scheduler>(
63
+ _ interval: Context.SchedulerTimeType.Stride,
64
+ scheduler: Context,
65
+ options: Context.SchedulerOptions? = nil,
66
+ customError: (() -> Failure)? = nil
67
+ ) -> Publishers.Timeout<Self, Context> {
68
+ return .init(upstream: self,
69
+ interval: interval,
70
+ scheduler: scheduler,
71
+ options: options,
72
+ customError: customError)
73
+ }
74
+ }
75
+
76
+ extension Publishers {
77
+
78
+ public struct Timeout<Upstream: Publisher, Context: Scheduler>: Publisher {
79
+
80
+ public typealias Output = Upstream.Output
81
+
82
+ public typealias Failure = Upstream.Failure
83
+
84
+ public let upstream: Upstream
85
+
86
+ public let interval: Context.SchedulerTimeType.Stride
87
+
88
+ public let scheduler: Context
89
+
90
+ public let options: Context.SchedulerOptions?
91
+
92
+ public let customError: (() -> Upstream.Failure)?
93
+
94
+ public init(upstream: Upstream,
95
+ interval: Context.SchedulerTimeType.Stride,
96
+ scheduler: Context,
97
+ options: Context.SchedulerOptions?,
98
+ customError: (() -> Publishers.Timeout<Upstream, Context>.Failure)?) {
99
+ self.upstream = upstream
100
+ self.interval = interval
101
+ self.scheduler = scheduler
102
+ self.options = options
103
+ self.customError = customError
104
+ }
105
+
106
+ public func receive<Downsteam: Subscriber>(subscriber: Downsteam)
107
+ where Downsteam.Failure == Failure, Downsteam.Input == Output
108
+ {
109
+ let inner = Inner(downstream: subscriber,
110
+ interval: interval,
111
+ scheduler: scheduler,
112
+ options: options,
113
+ customError: customError)
114
+ upstream.subscribe(inner)
115
+ }
116
+ }
117
+ }
118
+
119
+ extension Publishers.Timeout {
120
+ private final class Inner<Downstream: Subscriber>
121
+ : Subscriber,
122
+ Subscription,
123
+ CustomStringConvertible,
124
+ CustomReflectable,
125
+ CustomPlaygroundDisplayConvertible
126
+ where Downstream.Input == Upstream.Output, Downstream.Failure == Upstream.Failure
127
+ {
128
+ typealias Input = Upstream.Output
129
+
130
+ typealias Failure = Upstream.Failure
131
+
132
+ private let lock = UnfairLock.allocate()
133
+
134
+ private let downstreamLock = UnfairRecursiveLock.allocate()
135
+
136
+ private let downstream: Downstream
137
+
138
+ private let interval: Context.SchedulerTimeType.Stride
139
+
140
+ private let scheduler: Context
141
+
142
+ private let options: Context.SchedulerOptions?
143
+
144
+ private let customError: (() -> Upstream.Failure)?
145
+
146
+ private var state = SubscriptionStatus.awaitingSubscription
147
+
148
+ private var didTimeout = false
149
+
150
+ private var timer: AnyCancellable?
151
+
152
+ private var initialDemand = false
153
+
154
+ init(downstream: Downstream,
155
+ interval: Context.SchedulerTimeType.Stride,
156
+ scheduler: Context,
157
+ options: Context.SchedulerOptions?,
158
+ customError: (() -> Upstream.Failure)?) {
159
+ self.downstream = downstream
160
+ self.interval = interval
161
+ self.scheduler = scheduler
162
+ self.options = options
163
+ self.customError = customError
164
+ }
165
+
166
+ deinit {
167
+ lock.deallocate()
168
+ downstreamLock.deallocate()
169
+ }
170
+
171
+ func receive(subscription: Subscription) {
172
+ lock.lock()
173
+ guard case .awaitingSubscription = state else {
174
+ lock.unlock()
175
+ subscription.cancel()
176
+ return
177
+ }
178
+ state = .subscribed(subscription)
179
+ timer = timeoutClock()
180
+ lock.unlock()
181
+ downstreamLock.lock()
182
+ downstream.receive(subscription: self)
183
+ downstreamLock.unlock()
184
+ }
185
+
186
+ func receive(_ input: Input) -> Subscribers.Demand {
187
+ lock.lock()
188
+ guard !didTimeout, case .subscribed = state else {
189
+ lock.unlock()
190
+ return .none
191
+ }
192
+ timer?.cancel()
193
+ didTimeout = false
194
+ timer = timeoutClock()
195
+ lock.unlock()
196
+ scheduler.schedule(options: options) {
197
+ self.scheduledReceive(input)
198
+ }
199
+ return .none
200
+ }
201
+
202
+ func receive(completion: Subscribers.Completion<Failure>) {
203
+ lock.lock()
204
+ guard case .subscribed = state else {
205
+ lock.unlock()
206
+ return
207
+ }
208
+ timer?.cancel()
209
+ lock.unlock()
210
+ scheduler.schedule(options: options) {
211
+ self.scheduledReceive(completion: completion)
212
+ }
213
+ }
214
+
215
+ func request(_ demand: Subscribers.Demand) {
216
+ lock.lock()
217
+ guard case let .subscribed(subscription) = state else {
218
+ lock.unlock()
219
+ return
220
+ }
221
+ if !initialDemand {
222
+ timer = timeoutClock()
223
+ initialDemand = true
224
+ }
225
+ lock.unlock()
226
+ subscription.request(demand)
227
+ }
228
+
229
+ func cancel() {
230
+ lock.lock()
231
+ guard case let .subscribed(subscription) = state else {
232
+ lock.unlock()
233
+ return
234
+ }
235
+ state = .terminal
236
+ lock.unlock()
237
+ timer?.cancel()
238
+ subscription.cancel()
239
+ }
240
+
241
+ var description: String { return "Timeout" }
242
+
243
+ var customMirror: Mirror { return Mirror(self, children: EmptyCollection()) }
244
+
245
+ var playgroundDescription: Any { return description }
246
+
247
+ private func timedOut() {
248
+ lock.lock()
249
+ guard !didTimeout, case let .subscribed(subscription) = state else {
250
+ lock.unlock()
251
+ return
252
+ }
253
+ didTimeout = true
254
+ state = .terminal
255
+ lock.unlock()
256
+ subscription.cancel()
257
+ downstreamLock.lock()
258
+ downstream
259
+ .receive(completion: customError.map { .failure($0()) } ?? .finished)
260
+ downstreamLock.unlock()
261
+ }
262
+
263
+ private func timeoutClock() -> AnyCancellable {
264
+ let cancellable = scheduler
265
+ .schedule(after: scheduler.now.advanced(by: interval),
266
+ interval: interval,
267
+ tolerance: scheduler.minimumTolerance,
268
+ options: options,
269
+ timedOut)
270
+ return AnyCancellable(cancellable.cancel)
271
+ }
272
+
273
+ private func scheduledReceive(_ input: Input) {
274
+ lock.lock()
275
+ guard !didTimeout, case let .subscribed(subscription) = state else {
276
+ lock.unlock()
277
+ return
278
+ }
279
+ lock.unlock()
280
+ downstreamLock.lock()
281
+ let newDemand = downstream.receive(input)
282
+ downstreamLock.unlock()
283
+ if newDemand != .none {
284
+ subscription.request(newDemand)
285
+ }
286
+ }
287
+
288
+ private func scheduledReceive(completion: Subscribers.Completion<Failure>) {
289
+ lock.lock()
290
+ guard case .subscribed = state else {
291
+ lock.unlock()
292
+ return
293
+ }
294
+ state = .terminal
295
+ lock.unlock()
296
+ downstreamLock.lock()
297
+ downstream.receive(completion: completion)
298
+ downstreamLock.unlock()
299
+ }
300
+ }
301
+ }