@swiftbrowser/swift 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Package.swift +200 -9
- package/README.md +7 -9
- package/Sources/AVFoundation/AVFoundation.swift +131 -0
- package/Sources/AVFoundation/Asset.swift +487 -0
- package/Sources/AVFoundation/AudioSession.swift +144 -0
- package/Sources/AVFoundation/CMTime.swift +303 -0
- package/Sources/AVFoundation/Capture.swift +688 -0
- package/Sources/AVFoundation/Player.swift +749 -0
- package/Sources/AVFoundation/PlayerView.swift +117 -0
- package/Sources/AVKit/AVKit.swift +132 -0
- package/Sources/Accelerate/Accelerate.swift +122 -0
- package/Sources/AppIntents/AppIntents.swift +144 -0
- package/Sources/AppIntents/Parameters.swift +220 -0
- package/Sources/AppIntents/Shortcuts.swift +159 -0
- package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
- package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
- package/Sources/AuthenticationServices/Authorization.swift +251 -0
- package/Sources/Charts/Charts.swift +0 -4
- package/Sources/Combine/AnyCancellable.swift +65 -0
- package/Sources/Combine/AnyPublisher.swift +148 -0
- package/Sources/Combine/AnySubscriber.swift +230 -0
- package/Sources/Combine/Cancellable.swift +35 -0
- package/Sources/Combine/Codable.swift +29 -0
- package/Sources/Combine/CombineIdentifier.swift +45 -0
- package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
- package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
- package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
- package/Sources/Combine/CurrentValueSubject.swift +252 -0
- package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
- package/Sources/Combine/Future.swift +228 -0
- package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
- package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
- package/Sources/Combine/Helpers/ConduitList.swift +59 -0
- package/Sources/Combine/Helpers/DebugHook.swift +177 -0
- package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
- package/Sources/Combine/Helpers/Locking.swift +30 -0
- package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
- package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
- package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
- package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
- package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
- package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
- package/Sources/Combine/Helpers/Utils.swift +30 -0
- package/Sources/Combine/Helpers/Violations.swift +33 -0
- package/Sources/Combine/ImmediateScheduler.swift +178 -0
- package/Sources/Combine/LICENSE +21 -0
- package/Sources/Combine/NotificationPublisher.swift +48 -0
- package/Sources/Combine/ObjectWillChange.swift +46 -0
- package/Sources/Combine/PassthroughSubject.swift +222 -0
- package/Sources/Combine/Publisher+Subscribe.swift +53 -0
- package/Sources/Combine/Publishers/Deferred.swift +48 -0
- package/Sources/Combine/Publishers/Empty.swift +54 -0
- package/Sources/Combine/Publishers/Fail.swift +42 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
- package/Sources/Combine/Publishers/Just.swift +313 -0
- package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
- package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
- package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
- package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
- package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
- package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
- package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
- package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
- package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
- package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
- package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
- package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
- package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
- package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
- package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
- package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
- package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
- package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
- package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
- package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
- package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
- package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
- package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
- package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
- package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
- package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
- package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
- package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
- package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
- package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
- package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
- package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
- package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
- package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
- package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
- package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
- package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
- package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
- package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
- package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
- package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
- package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
- package/Sources/Combine/Publishers/Publishers.swift +13 -0
- package/Sources/Combine/Publishers/Record.swift +237 -0
- package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
- package/Sources/Combine/Result.swift +46 -0
- package/Sources/Combine/Scheduler.swift +89 -0
- package/Sources/Combine/Schedulers.swift +211 -0
- package/Sources/Combine/Subject+Void.swift +17 -0
- package/Sources/Combine/Subscriber+Void.swift +20 -0
- package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
- package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
- package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
- package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
- package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
- package/Sources/Combine/Subscription.swift +22 -0
- package/Sources/Combine/Subscriptions.swift +42 -0
- package/Sources/Combine/SwiftUIObservation.swift +10 -0
- package/Sources/Combine/_Introspection.swift +107 -0
- package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
- package/Sources/Compression/Compression.swift +365 -0
- package/Sources/Compression/Deflate.swift +407 -0
- package/Sources/Compression/Zlib.swift +179 -0
- package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
- package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
- package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
- package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
- package/Sources/CoreImage/CIColor.swift +41 -0
- package/Sources/CoreImage/CIContext.swift +31 -0
- package/Sources/CoreImage/CIDetector.swift +57 -0
- package/Sources/CoreImage/CIFilter.swift +243 -0
- package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
- package/Sources/CoreImage/CIImage.swift +162 -0
- package/Sources/CoreImage/QRCode.swift +393 -0
- package/Sources/CoreLocation/Coordinate.swift +30 -0
- package/Sources/CoreLocation/Location.swift +65 -0
- package/Sources/CoreML/Evaluation.swift +414 -0
- package/Sources/CoreML/FeatureValue.swift +266 -0
- package/Sources/CoreML/Model.swift +269 -0
- package/Sources/CoreML/MultiArray.swift +92 -0
- package/Sources/CoreML/Specification.swift +233 -0
- package/Sources/CoreText/CoreText.swift +64 -0
- package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
- package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
- package/Sources/CryptoKit/CryptoKit.swift +375 -0
- package/Sources/CryptoKit/Curve25519.swift +317 -0
- package/Sources/CryptoKit/P256.swift +321 -0
- package/Sources/FoundationBridge/AppStorage.swift +165 -0
- package/Sources/FoundationBridge/AssetResources.swift +90 -0
- package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
- package/Sources/FoundationBridge/AsyncImage.swift +116 -0
- package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
- package/Sources/{_FoundationCommon → FoundationBridge}/Bundle.swift +41 -4
- package/Sources/FoundationBridge/CombineExports.swift +8 -0
- package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
- package/Sources/FoundationBridge/Dispatch.swift +458 -0
- package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
- package/Sources/FoundationBridge/FileImporter.swift +128 -0
- package/Sources/FoundationBridge/FileSystem.swift +68 -0
- package/Sources/FoundationBridge/FoundationBridge.swift +24 -72
- package/Sources/FoundationBridge/HostResolution.swift +31 -0
- package/Sources/FoundationBridge/ItemProvider.swift +655 -0
- package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
- package/Sources/FoundationBridge/Links.swift +127 -0
- package/Sources/FoundationBridge/ListFormatter.swift +32 -0
- package/Sources/FoundationBridge/Localization.swift +149 -0
- package/Sources/FoundationBridge/Locks.swift +50 -0
- package/Sources/FoundationBridge/Markdown.swift +527 -0
- package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
- package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
- package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
- package/Sources/FoundationBridge/Operation.swift +195 -0
- package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
- package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
- package/Sources/FoundationBridge/SceneStorage.swift +78 -0
- package/Sources/FoundationBridge/SecurityExports.swift +8 -0
- package/Sources/FoundationBridge/Selector.swift +226 -0
- package/Sources/FoundationBridge/StringComparators.swift +17 -0
- package/Sources/FoundationBridge/Table.swift +211 -0
- package/Sources/FoundationBridge/TextAttributes.swift +42 -0
- package/Sources/FoundationBridge/Timer.swift +6 -1
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/{_FoundationCommon → FoundationBridge}/UserDefaults.swift +17 -4
- package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
- package/Sources/FoundationBridge/WebSocket.swift +187 -0
- package/Sources/FoundationModels/FoundationModels.swift +1098 -0
- package/Sources/ImageIO/GIF.swift +72 -0
- package/Sources/ImageIO/ImageIO.swift +248 -0
- package/Sources/ImageIO/ImageTypes.swift +28 -0
- package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
- package/Sources/LocalAuthentication/LAContext.swift +86 -0
- package/Sources/MapKit/Geometry.swift +223 -0
- package/Sources/MapKit/Map.swift +638 -0
- package/Sources/MapKit/MapView.swift +229 -0
- package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
- package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
- package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
- package/Sources/OSLog/OSLog.swift +6 -0
- package/Sources/Photos/Photos.swift +572 -0
- package/Sources/PhotosUI/PhotosPicker.swift +248 -0
- package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
- package/Sources/QuickLook/QuickLook.swift +168 -0
- package/Sources/SafariServices/SafariServices.swift +106 -0
- package/Sources/Security/Security.swift +332 -0
- package/Sources/StoreKit/AppStore.swift +207 -0
- package/Sources/StoreKit/Products.swift +280 -0
- package/Sources/StoreKit/RequestReview.swift +28 -0
- package/Sources/StoreKit/StoreKit1.swift +486 -0
- package/Sources/StoreKit/StoreViews.swift +428 -0
- package/Sources/StoreKit/Transactions.swift +197 -0
- package/Sources/SwiftData/Macros.swift +58 -0
- package/Sources/SwiftData/ModelActor.swift +38 -0
- package/Sources/SwiftData/ModelContainer.swift +129 -0
- package/Sources/SwiftData/ModelContext.swift +451 -0
- package/Sources/SwiftData/PersistentModel.swift +238 -0
- package/Sources/SwiftData/Properties.swift +261 -0
- package/Sources/SwiftData/Query.swift +256 -0
- package/Sources/SwiftData/Schema.swift +192 -0
- package/Sources/SwiftData/Store.swift +146 -0
- package/Sources/SwiftData/StringPredicates.swift +125 -0
- package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
- package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
- package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
- package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
- package/Sources/SwiftDataMacros/Plugin.swift +18 -0
- package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
- package/Sources/SwiftUI/API/Accessibility.swift +55 -6
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +1 -1
- package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
- package/Sources/SwiftUI/API/Animation.swift +37 -5
- package/Sources/SwiftUI/API/App.swift +31 -1
- package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
- package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
- package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
- package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
- package/Sources/SwiftUI/API/Canvas.swift +337 -0
- package/Sources/SwiftUI/API/Color.swift +104 -28
- package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
- package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
- package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
- package/Sources/SwiftUI/API/Commands.swift +106 -0
- package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
- package/Sources/SwiftUI/API/ContentShape.swift +33 -0
- package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
- package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
- package/Sources/SwiftUI/API/Controls.swift +59 -27
- package/Sources/SwiftUI/API/CustomLayout.swift +49 -10
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +1 -1
- package/Sources/SwiftUI/API/EditMode.swift +25 -82
- package/Sources/SwiftUI/API/Effects.swift +105 -7
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +93 -9
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +11 -3
- package/Sources/SwiftUI/API/Gauge.swift +3 -2
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +13 -2
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +1 -1
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +1 -1
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +13 -6
- package/Sources/SwiftUI/API/Layout.swift +67 -12
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +61 -6
- package/Sources/SwiftUI/API/Menu.swift +8 -1
- package/Sources/SwiftUI/API/Modifiers.swift +80 -10
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +24 -9
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +16 -2
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +48 -31
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +11 -2
- package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
- package/Sources/SwiftUI/API/Popover.swift +41 -0
- package/Sources/SwiftUI/API/Preferences.swift +262 -0
- package/Sources/SwiftUI/API/Presentation.swift +17 -4
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +164 -37
- package/Sources/SwiftUI/API/Publishers.swift +4 -4
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +3 -2
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +3 -3
- package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
- package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +105 -7
- package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
- package/Sources/SwiftUI/API/Sharing.swift +193 -0
- package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
- package/Sources/SwiftUI/API/State.swift +18 -1
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
- package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
- package/Sources/SwiftUI/API/TabContent.swift +841 -0
- package/Sources/SwiftUI/API/Table.swift +382 -0
- package/Sources/SwiftUI/API/Tabs.swift +148 -4
- package/Sources/SwiftUI/API/Tasks.swift +2 -2
- package/Sources/SwiftUI/API/Text.swift +386 -0
- package/Sources/SwiftUI/API/TextDates.swift +61 -0
- package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
- package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
- package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
- package/Sources/SwiftUI/API/Toolbar.swift +52 -16
- package/Sources/SwiftUI/API/Transfer.swift +145 -0
- package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
- package/Sources/SwiftUI/API/Video.swift +64 -0
- package/Sources/SwiftUI/API/View.swift +10 -2
- package/Sources/SwiftUI/API/ViewModifier.swift +4 -1
- package/Sources/SwiftUI/API/VisualEffect.swift +74 -1
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +7 -1
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +17 -3
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Localization/Localization.swift +498 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +2 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +37 -1
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +76 -4
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +58 -12
- package/Sources/SwiftUI/Runtime/Reconciler.swift +10 -1
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +977 -198
- package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
- package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
- package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
- package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
- package/Sources/Symbols/Symbols.swift +25 -0
- package/Sources/Translation/Translation.swift +423 -0
- package/Sources/UIKit/Activity.swift +213 -0
- package/Sources/UIKit/Alerts.swift +69 -0
- package/Sources/UIKit/AppDelegate.swift +222 -0
- package/Sources/UIKit/Appearance.swift +84 -0
- package/Sources/UIKit/ColorConversions.swift +70 -0
- package/Sources/UIKit/Controls.swift +225 -0
- package/Sources/UIKit/Device.swift +200 -0
- package/Sources/UIKit/Feedback.swift +65 -0
- package/Sources/UIKit/Font.swift +307 -0
- package/Sources/UIKit/Graphics.swift +204 -0
- package/Sources/UIKit/HostingController.swift +185 -0
- package/Sources/UIKit/Identity.swift +24 -0
- package/Sources/UIKit/Introspectable.swift +510 -0
- package/Sources/UIKit/Pasteboard.swift +363 -0
- package/Sources/UIKit/PhotoAlbum.swift +81 -0
- package/Sources/UIKit/RemoteNotifications.swift +15 -0
- package/Sources/UIKit/Representable.swift +288 -0
- package/Sources/UIKit/SafeArea.swift +12 -0
- package/Sources/UIKit/SceneDelegates.swift +132 -0
- package/Sources/UIKit/Scenes.swift +40 -0
- package/Sources/UIKit/ScrollView.swift +157 -0
- package/Sources/UIKit/ShortcutItems.swift +67 -0
- package/Sources/UIKit/SymbolConfiguration.swift +124 -0
- package/Sources/UIKit/TargetAction.swift +123 -0
- package/Sources/UIKit/TextPaste.swift +161 -0
- package/Sources/UIKit/TextView.swift +538 -0
- package/Sources/UIKit/UIKit.swift +292 -0
- package/Sources/UIKit/UIView.swift +855 -0
- package/Sources/UIKit/ViewTranslation.swift +311 -0
- package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
- package/Sources/UserNotifications/Content.swift +370 -0
- package/Sources/UserNotifications/NotificationCenter.swift +309 -0
- package/Sources/WeatherKit/WeatherKit.swift +228 -0
- package/Sources/WebKit/WebKit.swift +245 -0
- package/Sources/os/os.swift +376 -0
- package/Sources/zlib/zlib.swift +6 -0
- package/index.d.ts +1 -1
- package/index.mjs +2 -2
- package/manifest.d.mts +2 -0
- package/manifest.mjs +39 -0
- package/package.json +5 -3
- package/sync-sources.mjs +21 -7
- package/Sources/FoundationLite/Common.swift +0 -3
- package/Sources/FoundationLite/FoundationLite.swift +0 -171
- package/Sources/FoundationLite/Interaction.swift +0 -146
- package/Sources/FoundationLite/Timer.swift +0 -48
- package/Sources/_FoundationCommon/_FoundationCommon.swift +0 -10
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.HandleEvents.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 03.12.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Performs the specified closures when publisher events occur.
|
|
11
|
+
///
|
|
12
|
+
/// Use `handleEvents` when you want to examine elements as they progress through
|
|
13
|
+
/// the stages of the publisher’s lifecycle.
|
|
14
|
+
///
|
|
15
|
+
/// In the example below, a publisher of integers shows the effect of printing
|
|
16
|
+
/// debugging information at each stage of the element-processing lifecycle:
|
|
17
|
+
///
|
|
18
|
+
/// let integers = (0...2)
|
|
19
|
+
/// cancellable = integers.publisher
|
|
20
|
+
/// .handleEvents(receiveSubscription: { subs in
|
|
21
|
+
/// print("Subscription: \(subs.combineIdentifier)")
|
|
22
|
+
/// }, receiveOutput: { anInt in
|
|
23
|
+
/// print("in output handler, received \(anInt)")
|
|
24
|
+
/// }, receiveCompletion: { _ in
|
|
25
|
+
/// print("in completion handler")
|
|
26
|
+
/// }, receiveCancel: {
|
|
27
|
+
/// print("received cancel")
|
|
28
|
+
/// }, receiveRequest: { (demand) in
|
|
29
|
+
/// print("received demand: \(demand.description)")
|
|
30
|
+
/// })
|
|
31
|
+
/// .sink { _ in return }
|
|
32
|
+
///
|
|
33
|
+
/// // Prints:
|
|
34
|
+
/// // received demand: unlimited
|
|
35
|
+
/// // Subscription: 0x7f81284734c0
|
|
36
|
+
/// // in output handler, received 0
|
|
37
|
+
/// // in output handler, received 1
|
|
38
|
+
/// // in output handler, received 2
|
|
39
|
+
/// // in completion handler
|
|
40
|
+
///
|
|
41
|
+
/// - Parameters:
|
|
42
|
+
/// - receiveSubscription: A closure that executes when the publisher receives
|
|
43
|
+
/// the subscription from the upstream publisher. Defaults to `nil`.
|
|
44
|
+
/// - receiveOutput: A closure that executes when the publisher receives a value
|
|
45
|
+
/// from the upstream publisher. Defaults to `nil`.
|
|
46
|
+
/// - receiveCompletion: A closure that executes when the publisher receives
|
|
47
|
+
/// the completion from the upstream publisher. Defaults to `nil`.
|
|
48
|
+
/// - receiveCancel: A closure that executes when the downstream receiver cancels
|
|
49
|
+
/// publishing. Defaults to `nil`.
|
|
50
|
+
/// - receiveRequest: A closure that executes when the publisher receives a request
|
|
51
|
+
/// for more elements. Defaults to `nil`.
|
|
52
|
+
/// - Returns: A publisher that performs the specified closures when publisher events
|
|
53
|
+
/// occur.
|
|
54
|
+
public func handleEvents(
|
|
55
|
+
receiveSubscription: ((Subscription) -> Void)? = nil,
|
|
56
|
+
receiveOutput: ((Output) -> Void)? = nil,
|
|
57
|
+
receiveCompletion: ((Subscribers.Completion<Failure>) -> Void)? = nil,
|
|
58
|
+
receiveCancel: (() -> Void)? = nil,
|
|
59
|
+
receiveRequest: ((Subscribers.Demand) -> Void)? = nil
|
|
60
|
+
) -> Publishers.HandleEvents<Self> {
|
|
61
|
+
return .init(upstream: self,
|
|
62
|
+
receiveSubscription: receiveSubscription,
|
|
63
|
+
receiveOutput: receiveOutput,
|
|
64
|
+
receiveCompletion: receiveCompletion,
|
|
65
|
+
receiveCancel: receiveCancel,
|
|
66
|
+
receiveRequest: receiveRequest)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
extension Publishers {
|
|
71
|
+
|
|
72
|
+
/// A publisher that performs the specified closures when publisher events occur.
|
|
73
|
+
public struct HandleEvents<Upstream: Publisher>: Publisher {
|
|
74
|
+
|
|
75
|
+
public typealias Output = Upstream.Output
|
|
76
|
+
|
|
77
|
+
public typealias Failure = Upstream.Failure
|
|
78
|
+
|
|
79
|
+
/// The publisher from which this publisher receives elements.
|
|
80
|
+
public let upstream: Upstream
|
|
81
|
+
|
|
82
|
+
/// A closure that executes when the publisher receives the subscription from
|
|
83
|
+
/// the upstream publisher.
|
|
84
|
+
public var receiveSubscription: ((Subscription) -> Void)?
|
|
85
|
+
|
|
86
|
+
/// A closure that executes when the publisher receives a value from the upstream
|
|
87
|
+
/// publisher.
|
|
88
|
+
public var receiveOutput: ((Upstream.Output) -> Void)?
|
|
89
|
+
|
|
90
|
+
/// A closure that executes when the publisher receives the completion from
|
|
91
|
+
/// the upstream publisher.
|
|
92
|
+
public var receiveCompletion:
|
|
93
|
+
((Subscribers.Completion<Upstream.Failure>) -> Void)?
|
|
94
|
+
|
|
95
|
+
/// A closure that executes when the downstream receiver cancels publishing.
|
|
96
|
+
public var receiveCancel: (() -> Void)?
|
|
97
|
+
|
|
98
|
+
/// A closure that executes when the publisher receives a request for more
|
|
99
|
+
/// elements.
|
|
100
|
+
public var receiveRequest: ((Subscribers.Demand) -> Void)?
|
|
101
|
+
|
|
102
|
+
public init(
|
|
103
|
+
upstream: Upstream,
|
|
104
|
+
receiveSubscription: ((Subscription) -> Void)? = nil,
|
|
105
|
+
receiveOutput: ((Output) -> Void)? = nil,
|
|
106
|
+
receiveCompletion: ((Subscribers.Completion<Failure>) -> Void)? = nil,
|
|
107
|
+
receiveCancel: (() -> Void)? = nil,
|
|
108
|
+
receiveRequest: ((Subscribers.Demand) -> Void)?
|
|
109
|
+
) {
|
|
110
|
+
self.upstream = upstream
|
|
111
|
+
self.receiveSubscription = receiveSubscription
|
|
112
|
+
self.receiveOutput = receiveOutput
|
|
113
|
+
self.receiveCompletion = receiveCompletion
|
|
114
|
+
self.receiveCancel = receiveCancel
|
|
115
|
+
self.receiveRequest = receiveRequest
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
119
|
+
where Upstream.Failure == Downstream.Failure,
|
|
120
|
+
Upstream.Output == Downstream.Input
|
|
121
|
+
{
|
|
122
|
+
let inner = Inner(self, downstream: subscriber)
|
|
123
|
+
upstream.subscribe(inner)
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
extension Publishers.HandleEvents {
|
|
129
|
+
private final class Inner<Downstream: Subscriber>
|
|
130
|
+
: Subscriber,
|
|
131
|
+
Subscription,
|
|
132
|
+
CustomStringConvertible,
|
|
133
|
+
CustomReflectable,
|
|
134
|
+
CustomPlaygroundDisplayConvertible
|
|
135
|
+
where Downstream.Input == Upstream.Output, Downstream.Failure == Upstream.Failure
|
|
136
|
+
{
|
|
137
|
+
typealias Input = Upstream.Output
|
|
138
|
+
typealias Failure = Upstream.Failure
|
|
139
|
+
|
|
140
|
+
private var status = SubscriptionStatus.awaitingSubscription
|
|
141
|
+
private let lock = UnfairLock.allocate()
|
|
142
|
+
fileprivate var receiveSubscription: ((Subscription) -> Void)?
|
|
143
|
+
fileprivate var receiveOutput: ((Upstream.Output) -> Void)?
|
|
144
|
+
fileprivate var receiveCompletion:
|
|
145
|
+
((Subscribers.Completion<Upstream.Failure>) -> Void)?
|
|
146
|
+
fileprivate var receiveCancel: (() -> Void)?
|
|
147
|
+
fileprivate var receiveRequest: ((Subscribers.Demand) -> Void)?
|
|
148
|
+
private let downstream: Downstream
|
|
149
|
+
|
|
150
|
+
init(_ events: Publishers.HandleEvents<Upstream>, downstream: Downstream) {
|
|
151
|
+
self.receiveSubscription = events.receiveSubscription
|
|
152
|
+
self.receiveOutput = events.receiveOutput
|
|
153
|
+
self.receiveCompletion = events.receiveCompletion
|
|
154
|
+
self.receiveCancel = events.receiveCancel
|
|
155
|
+
self.receiveRequest = events.receiveRequest
|
|
156
|
+
self.downstream = downstream
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
deinit {
|
|
160
|
+
lock.deallocate()
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
func receive(subscription: Subscription) {
|
|
164
|
+
lock.lock()
|
|
165
|
+
if let receiveSubscription = self.receiveSubscription {
|
|
166
|
+
lock.unlock()
|
|
167
|
+
receiveSubscription(subscription)
|
|
168
|
+
lock.lock()
|
|
169
|
+
}
|
|
170
|
+
guard case .awaitingSubscription = status else {
|
|
171
|
+
lock.unlock()
|
|
172
|
+
subscription.cancel()
|
|
173
|
+
return
|
|
174
|
+
}
|
|
175
|
+
status = .subscribed(subscription)
|
|
176
|
+
lock.unlock()
|
|
177
|
+
downstream.receive(subscription: self)
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
181
|
+
lock.lock()
|
|
182
|
+
if let receiveOutput = self.receiveOutput {
|
|
183
|
+
lock.unlock()
|
|
184
|
+
receiveOutput(input)
|
|
185
|
+
} else {
|
|
186
|
+
lock.unlock()
|
|
187
|
+
}
|
|
188
|
+
let newDemand = downstream.receive(input)
|
|
189
|
+
if newDemand == .none {
|
|
190
|
+
return newDemand
|
|
191
|
+
}
|
|
192
|
+
lock.lock()
|
|
193
|
+
if let receiveRequest = self.receiveRequest {
|
|
194
|
+
lock.unlock()
|
|
195
|
+
receiveRequest(newDemand)
|
|
196
|
+
} else {
|
|
197
|
+
lock.unlock()
|
|
198
|
+
}
|
|
199
|
+
return newDemand
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
func receive(completion: Subscribers.Completion<Failure>) {
|
|
203
|
+
lock.lock()
|
|
204
|
+
if let receiveCompletion = self.receiveCompletion {
|
|
205
|
+
lock.unlock()
|
|
206
|
+
receiveCompletion(completion)
|
|
207
|
+
lock.lock()
|
|
208
|
+
}
|
|
209
|
+
lockedTerminate()
|
|
210
|
+
lock.unlock()
|
|
211
|
+
downstream.receive(completion: completion)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
func request(_ demand: Subscribers.Demand) {
|
|
215
|
+
lock.lock()
|
|
216
|
+
if let receiveRequest = self.receiveRequest {
|
|
217
|
+
lock.unlock()
|
|
218
|
+
receiveRequest(demand)
|
|
219
|
+
lock.lock()
|
|
220
|
+
}
|
|
221
|
+
guard case let .subscribed(subscription) = status else {
|
|
222
|
+
lock.unlock()
|
|
223
|
+
return
|
|
224
|
+
}
|
|
225
|
+
lock.unlock()
|
|
226
|
+
subscription.request(demand)
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
func cancel() {
|
|
230
|
+
lock.lock()
|
|
231
|
+
if let receiveCancel = self.receiveCancel {
|
|
232
|
+
lock.unlock()
|
|
233
|
+
receiveCancel()
|
|
234
|
+
lock.lock()
|
|
235
|
+
}
|
|
236
|
+
guard case let .subscribed(subscription) = status else {
|
|
237
|
+
lock.unlock()
|
|
238
|
+
return
|
|
239
|
+
}
|
|
240
|
+
lockedTerminate()
|
|
241
|
+
lock.unlock()
|
|
242
|
+
subscription.cancel()
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
var description: String { return "HandleEvents" }
|
|
246
|
+
|
|
247
|
+
var customMirror: Mirror { return Mirror(self, children: EmptyCollection()) }
|
|
248
|
+
|
|
249
|
+
var playgroundDescription: Any { return description }
|
|
250
|
+
|
|
251
|
+
private func lockedTerminate() {
|
|
252
|
+
receiveSubscription = nil
|
|
253
|
+
receiveOutput = nil
|
|
254
|
+
receiveCompletion = nil
|
|
255
|
+
receiveCancel = nil
|
|
256
|
+
receiveRequest = nil
|
|
257
|
+
status = .terminal
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.IgnoreOutput.swift
|
|
3
|
+
//
|
|
4
|
+
// Created by Eric Patey on 16.08.2019.
|
|
5
|
+
//
|
|
6
|
+
|
|
7
|
+
extension Publisher {
|
|
8
|
+
|
|
9
|
+
/// Ingores all upstream elements, but passes along a completion state (finished or
|
|
10
|
+
/// failed).
|
|
11
|
+
///
|
|
12
|
+
/// Use the `ignoreOutput(`` operator to determine if a publisher is able to complete
|
|
13
|
+
/// successfully or would fail.
|
|
14
|
+
///
|
|
15
|
+
/// In the example below, the array publisher (`numbers`) delivers the first five of
|
|
16
|
+
/// its elements successfully, as indicated by the `ignoreOutput()` operator.
|
|
17
|
+
/// The operator consumes, but doesn’t republish the elements downstream. However,
|
|
18
|
+
/// the sixth element, `0`, causes the error throwing closure to catch
|
|
19
|
+
/// a `NoZeroValuesAllowedError` that terminates the stream.
|
|
20
|
+
///
|
|
21
|
+
/// struct NoZeroValuesAllowedError: Error {}
|
|
22
|
+
/// let numbers = [1, 2, 3, 4, 5, 0, 6, 7, 8, 9]
|
|
23
|
+
/// cancellable = numbers.publisher
|
|
24
|
+
/// .tryFilter({ anInt in
|
|
25
|
+
/// guard anInt != 0 else { throw NoZeroValuesAllowedError() }
|
|
26
|
+
/// return anInt < 20
|
|
27
|
+
/// })
|
|
28
|
+
/// .ignoreOutput()
|
|
29
|
+
/// .sink(receiveCompletion: {print("completion: \($0)")},
|
|
30
|
+
/// receiveValue: {print("value \($0)")})
|
|
31
|
+
///
|
|
32
|
+
/// // Prints: "completion: failure(NoZeroValuesAllowedError())"
|
|
33
|
+
///
|
|
34
|
+
/// The output type of this publisher is `Never`.
|
|
35
|
+
///
|
|
36
|
+
/// - Returns: A publisher that ignores all upstream elements.
|
|
37
|
+
public func ignoreOutput() -> Publishers.IgnoreOutput<Self> {
|
|
38
|
+
return .init(upstream: self)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
extension Publishers {
|
|
43
|
+
/// A publisher that ignores all upstream elements, but passes along a completion
|
|
44
|
+
/// state (finish or failed).
|
|
45
|
+
public struct IgnoreOutput<Upstream: Publisher>: Publisher {
|
|
46
|
+
|
|
47
|
+
public typealias Output = Never
|
|
48
|
+
|
|
49
|
+
public typealias Failure = Upstream.Failure
|
|
50
|
+
|
|
51
|
+
/// The publisher from which this publisher receives elements.
|
|
52
|
+
public let upstream: Upstream
|
|
53
|
+
|
|
54
|
+
public init(upstream: Upstream) {
|
|
55
|
+
self.upstream = upstream
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
59
|
+
where Downstream.Failure == Upstream.Failure, Downstream.Input == Never
|
|
60
|
+
{
|
|
61
|
+
upstream.subscribe(Inner<Downstream>(downstream: subscriber))
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
extension Publishers.IgnoreOutput {
|
|
67
|
+
private struct Inner<Downstream: Subscriber>
|
|
68
|
+
: Subscriber,
|
|
69
|
+
CustomStringConvertible,
|
|
70
|
+
CustomReflectable,
|
|
71
|
+
CustomPlaygroundDisplayConvertible
|
|
72
|
+
where Downstream.Input == Never, Downstream.Failure == Upstream.Failure
|
|
73
|
+
{
|
|
74
|
+
typealias Input = Upstream.Output
|
|
75
|
+
|
|
76
|
+
typealias Failure = Upstream.Failure
|
|
77
|
+
|
|
78
|
+
private let downstream: Downstream
|
|
79
|
+
|
|
80
|
+
let combineIdentifier = CombineIdentifier()
|
|
81
|
+
|
|
82
|
+
fileprivate init(downstream: Downstream) {
|
|
83
|
+
self.downstream = downstream
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
func receive(subscription: Subscription) {
|
|
87
|
+
downstream.receive(subscription: subscription)
|
|
88
|
+
subscription.request(.unlimited)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
92
|
+
return .none
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
func receive(completion: Subscribers.Completion<Failure>) {
|
|
96
|
+
downstream.receive(completion: completion)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
var description: String { return "IgnoreOutput" }
|
|
100
|
+
|
|
101
|
+
var customMirror: Mirror {
|
|
102
|
+
return Mirror(self, children: EmptyCollection())
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
var playgroundDescription: Any { return description }
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
extension Publishers.IgnoreOutput: Equatable where Upstream: Equatable {}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.Last.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Joseph Spadafora on 7/9/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Publishes the last element of a stream, after the stream finishes.
|
|
11
|
+
///
|
|
12
|
+
/// Use `last()` when you need to emit only the last element from an upstream
|
|
13
|
+
/// publisher.
|
|
14
|
+
///
|
|
15
|
+
/// In the example below, the range publisher only emits the last element from
|
|
16
|
+
/// the sequence publisher, `10`, then finishes normally.
|
|
17
|
+
///
|
|
18
|
+
/// let numbers = (-10...10)
|
|
19
|
+
/// cancellable = numbers.publisher
|
|
20
|
+
/// .last()
|
|
21
|
+
/// .sink { print("\($0)") }
|
|
22
|
+
///
|
|
23
|
+
/// // Prints: "10"
|
|
24
|
+
///
|
|
25
|
+
/// - Returns: A publisher that only publishes the last element of a stream.
|
|
26
|
+
public func last() -> Publishers.Last<Self> {
|
|
27
|
+
return .init(upstream: self)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/// Publishes the last element of a stream that satisfies a predicate closure,
|
|
31
|
+
/// after upstream finishes.
|
|
32
|
+
///
|
|
33
|
+
/// Use `last(where:)` when you need to republish only the last element of a stream
|
|
34
|
+
/// that satisfies a closure you specify.
|
|
35
|
+
///
|
|
36
|
+
/// In the example below, a range publisher emits the last element that satisfies
|
|
37
|
+
/// the closure’s criteria, then finishes normally:
|
|
38
|
+
///
|
|
39
|
+
/// let numbers = (-10...10)
|
|
40
|
+
/// cancellable = numbers.publisher
|
|
41
|
+
/// .last { $0 < 6 }
|
|
42
|
+
/// .sink { print("\($0)") }
|
|
43
|
+
///
|
|
44
|
+
/// // Prints: "5"
|
|
45
|
+
///
|
|
46
|
+
/// - Parameter predicate: A closure that takes an element as its parameter and
|
|
47
|
+
/// returns a Boolean value that indicates whether to publish the element.
|
|
48
|
+
/// - Returns: A publisher that only publishes the last element satisfying the given
|
|
49
|
+
/// predicate.
|
|
50
|
+
public func last(
|
|
51
|
+
where predicate: @escaping (Output) -> Bool
|
|
52
|
+
) -> Publishers.LastWhere<Self> {
|
|
53
|
+
return .init(upstream: self, predicate: predicate)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/// Publishes the last element of a stream that satisfies an error-throwing predicate
|
|
57
|
+
/// closure, after the stream finishes.
|
|
58
|
+
///
|
|
59
|
+
/// Use `tryLast(where:)` when you need to republish the last element that satisfies
|
|
60
|
+
/// an error-throwing closure you specify. If the predicate closure throws an error,
|
|
61
|
+
/// the publisher fails.
|
|
62
|
+
///
|
|
63
|
+
/// In the example below, a publisher emits the last element that satisfies
|
|
64
|
+
/// the error-throwing closure, then finishes normally:
|
|
65
|
+
///
|
|
66
|
+
/// struct RangeError: Error {}
|
|
67
|
+
///
|
|
68
|
+
/// let numbers = [-62, 1, 6, 10, 9, 22, 41, -1, 5]
|
|
69
|
+
/// cancellable = numbers.publisher
|
|
70
|
+
/// .tryLast {
|
|
71
|
+
/// guard 0 != 0 else {throw RangeError()}
|
|
72
|
+
/// return true
|
|
73
|
+
/// }
|
|
74
|
+
/// .sink(
|
|
75
|
+
/// receiveCompletion: { print ("completion: \($0)", terminator: " ") },
|
|
76
|
+
/// receiveValue: { print ("\($0)", terminator: " ") }
|
|
77
|
+
/// )
|
|
78
|
+
/// // Prints: "5 completion: finished"
|
|
79
|
+
/// // If instead the numbers array had contained a `0`, the `tryLast` operator
|
|
80
|
+
/// // would terminate publishing with a RangeError."
|
|
81
|
+
///
|
|
82
|
+
/// - Parameter predicate: A closure that takes an element as its parameter and
|
|
83
|
+
/// returns a Boolean value that indicates whether to publish the element.
|
|
84
|
+
/// - Returns: A publisher that only publishes the last element satisfying the given
|
|
85
|
+
/// predicate.
|
|
86
|
+
public func tryLast(
|
|
87
|
+
where predicate: @escaping (Output) throws -> Bool
|
|
88
|
+
) -> Publishers.TryLastWhere<Self> {
|
|
89
|
+
return .init(upstream: self, predicate: predicate)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
extension Publishers {
|
|
94
|
+
|
|
95
|
+
/// A publisher that only publishes the last element of a stream,
|
|
96
|
+
/// after the stream finishes.
|
|
97
|
+
public struct Last<Upstream: Publisher>: Publisher {
|
|
98
|
+
|
|
99
|
+
public typealias Output = Upstream.Output
|
|
100
|
+
|
|
101
|
+
public typealias Failure = Upstream.Failure
|
|
102
|
+
|
|
103
|
+
/// The publisher from which this publisher receives elements.
|
|
104
|
+
public let upstream: Upstream
|
|
105
|
+
|
|
106
|
+
public init(upstream: Upstream) {
|
|
107
|
+
self.upstream = upstream
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
111
|
+
where Failure == Downstream.Failure, Output == Downstream.Input
|
|
112
|
+
{
|
|
113
|
+
upstream.subscribe(Inner(downstream: subscriber))
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/// A publisher that only publishes the last element of a stream that satisfies
|
|
118
|
+
/// a predicate closure, once the stream finishes.
|
|
119
|
+
public struct LastWhere<Upstream: Publisher>: Publisher {
|
|
120
|
+
|
|
121
|
+
public typealias Output = Upstream.Output
|
|
122
|
+
|
|
123
|
+
public typealias Failure = Upstream.Failure
|
|
124
|
+
|
|
125
|
+
/// The publisher from which this publisher receives elements.
|
|
126
|
+
public let upstream: Upstream
|
|
127
|
+
|
|
128
|
+
/// The closure that determines whether to publish an element.
|
|
129
|
+
public let predicate: (Upstream.Output) -> Bool
|
|
130
|
+
|
|
131
|
+
public init(upstream: Upstream, predicate: @escaping (Output) -> Bool) {
|
|
132
|
+
self.upstream = upstream
|
|
133
|
+
self.predicate = predicate
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
137
|
+
where Failure == Downstream.Failure, Output == Downstream.Input
|
|
138
|
+
{
|
|
139
|
+
upstream.subscribe(Inner(downstream: subscriber, predicate: predicate))
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/// A publisher that only publishes the last element of a stream that satisfies
|
|
144
|
+
/// an error-throwing predicate closure, once the stream finishes.
|
|
145
|
+
public struct TryLastWhere<Upstream: Publisher>: Publisher {
|
|
146
|
+
|
|
147
|
+
public typealias Output = Upstream.Output
|
|
148
|
+
|
|
149
|
+
public typealias Failure = Error
|
|
150
|
+
|
|
151
|
+
/// The publisher from which this publisher receives elements.
|
|
152
|
+
public let upstream: Upstream
|
|
153
|
+
|
|
154
|
+
/// The error-throwing closure that determines whether to publish an element.
|
|
155
|
+
public let predicate: (Upstream.Output) throws -> Bool
|
|
156
|
+
|
|
157
|
+
public init(upstream: Upstream, predicate: @escaping (Output) throws -> Bool) {
|
|
158
|
+
self.upstream = upstream
|
|
159
|
+
self.predicate = predicate
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
163
|
+
where Downstream.Failure == Error, Output == Downstream.Input
|
|
164
|
+
{
|
|
165
|
+
upstream.subscribe(Inner(downstream: subscriber, predicate: predicate))
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
extension Publishers.Last: Equatable where Upstream: Equatable {}
|
|
171
|
+
|
|
172
|
+
extension Publishers.Last {
|
|
173
|
+
private final class Inner<Downstream: Subscriber>
|
|
174
|
+
: ReduceProducer<Downstream,
|
|
175
|
+
Upstream.Output,
|
|
176
|
+
Upstream.Output,
|
|
177
|
+
Upstream.Failure,
|
|
178
|
+
Void>
|
|
179
|
+
where Upstream.Output == Downstream.Input, Upstream.Failure == Downstream.Failure
|
|
180
|
+
{
|
|
181
|
+
fileprivate init(downstream: Downstream) {
|
|
182
|
+
super.init(downstream: downstream, initial: nil, reduce: ())
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
override func receive(
|
|
186
|
+
newValue: Upstream.Output
|
|
187
|
+
) -> PartialCompletion<Void, Downstream.Failure> {
|
|
188
|
+
result = newValue
|
|
189
|
+
return .continue
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
override var description: String { return "Last" }
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
extension Publishers.LastWhere {
|
|
197
|
+
private final class Inner<Downstream: Subscriber>
|
|
198
|
+
: ReduceProducer<Downstream,
|
|
199
|
+
Upstream.Output,
|
|
200
|
+
Upstream.Output,
|
|
201
|
+
Upstream.Failure,
|
|
202
|
+
(Upstream.Output) -> Bool>
|
|
203
|
+
where Upstream.Output == Downstream.Input, Upstream.Failure == Downstream.Failure
|
|
204
|
+
{
|
|
205
|
+
fileprivate init(downstream: Downstream,
|
|
206
|
+
predicate: @escaping (Upstream.Output) -> Bool) {
|
|
207
|
+
super.init(downstream: downstream, initial: nil, reduce: predicate)
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
override func receive(
|
|
211
|
+
newValue: Upstream.Output
|
|
212
|
+
) -> PartialCompletion<Void, Downstream.Failure> {
|
|
213
|
+
if reduce(newValue) {
|
|
214
|
+
result = newValue
|
|
215
|
+
}
|
|
216
|
+
return .continue
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
override var description: String { return "LastWhere" }
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
extension Publishers.TryLastWhere {
|
|
224
|
+
private final class Inner<Downstream: Subscriber>
|
|
225
|
+
: ReduceProducer<Downstream,
|
|
226
|
+
Upstream.Output,
|
|
227
|
+
Upstream.Output,
|
|
228
|
+
Upstream.Failure,
|
|
229
|
+
(Upstream.Output) throws -> Bool>
|
|
230
|
+
where Upstream.Output == Downstream.Input, Downstream.Failure == Error
|
|
231
|
+
{
|
|
232
|
+
fileprivate init(downstream: Downstream,
|
|
233
|
+
predicate: @escaping (Upstream.Output) throws -> Bool) {
|
|
234
|
+
super.init(downstream: downstream, initial: nil, reduce: predicate)
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
override func receive(
|
|
238
|
+
newValue: Upstream.Output
|
|
239
|
+
) -> PartialCompletion<Void, Downstream.Failure> {
|
|
240
|
+
do {
|
|
241
|
+
if try reduce(newValue) {
|
|
242
|
+
result = newValue
|
|
243
|
+
}
|
|
244
|
+
return .continue
|
|
245
|
+
} catch {
|
|
246
|
+
return .failure(error)
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
override var description: String { return "TryLastWhere" }
|
|
251
|
+
}
|
|
252
|
+
}
|