@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.
- package/Package.swift +214 -0
- package/README.md +10 -2
- package/Sources/AVFoundation/AVFoundation.swift +131 -0
- package/Sources/AVFoundation/Asset.swift +487 -0
- package/Sources/AVFoundation/AudioSession.swift +144 -0
- package/Sources/AVFoundation/CMTime.swift +303 -0
- package/Sources/AVFoundation/Capture.swift +688 -0
- package/Sources/AVFoundation/Player.swift +749 -0
- package/Sources/AVFoundation/PlayerView.swift +117 -0
- package/Sources/AVKit/AVKit.swift +132 -0
- package/Sources/Accelerate/Accelerate.swift +122 -0
- package/Sources/AppIntents/AppIntents.swift +144 -0
- package/Sources/AppIntents/Parameters.swift +220 -0
- package/Sources/AppIntents/Shortcuts.swift +159 -0
- package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
- package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
- package/Sources/AuthenticationServices/Authorization.swift +251 -0
- package/Sources/Charts/Charts.swift +61 -0
- package/Sources/Combine/AnyCancellable.swift +65 -0
- package/Sources/Combine/AnyPublisher.swift +148 -0
- package/Sources/Combine/AnySubscriber.swift +230 -0
- package/Sources/Combine/Cancellable.swift +35 -0
- package/Sources/Combine/Codable.swift +29 -0
- package/Sources/Combine/CombineIdentifier.swift +45 -0
- package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
- package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
- package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
- package/Sources/Combine/CurrentValueSubject.swift +252 -0
- package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
- package/Sources/Combine/Future.swift +228 -0
- package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
- package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
- package/Sources/Combine/Helpers/ConduitList.swift +59 -0
- package/Sources/Combine/Helpers/DebugHook.swift +177 -0
- package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
- package/Sources/Combine/Helpers/Locking.swift +30 -0
- package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
- package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
- package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
- package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
- package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
- package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
- package/Sources/Combine/Helpers/Utils.swift +30 -0
- package/Sources/Combine/Helpers/Violations.swift +33 -0
- package/Sources/Combine/ImmediateScheduler.swift +178 -0
- package/Sources/Combine/LICENSE +21 -0
- package/Sources/Combine/NotificationPublisher.swift +48 -0
- package/Sources/Combine/ObjectWillChange.swift +46 -0
- package/Sources/Combine/PassthroughSubject.swift +222 -0
- package/Sources/Combine/Publisher+Subscribe.swift +53 -0
- package/Sources/Combine/Publishers/Deferred.swift +48 -0
- package/Sources/Combine/Publishers/Empty.swift +54 -0
- package/Sources/Combine/Publishers/Fail.swift +42 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
- package/Sources/Combine/Publishers/Just.swift +313 -0
- package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
- package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
- package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
- package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
- package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
- package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
- package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
- package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
- package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
- package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
- package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
- package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
- package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
- package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
- package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
- package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
- package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
- package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
- package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
- package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
- package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
- package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
- package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
- package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
- package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
- package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
- package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
- package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
- package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
- package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
- package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
- package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
- package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
- package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
- package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
- package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
- package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
- package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
- package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
- package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
- package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
- package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
- package/Sources/Combine/Publishers/Publishers.swift +13 -0
- package/Sources/Combine/Publishers/Record.swift +237 -0
- package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
- package/Sources/Combine/Result.swift +46 -0
- package/Sources/Combine/Scheduler.swift +89 -0
- package/Sources/Combine/Schedulers.swift +211 -0
- package/Sources/Combine/Subject+Void.swift +17 -0
- package/Sources/Combine/Subscriber+Void.swift +20 -0
- package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
- package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
- package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
- package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
- package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
- package/Sources/Combine/Subscription.swift +22 -0
- package/Sources/Combine/Subscriptions.swift +42 -0
- package/Sources/Combine/SwiftUIObservation.swift +10 -0
- package/Sources/Combine/_Introspection.swift +107 -0
- package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
- package/Sources/Compression/Compression.swift +365 -0
- package/Sources/Compression/Deflate.swift +407 -0
- package/Sources/Compression/Zlib.swift +179 -0
- package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
- package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
- package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
- package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
- package/Sources/CoreImage/CIColor.swift +41 -0
- package/Sources/CoreImage/CIContext.swift +31 -0
- package/Sources/CoreImage/CIDetector.swift +57 -0
- package/Sources/CoreImage/CIFilter.swift +243 -0
- package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
- package/Sources/CoreImage/CIImage.swift +162 -0
- package/Sources/CoreImage/QRCode.swift +393 -0
- package/Sources/CoreLocation/Coordinate.swift +30 -0
- package/Sources/CoreLocation/Location.swift +65 -0
- package/Sources/CoreML/Evaluation.swift +414 -0
- package/Sources/CoreML/FeatureValue.swift +266 -0
- package/Sources/CoreML/Model.swift +269 -0
- package/Sources/CoreML/MultiArray.swift +92 -0
- package/Sources/CoreML/Specification.swift +233 -0
- package/Sources/CoreText/CoreText.swift +64 -0
- package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
- package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
- package/Sources/CryptoKit/CryptoKit.swift +375 -0
- package/Sources/CryptoKit/Curve25519.swift +317 -0
- package/Sources/CryptoKit/P256.swift +321 -0
- package/Sources/FoundationBridge/AppStorage.swift +165 -0
- package/Sources/FoundationBridge/AssetResources.swift +90 -0
- package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
- package/Sources/FoundationBridge/AsyncImage.swift +116 -0
- package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
- package/Sources/FoundationBridge/Bundle.swift +119 -0
- package/Sources/FoundationBridge/CombineExports.swift +8 -0
- package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
- package/Sources/FoundationBridge/Dispatch.swift +458 -0
- package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
- package/Sources/FoundationBridge/FileImporter.swift +128 -0
- package/Sources/FoundationBridge/FileSystem.swift +68 -0
- package/Sources/FoundationBridge/FoundationBridge.swift +29 -0
- package/Sources/FoundationBridge/HostResolution.swift +31 -0
- package/Sources/FoundationBridge/ItemProvider.swift +655 -0
- package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
- package/Sources/FoundationBridge/Links.swift +127 -0
- package/Sources/FoundationBridge/ListFormatter.swift +32 -0
- package/Sources/FoundationBridge/Locale.swift +86 -0
- package/Sources/FoundationBridge/Localization.swift +149 -0
- package/Sources/FoundationBridge/Locks.swift +50 -0
- package/Sources/FoundationBridge/Markdown.swift +527 -0
- package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
- package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
- package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
- package/Sources/FoundationBridge/Operation.swift +195 -0
- package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
- package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
- package/Sources/FoundationBridge/SceneStorage.swift +78 -0
- package/Sources/FoundationBridge/SecurityExports.swift +8 -0
- package/Sources/FoundationBridge/Selector.swift +226 -0
- package/Sources/FoundationBridge/StringComparators.swift +17 -0
- package/Sources/FoundationBridge/Table.swift +211 -0
- package/Sources/FoundationBridge/TextAttributes.swift +42 -0
- package/Sources/FoundationBridge/Timer.swift +53 -0
- package/Sources/FoundationBridge/UITextChecker.swift +30 -0
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/FoundationBridge/UserDefaults.swift +183 -0
- package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
- package/Sources/FoundationBridge/WebSocket.swift +187 -0
- package/Sources/FoundationModels/FoundationModels.swift +1098 -0
- package/Sources/ImageIO/GIF.swift +72 -0
- package/Sources/ImageIO/ImageIO.swift +248 -0
- package/Sources/ImageIO/ImageTypes.swift +28 -0
- package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
- package/Sources/LocalAuthentication/LAContext.swift +86 -0
- package/Sources/MapKit/Geometry.swift +223 -0
- package/Sources/MapKit/Map.swift +638 -0
- package/Sources/MapKit/MapView.swift +229 -0
- package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
- package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
- package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
- package/Sources/OSLog/OSLog.swift +6 -0
- package/Sources/Photos/Photos.swift +572 -0
- package/Sources/PhotosUI/PhotosPicker.swift +248 -0
- package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
- package/Sources/QuickLook/QuickLook.swift +168 -0
- package/Sources/SafariServices/SafariServices.swift +106 -0
- package/Sources/Security/Security.swift +332 -0
- package/Sources/StoreKit/AppStore.swift +207 -0
- package/Sources/StoreKit/Products.swift +280 -0
- package/Sources/StoreKit/RequestReview.swift +28 -0
- package/Sources/StoreKit/StoreKit1.swift +486 -0
- package/Sources/StoreKit/StoreViews.swift +428 -0
- package/Sources/StoreKit/Transactions.swift +197 -0
- package/Sources/SwiftData/Macros.swift +58 -0
- package/Sources/SwiftData/ModelActor.swift +38 -0
- package/Sources/SwiftData/ModelContainer.swift +129 -0
- package/Sources/SwiftData/ModelContext.swift +451 -0
- package/Sources/SwiftData/PersistentModel.swift +238 -0
- package/Sources/SwiftData/Properties.swift +261 -0
- package/Sources/SwiftData/Query.swift +256 -0
- package/Sources/SwiftData/Schema.swift +192 -0
- package/Sources/SwiftData/Store.swift +146 -0
- package/Sources/SwiftData/StringPredicates.swift +125 -0
- package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
- package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
- package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
- package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
- package/Sources/SwiftDataMacros/Plugin.swift +18 -0
- package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
- package/Sources/SwiftUI/API/Accessibility.swift +181 -0
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +221 -0
- package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
- package/Sources/SwiftUI/API/Animation.swift +285 -0
- package/Sources/SwiftUI/API/App.swift +87 -0
- package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
- package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
- package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
- package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
- package/Sources/SwiftUI/API/Canvas.swift +337 -0
- package/Sources/SwiftUI/API/Color.swift +237 -0
- package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
- package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
- package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
- package/Sources/SwiftUI/API/Commands.swift +106 -0
- package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
- package/Sources/SwiftUI/API/ContentShape.swift +33 -0
- package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
- package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
- package/Sources/SwiftUI/API/Controls.swift +300 -0
- package/Sources/SwiftUI/API/CustomLayout.swift +442 -0
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +92 -0
- package/Sources/SwiftUI/API/EditMode.swift +212 -0
- package/Sources/SwiftUI/API/Effects.swift +388 -0
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +439 -0
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +137 -0
- package/Sources/SwiftUI/API/Font.swift +131 -0
- package/Sources/SwiftUI/API/Gauge.swift +290 -0
- package/Sources/SwiftUI/API/Geometry.swift +89 -0
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +135 -0
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +342 -0
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +188 -0
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +124 -0
- package/Sources/SwiftUI/API/Layout.swift +220 -0
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +331 -0
- package/Sources/SwiftUI/API/Menu.swift +58 -0
- package/Sources/SwiftUI/API/Modifiers.swift +313 -0
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +386 -0
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +293 -0
- package/Sources/SwiftUI/API/OnChange.swift +48 -0
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +411 -0
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +185 -0
- package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
- package/Sources/SwiftUI/API/Popover.swift +41 -0
- package/Sources/SwiftUI/API/Preferences.swift +262 -0
- package/Sources/SwiftUI/API/Presentation.swift +122 -0
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +517 -0
- package/Sources/SwiftUI/API/Publishers.swift +107 -0
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +84 -0
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +104 -0
- package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
- package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +409 -0
- package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
- package/Sources/SwiftUI/API/Sharing.swift +193 -0
- package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
- package/Sources/SwiftUI/API/State.swift +144 -0
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
- package/Sources/SwiftUI/API/StrokeStyle.swift +30 -0
- package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
- package/Sources/SwiftUI/API/TabContent.swift +841 -0
- package/Sources/SwiftUI/API/Table.swift +382 -0
- package/Sources/SwiftUI/API/Tabs.swift +263 -0
- package/Sources/SwiftUI/API/Tasks.swift +35 -0
- package/Sources/SwiftUI/API/Text.swift +386 -0
- package/Sources/SwiftUI/API/TextDates.swift +61 -0
- package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
- package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
- package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
- package/Sources/SwiftUI/API/Timeline.swift +212 -0
- package/Sources/SwiftUI/API/Toolbar.swift +251 -0
- package/Sources/SwiftUI/API/Transfer.swift +145 -0
- package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
- package/Sources/SwiftUI/API/Video.swift +64 -0
- package/Sources/SwiftUI/API/View.swift +215 -0
- package/Sources/SwiftUI/API/ViewModifier.swift +43 -0
- package/Sources/SwiftUI/API/VisualEffect.swift +155 -0
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +325 -0
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +660 -0
- package/Sources/SwiftUI/Charts/ChartContent.swift +376 -0
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Charts/Marks.swift +204 -0
- package/Sources/SwiftUI/Charts/Plottable.swift +99 -0
- package/Sources/SwiftUI/Charts/Scales.swift +326 -0
- package/Sources/SwiftUI/Localization/Localization.swift +498 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +85 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +101 -0
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +143 -0
- package/Sources/SwiftUI/Runtime/JSONParser.swift +443 -0
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +152 -0
- package/Sources/SwiftUI/Runtime/Reconciler.swift +219 -0
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +2146 -0
- package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
- package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
- package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
- package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
- package/Sources/Symbols/Symbols.swift +25 -0
- package/Sources/Translation/Translation.swift +423 -0
- package/Sources/UIKit/Activity.swift +213 -0
- package/Sources/UIKit/Alerts.swift +69 -0
- package/Sources/UIKit/AppDelegate.swift +222 -0
- package/Sources/UIKit/Appearance.swift +84 -0
- package/Sources/UIKit/ColorConversions.swift +70 -0
- package/Sources/UIKit/Controls.swift +225 -0
- package/Sources/UIKit/Device.swift +200 -0
- package/Sources/UIKit/Feedback.swift +65 -0
- package/Sources/UIKit/Font.swift +307 -0
- package/Sources/UIKit/Graphics.swift +204 -0
- package/Sources/UIKit/HostingController.swift +185 -0
- package/Sources/UIKit/Identity.swift +24 -0
- package/Sources/UIKit/Introspectable.swift +510 -0
- package/Sources/UIKit/Pasteboard.swift +363 -0
- package/Sources/UIKit/PhotoAlbum.swift +81 -0
- package/Sources/UIKit/RemoteNotifications.swift +15 -0
- package/Sources/UIKit/Representable.swift +288 -0
- package/Sources/UIKit/SafeArea.swift +12 -0
- package/Sources/UIKit/SceneDelegates.swift +132 -0
- package/Sources/UIKit/Scenes.swift +40 -0
- package/Sources/UIKit/ScrollView.swift +157 -0
- package/Sources/UIKit/ShortcutItems.swift +67 -0
- package/Sources/UIKit/SymbolConfiguration.swift +124 -0
- package/Sources/UIKit/TargetAction.swift +123 -0
- package/Sources/UIKit/TextPaste.swift +161 -0
- package/Sources/UIKit/TextView.swift +538 -0
- package/Sources/UIKit/UIKit.swift +292 -0
- package/Sources/UIKit/UIView.swift +855 -0
- package/Sources/UIKit/ViewTranslation.swift +311 -0
- package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
- package/Sources/UserNotifications/Content.swift +370 -0
- package/Sources/UserNotifications/NotificationCenter.swift +309 -0
- package/Sources/WeatherKit/WeatherKit.swift +228 -0
- package/Sources/WebKit/WebKit.swift +245 -0
- package/Sources/os/os.swift +376 -0
- package/Sources/zlib/zlib.swift +6 -0
- package/index.d.ts +2 -0
- package/index.mjs +16 -0
- package/manifest.d.mts +2 -0
- package/manifest.mjs +39 -0
- package/package.json +30 -4
- package/sync-sources.mjs +33 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.SubscribeOn.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 02.12.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Specifies the scheduler on which to perform subscribe, cancel, and request
|
|
11
|
+
/// operations.
|
|
12
|
+
///
|
|
13
|
+
/// In contrast with `receive(on:options:)`, which affects downstream messages,
|
|
14
|
+
/// `subscribe(on:options:)` changes the execution context of upstream messages.
|
|
15
|
+
///
|
|
16
|
+
/// In the following example, the `subscribe(on:options:)` operator causes
|
|
17
|
+
/// `ioPerformingPublisher` to receive requests on `backgroundQueue`, while
|
|
18
|
+
/// the `receive(on:options:)` causes `uiUpdatingSubscriber` to receive elements and
|
|
19
|
+
/// completion on `RunLoop.main`.
|
|
20
|
+
///
|
|
21
|
+
/// let ioPerformingPublisher == // Some publisher.
|
|
22
|
+
/// let uiUpdatingSubscriber == // Some subscriber that updates the UI.
|
|
23
|
+
///
|
|
24
|
+
/// ioPerformingPublisher
|
|
25
|
+
/// .subscribe(on: backgroundQueue)
|
|
26
|
+
/// .receive(on: RunLoop.main)
|
|
27
|
+
/// .subscribe(uiUpdatingSubscriber)
|
|
28
|
+
///
|
|
29
|
+
///
|
|
30
|
+
/// Using `subscribe(on:options:)` also causes the upstream publisher to perform
|
|
31
|
+
/// `cancel()` using the specfied scheduler.
|
|
32
|
+
///
|
|
33
|
+
/// - Parameters:
|
|
34
|
+
/// - scheduler: The scheduler used to send messages to upstream publishers.
|
|
35
|
+
/// - options: Options that customize the delivery of elements.
|
|
36
|
+
/// - Returns: A publisher which performs upstream operations on the specified
|
|
37
|
+
/// scheduler.
|
|
38
|
+
public func subscribe<Context: Scheduler>(
|
|
39
|
+
on scheduler: Context,
|
|
40
|
+
options: Context.SchedulerOptions? = nil
|
|
41
|
+
) -> Publishers.SubscribeOn<Self, Context> {
|
|
42
|
+
return .init(upstream: self, scheduler: scheduler, options: options)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
extension Publishers {
|
|
47
|
+
|
|
48
|
+
/// A publisher that receives elements from an upstream publisher on a specific
|
|
49
|
+
/// scheduler.
|
|
50
|
+
public struct SubscribeOn<Upstream: Publisher, Context: Scheduler>: Publisher {
|
|
51
|
+
|
|
52
|
+
public typealias Output = Upstream.Output
|
|
53
|
+
|
|
54
|
+
public typealias Failure = Upstream.Failure
|
|
55
|
+
|
|
56
|
+
/// The publisher from which this publisher receives elements.
|
|
57
|
+
public let upstream: Upstream
|
|
58
|
+
|
|
59
|
+
/// The scheduler the publisher should use to receive elements.
|
|
60
|
+
public let scheduler: Context
|
|
61
|
+
|
|
62
|
+
/// Scheduler options that customize the delivery of elements.
|
|
63
|
+
public let options: Context.SchedulerOptions?
|
|
64
|
+
|
|
65
|
+
public init(upstream: Upstream,
|
|
66
|
+
scheduler: Context,
|
|
67
|
+
options: Context.SchedulerOptions?) {
|
|
68
|
+
self.upstream = upstream
|
|
69
|
+
self.scheduler = scheduler
|
|
70
|
+
self.options = options
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
74
|
+
where Upstream.Failure == Downstream.Failure,
|
|
75
|
+
Upstream.Output == Downstream.Input
|
|
76
|
+
{
|
|
77
|
+
let inner = Inner(scheduler: scheduler,
|
|
78
|
+
options: options,
|
|
79
|
+
downstream: subscriber)
|
|
80
|
+
scheduler.schedule(options: options) {
|
|
81
|
+
self.upstream.subscribe(inner)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
extension Publishers.SubscribeOn {
|
|
88
|
+
private final class Inner<Downstream: Subscriber>
|
|
89
|
+
: Subscriber,
|
|
90
|
+
Subscription,
|
|
91
|
+
CustomStringConvertible,
|
|
92
|
+
CustomReflectable,
|
|
93
|
+
CustomPlaygroundDisplayConvertible
|
|
94
|
+
where Downstream.Input == Upstream.Output, Downstream.Failure == Upstream.Failure
|
|
95
|
+
{
|
|
96
|
+
typealias Input = Upstream.Output
|
|
97
|
+
|
|
98
|
+
typealias Failure = Upstream.Failure
|
|
99
|
+
|
|
100
|
+
private let lock = UnfairLock.allocate()
|
|
101
|
+
private let downstream: Downstream
|
|
102
|
+
private let scheduler: Context
|
|
103
|
+
private let options: Context.SchedulerOptions?
|
|
104
|
+
private var state = SubscriptionStatus.awaitingSubscription
|
|
105
|
+
private let upstreamLock = UnfairLock.allocate()
|
|
106
|
+
|
|
107
|
+
init(scheduler: Context,
|
|
108
|
+
options: Context.SchedulerOptions?,
|
|
109
|
+
downstream: Downstream) {
|
|
110
|
+
self.downstream = downstream
|
|
111
|
+
self.scheduler = scheduler
|
|
112
|
+
self.options = options
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
deinit {
|
|
116
|
+
lock.deallocate()
|
|
117
|
+
upstreamLock.deallocate()
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
func receive(subscription: Subscription) {
|
|
121
|
+
lock.lock()
|
|
122
|
+
guard case .awaitingSubscription = state else {
|
|
123
|
+
lock.unlock()
|
|
124
|
+
subscription.cancel()
|
|
125
|
+
return
|
|
126
|
+
}
|
|
127
|
+
state = .subscribed(subscription)
|
|
128
|
+
lock.unlock()
|
|
129
|
+
downstream.receive(subscription: self)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
133
|
+
lock.lock()
|
|
134
|
+
guard case .subscribed = state else {
|
|
135
|
+
lock.unlock()
|
|
136
|
+
return .none
|
|
137
|
+
}
|
|
138
|
+
lock.unlock()
|
|
139
|
+
return downstream.receive(input)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
func receive(completion: Subscribers.Completion<Failure>) {
|
|
143
|
+
lock.lock()
|
|
144
|
+
guard case .subscribed = state else {
|
|
145
|
+
lock.unlock()
|
|
146
|
+
return
|
|
147
|
+
}
|
|
148
|
+
state = .terminal
|
|
149
|
+
lock.unlock()
|
|
150
|
+
downstream.receive(completion: completion)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
func request(_ demand: Subscribers.Demand) {
|
|
154
|
+
lock.lock()
|
|
155
|
+
guard case let .subscribed(subscription) = state else {
|
|
156
|
+
lock.unlock()
|
|
157
|
+
return
|
|
158
|
+
}
|
|
159
|
+
lock.unlock()
|
|
160
|
+
scheduler.schedule(options: options) {
|
|
161
|
+
self.scheduledRequest(demand, subscription: subscription)
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
private func scheduledRequest(_ demand: Subscribers.Demand,
|
|
166
|
+
subscription: Subscription) {
|
|
167
|
+
upstreamLock.lock()
|
|
168
|
+
subscription.request(demand)
|
|
169
|
+
upstreamLock.unlock()
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
func cancel() {
|
|
173
|
+
lock.lock()
|
|
174
|
+
guard case let .subscribed(subscription) = state else {
|
|
175
|
+
lock.unlock()
|
|
176
|
+
return
|
|
177
|
+
}
|
|
178
|
+
state = .terminal
|
|
179
|
+
lock.unlock()
|
|
180
|
+
scheduler.schedule(options: options) {
|
|
181
|
+
self.scheduledCancel(subscription)
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
private func scheduledCancel(_ subscription: Subscription) {
|
|
186
|
+
upstreamLock.lock()
|
|
187
|
+
subscription.cancel()
|
|
188
|
+
upstreamLock.unlock()
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
var description: String { return "SubscribeOn" }
|
|
192
|
+
|
|
193
|
+
var customMirror: Mirror { return Mirror(self, children: EmptyCollection()) }
|
|
194
|
+
|
|
195
|
+
var playgroundDescription: Any { return description }
|
|
196
|
+
}
|
|
197
|
+
}
|
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.SwitchToLatest.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 07.01.2020.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher where Output: Publisher, Output.Failure == Failure {
|
|
9
|
+
|
|
10
|
+
/// Republishes elements sent by the most recently received publisher.
|
|
11
|
+
///
|
|
12
|
+
/// This operator works with an upstream publisher of publishers, flattening
|
|
13
|
+
/// the stream of elements to appear as if they were coming from a single stream of
|
|
14
|
+
/// elements. It switches the inner publisher as new ones arrive but keeps the outer
|
|
15
|
+
/// publisher constant for downstream subscribers.
|
|
16
|
+
///
|
|
17
|
+
/// For example, given the type `AnyPublisher<URLSession.DataTaskPublisher, NSError>`,
|
|
18
|
+
/// calling `switchToLatest()` results in the type
|
|
19
|
+
/// `SwitchToLatest<(Data, URLResponse), URLError>`.
|
|
20
|
+
/// The downstream subscriber sees a continuous stream of `(Data, URLResponse)`
|
|
21
|
+
/// elements from what looks like a single `URLSession.DataTaskPublisher` even though
|
|
22
|
+
/// the elements are coming from different upstream publishers.
|
|
23
|
+
///
|
|
24
|
+
/// When this operator receives a new publisher from the upstream publisher, it
|
|
25
|
+
/// cancels its previous subscription. Use this feature to prevent earlier publishers
|
|
26
|
+
/// from performing unnecessary work, such as creating network request publishers from
|
|
27
|
+
/// frequently updating user interface publishers.
|
|
28
|
+
///
|
|
29
|
+
/// The following example updates a `PassthroughSubject` with a new value every
|
|
30
|
+
/// `0.1` seconds. A `map(_:)` operator receives the new value and uses it to create
|
|
31
|
+
/// a new `URLSession.DataTaskPublisher`. By using the `switchToLatest()` operator,
|
|
32
|
+
/// the downstream sink subscriber receives the `(Data, URLResponse)` output type from
|
|
33
|
+
/// the data task publishers, rather than the `URLSession.DataTaskPublisher` type
|
|
34
|
+
/// produced by the `map(_:)` operator. Furthermore, creating each new data task
|
|
35
|
+
/// publisher cancels the previous data task publisher.
|
|
36
|
+
///
|
|
37
|
+
/// let subject = PassthroughSubject<Int, Never>()
|
|
38
|
+
/// cancellable = subject
|
|
39
|
+
/// .setFailureType(to: URLError.self)
|
|
40
|
+
/// .map() { index -> URLSession.DataTaskPublisher in
|
|
41
|
+
/// let url = URL(string: "https://example.org/get?index=\(index)")!
|
|
42
|
+
/// return URLSession.shared.dataTaskPublisher(for: url)
|
|
43
|
+
/// }
|
|
44
|
+
/// .switchToLatest()
|
|
45
|
+
/// .sink(receiveCompletion: { print("Complete: \($0)") },
|
|
46
|
+
/// receiveValue: { (data, response) in
|
|
47
|
+
/// guard let url = response.url else {
|
|
48
|
+
/// print("Bad response.")
|
|
49
|
+
/// return
|
|
50
|
+
/// }
|
|
51
|
+
/// print("URL: \(url)")
|
|
52
|
+
/// })
|
|
53
|
+
///
|
|
54
|
+
/// for index in 1...5 {
|
|
55
|
+
/// DispatchQueue.main.asyncAfter(deadline: .now() + TimeInterval(index/10)) {
|
|
56
|
+
/// subject.send(index)
|
|
57
|
+
/// }
|
|
58
|
+
/// }
|
|
59
|
+
///
|
|
60
|
+
/// // Prints "URL: https://example.org/get?index=5"
|
|
61
|
+
///
|
|
62
|
+
/// The exact behavior of this example depends on the value of `asyncAfter` and
|
|
63
|
+
/// the speed of the network connection. If the delay value is longer, or the network
|
|
64
|
+
/// connection is fast, the earlier data tasks may complete before `switchToLatest()`
|
|
65
|
+
/// can cancel them. If this happens, the output includes multiple URLs whose tasks
|
|
66
|
+
/// complete before cancellation.
|
|
67
|
+
public func switchToLatest() -> Publishers.SwitchToLatest<Output, Self> {
|
|
68
|
+
return .init(upstream: self)
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
extension Publisher where Output: Publisher, Failure == Never {
|
|
73
|
+
|
|
74
|
+
/// Republishes elements sent by the most recently received publisher.
|
|
75
|
+
///
|
|
76
|
+
/// This operator works with an upstream publisher of publishers, flattening
|
|
77
|
+
/// the stream of elements to appear as if they were coming from a single stream of
|
|
78
|
+
/// elements. It switches the inner publisher as new ones arrive but keeps the outer
|
|
79
|
+
/// publisher constant for downstream subscribers.
|
|
80
|
+
///
|
|
81
|
+
/// When this operator receives a new publisher from the upstream publisher, it
|
|
82
|
+
/// cancels its previous subscription. Use this feature to prevent earlier publishers
|
|
83
|
+
/// from performing unnecessary work, such as creating network request publishers from
|
|
84
|
+
/// frequently updating user interface publishers.
|
|
85
|
+
public func switchToLatest() -> Publishers.SwitchToLatest<
|
|
86
|
+
Output, Publishers.SetFailureType<Self, Output.Failure>
|
|
87
|
+
> {
|
|
88
|
+
return setFailureType(to: Output.Failure.self).switchToLatest()
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
extension Publisher where Output: Publisher, Failure == Never, Output.Failure == Never {
|
|
93
|
+
|
|
94
|
+
/// Republishes elements sent by the most recently received publisher.
|
|
95
|
+
///
|
|
96
|
+
/// This operator works with an upstream publisher of publishers, flattening
|
|
97
|
+
/// the stream of elements to appear as if they were coming from a single stream of
|
|
98
|
+
/// elements. It switches the inner publisher as new ones arrive but keeps the outer
|
|
99
|
+
/// publisher constant for downstream subscribers.
|
|
100
|
+
///
|
|
101
|
+
/// When this operator receives a new publisher from the upstream publisher, it
|
|
102
|
+
/// cancels its previous subscription. Use this feature to prevent earlier publishers
|
|
103
|
+
/// from performing unnecessary work, such as creating network request publishers from
|
|
104
|
+
/// frequently updating user interface publishers.
|
|
105
|
+
public func switchToLatest() -> Publishers.SwitchToLatest<Output, Self> {
|
|
106
|
+
return .init(upstream: self)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
extension Publisher where Output: Publisher, Output.Failure == Never {
|
|
111
|
+
|
|
112
|
+
/// Republishes elements sent by the most recently received publisher.
|
|
113
|
+
///
|
|
114
|
+
/// This operator works with an upstream publisher of publishers, flattening
|
|
115
|
+
/// the stream of elements to appear as if they were coming from a single stream of
|
|
116
|
+
/// elements. It switches the inner publisher as new ones arrive but keeps the outer
|
|
117
|
+
/// publisher constant for downstream subscribers.
|
|
118
|
+
///
|
|
119
|
+
/// When this operator receives a new publisher from the upstream publisher, it
|
|
120
|
+
/// cancels its previous subscription. Use this feature to prevent earlier publishers
|
|
121
|
+
/// from performing unnecessary work, such as creating network request publishers from
|
|
122
|
+
/// frequently updating user interface publishers.
|
|
123
|
+
public func switchToLatest() -> Publishers.SwitchToLatest<
|
|
124
|
+
Publishers.SetFailureType<Output, Failure>,
|
|
125
|
+
Publishers.Map<Self, Publishers.SetFailureType<Output, Failure>>
|
|
126
|
+
> {
|
|
127
|
+
return map { $0.setFailureType(to: Failure.self) }.switchToLatest()
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
extension Publishers {
|
|
132
|
+
|
|
133
|
+
/// A publisher that flattens nested publishers.
|
|
134
|
+
///
|
|
135
|
+
/// Given a publisher that publishes `Publisher` instances,
|
|
136
|
+
/// the `Publishers.SwitchToLatest` publisher produces a sequence of events from only
|
|
137
|
+
/// the most recent one. For example, given the type
|
|
138
|
+
/// `AnyPublisher<URLSession.DataTaskPublisher, NSError>`, calling `switchToLatest()`
|
|
139
|
+
/// results in the type `SwitchToLatest<(Data, URLResponse), URLError>`.
|
|
140
|
+
/// The downstream subscriber sees a continuous stream of `(Data, URLResponse)`
|
|
141
|
+
/// elements from what looks like a single `URLSession.DataTaskPublisher` even though
|
|
142
|
+
/// the elements are coming from different upstream publishers.
|
|
143
|
+
///
|
|
144
|
+
/// When `Publishers.SwitchToLatest` receives a new publisher from the upstream
|
|
145
|
+
/// publisher, it cancels its previous subscription. Use this feature to prevent
|
|
146
|
+
/// earlier publishers from performing unnecessary work, such as creating network
|
|
147
|
+
/// request publishers from frequently-updating user interface publishers.
|
|
148
|
+
public struct SwitchToLatest<NestedPublisher: Publisher, Upstream: Publisher>
|
|
149
|
+
: Publisher
|
|
150
|
+
where Upstream.Output == NestedPublisher,
|
|
151
|
+
Upstream.Failure == NestedPublisher.Failure
|
|
152
|
+
{
|
|
153
|
+
public typealias Output = NestedPublisher.Output
|
|
154
|
+
|
|
155
|
+
public typealias Failure = NestedPublisher.Failure
|
|
156
|
+
|
|
157
|
+
/// The publisher from which this publisher receives elements.
|
|
158
|
+
public let upstream: Upstream
|
|
159
|
+
|
|
160
|
+
/// Creates a publisher that “flattens” nested publishers.
|
|
161
|
+
///
|
|
162
|
+
/// - Parameter upstream: The publisher from which this publisher receives
|
|
163
|
+
/// elements.
|
|
164
|
+
public init(upstream: Upstream) {
|
|
165
|
+
self.upstream = upstream
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
169
|
+
where Downstream.Input == Output, Downstream.Failure == Failure
|
|
170
|
+
{
|
|
171
|
+
let outer = Outer(downstream: subscriber)
|
|
172
|
+
subscriber.receive(subscription: outer)
|
|
173
|
+
upstream.subscribe(outer)
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
extension Publishers.SwitchToLatest {
|
|
179
|
+
fileprivate final class Outer<Downstream: Subscriber>
|
|
180
|
+
: Subscriber,
|
|
181
|
+
Subscription,
|
|
182
|
+
CustomStringConvertible,
|
|
183
|
+
CustomReflectable,
|
|
184
|
+
CustomPlaygroundDisplayConvertible
|
|
185
|
+
where Downstream.Input == NestedPublisher.Output,
|
|
186
|
+
Downstream.Failure == Upstream.Failure
|
|
187
|
+
{
|
|
188
|
+
typealias Input = Upstream.Output
|
|
189
|
+
|
|
190
|
+
typealias Failure = Upstream.Failure
|
|
191
|
+
|
|
192
|
+
private let downstream: Downstream
|
|
193
|
+
private var outerSubscription: Subscription?
|
|
194
|
+
private var currentInnerSubscription: Subscription?
|
|
195
|
+
private var currentInnerIndex: UInt64 = 0
|
|
196
|
+
private var nextInnerIndex: UInt64 = 1
|
|
197
|
+
private let lock = UnfairLock.allocate()
|
|
198
|
+
private let downstreamLock = UnfairRecursiveLock.allocate()
|
|
199
|
+
private var cancelled = false
|
|
200
|
+
private var finished = false
|
|
201
|
+
private var sentCompletion = false
|
|
202
|
+
private var awaitingInnerSubscription = false
|
|
203
|
+
private var downstreamDemand = Subscribers.Demand.none
|
|
204
|
+
|
|
205
|
+
init(downstream: Downstream) {
|
|
206
|
+
self.downstream = downstream
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
deinit {
|
|
210
|
+
lock.deallocate()
|
|
211
|
+
downstreamLock.deallocate()
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
func receive(subscription: Subscription) {
|
|
215
|
+
lock.lock()
|
|
216
|
+
guard outerSubscription == nil && !cancelled else {
|
|
217
|
+
lock.unlock()
|
|
218
|
+
subscription.cancel()
|
|
219
|
+
return
|
|
220
|
+
}
|
|
221
|
+
outerSubscription = subscription
|
|
222
|
+
lock.unlock()
|
|
223
|
+
subscription.request(.unlimited)
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
227
|
+
lock.lock()
|
|
228
|
+
if cancelled || finished {
|
|
229
|
+
lock.unlock()
|
|
230
|
+
return .none
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if let currentInnerSubscription = self.currentInnerSubscription.take() {
|
|
234
|
+
lock.unlock()
|
|
235
|
+
currentInnerSubscription.cancel()
|
|
236
|
+
lock.lock()
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
let index = nextInnerIndex
|
|
240
|
+
currentInnerIndex = index
|
|
241
|
+
nextInnerIndex += 1
|
|
242
|
+
awaitingInnerSubscription = true
|
|
243
|
+
lock.unlock()
|
|
244
|
+
input.subscribe(Side(inner: self, index: index))
|
|
245
|
+
return .none
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
func receive(completion: Subscribers.Completion<Failure>) {
|
|
249
|
+
lock.lock()
|
|
250
|
+
outerSubscription = nil
|
|
251
|
+
finished = true
|
|
252
|
+
|
|
253
|
+
if cancelled {
|
|
254
|
+
lock.unlock()
|
|
255
|
+
return
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
switch completion {
|
|
259
|
+
case .finished:
|
|
260
|
+
if awaitingInnerSubscription {
|
|
261
|
+
lock.unlock()
|
|
262
|
+
return
|
|
263
|
+
}
|
|
264
|
+
if currentInnerSubscription == nil {
|
|
265
|
+
sentCompletion = true
|
|
266
|
+
lock.unlock()
|
|
267
|
+
downstreamLock.lock()
|
|
268
|
+
downstream.receive(completion: completion)
|
|
269
|
+
downstreamLock.unlock()
|
|
270
|
+
} else {
|
|
271
|
+
lock.unlock()
|
|
272
|
+
}
|
|
273
|
+
case .failure:
|
|
274
|
+
let currentInnerSubscription = self.currentInnerSubscription.take()
|
|
275
|
+
sentCompletion = true
|
|
276
|
+
lock.unlock()
|
|
277
|
+
currentInnerSubscription?.cancel()
|
|
278
|
+
downstreamLock.lock()
|
|
279
|
+
downstream.receive(completion: completion)
|
|
280
|
+
downstreamLock.unlock()
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
func request(_ demand: Subscribers.Demand) {
|
|
285
|
+
demand.assertNonZero()
|
|
286
|
+
lock.lock()
|
|
287
|
+
downstreamDemand += demand
|
|
288
|
+
if let currentInnerSubscription = self.currentInnerSubscription {
|
|
289
|
+
lock.unlock()
|
|
290
|
+
currentInnerSubscription.request(demand)
|
|
291
|
+
} else {
|
|
292
|
+
lock.unlock()
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
func cancel() {
|
|
297
|
+
lock.lock()
|
|
298
|
+
cancelled = true
|
|
299
|
+
let currentInnerSubscription = self.currentInnerSubscription.take()
|
|
300
|
+
let outerSubscription = self.outerSubscription.take()
|
|
301
|
+
lock.unlock()
|
|
302
|
+
|
|
303
|
+
currentInnerSubscription?.cancel()
|
|
304
|
+
outerSubscription?.cancel()
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
var description: String { return "SwitchToLatest" }
|
|
308
|
+
|
|
309
|
+
var customMirror: Mirror {
|
|
310
|
+
return Mirror(self, children: EmptyCollection())
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
var playgroundDescription: Any { return description }
|
|
314
|
+
|
|
315
|
+
private func receiveInner(subscription: Subscription, _ index: UInt64) {
|
|
316
|
+
lock.lock()
|
|
317
|
+
guard currentInnerIndex == index &&
|
|
318
|
+
!cancelled &&
|
|
319
|
+
currentInnerSubscription == nil else {
|
|
320
|
+
lock.unlock()
|
|
321
|
+
subscription.cancel()
|
|
322
|
+
return
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
currentInnerSubscription = subscription
|
|
326
|
+
awaitingInnerSubscription = false
|
|
327
|
+
let downstreamDemand = self.downstreamDemand
|
|
328
|
+
lock.unlock()
|
|
329
|
+
if downstreamDemand > 0 {
|
|
330
|
+
subscription.request(downstreamDemand)
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
private func receiveInner(_ input: NestedPublisher.Output,
|
|
335
|
+
_ index: UInt64) -> Subscribers.Demand {
|
|
336
|
+
lock.lock()
|
|
337
|
+
guard currentInnerIndex == index && !cancelled else {
|
|
338
|
+
lock.unlock()
|
|
339
|
+
return .none
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// This will crash if we don't have any demand yet.
|
|
343
|
+
// Combine crashes here too.
|
|
344
|
+
downstreamDemand -= 1
|
|
345
|
+
|
|
346
|
+
lock.unlock()
|
|
347
|
+
downstreamLock.lock()
|
|
348
|
+
let newDemand = downstream.receive(input)
|
|
349
|
+
downstreamLock.unlock()
|
|
350
|
+
if newDemand > 0 {
|
|
351
|
+
lock.lock()
|
|
352
|
+
downstreamDemand += newDemand
|
|
353
|
+
lock.unlock()
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
return newDemand
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
private func receiveInner(completion: Subscribers.Completion<Failure>,
|
|
360
|
+
_ index: UInt64) {
|
|
361
|
+
lock.lock()
|
|
362
|
+
guard currentInnerIndex == index && !cancelled else {
|
|
363
|
+
lock.unlock()
|
|
364
|
+
return
|
|
365
|
+
}
|
|
366
|
+
precondition(!awaitingInnerSubscription, "Unexpected completion")
|
|
367
|
+
currentInnerSubscription = nil
|
|
368
|
+
switch completion {
|
|
369
|
+
case .finished:
|
|
370
|
+
if sentCompletion || !finished {
|
|
371
|
+
lock.unlock()
|
|
372
|
+
return
|
|
373
|
+
}
|
|
374
|
+
sentCompletion = true
|
|
375
|
+
lock.unlock()
|
|
376
|
+
downstreamLock.lock()
|
|
377
|
+
downstream.receive(completion: completion)
|
|
378
|
+
downstreamLock.unlock()
|
|
379
|
+
case .failure:
|
|
380
|
+
if sentCompletion {
|
|
381
|
+
lock.unlock()
|
|
382
|
+
return
|
|
383
|
+
}
|
|
384
|
+
cancelled = true
|
|
385
|
+
let outerSubscription = self.outerSubscription.take()
|
|
386
|
+
sentCompletion = true
|
|
387
|
+
lock.unlock()
|
|
388
|
+
outerSubscription?.cancel()
|
|
389
|
+
downstreamLock.lock()
|
|
390
|
+
downstream.receive(completion: completion)
|
|
391
|
+
downstreamLock.unlock()
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
extension Publishers.SwitchToLatest.Outer {
|
|
398
|
+
private struct Side
|
|
399
|
+
: Subscriber,
|
|
400
|
+
CustomStringConvertible,
|
|
401
|
+
CustomReflectable,
|
|
402
|
+
CustomPlaygroundDisplayConvertible
|
|
403
|
+
{
|
|
404
|
+
typealias Input = NestedPublisher.Output
|
|
405
|
+
|
|
406
|
+
typealias Failure = NestedPublisher.Failure
|
|
407
|
+
|
|
408
|
+
typealias Outer =
|
|
409
|
+
Publishers.SwitchToLatest<NestedPublisher, Upstream>.Outer<Downstream>
|
|
410
|
+
|
|
411
|
+
private let index: UInt64
|
|
412
|
+
private let outer: Outer
|
|
413
|
+
|
|
414
|
+
let combineIdentifier = CombineIdentifier()
|
|
415
|
+
|
|
416
|
+
init(inner: Outer, index: UInt64) {
|
|
417
|
+
self.index = index
|
|
418
|
+
self.outer = inner
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
func receive(subscription: Subscription) {
|
|
422
|
+
outer.receiveInner(subscription: subscription, index)
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
426
|
+
return outer.receiveInner(input, index)
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
func receive(completion: Subscribers.Completion<Failure>) {
|
|
430
|
+
outer.receiveInner(completion: completion, index)
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
var description: String { return "SwitchToLatest" }
|
|
434
|
+
|
|
435
|
+
var customMirror: Mirror {
|
|
436
|
+
let children = CollectionOfOne<Mirror.Child>(
|
|
437
|
+
("parentSubscription", outer.combineIdentifier)
|
|
438
|
+
)
|
|
439
|
+
return Mirror(self, children: children)
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
var playgroundDescription: Any { return description }
|
|
443
|
+
}
|
|
444
|
+
}
|