@swiftbrowser/swift 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Package.swift +214 -0
- package/README.md +10 -2
- package/Sources/AVFoundation/AVFoundation.swift +131 -0
- package/Sources/AVFoundation/Asset.swift +487 -0
- package/Sources/AVFoundation/AudioSession.swift +144 -0
- package/Sources/AVFoundation/CMTime.swift +303 -0
- package/Sources/AVFoundation/Capture.swift +688 -0
- package/Sources/AVFoundation/Player.swift +749 -0
- package/Sources/AVFoundation/PlayerView.swift +117 -0
- package/Sources/AVKit/AVKit.swift +132 -0
- package/Sources/Accelerate/Accelerate.swift +122 -0
- package/Sources/AppIntents/AppIntents.swift +144 -0
- package/Sources/AppIntents/Parameters.swift +220 -0
- package/Sources/AppIntents/Shortcuts.swift +159 -0
- package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
- package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
- package/Sources/AuthenticationServices/Authorization.swift +251 -0
- package/Sources/Charts/Charts.swift +61 -0
- package/Sources/Combine/AnyCancellable.swift +65 -0
- package/Sources/Combine/AnyPublisher.swift +148 -0
- package/Sources/Combine/AnySubscriber.swift +230 -0
- package/Sources/Combine/Cancellable.swift +35 -0
- package/Sources/Combine/Codable.swift +29 -0
- package/Sources/Combine/CombineIdentifier.swift +45 -0
- package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
- package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
- package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
- package/Sources/Combine/CurrentValueSubject.swift +252 -0
- package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
- package/Sources/Combine/Future.swift +228 -0
- package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
- package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
- package/Sources/Combine/Helpers/ConduitList.swift +59 -0
- package/Sources/Combine/Helpers/DebugHook.swift +177 -0
- package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
- package/Sources/Combine/Helpers/Locking.swift +30 -0
- package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
- package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
- package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
- package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
- package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
- package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
- package/Sources/Combine/Helpers/Utils.swift +30 -0
- package/Sources/Combine/Helpers/Violations.swift +33 -0
- package/Sources/Combine/ImmediateScheduler.swift +178 -0
- package/Sources/Combine/LICENSE +21 -0
- package/Sources/Combine/NotificationPublisher.swift +48 -0
- package/Sources/Combine/ObjectWillChange.swift +46 -0
- package/Sources/Combine/PassthroughSubject.swift +222 -0
- package/Sources/Combine/Publisher+Subscribe.swift +53 -0
- package/Sources/Combine/Publishers/Deferred.swift +48 -0
- package/Sources/Combine/Publishers/Empty.swift +54 -0
- package/Sources/Combine/Publishers/Fail.swift +42 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
- package/Sources/Combine/Publishers/Just.swift +313 -0
- package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
- package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
- package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
- package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
- package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
- package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
- package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
- package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
- package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
- package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
- package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
- package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
- package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
- package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
- package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
- package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
- package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
- package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
- package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
- package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
- package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
- package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
- package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
- package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
- package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
- package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
- package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
- package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
- package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
- package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
- package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
- package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
- package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
- package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
- package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
- package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
- package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
- package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
- package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
- package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
- package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
- package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
- package/Sources/Combine/Publishers/Publishers.swift +13 -0
- package/Sources/Combine/Publishers/Record.swift +237 -0
- package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
- package/Sources/Combine/Result.swift +46 -0
- package/Sources/Combine/Scheduler.swift +89 -0
- package/Sources/Combine/Schedulers.swift +211 -0
- package/Sources/Combine/Subject+Void.swift +17 -0
- package/Sources/Combine/Subscriber+Void.swift +20 -0
- package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
- package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
- package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
- package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
- package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
- package/Sources/Combine/Subscription.swift +22 -0
- package/Sources/Combine/Subscriptions.swift +42 -0
- package/Sources/Combine/SwiftUIObservation.swift +10 -0
- package/Sources/Combine/_Introspection.swift +107 -0
- package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
- package/Sources/Compression/Compression.swift +365 -0
- package/Sources/Compression/Deflate.swift +407 -0
- package/Sources/Compression/Zlib.swift +179 -0
- package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
- package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
- package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
- package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
- package/Sources/CoreImage/CIColor.swift +41 -0
- package/Sources/CoreImage/CIContext.swift +31 -0
- package/Sources/CoreImage/CIDetector.swift +57 -0
- package/Sources/CoreImage/CIFilter.swift +243 -0
- package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
- package/Sources/CoreImage/CIImage.swift +162 -0
- package/Sources/CoreImage/QRCode.swift +393 -0
- package/Sources/CoreLocation/Coordinate.swift +30 -0
- package/Sources/CoreLocation/Location.swift +65 -0
- package/Sources/CoreML/Evaluation.swift +414 -0
- package/Sources/CoreML/FeatureValue.swift +266 -0
- package/Sources/CoreML/Model.swift +269 -0
- package/Sources/CoreML/MultiArray.swift +92 -0
- package/Sources/CoreML/Specification.swift +233 -0
- package/Sources/CoreText/CoreText.swift +64 -0
- package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
- package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
- package/Sources/CryptoKit/CryptoKit.swift +375 -0
- package/Sources/CryptoKit/Curve25519.swift +317 -0
- package/Sources/CryptoKit/P256.swift +321 -0
- package/Sources/FoundationBridge/AppStorage.swift +165 -0
- package/Sources/FoundationBridge/AssetResources.swift +90 -0
- package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
- package/Sources/FoundationBridge/AsyncImage.swift +116 -0
- package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
- package/Sources/FoundationBridge/Bundle.swift +119 -0
- package/Sources/FoundationBridge/CombineExports.swift +8 -0
- package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
- package/Sources/FoundationBridge/Dispatch.swift +458 -0
- package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
- package/Sources/FoundationBridge/FileImporter.swift +128 -0
- package/Sources/FoundationBridge/FileSystem.swift +68 -0
- package/Sources/FoundationBridge/FoundationBridge.swift +29 -0
- package/Sources/FoundationBridge/HostResolution.swift +31 -0
- package/Sources/FoundationBridge/ItemProvider.swift +655 -0
- package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
- package/Sources/FoundationBridge/Links.swift +127 -0
- package/Sources/FoundationBridge/ListFormatter.swift +32 -0
- package/Sources/FoundationBridge/Locale.swift +86 -0
- package/Sources/FoundationBridge/Localization.swift +149 -0
- package/Sources/FoundationBridge/Locks.swift +50 -0
- package/Sources/FoundationBridge/Markdown.swift +527 -0
- package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
- package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
- package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
- package/Sources/FoundationBridge/Operation.swift +195 -0
- package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
- package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
- package/Sources/FoundationBridge/SceneStorage.swift +78 -0
- package/Sources/FoundationBridge/SecurityExports.swift +8 -0
- package/Sources/FoundationBridge/Selector.swift +226 -0
- package/Sources/FoundationBridge/StringComparators.swift +17 -0
- package/Sources/FoundationBridge/Table.swift +211 -0
- package/Sources/FoundationBridge/TextAttributes.swift +42 -0
- package/Sources/FoundationBridge/Timer.swift +53 -0
- package/Sources/FoundationBridge/UITextChecker.swift +30 -0
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/FoundationBridge/UserDefaults.swift +183 -0
- package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
- package/Sources/FoundationBridge/WebSocket.swift +187 -0
- package/Sources/FoundationModels/FoundationModels.swift +1098 -0
- package/Sources/ImageIO/GIF.swift +72 -0
- package/Sources/ImageIO/ImageIO.swift +248 -0
- package/Sources/ImageIO/ImageTypes.swift +28 -0
- package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
- package/Sources/LocalAuthentication/LAContext.swift +86 -0
- package/Sources/MapKit/Geometry.swift +223 -0
- package/Sources/MapKit/Map.swift +638 -0
- package/Sources/MapKit/MapView.swift +229 -0
- package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
- package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
- package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
- package/Sources/OSLog/OSLog.swift +6 -0
- package/Sources/Photos/Photos.swift +572 -0
- package/Sources/PhotosUI/PhotosPicker.swift +248 -0
- package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
- package/Sources/QuickLook/QuickLook.swift +168 -0
- package/Sources/SafariServices/SafariServices.swift +106 -0
- package/Sources/Security/Security.swift +332 -0
- package/Sources/StoreKit/AppStore.swift +207 -0
- package/Sources/StoreKit/Products.swift +280 -0
- package/Sources/StoreKit/RequestReview.swift +28 -0
- package/Sources/StoreKit/StoreKit1.swift +486 -0
- package/Sources/StoreKit/StoreViews.swift +428 -0
- package/Sources/StoreKit/Transactions.swift +197 -0
- package/Sources/SwiftData/Macros.swift +58 -0
- package/Sources/SwiftData/ModelActor.swift +38 -0
- package/Sources/SwiftData/ModelContainer.swift +129 -0
- package/Sources/SwiftData/ModelContext.swift +451 -0
- package/Sources/SwiftData/PersistentModel.swift +238 -0
- package/Sources/SwiftData/Properties.swift +261 -0
- package/Sources/SwiftData/Query.swift +256 -0
- package/Sources/SwiftData/Schema.swift +192 -0
- package/Sources/SwiftData/Store.swift +146 -0
- package/Sources/SwiftData/StringPredicates.swift +125 -0
- package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
- package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
- package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
- package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
- package/Sources/SwiftDataMacros/Plugin.swift +18 -0
- package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
- package/Sources/SwiftUI/API/Accessibility.swift +181 -0
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +221 -0
- package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
- package/Sources/SwiftUI/API/Animation.swift +285 -0
- package/Sources/SwiftUI/API/App.swift +87 -0
- package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
- package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
- package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
- package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
- package/Sources/SwiftUI/API/Canvas.swift +337 -0
- package/Sources/SwiftUI/API/Color.swift +237 -0
- package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
- package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
- package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
- package/Sources/SwiftUI/API/Commands.swift +106 -0
- package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
- package/Sources/SwiftUI/API/ContentShape.swift +33 -0
- package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
- package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
- package/Sources/SwiftUI/API/Controls.swift +300 -0
- package/Sources/SwiftUI/API/CustomLayout.swift +442 -0
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +92 -0
- package/Sources/SwiftUI/API/EditMode.swift +212 -0
- package/Sources/SwiftUI/API/Effects.swift +388 -0
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +439 -0
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +137 -0
- package/Sources/SwiftUI/API/Font.swift +131 -0
- package/Sources/SwiftUI/API/Gauge.swift +290 -0
- package/Sources/SwiftUI/API/Geometry.swift +89 -0
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +135 -0
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +342 -0
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +188 -0
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +124 -0
- package/Sources/SwiftUI/API/Layout.swift +220 -0
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +331 -0
- package/Sources/SwiftUI/API/Menu.swift +58 -0
- package/Sources/SwiftUI/API/Modifiers.swift +313 -0
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +386 -0
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +293 -0
- package/Sources/SwiftUI/API/OnChange.swift +48 -0
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +411 -0
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +185 -0
- package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
- package/Sources/SwiftUI/API/Popover.swift +41 -0
- package/Sources/SwiftUI/API/Preferences.swift +262 -0
- package/Sources/SwiftUI/API/Presentation.swift +122 -0
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +517 -0
- package/Sources/SwiftUI/API/Publishers.swift +107 -0
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +84 -0
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +104 -0
- package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
- package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +409 -0
- package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
- package/Sources/SwiftUI/API/Sharing.swift +193 -0
- package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
- package/Sources/SwiftUI/API/State.swift +144 -0
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
- package/Sources/SwiftUI/API/StrokeStyle.swift +30 -0
- package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
- package/Sources/SwiftUI/API/TabContent.swift +841 -0
- package/Sources/SwiftUI/API/Table.swift +382 -0
- package/Sources/SwiftUI/API/Tabs.swift +263 -0
- package/Sources/SwiftUI/API/Tasks.swift +35 -0
- package/Sources/SwiftUI/API/Text.swift +386 -0
- package/Sources/SwiftUI/API/TextDates.swift +61 -0
- package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
- package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
- package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
- package/Sources/SwiftUI/API/Timeline.swift +212 -0
- package/Sources/SwiftUI/API/Toolbar.swift +251 -0
- package/Sources/SwiftUI/API/Transfer.swift +145 -0
- package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
- package/Sources/SwiftUI/API/Video.swift +64 -0
- package/Sources/SwiftUI/API/View.swift +215 -0
- package/Sources/SwiftUI/API/ViewModifier.swift +43 -0
- package/Sources/SwiftUI/API/VisualEffect.swift +155 -0
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +325 -0
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +660 -0
- package/Sources/SwiftUI/Charts/ChartContent.swift +376 -0
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Charts/Marks.swift +204 -0
- package/Sources/SwiftUI/Charts/Plottable.swift +99 -0
- package/Sources/SwiftUI/Charts/Scales.swift +326 -0
- package/Sources/SwiftUI/Localization/Localization.swift +498 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +85 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +101 -0
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +143 -0
- package/Sources/SwiftUI/Runtime/JSONParser.swift +443 -0
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +152 -0
- package/Sources/SwiftUI/Runtime/Reconciler.swift +219 -0
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +2146 -0
- package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
- package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
- package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
- package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
- package/Sources/Symbols/Symbols.swift +25 -0
- package/Sources/Translation/Translation.swift +423 -0
- package/Sources/UIKit/Activity.swift +213 -0
- package/Sources/UIKit/Alerts.swift +69 -0
- package/Sources/UIKit/AppDelegate.swift +222 -0
- package/Sources/UIKit/Appearance.swift +84 -0
- package/Sources/UIKit/ColorConversions.swift +70 -0
- package/Sources/UIKit/Controls.swift +225 -0
- package/Sources/UIKit/Device.swift +200 -0
- package/Sources/UIKit/Feedback.swift +65 -0
- package/Sources/UIKit/Font.swift +307 -0
- package/Sources/UIKit/Graphics.swift +204 -0
- package/Sources/UIKit/HostingController.swift +185 -0
- package/Sources/UIKit/Identity.swift +24 -0
- package/Sources/UIKit/Introspectable.swift +510 -0
- package/Sources/UIKit/Pasteboard.swift +363 -0
- package/Sources/UIKit/PhotoAlbum.swift +81 -0
- package/Sources/UIKit/RemoteNotifications.swift +15 -0
- package/Sources/UIKit/Representable.swift +288 -0
- package/Sources/UIKit/SafeArea.swift +12 -0
- package/Sources/UIKit/SceneDelegates.swift +132 -0
- package/Sources/UIKit/Scenes.swift +40 -0
- package/Sources/UIKit/ScrollView.swift +157 -0
- package/Sources/UIKit/ShortcutItems.swift +67 -0
- package/Sources/UIKit/SymbolConfiguration.swift +124 -0
- package/Sources/UIKit/TargetAction.swift +123 -0
- package/Sources/UIKit/TextPaste.swift +161 -0
- package/Sources/UIKit/TextView.swift +538 -0
- package/Sources/UIKit/UIKit.swift +292 -0
- package/Sources/UIKit/UIView.swift +855 -0
- package/Sources/UIKit/ViewTranslation.swift +311 -0
- package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
- package/Sources/UserNotifications/Content.swift +370 -0
- package/Sources/UserNotifications/NotificationCenter.swift +309 -0
- package/Sources/WeatherKit/WeatherKit.swift +228 -0
- package/Sources/WebKit/WebKit.swift +245 -0
- package/Sources/os/os.swift +376 -0
- package/Sources/zlib/zlib.swift +6 -0
- package/index.d.ts +2 -0
- package/index.mjs +16 -0
- package/manifest.d.mts +2 -0
- package/manifest.mjs +39 -0
- package/package.json +30 -4
- package/sync-sources.mjs +33 -0
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.RemoveDuplicates.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 24.10.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher where Output: Equatable {
|
|
9
|
+
|
|
10
|
+
/// Publishes only elements that don’t match the previous element.
|
|
11
|
+
///
|
|
12
|
+
/// Use `removeDuplicates()` to remove repeating elements from an upstream publisher.
|
|
13
|
+
/// This operator has a two-element memory: the operator uses the current and
|
|
14
|
+
/// previously published elements as the basis for its comparison.
|
|
15
|
+
///
|
|
16
|
+
/// In the example below, `removeDuplicates()` triggers on the doubled, tripled, and
|
|
17
|
+
/// quadrupled occurrences of `1`, `3`, and `4` respectively. Because the two-element
|
|
18
|
+
/// memory considers only the current element and the previous element, the operator
|
|
19
|
+
/// prints the final `0` in the example data since its immediate predecessor is `4`.
|
|
20
|
+
///
|
|
21
|
+
/// let numbers = [0, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 0]
|
|
22
|
+
/// cancellable = numbers.publisher
|
|
23
|
+
/// .removeDuplicates()
|
|
24
|
+
/// .sink { print("\($0)", terminator: " ") }
|
|
25
|
+
///
|
|
26
|
+
/// // Prints: "0 1 2 3 4 0"
|
|
27
|
+
///
|
|
28
|
+
/// - Returns: A publisher that consumes — rather than publishes — duplicate elements.
|
|
29
|
+
public func removeDuplicates() -> Publishers.RemoveDuplicates<Self> {
|
|
30
|
+
return removeDuplicates(by: ==)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
extension Publisher {
|
|
35
|
+
|
|
36
|
+
/// Publishes only elements that don’t match the previous element, as evaluated by
|
|
37
|
+
/// a provided closure.
|
|
38
|
+
///
|
|
39
|
+
/// Use `removeDuplicates(by:)` to remove repeating elements from an upstream
|
|
40
|
+
/// publisher based upon the evaluation of the current and previously published
|
|
41
|
+
/// elements using a closure you provide.
|
|
42
|
+
///
|
|
43
|
+
/// Use the `removeDuplicates(by:)` operator when comparing types that don’t
|
|
44
|
+
/// themselves implement `Equatable`, or if you need to compare values differently
|
|
45
|
+
/// than the type’s `Equatable` implementation.
|
|
46
|
+
///
|
|
47
|
+
/// In the example below, the `removeDuplicates(by:)` functionality triggers when
|
|
48
|
+
/// the `x` property of the current and previous elements are equal, otherwise
|
|
49
|
+
/// the operator publishes the current `Point` to the downstream subscriber:
|
|
50
|
+
///
|
|
51
|
+
/// struct Point {
|
|
52
|
+
/// let x: Int
|
|
53
|
+
/// let y: Int
|
|
54
|
+
/// }
|
|
55
|
+
///
|
|
56
|
+
/// let points = [Point(x: 0, y: 0), Point(x: 0, y: 1),
|
|
57
|
+
/// Point(x: 1, y: 1), Point(x: 2, y: 1)]
|
|
58
|
+
/// cancellable = points.publisher
|
|
59
|
+
/// .removeDuplicates { prev, current in
|
|
60
|
+
/// // Considers points to be duplicate if the x coordinate
|
|
61
|
+
/// // is equal, and ignores the y coordinate
|
|
62
|
+
/// prev.x == current.x
|
|
63
|
+
/// }
|
|
64
|
+
/// .sink { print("\($0)", terminator: " ") }
|
|
65
|
+
///
|
|
66
|
+
/// // Prints: Point(x: 0, y: 0) Point(x: 1, y: 1) Point(x: 2, y: 1)
|
|
67
|
+
///
|
|
68
|
+
/// - Parameter predicate: A closure to evaluate whether two elements are equivalent,
|
|
69
|
+
/// for purposes of filtering. Return `true` from this closure to indicate that
|
|
70
|
+
/// the second element is a duplicate of the first.
|
|
71
|
+
/// - Returns: A publisher that consumes — rather than publishes — duplicate elements.
|
|
72
|
+
public func removeDuplicates(
|
|
73
|
+
by predicate: @escaping (Output, Output) -> Bool
|
|
74
|
+
) -> Publishers.RemoveDuplicates<Self> {
|
|
75
|
+
return .init(upstream: self, predicate: predicate)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/// Publishes only elements that don’t match the previous element, as evaluated by
|
|
79
|
+
/// a provided error-throwing closure.
|
|
80
|
+
///
|
|
81
|
+
/// Use `tryRemoveDuplicates(by:)` to remove repeating elements from an upstream
|
|
82
|
+
/// publisher based upon the evaluation of elements using an error-throwing closure
|
|
83
|
+
/// you provide. If your closure throws an error, the publisher terminates with
|
|
84
|
+
/// the error.
|
|
85
|
+
///
|
|
86
|
+
/// In the example below, the closure provided to `tryRemoveDuplicates(by:)` returns
|
|
87
|
+
/// `true` when two consecutive elements are equal, thereby filtering out `0`,
|
|
88
|
+
/// `1`, `2`, and `3`. However, the closure throws an error when it encounters `4`.
|
|
89
|
+
/// The publisher then terminates with this error.
|
|
90
|
+
///
|
|
91
|
+
/// struct BadValuesError: Error {}
|
|
92
|
+
/// let numbers = [0, 0, 0, 0, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
|
|
93
|
+
/// cancellable = numbers.publisher
|
|
94
|
+
/// .tryRemoveDuplicates { first, second -> Bool in
|
|
95
|
+
/// if (first == 4 && second == 4) {
|
|
96
|
+
/// throw BadValuesError()
|
|
97
|
+
/// }
|
|
98
|
+
/// return first == second
|
|
99
|
+
/// }
|
|
100
|
+
/// .sink(
|
|
101
|
+
/// receiveCompletion: { print ("\($0)") },
|
|
102
|
+
/// receiveValue: { print ("\($0)", terminator: " ") }
|
|
103
|
+
/// )
|
|
104
|
+
///
|
|
105
|
+
/// // Prints: "0 1 2 3 4 failure(BadValuesError()"
|
|
106
|
+
///
|
|
107
|
+
/// - Parameter predicate: A closure to evaluate whether two elements are equivalent,
|
|
108
|
+
/// for purposes of filtering. Return `true` from this closure to indicate that
|
|
109
|
+
/// the second element is a duplicate of the first. If this closure throws an error,
|
|
110
|
+
/// the publisher terminates with the thrown error.
|
|
111
|
+
/// - Returns: A publisher that consumes — rather than publishes — duplicate elements.
|
|
112
|
+
public func tryRemoveDuplicates(
|
|
113
|
+
by predicate: @escaping (Output, Output) throws -> Bool
|
|
114
|
+
) -> Publishers.TryRemoveDuplicates<Self> {
|
|
115
|
+
return .init(upstream: self, predicate: predicate)
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
extension Publishers {
|
|
120
|
+
|
|
121
|
+
/// A publisher that publishes only elements that don’t match the previous element.
|
|
122
|
+
public struct RemoveDuplicates<Upstream: Publisher>: Publisher {
|
|
123
|
+
|
|
124
|
+
public typealias Output = Upstream.Output
|
|
125
|
+
|
|
126
|
+
public typealias Failure = Upstream.Failure
|
|
127
|
+
|
|
128
|
+
/// The publisher from which this publisher receives elements.
|
|
129
|
+
public let upstream: Upstream
|
|
130
|
+
|
|
131
|
+
/// The predicate closure used to evaluate whether two elements are duplicates.
|
|
132
|
+
public let predicate: (Output, Output) -> Bool
|
|
133
|
+
|
|
134
|
+
/// Creates a publisher that publishes only elements that don’t match the previous
|
|
135
|
+
/// element, as evaluated by a provided closure.
|
|
136
|
+
///
|
|
137
|
+
/// - Parameter upstream: The publisher from which this publisher receives
|
|
138
|
+
/// elements.
|
|
139
|
+
/// - Parameter predicate: A closure to evaluate whether two elements are
|
|
140
|
+
/// equivalent, for purposes of filtering. Return `true` from this closure
|
|
141
|
+
/// to indicate that the second element is a duplicate of the first.
|
|
142
|
+
public init(upstream: Upstream, predicate: @escaping (Output, Output) -> Bool) {
|
|
143
|
+
self.upstream = upstream
|
|
144
|
+
self.predicate = predicate
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
148
|
+
where Upstream.Failure == Downstream.Failure,
|
|
149
|
+
Upstream.Output == Downstream.Input
|
|
150
|
+
{
|
|
151
|
+
upstream.subscribe(Inner(downstream: subscriber, filter: predicate))
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/// A publisher that publishes only elements that don’t match the previous element,
|
|
156
|
+
/// as evaluated by a provided error-throwing closure.
|
|
157
|
+
public struct TryRemoveDuplicates<Upstream: Publisher>: Publisher {
|
|
158
|
+
|
|
159
|
+
public typealias Output = Upstream.Output
|
|
160
|
+
|
|
161
|
+
public typealias Failure = Error
|
|
162
|
+
|
|
163
|
+
/// The publisher from which this publisher receives elements.
|
|
164
|
+
public let upstream: Upstream
|
|
165
|
+
|
|
166
|
+
/// An error-throwing closure to evaluate whether two elements are equivalent,
|
|
167
|
+
/// for purposes of filtering.
|
|
168
|
+
public let predicate: (Output, Output) throws -> Bool
|
|
169
|
+
|
|
170
|
+
/// Creates a publisher that publishes only elements that don’t match the previous
|
|
171
|
+
/// element, as evaluated by a provided error-throwing closure.
|
|
172
|
+
///
|
|
173
|
+
/// - Parameter upstream: The publisher from which this publisher receives
|
|
174
|
+
/// elements.
|
|
175
|
+
/// - Parameter predicate: An error-throwing closure to evaluate whether two
|
|
176
|
+
/// elements are equivalent, for purposes of filtering. Return `true` from this
|
|
177
|
+
/// closure to indicate that the second element is a duplicate of the first.
|
|
178
|
+
/// If this closure throws an error, the publisher terminates
|
|
179
|
+
/// with the thrown error.
|
|
180
|
+
public init(upstream: Upstream,
|
|
181
|
+
predicate: @escaping (Output, Output) throws -> Bool) {
|
|
182
|
+
self.upstream = upstream
|
|
183
|
+
self.predicate = predicate
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
187
|
+
where Upstream.Output == Downstream.Input, Downstream.Failure == Error
|
|
188
|
+
{
|
|
189
|
+
upstream.subscribe(Inner(downstream: subscriber, filter: predicate))
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
extension Publishers.RemoveDuplicates {
|
|
195
|
+
private final class Inner<Downstream: Subscriber>
|
|
196
|
+
: FilterProducer<Downstream,
|
|
197
|
+
Upstream.Output,
|
|
198
|
+
Upstream.Output,
|
|
199
|
+
Upstream.Failure,
|
|
200
|
+
(Output, Output) -> Bool>
|
|
201
|
+
where Downstream.Input == Upstream.Output, Downstream.Failure == Upstream.Failure
|
|
202
|
+
{
|
|
203
|
+
private var last: Upstream.Output?
|
|
204
|
+
|
|
205
|
+
override func receive(
|
|
206
|
+
newValue: Input
|
|
207
|
+
) -> PartialCompletion<Upstream.Output?, Downstream.Failure> {
|
|
208
|
+
let last = self.last
|
|
209
|
+
self.last = newValue
|
|
210
|
+
return last.map {
|
|
211
|
+
filter($0, newValue) ? .continue(nil) : .continue(newValue)
|
|
212
|
+
} ?? .continue(newValue)
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
override var description: String { return "RemoveDuplicates" }
|
|
216
|
+
|
|
217
|
+
override var customMirror: Mirror {
|
|
218
|
+
let children: [Mirror.Child] = [
|
|
219
|
+
("downstream", downstream),
|
|
220
|
+
("last", last as Any)
|
|
221
|
+
]
|
|
222
|
+
return Mirror(self, children: children)
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
extension Publishers.TryRemoveDuplicates {
|
|
228
|
+
private final class Inner<Downstream: Subscriber>
|
|
229
|
+
: FilterProducer<Downstream,
|
|
230
|
+
Upstream.Output,
|
|
231
|
+
Upstream.Output,
|
|
232
|
+
Upstream.Failure,
|
|
233
|
+
(Output, Output) throws -> Bool>
|
|
234
|
+
where Downstream.Input == Upstream.Output, Downstream.Failure == Error
|
|
235
|
+
{
|
|
236
|
+
private var last: Upstream.Output?
|
|
237
|
+
|
|
238
|
+
override func receive(
|
|
239
|
+
newValue: Input
|
|
240
|
+
) -> PartialCompletion<Upstream.Output?, Downstream.Failure> {
|
|
241
|
+
let last = self.last
|
|
242
|
+
self.last = newValue
|
|
243
|
+
return last.map {
|
|
244
|
+
do {
|
|
245
|
+
return try filter($0, newValue)
|
|
246
|
+
? .continue(nil)
|
|
247
|
+
: .continue(newValue)
|
|
248
|
+
} catch {
|
|
249
|
+
return .failure(error)
|
|
250
|
+
}
|
|
251
|
+
} ?? .continue(newValue)
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
override var description: String { return "TryRemoveDuplicates" }
|
|
255
|
+
|
|
256
|
+
override var customMirror: Mirror {
|
|
257
|
+
let children: [Mirror.Child] = [
|
|
258
|
+
("downstream", downstream),
|
|
259
|
+
("last", last as Any)
|
|
260
|
+
]
|
|
261
|
+
return Mirror(self, children: children)
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.ReplaceEmpty.swift
|
|
3
|
+
// OpenCombine
|
|
4
|
+
//
|
|
5
|
+
// Created by Joe Spadafora on 12/10/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Replaces an empty stream with the provided element.
|
|
11
|
+
///
|
|
12
|
+
/// Use `replaceEmpty(with:)` to provide a replacement element if the upstream
|
|
13
|
+
/// publisher finishes without producing any elements.
|
|
14
|
+
///
|
|
15
|
+
/// In the example below, the empty `Double` array publisher doesn’t produce any
|
|
16
|
+
/// elements, so `replaceEmpty(with:)` publishes `Double.nan` and finishes normally.
|
|
17
|
+
///
|
|
18
|
+
/// let numbers: [Double] = []
|
|
19
|
+
/// cancellable = numbers.publisher
|
|
20
|
+
/// .replaceEmpty(with: Double.nan)
|
|
21
|
+
/// .sink { print("\($0)", terminator: " ") }
|
|
22
|
+
///
|
|
23
|
+
/// // Prints "(nan)".
|
|
24
|
+
///
|
|
25
|
+
/// Conversely, providing a non-empty publisher publishes all elements and
|
|
26
|
+
/// the publisher then terminates normally:
|
|
27
|
+
///
|
|
28
|
+
/// let otherNumbers: [Double] = [1.0, 2.0, 3.0]
|
|
29
|
+
/// cancellable2 = otherNumbers.publisher
|
|
30
|
+
/// .replaceEmpty(with: Double.nan)
|
|
31
|
+
/// .sink { print("\($0)", terminator: " ") }
|
|
32
|
+
///
|
|
33
|
+
/// // Prints: 1.0 2.0 3.0
|
|
34
|
+
///
|
|
35
|
+
/// - Parameter output: An element to emit when the upstream publisher finishes
|
|
36
|
+
/// without emitting any elements.
|
|
37
|
+
/// - Returns: A publisher that replaces an empty stream with the provided output
|
|
38
|
+
/// element.
|
|
39
|
+
public func replaceEmpty(with output: Output) -> Publishers.ReplaceEmpty<Self> {
|
|
40
|
+
return .init(upstream: self, output: output)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
extension Publishers {
|
|
45
|
+
|
|
46
|
+
/// A publisher that replaces an empty stream with a provided element.
|
|
47
|
+
public struct ReplaceEmpty<Upstream: Publisher>: Publisher {
|
|
48
|
+
|
|
49
|
+
public typealias Output = Upstream.Output
|
|
50
|
+
|
|
51
|
+
public typealias Failure = Upstream.Failure
|
|
52
|
+
|
|
53
|
+
/// The element to deliver when the upstream publisher finishes
|
|
54
|
+
/// without delivering any elements.
|
|
55
|
+
public let output: Upstream.Output
|
|
56
|
+
|
|
57
|
+
/// The publisher from which this publisher receives elements.
|
|
58
|
+
public let upstream: Upstream
|
|
59
|
+
|
|
60
|
+
public init(upstream: Upstream, output: Output) {
|
|
61
|
+
self.upstream = upstream
|
|
62
|
+
self.output = output
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
66
|
+
where Upstream.Failure == Downstream.Failure,
|
|
67
|
+
Upstream.Output == Downstream.Input
|
|
68
|
+
{
|
|
69
|
+
let inner = Inner(downstream: subscriber, output: output)
|
|
70
|
+
upstream.subscribe(inner)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
extension Publishers.ReplaceEmpty: Equatable
|
|
76
|
+
where Upstream: Equatable, Upstream.Output: Equatable {}
|
|
77
|
+
|
|
78
|
+
extension Publishers.ReplaceEmpty {
|
|
79
|
+
|
|
80
|
+
private final class Inner<Downstream: Subscriber>
|
|
81
|
+
: Subscriber,
|
|
82
|
+
Subscription,
|
|
83
|
+
CustomStringConvertible,
|
|
84
|
+
CustomReflectable,
|
|
85
|
+
CustomPlaygroundDisplayConvertible
|
|
86
|
+
where Upstream.Failure == Downstream.Failure,
|
|
87
|
+
Upstream.Output == Downstream.Input
|
|
88
|
+
{
|
|
89
|
+
|
|
90
|
+
typealias Input = Upstream.Output
|
|
91
|
+
typealias Failure = Upstream.Failure
|
|
92
|
+
|
|
93
|
+
private let output: Output
|
|
94
|
+
private let downstream: Downstream
|
|
95
|
+
|
|
96
|
+
private var receivedUpstream = false
|
|
97
|
+
private var lock = UnfairLock.allocate()
|
|
98
|
+
private var downstreamRequested = false
|
|
99
|
+
private var finishedWithoutUpstream = false
|
|
100
|
+
|
|
101
|
+
private var status = SubscriptionStatus.awaitingSubscription
|
|
102
|
+
|
|
103
|
+
fileprivate init(downstream: Downstream, output: Output) {
|
|
104
|
+
self.downstream = downstream
|
|
105
|
+
self.output = output
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
deinit {
|
|
109
|
+
lock.deallocate()
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
func receive(subscription: Subscription) {
|
|
113
|
+
lock.lock()
|
|
114
|
+
guard case .awaitingSubscription = status else {
|
|
115
|
+
lock.unlock()
|
|
116
|
+
subscription.cancel()
|
|
117
|
+
return
|
|
118
|
+
}
|
|
119
|
+
status = .subscribed(subscription)
|
|
120
|
+
lock.unlock()
|
|
121
|
+
downstream.receive(subscription: self)
|
|
122
|
+
subscription.request(.unlimited)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
func receive(_ input: Upstream.Output) -> Subscribers.Demand {
|
|
126
|
+
lock.lock()
|
|
127
|
+
guard case .subscribed = status else {
|
|
128
|
+
lock.unlock()
|
|
129
|
+
return .none
|
|
130
|
+
}
|
|
131
|
+
receivedUpstream = true
|
|
132
|
+
lock.unlock()
|
|
133
|
+
return downstream.receive(input)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
func receive(completion: Subscribers.Completion<Upstream.Failure>) {
|
|
137
|
+
lock.lock()
|
|
138
|
+
guard case .subscribed = status else {
|
|
139
|
+
lock.unlock()
|
|
140
|
+
return
|
|
141
|
+
}
|
|
142
|
+
status = .terminal
|
|
143
|
+
if receivedUpstream {
|
|
144
|
+
lock.unlock()
|
|
145
|
+
downstream.receive(completion: completion)
|
|
146
|
+
return
|
|
147
|
+
}
|
|
148
|
+
switch completion {
|
|
149
|
+
case .finished:
|
|
150
|
+
if downstreamRequested {
|
|
151
|
+
lock.unlock()
|
|
152
|
+
_ = downstream.receive(output)
|
|
153
|
+
downstream.receive(completion: completion)
|
|
154
|
+
return
|
|
155
|
+
}
|
|
156
|
+
finishedWithoutUpstream = true
|
|
157
|
+
lock.unlock()
|
|
158
|
+
case .failure:
|
|
159
|
+
lock.unlock()
|
|
160
|
+
downstream.receive(completion: completion)
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
func request(_ demand: Subscribers.Demand) {
|
|
165
|
+
demand.assertNonZero()
|
|
166
|
+
lock.lock()
|
|
167
|
+
downstreamRequested = true
|
|
168
|
+
if finishedWithoutUpstream {
|
|
169
|
+
lock.unlock()
|
|
170
|
+
_ = downstream.receive(output)
|
|
171
|
+
downstream.receive(completion: .finished)
|
|
172
|
+
return
|
|
173
|
+
}
|
|
174
|
+
guard case let .subscribed(subscription) = status else {
|
|
175
|
+
lock.unlock()
|
|
176
|
+
return
|
|
177
|
+
}
|
|
178
|
+
lock.unlock()
|
|
179
|
+
subscription.request(demand)
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
func cancel() {
|
|
183
|
+
lock.lock()
|
|
184
|
+
guard case let .subscribed(subscription) = status else {
|
|
185
|
+
lock.unlock()
|
|
186
|
+
return
|
|
187
|
+
}
|
|
188
|
+
status = .terminal
|
|
189
|
+
lock.unlock()
|
|
190
|
+
subscription.cancel()
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
var description: String { return "ReplaceEmpty" }
|
|
194
|
+
|
|
195
|
+
var customMirror: Mirror {
|
|
196
|
+
return Mirror(self, children: EmptyCollection())
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
var playgroundDescription: Any { return description }
|
|
200
|
+
}
|
|
201
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.ReplaceError.swift
|
|
3
|
+
// OpenCombine
|
|
4
|
+
//
|
|
5
|
+
// Created by Bogdan Vlad on 8/29/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Replaces any errors in the stream with the provided element.
|
|
11
|
+
///
|
|
12
|
+
/// If the upstream publisher fails with an error, this publisher emits the provided
|
|
13
|
+
/// element, then finishes normally.
|
|
14
|
+
///
|
|
15
|
+
/// In the example below, a publisher of strings fails with a `MyError` instance,
|
|
16
|
+
/// which sends a failure completion downstream. The `replaceError(with:)` operator
|
|
17
|
+
/// handles the failure by publishing the string `(replacement element)` and
|
|
18
|
+
/// completing normally.
|
|
19
|
+
///
|
|
20
|
+
/// struct MyError: Error {}
|
|
21
|
+
/// let fail = Fail<String, MyError>(error: MyError())
|
|
22
|
+
/// cancellable = fail
|
|
23
|
+
/// .replaceError(with: "(replacement element)")
|
|
24
|
+
/// .sink(
|
|
25
|
+
/// receiveCompletion: { print ("\($0)") },
|
|
26
|
+
/// receiveValue: { print ("\($0)", terminator: " ") }
|
|
27
|
+
/// )
|
|
28
|
+
///
|
|
29
|
+
/// // Prints: "(replacement element) finished".
|
|
30
|
+
///
|
|
31
|
+
/// This `replaceError(with:)` functionality is useful when you want to handle
|
|
32
|
+
/// an error by sending a single replacement element and end the stream.
|
|
33
|
+
/// Use `catch(_:)` to recover from an error and provide a replacement publisher
|
|
34
|
+
/// to continue providing elements to the downstream subscriber.
|
|
35
|
+
///
|
|
36
|
+
/// - Parameter output: An element to emit when the upstream publisher fails.
|
|
37
|
+
/// - Returns: A publisher that replaces an error from the upstream publisher with
|
|
38
|
+
/// the provided output element.
|
|
39
|
+
public func replaceError(with output: Output) -> Publishers.ReplaceError<Self> {
|
|
40
|
+
return .init(upstream: self, output: output)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
extension Publishers {
|
|
45
|
+
/// A publisher that replaces any errors in the stream with a provided element.
|
|
46
|
+
public struct ReplaceError<Upstream: Publisher>: Publisher {
|
|
47
|
+
|
|
48
|
+
/// The kind of values published by this publisher.
|
|
49
|
+
public typealias Output = Upstream.Output
|
|
50
|
+
|
|
51
|
+
/// The kind of errors this publisher might publish.
|
|
52
|
+
///
|
|
53
|
+
/// Use `Never` if this `Publisher` does not publish errors.
|
|
54
|
+
public typealias Failure = Never
|
|
55
|
+
|
|
56
|
+
/// The element with which to replace errors from the upstream publisher.
|
|
57
|
+
public let output: Upstream.Output
|
|
58
|
+
|
|
59
|
+
/// The publisher from which this publisher receives elements.
|
|
60
|
+
public let upstream: Upstream
|
|
61
|
+
|
|
62
|
+
public init(upstream: Upstream,
|
|
63
|
+
output: Output) {
|
|
64
|
+
self.upstream = upstream
|
|
65
|
+
self.output = output
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/// This function is called to attach the specified `Subscriber`
|
|
69
|
+
/// to this `Publisher` by `subscribe(_:)`
|
|
70
|
+
///
|
|
71
|
+
/// - SeeAlso: `subscribe(_:)`
|
|
72
|
+
/// - Parameters:
|
|
73
|
+
/// - subscriber: The subscriber to attach to this `Publisher`.
|
|
74
|
+
/// once attached it can begin to receive values.
|
|
75
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
76
|
+
where Upstream.Output == Downstream.Input, Downstream.Failure == Failure
|
|
77
|
+
{
|
|
78
|
+
upstream.subscribe(Inner(downstream: subscriber, output: output))
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
extension Publishers.ReplaceError: Equatable
|
|
84
|
+
where Upstream: Equatable, Upstream.Output: Equatable
|
|
85
|
+
{}
|
|
86
|
+
|
|
87
|
+
extension Publishers.ReplaceError {
|
|
88
|
+
|
|
89
|
+
private final class Inner<Downstream: Subscriber>
|
|
90
|
+
: Subscriber,
|
|
91
|
+
Subscription,
|
|
92
|
+
CustomStringConvertible,
|
|
93
|
+
CustomReflectable,
|
|
94
|
+
CustomPlaygroundDisplayConvertible
|
|
95
|
+
where Upstream.Output == Downstream.Input
|
|
96
|
+
{
|
|
97
|
+
typealias Input = Upstream.Output
|
|
98
|
+
typealias Failure = Upstream.Failure
|
|
99
|
+
|
|
100
|
+
private let output: Upstream.Output
|
|
101
|
+
private let downstream: Downstream
|
|
102
|
+
private var status = SubscriptionStatus.awaitingSubscription
|
|
103
|
+
private var terminated = false
|
|
104
|
+
private var pendingDemand = Subscribers.Demand.none
|
|
105
|
+
private var lock = UnfairLock.allocate()
|
|
106
|
+
|
|
107
|
+
fileprivate init(downstream: Downstream, output: Upstream.Output) {
|
|
108
|
+
self.downstream = downstream
|
|
109
|
+
self.output = output
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
deinit {
|
|
113
|
+
lock.deallocate()
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
func receive(subscription: Subscription) {
|
|
117
|
+
lock.lock()
|
|
118
|
+
guard case .awaitingSubscription = status else {
|
|
119
|
+
lock.unlock()
|
|
120
|
+
subscription.cancel()
|
|
121
|
+
return
|
|
122
|
+
}
|
|
123
|
+
status = .subscribed(subscription)
|
|
124
|
+
lock.unlock()
|
|
125
|
+
downstream.receive(subscription: self)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
129
|
+
lock.lock()
|
|
130
|
+
guard case .subscribed = status else {
|
|
131
|
+
lock.unlock()
|
|
132
|
+
return .none
|
|
133
|
+
}
|
|
134
|
+
pendingDemand -= 1
|
|
135
|
+
lock.unlock()
|
|
136
|
+
let demand = downstream.receive(input)
|
|
137
|
+
if demand == .none {
|
|
138
|
+
return .none
|
|
139
|
+
}
|
|
140
|
+
lock.lock()
|
|
141
|
+
pendingDemand += demand
|
|
142
|
+
lock.unlock()
|
|
143
|
+
return demand
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
func receive(completion: Subscribers.Completion<Failure>) {
|
|
147
|
+
lock.lock()
|
|
148
|
+
guard case .subscribed = status, !terminated else {
|
|
149
|
+
lock.unlock()
|
|
150
|
+
return
|
|
151
|
+
}
|
|
152
|
+
switch completion {
|
|
153
|
+
case .finished:
|
|
154
|
+
status = .terminal
|
|
155
|
+
lock.unlock()
|
|
156
|
+
downstream.receive(completion: .finished)
|
|
157
|
+
case .failure:
|
|
158
|
+
// If there was no demand from downstream,
|
|
159
|
+
// ReplaceError does not forward the value that
|
|
160
|
+
// replaces the error until it is requested.
|
|
161
|
+
if pendingDemand == .none {
|
|
162
|
+
terminated = true
|
|
163
|
+
lock.unlock()
|
|
164
|
+
return
|
|
165
|
+
}
|
|
166
|
+
status = .terminal
|
|
167
|
+
lock.unlock()
|
|
168
|
+
_ = downstream.receive(output)
|
|
169
|
+
downstream.receive(completion: .finished)
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
func request(_ demand: Subscribers.Demand) {
|
|
174
|
+
demand.assertNonZero()
|
|
175
|
+
lock.lock()
|
|
176
|
+
if terminated {
|
|
177
|
+
status = .terminal
|
|
178
|
+
lock.unlock()
|
|
179
|
+
_ = downstream.receive(output)
|
|
180
|
+
downstream.receive(completion: .finished)
|
|
181
|
+
return
|
|
182
|
+
}
|
|
183
|
+
pendingDemand += demand
|
|
184
|
+
guard case let .subscribed(subscription) = status else {
|
|
185
|
+
lock.unlock()
|
|
186
|
+
return
|
|
187
|
+
}
|
|
188
|
+
lock.unlock()
|
|
189
|
+
subscription.request(demand)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
func cancel() {
|
|
193
|
+
lock.lock()
|
|
194
|
+
guard case let .subscribed(subscription) = status else {
|
|
195
|
+
lock.unlock()
|
|
196
|
+
return
|
|
197
|
+
}
|
|
198
|
+
status = .terminal
|
|
199
|
+
lock.unlock()
|
|
200
|
+
subscription.cancel()
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
var description: String { return "ReplaceError" }
|
|
204
|
+
|
|
205
|
+
var customMirror: Mirror {
|
|
206
|
+
return Mirror(self, children: EmptyCollection())
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
var playgroundDescription: Any { return description }
|
|
210
|
+
}
|
|
211
|
+
}
|