@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.
- package/Package.swift +200 -9
- package/README.md +7 -9
- 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 +0 -4
- 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/{_FoundationCommon → FoundationBridge}/Bundle.swift +41 -4
- 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 +24 -72
- 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/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 +6 -1
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/{_FoundationCommon → FoundationBridge}/UserDefaults.swift +17 -4
- 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 +55 -6
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +1 -1
- package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
- package/Sources/SwiftUI/API/Animation.swift +37 -5
- package/Sources/SwiftUI/API/App.swift +31 -1
- 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 +104 -28
- 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 +59 -27
- package/Sources/SwiftUI/API/CustomLayout.swift +49 -10
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +1 -1
- package/Sources/SwiftUI/API/EditMode.swift +25 -82
- package/Sources/SwiftUI/API/Effects.swift +105 -7
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +93 -9
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +11 -3
- package/Sources/SwiftUI/API/Gauge.swift +3 -2
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +13 -2
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +1 -1
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +1 -1
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +13 -6
- package/Sources/SwiftUI/API/Layout.swift +67 -12
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +61 -6
- package/Sources/SwiftUI/API/Menu.swift +8 -1
- package/Sources/SwiftUI/API/Modifiers.swift +80 -10
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +24 -9
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +16 -2
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +48 -31
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +11 -2
- 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 +17 -4
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +164 -37
- package/Sources/SwiftUI/API/Publishers.swift +4 -4
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +3 -2
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +3 -3
- 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 +105 -7
- 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 +18 -1
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -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 +148 -4
- package/Sources/SwiftUI/API/Tasks.swift +2 -2
- 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/Toolbar.swift +52 -16
- 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 +10 -2
- package/Sources/SwiftUI/API/ViewModifier.swift +4 -1
- package/Sources/SwiftUI/API/VisualEffect.swift +74 -1
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +7 -1
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +17 -3
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Localization/Localization.swift +498 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +2 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +37 -1
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +76 -4
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +58 -12
- package/Sources/SwiftUI/Runtime/Reconciler.swift +10 -1
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +977 -198
- 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 +1 -1
- package/index.mjs +2 -2
- package/manifest.d.mts +2 -0
- package/manifest.mjs +39 -0
- package/package.json +5 -3
- package/sync-sources.mjs +21 -7
- package/Sources/FoundationLite/Common.swift +0 -3
- package/Sources/FoundationLite/FoundationLite.swift +0 -171
- package/Sources/FoundationLite/Interaction.swift +0 -146
- package/Sources/FoundationLite/Timer.swift +0 -48
- package/Sources/_FoundationCommon/_FoundationCommon.swift +0 -10
|
@@ -0,0 +1,720 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.Zip.swift
|
|
3
|
+
//
|
|
4
|
+
// Created by Eric Patey on 29.08.2019.
|
|
5
|
+
//
|
|
6
|
+
|
|
7
|
+
// swiftlint:disable large_tuple
|
|
8
|
+
|
|
9
|
+
#if canImport(COpenCombineHelpers)
|
|
10
|
+
import COpenCombineHelpers
|
|
11
|
+
#endif
|
|
12
|
+
|
|
13
|
+
extension Publishers {
|
|
14
|
+
|
|
15
|
+
/// A publisher created by applying the zip function to two upstream publishers.
|
|
16
|
+
public struct Zip<UpstreamA: Publisher, UpstreamB: Publisher>: Publisher
|
|
17
|
+
where UpstreamA.Failure == UpstreamB.Failure
|
|
18
|
+
{
|
|
19
|
+
|
|
20
|
+
/// The kind of values published by this publisher.
|
|
21
|
+
public typealias Output = (UpstreamA.Output, UpstreamB.Output)
|
|
22
|
+
|
|
23
|
+
/// The kind of errors this publisher might publish.
|
|
24
|
+
///
|
|
25
|
+
/// Use `Never` if this `Publisher` does not publish errors.
|
|
26
|
+
public typealias Failure = UpstreamA.Failure
|
|
27
|
+
|
|
28
|
+
public let a: UpstreamA
|
|
29
|
+
|
|
30
|
+
public let b: UpstreamB
|
|
31
|
+
|
|
32
|
+
public init(_ a: UpstreamA, _ b: UpstreamB) {
|
|
33
|
+
self.a = a
|
|
34
|
+
self.b = b
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/// This function is called to attach the specified `Subscriber` to this
|
|
38
|
+
/// `Publisher` by `subscribe(_:)`
|
|
39
|
+
///
|
|
40
|
+
/// - SeeAlso: `subscribe(_:)`
|
|
41
|
+
/// - Parameters:
|
|
42
|
+
/// - subscriber: The subscriber to attach to this `Publisher`.
|
|
43
|
+
/// once attached it can begin to receive values.
|
|
44
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream) where
|
|
45
|
+
UpstreamB.Failure == Downstream.Failure,
|
|
46
|
+
Downstream.Input == (UpstreamA.Output, UpstreamB.Output)
|
|
47
|
+
{
|
|
48
|
+
_ = Inner<Downstream>(downstream: subscriber, a, b)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/// A publisher created by applying the zip function to three upstream publishers.
|
|
53
|
+
public struct Zip3<UpstreamA: Publisher,
|
|
54
|
+
UpstreamB: Publisher,
|
|
55
|
+
UpstreamC: Publisher>
|
|
56
|
+
: Publisher
|
|
57
|
+
where UpstreamA.Failure == UpstreamB.Failure,
|
|
58
|
+
UpstreamB.Failure == UpstreamC.Failure
|
|
59
|
+
{
|
|
60
|
+
/// The kind of values published by this publisher.
|
|
61
|
+
public typealias Output = (UpstreamA.Output, UpstreamB.Output, UpstreamC.Output)
|
|
62
|
+
|
|
63
|
+
/// The kind of errors this publisher might publish.
|
|
64
|
+
///
|
|
65
|
+
/// Use `Never` if this `Publisher` does not publish errors.
|
|
66
|
+
public typealias Failure = UpstreamA.Failure
|
|
67
|
+
|
|
68
|
+
public let a: UpstreamA
|
|
69
|
+
|
|
70
|
+
public let b: UpstreamB
|
|
71
|
+
|
|
72
|
+
public let c: UpstreamC
|
|
73
|
+
|
|
74
|
+
public init(_ a: UpstreamA, _ b: UpstreamB, _ c: UpstreamC) {
|
|
75
|
+
self.a = a
|
|
76
|
+
self.b = b
|
|
77
|
+
self.c = c
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/// This function is called to attach the specified `Subscriber` to this
|
|
81
|
+
/// `Publisher` by `subscribe(_:)`
|
|
82
|
+
///
|
|
83
|
+
/// - SeeAlso: `subscribe(_:)`
|
|
84
|
+
/// - Parameters:
|
|
85
|
+
/// - subscriber: The subscriber to attach to this `Publisher`.
|
|
86
|
+
/// once attached it can begin to receive values.
|
|
87
|
+
public func receive<Downstream>(subscriber: Downstream)
|
|
88
|
+
where Downstream: Subscriber,
|
|
89
|
+
UpstreamC.Failure == Downstream.Failure,
|
|
90
|
+
Downstream.Input == (UpstreamA.Output, UpstreamB.Output, UpstreamC.Output)
|
|
91
|
+
{
|
|
92
|
+
_ = Inner<Downstream>(downstream: subscriber, a, b, c)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/// A publisher created by applying the zip function to four upstream publishers.
|
|
97
|
+
public struct Zip4<
|
|
98
|
+
UpstreamA: Publisher,
|
|
99
|
+
UpstreamB: Publisher,
|
|
100
|
+
UpstreamC: Publisher,
|
|
101
|
+
UpstreamD: Publisher
|
|
102
|
+
>: Publisher where
|
|
103
|
+
UpstreamA.Failure == UpstreamB.Failure,
|
|
104
|
+
UpstreamB.Failure == UpstreamC.Failure,
|
|
105
|
+
UpstreamC.Failure == UpstreamD.Failure
|
|
106
|
+
{
|
|
107
|
+
|
|
108
|
+
/// The kind of values published by this publisher.
|
|
109
|
+
public typealias Output = (
|
|
110
|
+
UpstreamA.Output,
|
|
111
|
+
UpstreamB.Output,
|
|
112
|
+
UpstreamC.Output,
|
|
113
|
+
UpstreamD.Output)
|
|
114
|
+
|
|
115
|
+
/// The kind of errors this publisher might publish.
|
|
116
|
+
///
|
|
117
|
+
/// Use `Never` if this `Publisher` does not publish errors.
|
|
118
|
+
public typealias Failure = UpstreamA.Failure
|
|
119
|
+
|
|
120
|
+
public let a: UpstreamA
|
|
121
|
+
|
|
122
|
+
public let b: UpstreamB
|
|
123
|
+
|
|
124
|
+
public let c: UpstreamC
|
|
125
|
+
|
|
126
|
+
public let d: UpstreamD
|
|
127
|
+
|
|
128
|
+
public init(_ a: UpstreamA, _ b: UpstreamB, _ c: UpstreamC, _ d: UpstreamD) {
|
|
129
|
+
self.a = a
|
|
130
|
+
self.b = b
|
|
131
|
+
self.c = c
|
|
132
|
+
self.d = d
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/// This function is called to attach the specified `Subscriber` to this
|
|
136
|
+
/// `Publisher` by `subscribe(_:)`
|
|
137
|
+
///
|
|
138
|
+
/// - SeeAlso: `subscribe(_:)`
|
|
139
|
+
/// - Parameters:
|
|
140
|
+
/// - subscriber: The subscriber to attach to this `Publisher`.
|
|
141
|
+
/// once attached it can begin to receive values.
|
|
142
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
143
|
+
where UpstreamD.Failure == Downstream.Failure,
|
|
144
|
+
Downstream.Input == (
|
|
145
|
+
UpstreamA.Output,
|
|
146
|
+
UpstreamB.Output,
|
|
147
|
+
UpstreamC.Output,
|
|
148
|
+
UpstreamD.Output)
|
|
149
|
+
{
|
|
150
|
+
_ = Inner<Downstream>(downstream: subscriber, a, b, c, d)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
extension Publisher {
|
|
156
|
+
|
|
157
|
+
/// Combine elements from another publisher and deliver pairs of elements as tuples.
|
|
158
|
+
///
|
|
159
|
+
/// The returned publisher waits until both publishers have emitted an event, then
|
|
160
|
+
/// delivers the oldest unconsumed event from each publisher together as a tuple to
|
|
161
|
+
/// the subscriber.
|
|
162
|
+
/// For example, if publisher `P1` emits elements `a` and `b`, and publisher `P2`
|
|
163
|
+
/// emits event `c`, the zip publisher emits the tuple `(a, c)`. It won’t emit a
|
|
164
|
+
/// tuple with event `b` until `P2` emits another event.
|
|
165
|
+
/// If either upstream publisher finishes successfuly or fails with an error, the
|
|
166
|
+
/// zipped publisher does the same.
|
|
167
|
+
///
|
|
168
|
+
/// - Parameter other: Another publisher.
|
|
169
|
+
/// - Returns: A publisher that emits pairs of elements from the upstream publishers
|
|
170
|
+
/// as tuples.
|
|
171
|
+
public func zip<Other>(_ other: Other) -> Publishers.Zip<Self, Other>
|
|
172
|
+
where Other: Publisher, Self.Failure == Other.Failure
|
|
173
|
+
{
|
|
174
|
+
return Publishers.Zip(self, other)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/// Combine elements from another publisher and deliver a transformed output.
|
|
178
|
+
///
|
|
179
|
+
/// The returned publisher waits until both publishers have emitted an event, then
|
|
180
|
+
/// delivers the oldest unconsumed event from each publisher together as a tuple to
|
|
181
|
+
/// the subscriber.
|
|
182
|
+
/// For example, if publisher `P1` emits elements `a` and `b`, and publisher `P2`
|
|
183
|
+
/// emits event `c`, the zip publisher emits the tuple `(a, c)`. It won’t emit a tuple
|
|
184
|
+
/// with event `b` until `P2` emits another event.
|
|
185
|
+
/// If either upstream publisher finishes successfuly or fails with an error, the
|
|
186
|
+
/// zipped publisher does the same.
|
|
187
|
+
///
|
|
188
|
+
/// - Parameter other: Another publisher.
|
|
189
|
+
/// - transform: A closure that receives the most recent value from each publisher
|
|
190
|
+
/// and returns a new value to publish.
|
|
191
|
+
/// - Returns: A publisher that emits pairs of elements from the upstream publishers
|
|
192
|
+
/// as tuples.
|
|
193
|
+
public func zip<Other, Result>(
|
|
194
|
+
_ other: Other,
|
|
195
|
+
_ transform: @escaping (Self.Output, Other.Output) -> Result)
|
|
196
|
+
-> Publishers.Map<Publishers.Zip<Self, Other>, Result>
|
|
197
|
+
where Other: Publisher, Self.Failure == Other.Failure
|
|
198
|
+
{
|
|
199
|
+
return Publishers.Map(upstream: Publishers.Zip(self, other), transform: transform)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/// Combine elements from two other publishers and deliver groups of elements as
|
|
203
|
+
/// tuples.
|
|
204
|
+
///
|
|
205
|
+
/// The returned publisher waits until all three publishers have emitted an event,
|
|
206
|
+
/// then delivers the oldest unconsumed event from each publisher as a tuple to the
|
|
207
|
+
/// subscriber.
|
|
208
|
+
/// For example, if publisher `P1` emits elements `a` and `b`, and publisher `P2`
|
|
209
|
+
/// emits elements `c` and `d`, and publisher `P3` emits the event `e`, the zip
|
|
210
|
+
/// publisher emits the tuple `(a, c, e)`. It won’t emit a tuple with elements `b` or
|
|
211
|
+
/// `d` until `P3` emits another event.
|
|
212
|
+
/// If any upstream publisher finishes successfuly or fails with an error, the zipped
|
|
213
|
+
/// publisher does the same.
|
|
214
|
+
///
|
|
215
|
+
/// - Parameters:
|
|
216
|
+
/// - publisher1: A second publisher.
|
|
217
|
+
/// - publisher2: A third publisher.
|
|
218
|
+
/// - Returns: A publisher that emits groups of elements from the upstream publishers
|
|
219
|
+
/// as tuples.
|
|
220
|
+
public func zip<Other1, Other2>(_ publisher1: Other1, _ publisher2: Other2)
|
|
221
|
+
-> Publishers.Zip3<Self, Other1, Other2>
|
|
222
|
+
where Other1: Publisher,
|
|
223
|
+
Other2: Publisher,
|
|
224
|
+
Self.Failure == Other1.Failure,
|
|
225
|
+
Other1.Failure == Other2.Failure
|
|
226
|
+
{
|
|
227
|
+
return Publishers.Zip3(self, publisher1, publisher2)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/// Combine elements from two other publishers and deliver a transformed output.
|
|
231
|
+
///
|
|
232
|
+
/// The returned publisher waits until all three publishers have emitted an event,
|
|
233
|
+
/// then delivers the oldest unconsumed event from each publisher as a tuple to the
|
|
234
|
+
/// subscriber.
|
|
235
|
+
/// For example, if publisher `P1` emits elements `a` and `b`, and publisher `P2`
|
|
236
|
+
/// emits elements `c` and `d`, and publisher `P3` emits the event `e`, the zip
|
|
237
|
+
/// publisher emits the tuple `(a, c, e)`. It won’t emit a tuple with elements `b` or
|
|
238
|
+
/// `d` until `P3` emits another event.
|
|
239
|
+
/// If any upstream publisher finishes successfuly or fails with an error, the zipped
|
|
240
|
+
/// publisher does the same.
|
|
241
|
+
///
|
|
242
|
+
/// - Parameters:
|
|
243
|
+
/// - publisher1: A second publisher.
|
|
244
|
+
/// - publisher2: A third publisher.
|
|
245
|
+
/// - transform: A closure that receives the most recent value from each publisher
|
|
246
|
+
/// and returns a new value to publish.
|
|
247
|
+
/// - Returns: A publisher that emits groups of elements from the upstream publishers
|
|
248
|
+
/// as tuples.
|
|
249
|
+
public func zip<Other1, Other2, Result>(
|
|
250
|
+
_ publisher1: Other1,
|
|
251
|
+
_ publisher2: Other2,
|
|
252
|
+
_ transform: @escaping (Self.Output, Other1.Output, Other2.Output) -> Result)
|
|
253
|
+
-> Publishers.Map<Publishers.Zip3<Self, Other1, Other2>, Result>
|
|
254
|
+
where Other1: Publisher,
|
|
255
|
+
Other2: Publisher,
|
|
256
|
+
Self.Failure == Other1.Failure,
|
|
257
|
+
Other1.Failure == Other2.Failure
|
|
258
|
+
{
|
|
259
|
+
return Publishers.Map(upstream: Publishers.Zip3(self, publisher1, publisher2),
|
|
260
|
+
transform: transform)
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/// Combine elements from three other publishers and deliver groups of elements as
|
|
264
|
+
/// tuples.
|
|
265
|
+
///
|
|
266
|
+
/// The returned publisher waits until all four publishers have emitted an event, then
|
|
267
|
+
/// delivers the oldest unconsumed event from each publisher as a tuple to the
|
|
268
|
+
/// subscriber.
|
|
269
|
+
/// For example, if publisher `P1` emits elements `a` and `b`, and publisher `P2`
|
|
270
|
+
/// emits elements `c` and `d`, and publisher `P3` emits the elements `e` and `f`, and
|
|
271
|
+
/// publisher `P4` emits the event `g`, the zip publisher emits the tuple
|
|
272
|
+
/// `(a, c, e, g)`. It won’t emit a tuple with elements `b`, `d`, or `f` until `P4`
|
|
273
|
+
/// emits another event.
|
|
274
|
+
/// If any upstream publisher finishes successfuly or fails with an error, the zipped
|
|
275
|
+
/// publisher does the same.
|
|
276
|
+
///
|
|
277
|
+
/// - Parameters:
|
|
278
|
+
/// - publisher1: A second publisher.
|
|
279
|
+
/// - publisher2: A third publisher.
|
|
280
|
+
/// - publisher3: A fourth publisher.
|
|
281
|
+
/// - Returns: A publisher that emits groups of elements from the upstream publishers
|
|
282
|
+
/// as tuples.
|
|
283
|
+
public func zip<Other1, Other2, Other3>(_ publisher1: Other1,
|
|
284
|
+
_ publisher2: Other2,
|
|
285
|
+
_ publisher3: Other3)
|
|
286
|
+
-> Publishers.Zip4<Self, Other1, Other2, Other3>
|
|
287
|
+
where Other1: Publisher,
|
|
288
|
+
Other2: Publisher,
|
|
289
|
+
Other3: Publisher,
|
|
290
|
+
Self.Failure == Other1.Failure,
|
|
291
|
+
Other1.Failure == Other2.Failure,
|
|
292
|
+
Other2.Failure == Other3.Failure
|
|
293
|
+
{
|
|
294
|
+
return Publishers.Zip4(self, publisher1, publisher2, publisher3)
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/// Combine elements from three other publishers and deliver a transformed output.
|
|
298
|
+
///
|
|
299
|
+
/// The returned publisher waits until all four publishers have emitted an event, then
|
|
300
|
+
/// delivers the oldest unconsumed event from each publisher as a tuple to the
|
|
301
|
+
/// subscriber.
|
|
302
|
+
/// For example, if publisher `P1` emits elements `a` and `b`, and publisher `P2`
|
|
303
|
+
/// emits elements `c` and `d`, and publisher `P3` emits the elements `e` and `f`, and
|
|
304
|
+
/// publisher `P4` emits the event `g`, the zip publisher emits the tuple
|
|
305
|
+
/// `(a, c, e, g)`. It won’t emit a tuple with elements `b`, `d`, or `f` until `P4`
|
|
306
|
+
/// emits another event.
|
|
307
|
+
/// If any upstream publisher finishes successfuly or fails with an error, the zipped
|
|
308
|
+
/// publisher does the same.
|
|
309
|
+
///
|
|
310
|
+
/// - Parameters:
|
|
311
|
+
/// - publisher1: A second publisher.
|
|
312
|
+
/// - publisher2: A third publisher.
|
|
313
|
+
/// - publisher3: A fourth publisher.
|
|
314
|
+
/// - transform: A closure that receives the most recent value from each publisher
|
|
315
|
+
/// and returns a new value to publish.
|
|
316
|
+
/// - Returns: A publisher that emits groups of elements from the upstream publishers
|
|
317
|
+
/// as tuples.
|
|
318
|
+
public func zip<Other1, Other2, Other3, Result>(
|
|
319
|
+
_ publisher1: Other1,
|
|
320
|
+
_ publisher2: Other2,
|
|
321
|
+
_ publisher3: Other3,
|
|
322
|
+
_ transform: @escaping (Self.Output, Other1.Output, Other2.Output, Other3.Output)
|
|
323
|
+
-> Result)
|
|
324
|
+
-> Publishers.Map<Publishers.Zip4<Self, Other1, Other2, Other3>, Result>
|
|
325
|
+
where Other1: Publisher,
|
|
326
|
+
Other2: Publisher,
|
|
327
|
+
Other3: Publisher,
|
|
328
|
+
Self.Failure == Other1.Failure,
|
|
329
|
+
Other1.Failure == Other2.Failure,
|
|
330
|
+
Other2.Failure == Other3.Failure
|
|
331
|
+
{
|
|
332
|
+
return Publishers.Map(upstream: Publishers.Zip4(self,
|
|
333
|
+
publisher1,
|
|
334
|
+
publisher2,
|
|
335
|
+
publisher3),
|
|
336
|
+
transform: transform)
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
extension Publishers.Zip {
|
|
341
|
+
private class Inner<Downstream: Subscriber>: InnerBase<Downstream>
|
|
342
|
+
where Downstream.Failure == Failure,
|
|
343
|
+
Downstream.Input == (UpstreamA.Output, UpstreamB.Output)
|
|
344
|
+
{
|
|
345
|
+
private lazy var aSubscriber = ChildSubscriber<UpstreamA, Downstream>(self, 0)
|
|
346
|
+
private lazy var bSubscriber = ChildSubscriber<UpstreamB, Downstream>(self, 1)
|
|
347
|
+
|
|
348
|
+
init(downstream: Downstream, _ a: UpstreamA, _ b: UpstreamB) {
|
|
349
|
+
super.init(downstream: downstream)
|
|
350
|
+
|
|
351
|
+
a.subscribe(aSubscriber)
|
|
352
|
+
b.subscribe(bSubscriber)
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
override fileprivate var upstreamSubscriptions: [ChildSubscription] {
|
|
356
|
+
return [aSubscriber, bSubscriber]
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
override fileprivate func dequeueValue() -> Downstream.Input {
|
|
360
|
+
return (aSubscriber.dequeueValue(), bSubscriber.dequeueValue())
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
extension Publishers.Zip3 {
|
|
366
|
+
private class Inner<Downstream: Subscriber>: InnerBase<Downstream>
|
|
367
|
+
where Downstream.Failure == Failure,
|
|
368
|
+
Downstream.Input == (UpstreamA.Output, UpstreamB.Output, UpstreamC.Output)
|
|
369
|
+
{
|
|
370
|
+
private lazy var aSubscriber = ChildSubscriber<UpstreamA, Downstream>(self, 0)
|
|
371
|
+
private lazy var bSubscriber = ChildSubscriber<UpstreamB, Downstream>(self, 1)
|
|
372
|
+
private lazy var cSubscriber = ChildSubscriber<UpstreamC, Downstream>(self, 2)
|
|
373
|
+
|
|
374
|
+
init(downstream: Downstream, _ a: UpstreamA, _ b: UpstreamB, _ c: UpstreamC) {
|
|
375
|
+
super.init(downstream: downstream)
|
|
376
|
+
|
|
377
|
+
a.subscribe(aSubscriber)
|
|
378
|
+
b.subscribe(bSubscriber)
|
|
379
|
+
c.subscribe(cSubscriber)
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
override fileprivate var upstreamSubscriptions: [ChildSubscription] {
|
|
383
|
+
return [aSubscriber, bSubscriber, cSubscriber]
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
override fileprivate func dequeueValue() -> Downstream.Input {
|
|
387
|
+
return (aSubscriber.dequeueValue(),
|
|
388
|
+
bSubscriber.dequeueValue(),
|
|
389
|
+
cSubscriber.dequeueValue())
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
extension Publishers.Zip4 {
|
|
395
|
+
private class Inner<Downstream: Subscriber>: InnerBase<Downstream>
|
|
396
|
+
where Downstream.Failure == Failure,
|
|
397
|
+
Downstream.Input == (
|
|
398
|
+
UpstreamA.Output,
|
|
399
|
+
UpstreamB.Output,
|
|
400
|
+
UpstreamC.Output,
|
|
401
|
+
UpstreamD.Output)
|
|
402
|
+
{
|
|
403
|
+
private lazy var aSubscriber = ChildSubscriber<UpstreamA, Downstream>(self, 0)
|
|
404
|
+
private lazy var bSubscriber = ChildSubscriber<UpstreamB, Downstream>(self, 1)
|
|
405
|
+
private lazy var cSubscriber = ChildSubscriber<UpstreamC, Downstream>(self, 2)
|
|
406
|
+
private lazy var dSubscriber = ChildSubscriber<UpstreamD, Downstream>(self, 3)
|
|
407
|
+
|
|
408
|
+
init(downstream: Downstream,
|
|
409
|
+
_ a: UpstreamA,
|
|
410
|
+
_ b: UpstreamB,
|
|
411
|
+
_ c: UpstreamC,
|
|
412
|
+
_ d: UpstreamD)
|
|
413
|
+
{
|
|
414
|
+
super.init(downstream: downstream)
|
|
415
|
+
|
|
416
|
+
a.subscribe(aSubscriber)
|
|
417
|
+
b.subscribe(bSubscriber)
|
|
418
|
+
c.subscribe(cSubscriber)
|
|
419
|
+
d.subscribe(dSubscriber)
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
override fileprivate var upstreamSubscriptions: [ChildSubscription] {
|
|
423
|
+
return [aSubscriber, bSubscriber, cSubscriber, dSubscriber]
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
override fileprivate func dequeueValue() -> Downstream.Input {
|
|
427
|
+
return (aSubscriber.dequeueValue(),
|
|
428
|
+
bSubscriber.dequeueValue(),
|
|
429
|
+
cSubscriber.dequeueValue(),
|
|
430
|
+
dSubscriber.dequeueValue())
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
private class InnerBase<Downstream: Subscriber>: CustomStringConvertible {
|
|
436
|
+
let description = "Zip"
|
|
437
|
+
|
|
438
|
+
private let lock = UnfairRecursiveLock.allocate()
|
|
439
|
+
|
|
440
|
+
private let downstream: Downstream
|
|
441
|
+
private var downstreamDemand = Subscribers.Demand.none
|
|
442
|
+
private var valueIsBeingProcessed = false
|
|
443
|
+
private var value: Downstream.Input?
|
|
444
|
+
private var isFinished = false
|
|
445
|
+
|
|
446
|
+
// The following two pieces of state are a hacky implementation of subtle Apple
|
|
447
|
+
// concurrency behaviors. Specifically, when Zip is processing an upstream child value
|
|
448
|
+
// and sending a resulting value downstream, multiple behaviors are changed.
|
|
449
|
+
// 1. If a downstream demand request comes in during this period, the demand request
|
|
450
|
+
// for that specific triggering upstream child will be communiated via the result
|
|
451
|
+
// of `.receive(_ input:)` INSTEAD of a later `.request(_ demand:)` call.
|
|
452
|
+
// (AppleRef: 001)
|
|
453
|
+
// 2. If an upstream `.finished` comes in during this time period, the "finished
|
|
454
|
+
// asssessment check" (AppleRef: 002) is skipped.
|
|
455
|
+
// If an upstream value is being processed when a downstream demand request comes in,
|
|
456
|
+
// the demand for that specfic upstream child will be communiated via the result
|
|
457
|
+
// of `.receive(_ input:)` INSTEAD of a later `.request(_ demand:)` call.
|
|
458
|
+
private final var processingValueForChild: ChildSubscription?
|
|
459
|
+
private final var demandReceivedWhileProcessing: Subscribers.Demand?
|
|
460
|
+
|
|
461
|
+
init(downstream: Downstream) {
|
|
462
|
+
self.downstream = downstream
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
deinit {
|
|
466
|
+
lock.deallocate()
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
fileprivate var upstreamSubscriptions: [ChildSubscription] {
|
|
470
|
+
abstractMethod()
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
fileprivate func dequeueValue() -> Downstream.Input {
|
|
474
|
+
abstractMethod()
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
fileprivate final func receivedSubscription(for child: ChildSubscription) {
|
|
478
|
+
lock.lock()
|
|
479
|
+
child.state = .active
|
|
480
|
+
let sendSubscriptionDownstream = upstreamSubscriptions
|
|
481
|
+
.filter { $0.state == .waitingForSubscription }
|
|
482
|
+
.isEmpty
|
|
483
|
+
lock.unlock()
|
|
484
|
+
|
|
485
|
+
if sendSubscriptionDownstream {
|
|
486
|
+
self.sendSubscriptionDownstream()
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
fileprivate final func receivedChildValue(
|
|
491
|
+
child: ChildSubscription,
|
|
492
|
+
_ lockedStoreValue: () -> Void
|
|
493
|
+
) -> Subscribers.Demand {
|
|
494
|
+
lock.lock()
|
|
495
|
+
lockedStoreValue()
|
|
496
|
+
defer {
|
|
497
|
+
checkShouldFinish()
|
|
498
|
+
lock.unlock()
|
|
499
|
+
}
|
|
500
|
+
if let dequeuedValue = maybeDequeueValue() {
|
|
501
|
+
value = dequeuedValue
|
|
502
|
+
assert(processingValueForChild == nil)
|
|
503
|
+
processingValueForChild = child
|
|
504
|
+
valueIsBeingProcessed = true
|
|
505
|
+
return processValue() ?? .none
|
|
506
|
+
} else {
|
|
507
|
+
return .none
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
fileprivate final func receivedCompletion(
|
|
512
|
+
_ completion: Subscribers.Completion<Downstream.Failure>,
|
|
513
|
+
forChild child: ChildSubscription)
|
|
514
|
+
{
|
|
515
|
+
switch completion {
|
|
516
|
+
case .failure:
|
|
517
|
+
downstream.receive(completion: completion)
|
|
518
|
+
lock.lock()
|
|
519
|
+
child.state = .failed
|
|
520
|
+
let subscriptionsToCancel = upstreamSubscriptions
|
|
521
|
+
lock.unlock()
|
|
522
|
+
subscriptionsToCancel.forEach { $0.cancel() }
|
|
523
|
+
case .finished:
|
|
524
|
+
lock.lock()
|
|
525
|
+
child.state = .finished
|
|
526
|
+
if !valueIsBeingProcessed {
|
|
527
|
+
valueIsBeingProcessed = true
|
|
528
|
+
if processingValueForChild == nil &&
|
|
529
|
+
!areMoreValuesPossible &&
|
|
530
|
+
!isFinished {
|
|
531
|
+
sendFinishDownstream()
|
|
532
|
+
} else {
|
|
533
|
+
processValue()
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
lock.unlock()
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
private func checkShouldFinish() {
|
|
541
|
+
if processingValueForChild == nil && upstreamSubscriptions.shouldFinish() {
|
|
542
|
+
sendFinishDownstream()
|
|
543
|
+
isFinished = true
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
private func maybeDequeueValue() -> Downstream.Input? {
|
|
548
|
+
return hasCompleteValueAvailable ? dequeueValue() : nil
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
private func sendSubscriptionDownstream() {
|
|
552
|
+
downstream.receive(subscription: self)
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
private var hasCompleteValueAvailable: Bool {
|
|
556
|
+
return upstreamSubscriptions.allSatisfy { $0.hasValue }
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
private var areMoreValuesPossible: Bool {
|
|
560
|
+
// More values are possible if all children are (active || have surplus)
|
|
561
|
+
return upstreamSubscriptions
|
|
562
|
+
.allSatisfy { $0.state == .active || $0.hasValue }
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
@discardableResult
|
|
566
|
+
private func processValue() -> Subscribers.Demand? {
|
|
567
|
+
assert(valueIsBeingProcessed)
|
|
568
|
+
|
|
569
|
+
lock.lock()
|
|
570
|
+
defer {
|
|
571
|
+
valueIsBeingProcessed = false
|
|
572
|
+
processingValueForChild = nil
|
|
573
|
+
demandReceivedWhileProcessing = nil
|
|
574
|
+
lock.unlock()
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
if let value = self.value {
|
|
578
|
+
if downstreamDemand != .none {
|
|
579
|
+
downstreamDemand -= 1
|
|
580
|
+
}
|
|
581
|
+
let newDemand = downstream.receive(value)
|
|
582
|
+
if newDemand != .none {
|
|
583
|
+
downstreamDemand += newDemand
|
|
584
|
+
demandReceivedWhileProcessing = newDemand
|
|
585
|
+
}
|
|
586
|
+
self.value = nil
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
return demandReceivedWhileProcessing
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
private func sendRequestUpstream(demand: Subscribers.Demand) {
|
|
593
|
+
lock.lock()
|
|
594
|
+
let subscriptionsToRequest = upstreamSubscriptions
|
|
595
|
+
.filter { $0.childIndex != processingValueForChild?.childIndex }
|
|
596
|
+
lock.unlock()
|
|
597
|
+
subscriptionsToRequest.forEach { $0.request(demand) }
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
private func sendFinishDownstream() {
|
|
601
|
+
downstream.receive(completion: .finished)
|
|
602
|
+
lock.lock()
|
|
603
|
+
let activeChildren = upstreamSubscriptions.filter { $0.state == .active }
|
|
604
|
+
lock.unlock()
|
|
605
|
+
activeChildren.forEach { $0.cancel() }
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
extension InnerBase: Subscription {
|
|
610
|
+
fileprivate final func request(_ demand: Subscribers.Demand) {
|
|
611
|
+
guard demand != .none else {
|
|
612
|
+
fatalError()
|
|
613
|
+
}
|
|
614
|
+
lock.lock()
|
|
615
|
+
downstreamDemand += demand
|
|
616
|
+
sendRequestUpstream(demand: demand)
|
|
617
|
+
if valueIsBeingProcessed {
|
|
618
|
+
demandReceivedWhileProcessing = demand
|
|
619
|
+
} else {
|
|
620
|
+
valueIsBeingProcessed = true
|
|
621
|
+
processValue()
|
|
622
|
+
}
|
|
623
|
+
lock.unlock()
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
fileprivate final func cancel() {
|
|
627
|
+
lock.lock()
|
|
628
|
+
let subscriptionsToCancel = upstreamSubscriptions
|
|
629
|
+
lock.unlock()
|
|
630
|
+
subscriptionsToCancel.forEach { $0.cancel() }
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
extension Array where Element == ChildSubscription {
|
|
635
|
+
func shouldFinish() -> Bool {
|
|
636
|
+
for subscription in self
|
|
637
|
+
where subscription.state == .finished && !subscription.hasValue{
|
|
638
|
+
return true
|
|
639
|
+
}
|
|
640
|
+
return false
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
private enum ChildState {
|
|
645
|
+
case waitingForSubscription
|
|
646
|
+
case active
|
|
647
|
+
case finished
|
|
648
|
+
case failed
|
|
649
|
+
case canceled
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
// Note that it's critical that this protocol not have any associated types - specifically
|
|
653
|
+
// note that it does not refer to `Upstream`.
|
|
654
|
+
// This allows `InnerBase` to do most of the heavy lifting without regard to the
|
|
655
|
+
// upstream publisher's value type.
|
|
656
|
+
private protocol ChildSubscription: AnyObject, Subscription {
|
|
657
|
+
var state: ChildState { get set }
|
|
658
|
+
var childIndex: Int { get }
|
|
659
|
+
var hasValue: Bool { get }
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
private final class ChildSubscriber<Upstream: Publisher, Downstream: Subscriber>
|
|
663
|
+
where Upstream.Failure == Downstream.Failure
|
|
664
|
+
{
|
|
665
|
+
typealias Input = Upstream.Output
|
|
666
|
+
typealias Failure = Upstream.Failure
|
|
667
|
+
|
|
668
|
+
fileprivate final var state: ChildState = .waitingForSubscription
|
|
669
|
+
fileprivate final var upstreamSubscription: Subscription?
|
|
670
|
+
private var values = [Upstream.Output]()
|
|
671
|
+
private unowned let parent: InnerBase<Downstream>
|
|
672
|
+
fileprivate let childIndex: Int
|
|
673
|
+
|
|
674
|
+
init(_ parent: InnerBase<Downstream>, _ childIndex: Int) {
|
|
675
|
+
self.parent = parent
|
|
676
|
+
self.childIndex = childIndex
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
fileprivate final func dequeueValue() -> Upstream.Output {
|
|
680
|
+
return values.remove(at: 0)
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
extension ChildSubscriber: ChildSubscription {
|
|
685
|
+
fileprivate final var hasValue: Bool {
|
|
686
|
+
return !values.isEmpty
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
extension ChildSubscriber: Subscription {
|
|
691
|
+
fileprivate final func request(_ demand: Subscribers.Demand) {
|
|
692
|
+
upstreamSubscription?.request(demand)
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
extension ChildSubscriber: Cancellable {
|
|
697
|
+
fileprivate final func cancel() {
|
|
698
|
+
upstreamSubscription?.cancel()
|
|
699
|
+
upstreamSubscription = nil
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
extension ChildSubscriber: Subscriber {
|
|
704
|
+
fileprivate final func receive(subscription: Subscription) {
|
|
705
|
+
if upstreamSubscription == nil {
|
|
706
|
+
upstreamSubscription = subscription
|
|
707
|
+
parent.receivedSubscription(for: self)
|
|
708
|
+
} else {
|
|
709
|
+
subscription.cancel()
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
fileprivate final func receive(_ input: Input) -> Subscribers.Demand {
|
|
714
|
+
return parent.receivedChildValue(child: self) { values.append(input) }
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
fileprivate final func receive(completion: Subscribers.Completion<Failure>) {
|
|
718
|
+
parent.receivedCompletion(completion, forChild: self)
|
|
719
|
+
}
|
|
720
|
+
}
|