@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,274 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.Retry.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 28.06.2020.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Attempts to recreate a failed subscription with the upstream publisher up to
|
|
11
|
+
/// the number of times you specify.
|
|
12
|
+
///
|
|
13
|
+
/// Use `retry(_:)` to try connecting to an upstream publisher after a failed
|
|
14
|
+
/// connection attempt.
|
|
15
|
+
///
|
|
16
|
+
/// In the example below, a `URLSession.DataTaskPublisher` attempts to connect to
|
|
17
|
+
/// a remote URL. If the connection attempt succeeds, it publishes the remote
|
|
18
|
+
/// service’s HTML to the downstream publisher and completes normally. Otherwise,
|
|
19
|
+
/// the retry operator attempts to reestablish the connection. If after three attempts
|
|
20
|
+
/// the publisher still can’t connect to the remote URL, the `catch(_:)` operator
|
|
21
|
+
/// replaces the error with a new publisher that publishes a “connection timed out”
|
|
22
|
+
/// HTML page. After the downstream subscriber receives the timed out message,
|
|
23
|
+
/// the stream completes normally.
|
|
24
|
+
///
|
|
25
|
+
/// struct WebSiteData: Codable {
|
|
26
|
+
/// var rawHTML: String
|
|
27
|
+
/// }
|
|
28
|
+
///
|
|
29
|
+
/// let myURL = URL(string: "https://www.example.com")
|
|
30
|
+
///
|
|
31
|
+
/// cancellable = URLSession.shared.dataTaskPublisher(for: myURL!)
|
|
32
|
+
/// .retry(3)
|
|
33
|
+
/// .map { page -> WebSiteData in
|
|
34
|
+
/// WebSiteData(rawHTML: String(decoding: page.data, as: UTF8.self))
|
|
35
|
+
/// }
|
|
36
|
+
/// .catch { error in
|
|
37
|
+
/// Just(
|
|
38
|
+
/// WebSiteData(
|
|
39
|
+
/// rawHTML: "<HTML>Unable to load page - timed out.</HTML>"
|
|
40
|
+
/// )
|
|
41
|
+
/// )
|
|
42
|
+
/// }
|
|
43
|
+
/// .sink(receiveCompletion: { print ("completion: \($0)") },
|
|
44
|
+
/// receiveValue: { print ("value: \($0)") })
|
|
45
|
+
///
|
|
46
|
+
/// // Prints: The HTML content from the remote URL upon a successful connection,
|
|
47
|
+
/// // or returns "<HTML>Unable to load page - timed out.</HTML>" if
|
|
48
|
+
/// // the number of retries exceeds the specified value.
|
|
49
|
+
///
|
|
50
|
+
/// After exceeding the specified number of retries, the publisher passes the failure
|
|
51
|
+
/// to the downstream receiver.
|
|
52
|
+
/// - Parameter retries: The number of times to attempt to recreate the subscription.
|
|
53
|
+
/// - Returns: A publisher that attempts to recreate its subscription to a failed
|
|
54
|
+
/// upstream publisher.
|
|
55
|
+
public func retry(_ retries: Int) -> Publishers.Retry<Self> {
|
|
56
|
+
return .init(upstream: self, retries: retries)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
extension Publishers {
|
|
61
|
+
|
|
62
|
+
/// A publisher that attempts to recreate its subscription to a failed upstream
|
|
63
|
+
/// publisher.
|
|
64
|
+
public struct Retry<Upstream: Publisher>: Publisher {
|
|
65
|
+
|
|
66
|
+
public typealias Output = Upstream.Output
|
|
67
|
+
|
|
68
|
+
public typealias Failure = Upstream.Failure
|
|
69
|
+
|
|
70
|
+
/// The publisher from which this publisher receives elements.
|
|
71
|
+
public let upstream: Upstream
|
|
72
|
+
|
|
73
|
+
/// The maximum number of retry attempts to perform.
|
|
74
|
+
///
|
|
75
|
+
/// If `nil`, this publisher attempts to reconnect with the upstream publisher
|
|
76
|
+
/// an unlimited number of times.
|
|
77
|
+
public let retries: Int?
|
|
78
|
+
|
|
79
|
+
/// Creates a publisher that attempts to recreate its subscription to a failed
|
|
80
|
+
/// upstream publisher.
|
|
81
|
+
///
|
|
82
|
+
/// - Parameters:
|
|
83
|
+
/// - upstream: The publisher from which this publisher receives its elements.
|
|
84
|
+
/// - retries: The maximum number of retry attempts to perform. If `nil`, this
|
|
85
|
+
/// publisher attempts to reconnect with the upstream publisher an unlimited
|
|
86
|
+
/// number of times.
|
|
87
|
+
public init(upstream: Upstream, retries: Int?) {
|
|
88
|
+
self.upstream = upstream
|
|
89
|
+
self.retries = retries
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
93
|
+
where Downstream.Input == Output, Downstream.Failure == Failure
|
|
94
|
+
{
|
|
95
|
+
upstream.subscribe(Inner(parent: self, downstream: subscriber))
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
extension Publishers.Retry: Equatable where Upstream: Equatable {}
|
|
101
|
+
|
|
102
|
+
extension Publishers.Retry {
|
|
103
|
+
private final class Inner<Downstream: Subscriber>
|
|
104
|
+
: Subscriber,
|
|
105
|
+
Subscription,
|
|
106
|
+
CustomStringConvertible,
|
|
107
|
+
CustomReflectable,
|
|
108
|
+
CustomPlaygroundDisplayConvertible
|
|
109
|
+
where Downstream.Failure == Failure, Downstream.Input == Output
|
|
110
|
+
{
|
|
111
|
+
typealias Input = Upstream.Output
|
|
112
|
+
|
|
113
|
+
typealias Failure = Upstream.Failure
|
|
114
|
+
|
|
115
|
+
private enum State {
|
|
116
|
+
case ready(Publishers.Retry<Upstream>, Downstream)
|
|
117
|
+
case terminal
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private enum Chances {
|
|
121
|
+
case finite(Int)
|
|
122
|
+
case infinite
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
private let lock = UnfairLock.allocate()
|
|
126
|
+
|
|
127
|
+
private var state: State
|
|
128
|
+
|
|
129
|
+
private var upstreamSubscription: Subscription?
|
|
130
|
+
|
|
131
|
+
private var remaining: Chances
|
|
132
|
+
|
|
133
|
+
private var downstreamNeedsSubscription = true
|
|
134
|
+
|
|
135
|
+
private var downstreamDemand = Subscribers.Demand.none
|
|
136
|
+
|
|
137
|
+
private var completionRecursion = false
|
|
138
|
+
|
|
139
|
+
private var needsSubscribe = false
|
|
140
|
+
|
|
141
|
+
init(parent: Publishers.Retry<Upstream>, downstream: Downstream) {
|
|
142
|
+
state = .ready(parent, downstream)
|
|
143
|
+
remaining = parent.retries.map(Chances.finite) ?? .infinite
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
deinit {
|
|
147
|
+
lock.deallocate()
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
func receive(subscription: Subscription) {
|
|
151
|
+
lock.lock()
|
|
152
|
+
guard case let .ready(_, downstream) = state, upstreamSubscription == nil
|
|
153
|
+
else {
|
|
154
|
+
lock.unlock()
|
|
155
|
+
subscription.cancel()
|
|
156
|
+
return
|
|
157
|
+
}
|
|
158
|
+
upstreamSubscription = subscription
|
|
159
|
+
let downstreamDemand = self.downstreamDemand
|
|
160
|
+
let downstreamNeedsSubscription = self.downstreamNeedsSubscription
|
|
161
|
+
self.downstreamNeedsSubscription = false
|
|
162
|
+
lock.unlock()
|
|
163
|
+
if downstreamNeedsSubscription {
|
|
164
|
+
downstream.receive(subscription: self)
|
|
165
|
+
}
|
|
166
|
+
if downstreamDemand != .none {
|
|
167
|
+
subscription.request(downstreamDemand)
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
172
|
+
lock.lock()
|
|
173
|
+
guard case let .ready(_, downstream) = state else {
|
|
174
|
+
lock.unlock()
|
|
175
|
+
return .none
|
|
176
|
+
}
|
|
177
|
+
downstreamDemand -= 1
|
|
178
|
+
lock.unlock()
|
|
179
|
+
|
|
180
|
+
let newDemand = downstream.receive(input)
|
|
181
|
+
|
|
182
|
+
if newDemand == .none { return .none }
|
|
183
|
+
|
|
184
|
+
lock.lock()
|
|
185
|
+
downstreamDemand += newDemand
|
|
186
|
+
|
|
187
|
+
if let upstreamSubscription = self.upstreamSubscription {
|
|
188
|
+
lock.unlock()
|
|
189
|
+
upstreamSubscription.request(newDemand)
|
|
190
|
+
} else {
|
|
191
|
+
lock.unlock()
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return .none
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
func receive(completion: Subscribers.Completion<Failure>) {
|
|
198
|
+
lock.lock()
|
|
199
|
+
guard case let .ready(parent, downstream) = state else {
|
|
200
|
+
lock.unlock()
|
|
201
|
+
return
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
if case .failure = completion {
|
|
205
|
+
upstreamSubscription = nil
|
|
206
|
+
switch remaining {
|
|
207
|
+
case .finite(0):
|
|
208
|
+
break
|
|
209
|
+
case .finite(let attempts):
|
|
210
|
+
remaining = .finite(attempts - 1)
|
|
211
|
+
fallthrough
|
|
212
|
+
case .infinite:
|
|
213
|
+
if completionRecursion {
|
|
214
|
+
needsSubscribe = true
|
|
215
|
+
lock.unlock()
|
|
216
|
+
return
|
|
217
|
+
}
|
|
218
|
+
repeat {
|
|
219
|
+
completionRecursion = true
|
|
220
|
+
needsSubscribe = false
|
|
221
|
+
lock.unlock()
|
|
222
|
+
parent.upstream.subscribe(self)
|
|
223
|
+
lock.lock()
|
|
224
|
+
completionRecursion = false
|
|
225
|
+
} while needsSubscribe
|
|
226
|
+
lock.unlock()
|
|
227
|
+
return
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
state = .terminal
|
|
232
|
+
lock.unlock()
|
|
233
|
+
downstream.receive(completion: completion)
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
func request(_ demand: Subscribers.Demand) {
|
|
237
|
+
lock.lock()
|
|
238
|
+
guard case .ready = state else {
|
|
239
|
+
lock.unlock()
|
|
240
|
+
return
|
|
241
|
+
}
|
|
242
|
+
downstreamDemand += demand
|
|
243
|
+
if let upstreamSubscription = self.upstreamSubscription {
|
|
244
|
+
lock.unlock()
|
|
245
|
+
upstreamSubscription.request(demand)
|
|
246
|
+
} else {
|
|
247
|
+
lock.unlock()
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
func cancel() {
|
|
252
|
+
lock.lock()
|
|
253
|
+
guard case .ready = state else {
|
|
254
|
+
lock.unlock()
|
|
255
|
+
return
|
|
256
|
+
}
|
|
257
|
+
state = .terminal
|
|
258
|
+
if let upstreamSubscription = self.upstreamSubscription {
|
|
259
|
+
lock.unlock()
|
|
260
|
+
upstreamSubscription.cancel()
|
|
261
|
+
} else {
|
|
262
|
+
lock.unlock()
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
var description: String { return "Retry" }
|
|
267
|
+
|
|
268
|
+
var customMirror: Mirror {
|
|
269
|
+
return Mirror(self, children: EmptyCollection())
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
var playgroundDescription: Any { return description }
|
|
273
|
+
}
|
|
274
|
+
}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.Scan.swift
|
|
3
|
+
//
|
|
4
|
+
// Created by Eric Patey on 26.08.2019.
|
|
5
|
+
//
|
|
6
|
+
|
|
7
|
+
extension Publisher {
|
|
8
|
+
|
|
9
|
+
/// Transforms elements from the upstream publisher by providing the current
|
|
10
|
+
/// element to a closure along with the last value returned by the closure.
|
|
11
|
+
///
|
|
12
|
+
/// Use `scan(_:_:)` to accumulate all previously-published values into a single
|
|
13
|
+
/// value, which you then combine with each newly-published value.
|
|
14
|
+
///
|
|
15
|
+
/// The following example logs a running total of all values received
|
|
16
|
+
/// from the sequence publisher.
|
|
17
|
+
///
|
|
18
|
+
/// let range = (0...5)
|
|
19
|
+
/// cancellable = range.publisher
|
|
20
|
+
/// .scan(0) { return $0 + $1 }
|
|
21
|
+
/// .sink { print ("\($0)", terminator: " ") }
|
|
22
|
+
/// // Prints: "0 1 3 6 10 15 ".
|
|
23
|
+
///
|
|
24
|
+
/// - Parameters:
|
|
25
|
+
/// - initialResult: The previous result returned by the `nextPartialResult`
|
|
26
|
+
/// closure.
|
|
27
|
+
/// - nextPartialResult: A closure that takes as its arguments the previous value
|
|
28
|
+
/// returned by the closure and the next element emitted from the upstream
|
|
29
|
+
/// publisher.
|
|
30
|
+
/// - Returns: A publisher that transforms elements by applying a closure that
|
|
31
|
+
/// receives its previous return value and the next element from the upstream
|
|
32
|
+
/// publisher.
|
|
33
|
+
public func scan<Result>(
|
|
34
|
+
_ initialResult: Result,
|
|
35
|
+
_ nextPartialResult: @escaping (Result, Output) -> Result
|
|
36
|
+
) -> Publishers.Scan<Self, Result> {
|
|
37
|
+
return .init(upstream: self,
|
|
38
|
+
initialResult: initialResult,
|
|
39
|
+
nextPartialResult: nextPartialResult)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/// Transforms elements from the upstream publisher by providing the current element
|
|
43
|
+
/// to an error-throwing closure along with the last value returned by the closure.
|
|
44
|
+
///
|
|
45
|
+
/// Use `tryScan(_:_:)` to accumulate all previously-published values into a single
|
|
46
|
+
/// value, which you then combine with each newly-published value.
|
|
47
|
+
/// If your accumulator closure throws an error, the publisher terminates with
|
|
48
|
+
/// the error.
|
|
49
|
+
///
|
|
50
|
+
/// In the example below, `tryScan(_:_:)` calls a division function on elements of
|
|
51
|
+
/// a collection publisher. The `Publishers.TryScan` publisher publishes each result
|
|
52
|
+
/// until the function encounters a `DivisionByZeroError`, which terminates
|
|
53
|
+
/// the publisher.
|
|
54
|
+
///
|
|
55
|
+
/// struct DivisionByZeroError: Error {}
|
|
56
|
+
///
|
|
57
|
+
/// /// A function that throws a DivisionByZeroError if `current` provided by the
|
|
58
|
+
/// /// TryScan publisher is zero.
|
|
59
|
+
/// func myThrowingFunction(_ lastValue: Int, _ currentValue: Int) throws -> Int {
|
|
60
|
+
/// guard currentValue != 0 else { throw DivisionByZeroError() }
|
|
61
|
+
/// return (lastValue + currentValue) / currentValue
|
|
62
|
+
/// }
|
|
63
|
+
///
|
|
64
|
+
/// let numbers = [1,2,3,4,5,0,6,7,8,9]
|
|
65
|
+
/// cancellable = numbers.publisher
|
|
66
|
+
/// .tryScan(10) { try myThrowingFunction($0, $1) }
|
|
67
|
+
/// .sink(
|
|
68
|
+
/// receiveCompletion: { print ("\($0)") },
|
|
69
|
+
/// receiveValue: { print ("\($0)", terminator: " ") }
|
|
70
|
+
/// )
|
|
71
|
+
///
|
|
72
|
+
/// // Prints: "11 6 3 1 1 -1 failure(DivisionByZeroError())".
|
|
73
|
+
///
|
|
74
|
+
/// If the closure throws an error, the publisher fails with the error.
|
|
75
|
+
///
|
|
76
|
+
/// - Parameters:
|
|
77
|
+
/// - initialResult: The previous result returned by the `nextPartialResult`
|
|
78
|
+
/// closure.
|
|
79
|
+
/// - nextPartialResult: An error-throwing closure that takes as its arguments the
|
|
80
|
+
/// previous value returned by the closure and the next element emitted from the
|
|
81
|
+
/// upstream publisher.
|
|
82
|
+
/// - Returns: A publisher that transforms elements by applying a closure that
|
|
83
|
+
/// receives its previous return value and the next element from the upstream
|
|
84
|
+
/// publisher.
|
|
85
|
+
public func tryScan<Result>(
|
|
86
|
+
_ initialResult: Result,
|
|
87
|
+
_ nextPartialResult: @escaping (Result, Output) throws -> Result
|
|
88
|
+
) -> Publishers.TryScan<Self, Result> {
|
|
89
|
+
return .init(upstream: self,
|
|
90
|
+
initialResult: initialResult,
|
|
91
|
+
nextPartialResult: nextPartialResult)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
extension Publishers {
|
|
96
|
+
|
|
97
|
+
public struct Scan<Upstream: Publisher, Output>: Publisher {
|
|
98
|
+
|
|
99
|
+
public typealias Failure = Upstream.Failure
|
|
100
|
+
|
|
101
|
+
public let upstream: Upstream
|
|
102
|
+
|
|
103
|
+
public let initialResult: Output
|
|
104
|
+
|
|
105
|
+
public let nextPartialResult: (Output, Upstream.Output) -> Output
|
|
106
|
+
|
|
107
|
+
public init(upstream: Upstream,
|
|
108
|
+
initialResult: Output,
|
|
109
|
+
nextPartialResult: @escaping (Output, Upstream.Output) -> Output) {
|
|
110
|
+
self.upstream = upstream
|
|
111
|
+
self.initialResult = initialResult
|
|
112
|
+
self.nextPartialResult = nextPartialResult
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
116
|
+
where Output == Downstream.Input, Upstream.Failure == Downstream.Failure
|
|
117
|
+
{
|
|
118
|
+
upstream.subscribe(Inner(downstream: subscriber,
|
|
119
|
+
initialResult: initialResult,
|
|
120
|
+
nextPartialResult: nextPartialResult))
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
public struct TryScan<Upstream: Publisher, Output>: Publisher {
|
|
125
|
+
|
|
126
|
+
public typealias Failure = Error
|
|
127
|
+
|
|
128
|
+
public let upstream: Upstream
|
|
129
|
+
|
|
130
|
+
public let initialResult: Output
|
|
131
|
+
|
|
132
|
+
public let nextPartialResult: (Output, Upstream.Output) throws -> Output
|
|
133
|
+
|
|
134
|
+
public init(
|
|
135
|
+
upstream: Upstream,
|
|
136
|
+
initialResult: Output,
|
|
137
|
+
nextPartialResult: @escaping (Output, Upstream.Output) throws -> Output
|
|
138
|
+
) {
|
|
139
|
+
self.upstream = upstream
|
|
140
|
+
self.initialResult = initialResult
|
|
141
|
+
self.nextPartialResult = nextPartialResult
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
145
|
+
where Output == Downstream.Input, Downstream.Failure == Error
|
|
146
|
+
{
|
|
147
|
+
upstream.subscribe(Inner(downstream: subscriber,
|
|
148
|
+
initialResult: initialResult,
|
|
149
|
+
nextPartialResult: nextPartialResult))
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
extension Publishers.Scan {
|
|
155
|
+
|
|
156
|
+
private final class Inner<Downstream: Subscriber>
|
|
157
|
+
: Subscriber,
|
|
158
|
+
CustomStringConvertible,
|
|
159
|
+
CustomReflectable,
|
|
160
|
+
CustomPlaygroundDisplayConvertible
|
|
161
|
+
where Upstream.Failure == Downstream.Failure
|
|
162
|
+
{
|
|
163
|
+
// NOTE: this class has been audited for thread safety.
|
|
164
|
+
// Combine doesn't use any locking here.
|
|
165
|
+
|
|
166
|
+
typealias Input = Upstream.Output
|
|
167
|
+
|
|
168
|
+
typealias Failure = Upstream.Failure
|
|
169
|
+
|
|
170
|
+
private let downstream: Downstream
|
|
171
|
+
|
|
172
|
+
private let nextPartialResult: (Downstream.Input, Input) -> Downstream.Input
|
|
173
|
+
|
|
174
|
+
private var result: Downstream.Input
|
|
175
|
+
|
|
176
|
+
fileprivate init(
|
|
177
|
+
downstream: Downstream,
|
|
178
|
+
initialResult: Downstream.Input,
|
|
179
|
+
nextPartialResult: @escaping (Downstream.Input, Input) -> Downstream.Input
|
|
180
|
+
)
|
|
181
|
+
{
|
|
182
|
+
self.downstream = downstream
|
|
183
|
+
self.result = initialResult
|
|
184
|
+
self.nextPartialResult = nextPartialResult
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
func receive(subscription: Subscription) {
|
|
188
|
+
downstream.receive(subscription: subscription)
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
192
|
+
result = nextPartialResult(result, input)
|
|
193
|
+
return downstream.receive(result)
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
func receive(completion: Subscribers.Completion<Failure>) {
|
|
197
|
+
downstream.receive(completion: completion)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
var description: String { return "Scan" }
|
|
201
|
+
|
|
202
|
+
var customMirror: Mirror {
|
|
203
|
+
let children: [Mirror.Child] = [
|
|
204
|
+
("downstream", downstream),
|
|
205
|
+
("result", result)
|
|
206
|
+
]
|
|
207
|
+
return Mirror(self, children: children)
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
var playgroundDescription: Any { return description }
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
extension Publishers.TryScan {
|
|
215
|
+
private final class Inner<Downstream: Subscriber>
|
|
216
|
+
: Subscriber,
|
|
217
|
+
Subscription,
|
|
218
|
+
CustomStringConvertible,
|
|
219
|
+
CustomReflectable,
|
|
220
|
+
CustomPlaygroundDisplayConvertible
|
|
221
|
+
where Downstream.Failure == Error
|
|
222
|
+
{
|
|
223
|
+
// NOTE: this class has been audited for thread safety.
|
|
224
|
+
|
|
225
|
+
typealias Input = Upstream.Output
|
|
226
|
+
|
|
227
|
+
typealias Failure = Upstream.Failure
|
|
228
|
+
|
|
229
|
+
private let downstream: Downstream
|
|
230
|
+
|
|
231
|
+
private let nextPartialResult:
|
|
232
|
+
(Downstream.Input, Input) throws -> Downstream.Input
|
|
233
|
+
|
|
234
|
+
private var result: Downstream.Input
|
|
235
|
+
|
|
236
|
+
private var status = SubscriptionStatus.awaitingSubscription
|
|
237
|
+
|
|
238
|
+
private let lock = UnfairLock.allocate()
|
|
239
|
+
|
|
240
|
+
private var finished = false
|
|
241
|
+
|
|
242
|
+
fileprivate init(
|
|
243
|
+
downstream: Downstream,
|
|
244
|
+
initialResult: Downstream.Input,
|
|
245
|
+
nextPartialResult:
|
|
246
|
+
@escaping (Downstream.Input, Input) throws -> Downstream.Input
|
|
247
|
+
) {
|
|
248
|
+
self.downstream = downstream
|
|
249
|
+
self.nextPartialResult = nextPartialResult
|
|
250
|
+
self.result = initialResult
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
deinit {
|
|
254
|
+
lock.deallocate()
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
func receive(subscription: Subscription) {
|
|
258
|
+
lock.lock()
|
|
259
|
+
guard case .awaitingSubscription = status else {
|
|
260
|
+
lock.unlock()
|
|
261
|
+
subscription.cancel()
|
|
262
|
+
return
|
|
263
|
+
}
|
|
264
|
+
status = .subscribed(subscription)
|
|
265
|
+
lock.unlock()
|
|
266
|
+
downstream.receive(subscription: self)
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
270
|
+
do {
|
|
271
|
+
result = try nextPartialResult(result, input)
|
|
272
|
+
return downstream.receive(result)
|
|
273
|
+
} catch {
|
|
274
|
+
lock.lock()
|
|
275
|
+
guard case let .subscribed(subscription) = status else {
|
|
276
|
+
lock.unlock()
|
|
277
|
+
return .none
|
|
278
|
+
}
|
|
279
|
+
status = .terminal
|
|
280
|
+
lock.unlock()
|
|
281
|
+
subscription.cancel()
|
|
282
|
+
downstream.receive(completion: .failure(error))
|
|
283
|
+
return .none
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
func receive(completion: Subscribers.Completion<Upstream.Failure>) {
|
|
288
|
+
// Combine doesn't use locking in this method!
|
|
289
|
+
guard case .subscribed = status else {
|
|
290
|
+
return
|
|
291
|
+
}
|
|
292
|
+
downstream.receive(completion: completion.eraseError())
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
func request(_ demand: Subscribers.Demand) {
|
|
296
|
+
lock.lock()
|
|
297
|
+
guard case let .subscribed(subscription) = status else {
|
|
298
|
+
lock.unlock()
|
|
299
|
+
return
|
|
300
|
+
}
|
|
301
|
+
lock.unlock()
|
|
302
|
+
subscription.request(demand)
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
func cancel() {
|
|
306
|
+
lock.lock()
|
|
307
|
+
guard case let .subscribed(subscription) = status else {
|
|
308
|
+
lock.unlock()
|
|
309
|
+
return
|
|
310
|
+
}
|
|
311
|
+
status = .terminal
|
|
312
|
+
lock.unlock()
|
|
313
|
+
subscription.cancel()
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
var description: String { return "TryScan" }
|
|
317
|
+
|
|
318
|
+
var customMirror: Mirror {
|
|
319
|
+
lock.lock()
|
|
320
|
+
defer { lock.unlock() }
|
|
321
|
+
let children: [Mirror.Child] = [
|
|
322
|
+
("downstream", downstream),
|
|
323
|
+
("status", status),
|
|
324
|
+
("result", result)
|
|
325
|
+
]
|
|
326
|
+
return Mirror(self, children: children)
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
var playgroundDescription: Any { return description }
|
|
330
|
+
}
|
|
331
|
+
}
|