@swiftbrowser/swift 0.1.0 → 0.3.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 +68 -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 +125 -10
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +100 -9
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +11 -3
- package/Sources/SwiftUI/API/Gauge.swift +26 -10
- 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 +71 -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 +88 -12
- 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 +14 -4
- 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 +168 -39
- 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 +86 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +187 -8
- 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 +46 -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 +524 -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 +41 -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,533 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.FlatMap.swift
|
|
3
|
+
//
|
|
4
|
+
// Created by Eric Patey on 16.08.2019.
|
|
5
|
+
//
|
|
6
|
+
|
|
7
|
+
extension Publisher {
|
|
8
|
+
|
|
9
|
+
/// Transforms all elements from an upstream publisher into a new publisher up to
|
|
10
|
+
/// a maximum number of publishers you specify.
|
|
11
|
+
///
|
|
12
|
+
/// OpenCombine‘s `flatMap(maxPublishers:_:)` operator performs a similar function
|
|
13
|
+
/// to the `flatMap(_:)` operator in the Swift standard library, but turns
|
|
14
|
+
/// the elements from one kind of publisher into a new publisher that is sent
|
|
15
|
+
/// to subscribers. Use `flatMap(maxPublishers:_:)` when you want to create a new
|
|
16
|
+
/// series of events for downstream subscribers based on the received value.
|
|
17
|
+
/// The closure creates the new `Publisher` based on the received value.
|
|
18
|
+
/// The new `Publisher` can emit more than one event, and successful completion of
|
|
19
|
+
/// the new `Publisher` does not complete the overall stream.
|
|
20
|
+
/// Failure of the new `Publisher` will fail the overall stream.
|
|
21
|
+
///
|
|
22
|
+
/// In the example below, a `PassthroughSubject` publishes `WeatherStation` elements.
|
|
23
|
+
/// The `flatMap(maxPublishers:_:)` receives each element, creates a `URL` from it,
|
|
24
|
+
/// and produces a new `URLSession.DataTaskPublisher`, which will publish the data
|
|
25
|
+
/// loaded from that `URL`.
|
|
26
|
+
///
|
|
27
|
+
/// public struct WeatherStation {
|
|
28
|
+
/// public let stationID: String
|
|
29
|
+
/// }
|
|
30
|
+
///
|
|
31
|
+
/// var weatherPublisher = PassthroughSubject<WeatherStation, URLError>()
|
|
32
|
+
///
|
|
33
|
+
/// cancellable = weatherPublisher
|
|
34
|
+
/// .flatMap { station -> URLSession.DataTaskPublisher in
|
|
35
|
+
/// let url = URL(string: """
|
|
36
|
+
/// https://weatherapi.example.com/stations/\(station.stationID)\
|
|
37
|
+
/// /observations/latest
|
|
38
|
+
/// """)!
|
|
39
|
+
/// return URLSession.shared.dataTaskPublisher(for: url)
|
|
40
|
+
/// }
|
|
41
|
+
/// .sink(
|
|
42
|
+
/// receiveCompletion: { completion in
|
|
43
|
+
/// // Handle publisher completion (normal or error).
|
|
44
|
+
/// },
|
|
45
|
+
/// receiveValue: {
|
|
46
|
+
/// // Process the received data.
|
|
47
|
+
/// }
|
|
48
|
+
/// )
|
|
49
|
+
///
|
|
50
|
+
/// weatherPublisher.send(WeatherStation(stationID: "KSFO")) // San Francisco, CA
|
|
51
|
+
/// weatherPublisher.send(WeatherStation(stationID: "EGLC")) // London, UK
|
|
52
|
+
/// weatherPublisher.send(WeatherStation(stationID: "ZBBB")) // Beijing, CN
|
|
53
|
+
///
|
|
54
|
+
/// - Parameters:
|
|
55
|
+
/// - maxPublishers: Specifies the maximum number of concurrent publisher
|
|
56
|
+
/// subscriptions, or `Subscribers.Demand.unlimited` if unspecified.
|
|
57
|
+
/// - transform: A closure that takes an element as a parameter and returns
|
|
58
|
+
/// a publisher that produces elements of that type.
|
|
59
|
+
/// - Returns: A publisher that transforms elements from an upstream publisher into
|
|
60
|
+
/// a publisher of that element’s type.
|
|
61
|
+
public func flatMap<Result, Child: Publisher>(
|
|
62
|
+
maxPublishers: Subscribers.Demand = .unlimited,
|
|
63
|
+
_ transform: @escaping (Output) -> Child
|
|
64
|
+
) -> Publishers.FlatMap<Child, Self>
|
|
65
|
+
where Result == Child.Output, Failure == Child.Failure {
|
|
66
|
+
return .init(upstream: self,
|
|
67
|
+
maxPublishers: maxPublishers,
|
|
68
|
+
transform: transform)
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
extension Publisher where Failure == Never {
|
|
73
|
+
|
|
74
|
+
/// Transforms all elements from an upstream publisher into a new publisher up to
|
|
75
|
+
/// a maximum number of publishers you specify.
|
|
76
|
+
///
|
|
77
|
+
/// - Parameters:
|
|
78
|
+
/// - maxPublishers: Specifies the maximum number of concurrent publisher
|
|
79
|
+
/// subscriptions, or `Subscribers.Demand.unlimited` if unspecified.
|
|
80
|
+
/// - transform: A closure that takes an element as a parameter and returns
|
|
81
|
+
/// a publisher that produces elements of that type.
|
|
82
|
+
/// - Returns: A publisher that transforms elements from an upstream publisher into
|
|
83
|
+
/// a publisher of that element’s type.
|
|
84
|
+
public func flatMap<Child: Publisher>(
|
|
85
|
+
maxPublishers: Subscribers.Demand = .unlimited,
|
|
86
|
+
_ transform: @escaping (Output) -> Child
|
|
87
|
+
) -> Publishers.FlatMap<Child, Publishers.SetFailureType<Self, Child.Failure>> {
|
|
88
|
+
return setFailureType(to: Child.Failure.self)
|
|
89
|
+
.flatMap(maxPublishers: maxPublishers, transform)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/// Transforms all elements from an upstream publisher into a new publisher up to
|
|
93
|
+
/// a maximum number of publishers you specify.
|
|
94
|
+
///
|
|
95
|
+
/// - Parameters:
|
|
96
|
+
/// - maxPublishers: Specifies the maximum number of concurrent publisher
|
|
97
|
+
/// subscriptions, or `Subscribers.Demand.unlimited` if unspecified.
|
|
98
|
+
/// - transform: A closure that takes an element as a parameter and returns
|
|
99
|
+
/// a publisher that produces elements of that type.
|
|
100
|
+
/// - Returns: A publisher that transforms elements from an upstream publisher
|
|
101
|
+
/// into a publisher of that element’s type.
|
|
102
|
+
public func flatMap<Child: Publisher>(
|
|
103
|
+
maxPublishers: Subscribers.Demand = .unlimited,
|
|
104
|
+
_ transform: @escaping (Output) -> Child
|
|
105
|
+
) -> Publishers.FlatMap<Child, Self> where Child.Failure == Never {
|
|
106
|
+
return .init(upstream: self, maxPublishers: maxPublishers, transform: transform)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
extension Publisher {
|
|
111
|
+
|
|
112
|
+
/// Transforms all elements from an upstream publisher into a new publisher up to
|
|
113
|
+
/// a maximum number of publishers you specify.
|
|
114
|
+
///
|
|
115
|
+
/// - Parameters:
|
|
116
|
+
/// - maxPublishers: Specifies the maximum number of concurrent publisher
|
|
117
|
+
/// subscriptions, or `Subscribers.Demand.unlimited` if unspecified.
|
|
118
|
+
/// - transform: A closure that takes an element as a parameter and returns
|
|
119
|
+
/// a publisher that produces elements of that type.
|
|
120
|
+
/// - Returns: A publisher that transforms elements from an upstream publisher into
|
|
121
|
+
/// a publisher of that element’s type.
|
|
122
|
+
public func flatMap<Child: Publisher>(
|
|
123
|
+
maxPublishers: Subscribers.Demand = .unlimited,
|
|
124
|
+
_ transform: @escaping (Output) -> Child
|
|
125
|
+
) -> Publishers.FlatMap<Publishers.SetFailureType<Child, Failure>, Self>
|
|
126
|
+
where Child.Failure == Never
|
|
127
|
+
{
|
|
128
|
+
return flatMap(maxPublishers: maxPublishers) {
|
|
129
|
+
transform($0).setFailureType(to: Failure.self)
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
extension Publishers {
|
|
135
|
+
|
|
136
|
+
/// A publisher that transforms elements from an upstream publisher into a new
|
|
137
|
+
/// publisher.
|
|
138
|
+
public struct FlatMap<Child: Publisher, Upstream: Publisher>: Publisher
|
|
139
|
+
where Child.Failure == Upstream.Failure
|
|
140
|
+
{
|
|
141
|
+
public typealias Output = Child.Output
|
|
142
|
+
|
|
143
|
+
public typealias Failure = Upstream.Failure
|
|
144
|
+
|
|
145
|
+
public let upstream: Upstream
|
|
146
|
+
|
|
147
|
+
public let maxPublishers: Subscribers.Demand
|
|
148
|
+
|
|
149
|
+
public let transform: (Upstream.Output) -> Child
|
|
150
|
+
|
|
151
|
+
public init(upstream: Upstream, maxPublishers: Subscribers.Demand,
|
|
152
|
+
transform: @escaping (Upstream.Output) -> Child) {
|
|
153
|
+
self.upstream = upstream
|
|
154
|
+
self.maxPublishers = maxPublishers
|
|
155
|
+
self.transform = transform
|
|
156
|
+
}
|
|
157
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
158
|
+
where Child.Output == Downstream.Input, Upstream.Failure == Downstream.Failure
|
|
159
|
+
{
|
|
160
|
+
let outer = Outer(downstream: subscriber,
|
|
161
|
+
maxPublishers: maxPublishers,
|
|
162
|
+
map: transform)
|
|
163
|
+
subscriber.receive(subscription: outer)
|
|
164
|
+
upstream.subscribe(outer)
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
extension Publishers.FlatMap {
|
|
170
|
+
private final class Outer<Downstream: Subscriber>
|
|
171
|
+
: Subscriber,
|
|
172
|
+
Subscription,
|
|
173
|
+
CustomStringConvertible,
|
|
174
|
+
CustomReflectable,
|
|
175
|
+
CustomPlaygroundDisplayConvertible
|
|
176
|
+
where Downstream.Input == Child.Output, Downstream.Failure == Upstream.Failure
|
|
177
|
+
{
|
|
178
|
+
typealias Input = Upstream.Output
|
|
179
|
+
typealias Failure = Upstream.Failure
|
|
180
|
+
|
|
181
|
+
private typealias SubscriptionIndex = Int
|
|
182
|
+
|
|
183
|
+
/// All requests to this subscription should be made with the `outerLock`
|
|
184
|
+
/// acquired.
|
|
185
|
+
private var outerSubscription: Subscription?
|
|
186
|
+
|
|
187
|
+
/// The lock for requesting from `outerSubscription`.
|
|
188
|
+
private let outerLock = UnfairRecursiveLock.allocate()
|
|
189
|
+
|
|
190
|
+
/// The lock for modifying the state. All mutable state here should be
|
|
191
|
+
/// read and modified with this lock acquired.
|
|
192
|
+
/// The only exception is the `downstreamRecursive` field, which is guarded
|
|
193
|
+
/// by the `downstreamLock`.
|
|
194
|
+
private let lock = UnfairLock.allocate()
|
|
195
|
+
|
|
196
|
+
/// All the calls to the downstream subscriber should be made with this lock
|
|
197
|
+
/// acquired.
|
|
198
|
+
private let downstreamLock = UnfairRecursiveLock.allocate()
|
|
199
|
+
|
|
200
|
+
private let downstream: Downstream
|
|
201
|
+
|
|
202
|
+
private var downstreamDemand = Subscribers.Demand.none
|
|
203
|
+
|
|
204
|
+
/// This variable is set to `true` whenever we call `downstream.receive(_:)`,
|
|
205
|
+
/// and then set back to `false`.
|
|
206
|
+
private var downstreamRecursive = false
|
|
207
|
+
|
|
208
|
+
private var innerRecursive = false
|
|
209
|
+
private var subscriptions = [SubscriptionIndex : Subscription]()
|
|
210
|
+
private var nextInnerIndex: SubscriptionIndex = 0
|
|
211
|
+
private var pendingSubscriptions = 0
|
|
212
|
+
private var buffer = [(SubscriptionIndex, Child.Output)]()
|
|
213
|
+
private let maxPublishers: Subscribers.Demand
|
|
214
|
+
private let map: (Input) -> Child
|
|
215
|
+
private var cancelledOrCompleted = false
|
|
216
|
+
private var outerFinished = false
|
|
217
|
+
|
|
218
|
+
init(downstream: Downstream,
|
|
219
|
+
maxPublishers: Subscribers.Demand,
|
|
220
|
+
map: @escaping (Upstream.Output) -> Child) {
|
|
221
|
+
self.downstream = downstream
|
|
222
|
+
self.maxPublishers = maxPublishers
|
|
223
|
+
self.map = map
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
deinit {
|
|
227
|
+
outerLock.deallocate()
|
|
228
|
+
lock.deallocate()
|
|
229
|
+
downstreamLock.deallocate()
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// MARK: - Subscriber
|
|
233
|
+
|
|
234
|
+
fileprivate func receive(subscription: Subscription) {
|
|
235
|
+
lock.lock()
|
|
236
|
+
guard outerSubscription == nil, !cancelledOrCompleted else {
|
|
237
|
+
lock.unlock()
|
|
238
|
+
subscription.cancel()
|
|
239
|
+
return
|
|
240
|
+
}
|
|
241
|
+
outerSubscription = subscription
|
|
242
|
+
lock.unlock()
|
|
243
|
+
subscription.request(maxPublishers)
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
fileprivate func receive(_ input: Input) -> Subscribers.Demand {
|
|
247
|
+
lock.lock()
|
|
248
|
+
let cancelledOrCompleted = self.cancelledOrCompleted
|
|
249
|
+
lock.unlock()
|
|
250
|
+
if cancelledOrCompleted {
|
|
251
|
+
return .none
|
|
252
|
+
}
|
|
253
|
+
let child = map(input)
|
|
254
|
+
lock.lock()
|
|
255
|
+
let innerIndex = nextInnerIndex
|
|
256
|
+
nextInnerIndex += 1
|
|
257
|
+
pendingSubscriptions += 1
|
|
258
|
+
lock.unlock()
|
|
259
|
+
child.subscribe(Side(index: innerIndex, inner: self))
|
|
260
|
+
return .none
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
fileprivate func receive(completion: Subscribers.Completion<Failure>) {
|
|
264
|
+
lock.lock()
|
|
265
|
+
outerSubscription = nil
|
|
266
|
+
outerFinished = true
|
|
267
|
+
switch completion {
|
|
268
|
+
case .finished:
|
|
269
|
+
releaseLockThenSendCompletionDownstreamIfNeeded(outerFinished: true)
|
|
270
|
+
return
|
|
271
|
+
case .failure:
|
|
272
|
+
let wasAlreadyCancelledOrCompleted = cancelledOrCompleted
|
|
273
|
+
cancelledOrCompleted = true
|
|
274
|
+
for (_, subscription) in subscriptions {
|
|
275
|
+
// Cancelling subscriptions with the lock acquired. Not good,
|
|
276
|
+
// but that's what Combine does. This code path is tested.
|
|
277
|
+
subscription.cancel()
|
|
278
|
+
}
|
|
279
|
+
subscriptions = [:]
|
|
280
|
+
lock.unlock()
|
|
281
|
+
if wasAlreadyCancelledOrCompleted {
|
|
282
|
+
return
|
|
283
|
+
}
|
|
284
|
+
downstreamLock.lock()
|
|
285
|
+
downstream.receive(completion: completion)
|
|
286
|
+
downstreamLock.unlock()
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// MARK: - Subscription
|
|
291
|
+
|
|
292
|
+
fileprivate func request(_ demand: Subscribers.Demand) {
|
|
293
|
+
demand.assertNonZero()
|
|
294
|
+
if downstreamRecursive {
|
|
295
|
+
// downstreamRecursive being true means that downstreamLock
|
|
296
|
+
// is already acquired.
|
|
297
|
+
downstreamDemand += demand
|
|
298
|
+
return
|
|
299
|
+
}
|
|
300
|
+
lock.lock()
|
|
301
|
+
if cancelledOrCompleted {
|
|
302
|
+
lock.unlock()
|
|
303
|
+
return
|
|
304
|
+
}
|
|
305
|
+
if demand == .unlimited {
|
|
306
|
+
downstreamDemand = .unlimited
|
|
307
|
+
let buffer = self.buffer.take()
|
|
308
|
+
let subscriptions = self.subscriptions
|
|
309
|
+
lock.unlock()
|
|
310
|
+
downstreamLock.lock()
|
|
311
|
+
downstreamRecursive = true
|
|
312
|
+
for (_, childOutput) in buffer {
|
|
313
|
+
_ = downstream.receive(childOutput)
|
|
314
|
+
}
|
|
315
|
+
downstreamRecursive = false
|
|
316
|
+
downstreamLock.unlock()
|
|
317
|
+
for (_, subscription) in subscriptions {
|
|
318
|
+
subscription.request(.unlimited)
|
|
319
|
+
}
|
|
320
|
+
lock.lock()
|
|
321
|
+
} else {
|
|
322
|
+
downstreamDemand += demand
|
|
323
|
+
while !buffer.isEmpty && downstreamDemand > 0 {
|
|
324
|
+
// FIXME: This has quadratic complexity.
|
|
325
|
+
// This is what Combine does.
|
|
326
|
+
// Can we improve perfomance by using e. g. Deque instead of Array?
|
|
327
|
+
// Or array's cache locality makes this solution more efficient?
|
|
328
|
+
// Must benchmark before optimizing!
|
|
329
|
+
//
|
|
330
|
+
// https://www.cocoawithlove.com/blog/2016/09/22/deque.html
|
|
331
|
+
let (index, value) = buffer.removeFirst()
|
|
332
|
+
downstreamDemand -= 1
|
|
333
|
+
let subscription = subscriptions[index]
|
|
334
|
+
lock.unlock()
|
|
335
|
+
downstreamLock.lock()
|
|
336
|
+
downstreamRecursive = true
|
|
337
|
+
let additionalDemand = downstream.receive(value)
|
|
338
|
+
downstreamRecursive = false
|
|
339
|
+
downstreamLock.unlock()
|
|
340
|
+
if additionalDemand != .none {
|
|
341
|
+
lock.lock()
|
|
342
|
+
downstreamDemand += additionalDemand
|
|
343
|
+
lock.unlock()
|
|
344
|
+
}
|
|
345
|
+
if let subscription = subscription {
|
|
346
|
+
innerRecursive = true
|
|
347
|
+
subscription.request(.max(1))
|
|
348
|
+
innerRecursive = false
|
|
349
|
+
}
|
|
350
|
+
lock.lock()
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
releaseLockThenSendCompletionDownstreamIfNeeded(outerFinished: outerFinished)
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
fileprivate func cancel() {
|
|
357
|
+
lock.lock()
|
|
358
|
+
if cancelledOrCompleted {
|
|
359
|
+
lock.unlock()
|
|
360
|
+
return
|
|
361
|
+
}
|
|
362
|
+
cancelledOrCompleted = true
|
|
363
|
+
let subscriptions = self.subscriptions.take()
|
|
364
|
+
let outerSubscription = self.outerSubscription.take()
|
|
365
|
+
lock.unlock()
|
|
366
|
+
for (_, subscription) in subscriptions {
|
|
367
|
+
subscription.cancel()
|
|
368
|
+
}
|
|
369
|
+
// Combine doesn't acquire outerLock here. Weird.
|
|
370
|
+
outerSubscription?.cancel()
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// MARK: - Reflection
|
|
374
|
+
|
|
375
|
+
fileprivate var description: String { return "FlatMap" }
|
|
376
|
+
|
|
377
|
+
fileprivate var customMirror: Mirror {
|
|
378
|
+
return Mirror(self, children: EmptyCollection())
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
fileprivate var playgroundDescription: Any { return description }
|
|
382
|
+
|
|
383
|
+
// MARK: - Private
|
|
384
|
+
|
|
385
|
+
private func receiveInner(subscription: Subscription,
|
|
386
|
+
_ index: SubscriptionIndex) {
|
|
387
|
+
lock.lock()
|
|
388
|
+
pendingSubscriptions -= 1
|
|
389
|
+
subscriptions[index] = subscription
|
|
390
|
+
|
|
391
|
+
let demand = downstreamDemand == .unlimited
|
|
392
|
+
? Subscribers.Demand.unlimited
|
|
393
|
+
: .max(1)
|
|
394
|
+
|
|
395
|
+
lock.unlock()
|
|
396
|
+
subscription.request(demand)
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
private func receiveInner(_ input: Child.Output,
|
|
400
|
+
_ index: SubscriptionIndex) -> Subscribers.Demand {
|
|
401
|
+
lock.lock()
|
|
402
|
+
if downstreamDemand == .unlimited {
|
|
403
|
+
lock.unlock()
|
|
404
|
+
downstreamLock.lock()
|
|
405
|
+
downstreamRecursive = true
|
|
406
|
+
_ = downstream.receive(input)
|
|
407
|
+
downstreamRecursive = false
|
|
408
|
+
downstreamLock.unlock()
|
|
409
|
+
return .none
|
|
410
|
+
}
|
|
411
|
+
if downstreamDemand == .none || innerRecursive {
|
|
412
|
+
buffer.append((index, input))
|
|
413
|
+
lock.unlock()
|
|
414
|
+
return .none
|
|
415
|
+
}
|
|
416
|
+
downstreamDemand -= 1
|
|
417
|
+
lock.unlock()
|
|
418
|
+
downstreamLock.lock()
|
|
419
|
+
downstreamRecursive = true
|
|
420
|
+
let newDemand = downstream.receive(input)
|
|
421
|
+
downstreamRecursive = false
|
|
422
|
+
downstreamLock.unlock()
|
|
423
|
+
if newDemand > 0 {
|
|
424
|
+
lock.lock()
|
|
425
|
+
downstreamDemand += newDemand
|
|
426
|
+
lock.unlock()
|
|
427
|
+
}
|
|
428
|
+
return .max(1)
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
private func receiveInner(completion: Subscribers.Completion<Child.Failure>,
|
|
432
|
+
_ index: SubscriptionIndex) {
|
|
433
|
+
switch completion {
|
|
434
|
+
case .finished:
|
|
435
|
+
lock.lock()
|
|
436
|
+
subscriptions.removeValue(forKey: index)
|
|
437
|
+
let downstreamCompleted = releaseLockThenSendCompletionDownstreamIfNeeded(
|
|
438
|
+
outerFinished: outerFinished
|
|
439
|
+
)
|
|
440
|
+
if !downstreamCompleted {
|
|
441
|
+
requestOneMorePublisher()
|
|
442
|
+
}
|
|
443
|
+
case .failure:
|
|
444
|
+
lock.lock()
|
|
445
|
+
if cancelledOrCompleted {
|
|
446
|
+
lock.unlock()
|
|
447
|
+
return
|
|
448
|
+
}
|
|
449
|
+
cancelledOrCompleted = true
|
|
450
|
+
let subscriptions = self.subscriptions.take()
|
|
451
|
+
lock.unlock()
|
|
452
|
+
for (i, subscription) in subscriptions where i != index {
|
|
453
|
+
subscription.cancel()
|
|
454
|
+
}
|
|
455
|
+
downstreamLock.lock()
|
|
456
|
+
downstream.receive(completion: completion)
|
|
457
|
+
downstreamLock.unlock()
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
private func requestOneMorePublisher() {
|
|
462
|
+
if maxPublishers != .unlimited {
|
|
463
|
+
outerLock.lock()
|
|
464
|
+
outerSubscription?.request(.max(1))
|
|
465
|
+
outerLock.unlock()
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/// - Precondition: `lock` is acquired
|
|
470
|
+
/// - Postcondition: `lock` is released
|
|
471
|
+
///
|
|
472
|
+
/// - Returns: `true` if a completion was sent downstream
|
|
473
|
+
@discardableResult
|
|
474
|
+
private func releaseLockThenSendCompletionDownstreamIfNeeded(
|
|
475
|
+
outerFinished: Bool
|
|
476
|
+
) -> Bool {
|
|
477
|
+
#if DEBUG
|
|
478
|
+
lock.assertOwner() // Sanity check
|
|
479
|
+
#endif
|
|
480
|
+
if !cancelledOrCompleted && outerFinished && buffer.isEmpty &&
|
|
481
|
+
subscriptions.count + pendingSubscriptions == 0 {
|
|
482
|
+
cancelledOrCompleted = true
|
|
483
|
+
lock.unlock()
|
|
484
|
+
downstreamLock.lock()
|
|
485
|
+
downstream.receive(completion: .finished)
|
|
486
|
+
downstreamLock.unlock()
|
|
487
|
+
return true
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
lock.unlock()
|
|
491
|
+
return false
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// MARK: - Side
|
|
495
|
+
|
|
496
|
+
private struct Side: Subscriber,
|
|
497
|
+
CustomStringConvertible,
|
|
498
|
+
CustomReflectable,
|
|
499
|
+
CustomPlaygroundDisplayConvertible {
|
|
500
|
+
private let index: SubscriptionIndex
|
|
501
|
+
private let inner: Outer
|
|
502
|
+
fileprivate let combineIdentifier = CombineIdentifier()
|
|
503
|
+
|
|
504
|
+
fileprivate init(index: SubscriptionIndex, inner: Outer) {
|
|
505
|
+
self.index = index
|
|
506
|
+
self.inner = inner
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
fileprivate func receive(subscription: Subscription) {
|
|
510
|
+
inner.receiveInner(subscription: subscription, index)
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
fileprivate func receive(_ input: Child.Output) -> Subscribers.Demand {
|
|
514
|
+
return inner.receiveInner(input, index)
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
fileprivate func receive(completion: Subscribers.Completion<Child.Failure>) {
|
|
518
|
+
inner.receiveInner(completion: completion, index)
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
fileprivate var description: String { return "FlatMap" }
|
|
522
|
+
|
|
523
|
+
fileprivate var customMirror: Mirror {
|
|
524
|
+
let children = CollectionOfOne<Mirror.Child>(
|
|
525
|
+
("parentSubscription", inner.combineIdentifier)
|
|
526
|
+
)
|
|
527
|
+
return Mirror(self, children: children)
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
fileprivate var playgroundDescription: Any { return description }
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
}
|