@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,206 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.Print.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 16.06.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Prints log messages for all publishing events.
|
|
11
|
+
///
|
|
12
|
+
/// Use `print(_:to:)` to log messages the console.
|
|
13
|
+
///
|
|
14
|
+
/// In the example below, log messages are printed on the console:
|
|
15
|
+
///
|
|
16
|
+
/// let integers = (1...2)
|
|
17
|
+
/// cancellable = integers.publisher
|
|
18
|
+
/// .print("Logged a message", to: nil)
|
|
19
|
+
/// .sink { _ in }
|
|
20
|
+
///
|
|
21
|
+
/// // Prints:
|
|
22
|
+
/// // Logged a message: receive subscription: (1..<2)
|
|
23
|
+
/// // Logged a message: request unlimited
|
|
24
|
+
/// // Logged a message: receive value: (1)
|
|
25
|
+
/// // Logged a message: receive finished
|
|
26
|
+
///
|
|
27
|
+
/// - Parameters:
|
|
28
|
+
/// - prefix: A string — which defaults to empty — with which to prefix all log
|
|
29
|
+
/// messages.
|
|
30
|
+
/// - stream: A stream for text output that receives messages, and which directs
|
|
31
|
+
/// output to the console by default. A custom stream can be used to log messages
|
|
32
|
+
/// to other destinations.
|
|
33
|
+
/// - Returns: A publisher that prints log messages for all publishing events.
|
|
34
|
+
public func print(_ prefix: String = "",
|
|
35
|
+
to stream: TextOutputStream? = nil) -> Publishers.Print<Self> {
|
|
36
|
+
return .init(upstream: self, prefix: prefix, to: stream)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
extension Publishers {
|
|
41
|
+
|
|
42
|
+
/// A publisher that prints log messages for all publishing events, optionally
|
|
43
|
+
/// prefixed with a given string.
|
|
44
|
+
///
|
|
45
|
+
/// This publisher prints log messages when receiving the following events:
|
|
46
|
+
///
|
|
47
|
+
/// - subscription
|
|
48
|
+
/// - value
|
|
49
|
+
/// - normal completion
|
|
50
|
+
/// - failure
|
|
51
|
+
/// - cancellation
|
|
52
|
+
public struct Print<Upstream: Publisher>: Publisher {
|
|
53
|
+
|
|
54
|
+
public typealias Output = Upstream.Output
|
|
55
|
+
|
|
56
|
+
public typealias Failure = Upstream.Failure
|
|
57
|
+
|
|
58
|
+
/// A string with which to prefix all log messages.
|
|
59
|
+
public let prefix: String
|
|
60
|
+
|
|
61
|
+
/// The publisher from which this publisher receives elements.
|
|
62
|
+
public let upstream: Upstream
|
|
63
|
+
|
|
64
|
+
public let stream: TextOutputStream?
|
|
65
|
+
|
|
66
|
+
/// Creates a publisher that prints log messages for all publishing events.
|
|
67
|
+
///
|
|
68
|
+
/// - Parameters:
|
|
69
|
+
/// - upstream: The publisher from which this publisher receives elements.
|
|
70
|
+
/// - prefix: A string with which to prefix all log messages.
|
|
71
|
+
public init(upstream: Upstream,
|
|
72
|
+
prefix: String,
|
|
73
|
+
to stream: TextOutputStream? = nil) {
|
|
74
|
+
self.upstream = upstream
|
|
75
|
+
self.prefix = prefix
|
|
76
|
+
self.stream = stream
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
80
|
+
where Failure == Downstream.Failure, Output == Downstream.Input
|
|
81
|
+
{
|
|
82
|
+
let inner = Inner(downstream: subscriber, prefix: prefix, stream: stream)
|
|
83
|
+
upstream.subscribe(inner)
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
extension Publishers.Print {
|
|
89
|
+
private final class Inner<Downstream: Subscriber>: Subscriber,
|
|
90
|
+
Subscription,
|
|
91
|
+
CustomStringConvertible,
|
|
92
|
+
CustomReflectable,
|
|
93
|
+
CustomPlaygroundDisplayConvertible
|
|
94
|
+
{
|
|
95
|
+
typealias Input = Downstream.Input
|
|
96
|
+
typealias Failure = Downstream.Failure
|
|
97
|
+
|
|
98
|
+
/// A concrete type wrapper around an abstract stream.
|
|
99
|
+
private struct PrintTarget: TextOutputStream {
|
|
100
|
+
|
|
101
|
+
var stream: TextOutputStream
|
|
102
|
+
|
|
103
|
+
mutating func write(_ string: String) {
|
|
104
|
+
stream.write(string)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private var downstream: Downstream
|
|
109
|
+
private let prefix: String
|
|
110
|
+
private var stream: PrintTarget?
|
|
111
|
+
private var status = SubscriptionStatus.awaitingSubscription
|
|
112
|
+
private let lock = UnfairLock.allocate()
|
|
113
|
+
|
|
114
|
+
init(downstream: Downstream, prefix: String, stream: TextOutputStream?) {
|
|
115
|
+
self.downstream = downstream
|
|
116
|
+
self.prefix = prefix.isEmpty ? "" : "\(prefix): "
|
|
117
|
+
self.stream = stream.map(PrintTarget.init)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
deinit {
|
|
121
|
+
lock.deallocate()
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
func receive(subscription: Subscription) {
|
|
125
|
+
log("\(prefix)receive subscription: (\(subscription))")
|
|
126
|
+
lock.lock()
|
|
127
|
+
guard case .awaitingSubscription = status else {
|
|
128
|
+
lock.unlock()
|
|
129
|
+
subscription.cancel()
|
|
130
|
+
return
|
|
131
|
+
}
|
|
132
|
+
status = .subscribed(subscription)
|
|
133
|
+
lock.unlock()
|
|
134
|
+
downstream.receive(subscription: self)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
138
|
+
log("\(prefix)receive value: (\(input))")
|
|
139
|
+
let demand = downstream.receive(input)
|
|
140
|
+
|
|
141
|
+
if let max = demand.max {
|
|
142
|
+
log("\(prefix)request max: (\(max)) (synchronous)")
|
|
143
|
+
} else {
|
|
144
|
+
log("\(prefix)request unlimited (synchronous)")
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return demand
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
func receive(completion: Subscribers.Completion<Failure>) {
|
|
151
|
+
switch completion {
|
|
152
|
+
case .finished:
|
|
153
|
+
log("\(prefix)receive finished")
|
|
154
|
+
case .failure(let error):
|
|
155
|
+
log("\(prefix)receive error: (\(error))")
|
|
156
|
+
}
|
|
157
|
+
lock.lock()
|
|
158
|
+
status = .terminal
|
|
159
|
+
lock.unlock()
|
|
160
|
+
downstream.receive(completion: completion)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
func request(_ demand: Subscribers.Demand) {
|
|
164
|
+
if let max = demand.max {
|
|
165
|
+
log("\(prefix)request max: (\(max))")
|
|
166
|
+
} else {
|
|
167
|
+
log("\(prefix)request unlimited")
|
|
168
|
+
}
|
|
169
|
+
lock.lock()
|
|
170
|
+
guard case let .subscribed(subscription) = status else {
|
|
171
|
+
lock.unlock()
|
|
172
|
+
return
|
|
173
|
+
}
|
|
174
|
+
lock.unlock()
|
|
175
|
+
subscription.request(demand)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
func cancel() {
|
|
179
|
+
log("\(prefix)receive cancel")
|
|
180
|
+
lock.lock()
|
|
181
|
+
guard case let .subscribed(subscription) = status else {
|
|
182
|
+
lock.unlock()
|
|
183
|
+
return
|
|
184
|
+
}
|
|
185
|
+
status = .terminal
|
|
186
|
+
lock.unlock()
|
|
187
|
+
subscription.cancel()
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
var description: String { return "Print" }
|
|
191
|
+
|
|
192
|
+
var customMirror: Mirror { return Mirror(self, children: EmptyCollection()) }
|
|
193
|
+
|
|
194
|
+
var playgroundDescription: Any { return description }
|
|
195
|
+
|
|
196
|
+
// MARK: - Private
|
|
197
|
+
|
|
198
|
+
private func log(_ text: String) {
|
|
199
|
+
if var stream = stream {
|
|
200
|
+
Swift.print(text, to: &stream)
|
|
201
|
+
} else {
|
|
202
|
+
Swift.print(text)
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.ReceiveOn.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 02.12.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
/// Specifies the scheduler on which to receive elements from the publisher.
|
|
10
|
+
///
|
|
11
|
+
/// You use the `receive(on:options:)` operator to receive results and completion on
|
|
12
|
+
/// a specific scheduler, such as performing UI work on the main run loop. In contrast
|
|
13
|
+
/// with `subscribe(on:options:)`, which affects upstream messages,
|
|
14
|
+
/// `receive(on:options:)` changes the execution context of downstream messages.
|
|
15
|
+
///
|
|
16
|
+
/// In the following example, the `subscribe(on:options:)` operator causes
|
|
17
|
+
/// `jsonPublisher` to receive requests on `backgroundQueue`, while
|
|
18
|
+
/// the `receive(on:options:)` causes `labelUpdater` to receive elements and
|
|
19
|
+
/// completion on `RunLoop.main`.
|
|
20
|
+
///
|
|
21
|
+
/// // Some publisher.
|
|
22
|
+
/// let jsonPublisher = MyJSONLoaderPublisher()
|
|
23
|
+
///
|
|
24
|
+
/// // Some subscriber that updates the UI.
|
|
25
|
+
/// let labelUpdater = MyLabelUpdateSubscriber()
|
|
26
|
+
///
|
|
27
|
+
/// jsonPublisher
|
|
28
|
+
/// .subscribe(on: backgroundQueue)
|
|
29
|
+
/// .receive(on: RunLoop.main)
|
|
30
|
+
/// .subscribe(labelUpdater)
|
|
31
|
+
///
|
|
32
|
+
///
|
|
33
|
+
/// Prefer `receive(on:options:)` over explicit use of dispatch queues when performing
|
|
34
|
+
/// work in subscribers. For example, instead of the following pattern:
|
|
35
|
+
///
|
|
36
|
+
/// pub.sink {
|
|
37
|
+
/// DispatchQueue.main.async {
|
|
38
|
+
/// // Do something.
|
|
39
|
+
/// }
|
|
40
|
+
/// }
|
|
41
|
+
///
|
|
42
|
+
/// Use this pattern instead:
|
|
43
|
+
///
|
|
44
|
+
/// pub.receive(on: DispatchQueue.main).sink {
|
|
45
|
+
/// // Do something.
|
|
46
|
+
/// }
|
|
47
|
+
///
|
|
48
|
+
/// > Note: `receive(on:options:)` doesn’t affect the scheduler used to cal
|
|
49
|
+
/// the subscriber’s `receive(subscription:)` method.
|
|
50
|
+
///
|
|
51
|
+
/// - Parameters:
|
|
52
|
+
/// - scheduler: The scheduler the publisher uses for element delivery.
|
|
53
|
+
/// - options: Scheduler options used to customize element delivery.
|
|
54
|
+
/// - Returns: A publisher that delivers elements using the specified scheduler.
|
|
55
|
+
public func receive<Context: Scheduler>(
|
|
56
|
+
on scheduler: Context,
|
|
57
|
+
options: Context.SchedulerOptions? = nil
|
|
58
|
+
) -> Publishers.ReceiveOn<Self, Context> {
|
|
59
|
+
return .init(upstream: self, scheduler: scheduler, options: options)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
extension Publishers {
|
|
64
|
+
|
|
65
|
+
/// A publisher that delivers elements to its downstream subscriber on a specific
|
|
66
|
+
/// scheduler.
|
|
67
|
+
public struct ReceiveOn<Upstream: Publisher, Context: Scheduler>: Publisher {
|
|
68
|
+
|
|
69
|
+
public typealias Output = Upstream.Output
|
|
70
|
+
|
|
71
|
+
public typealias Failure = Upstream.Failure
|
|
72
|
+
|
|
73
|
+
/// The publisher from which this publisher receives elements.
|
|
74
|
+
public let upstream: Upstream
|
|
75
|
+
|
|
76
|
+
/// The scheduler the publisher is to use for element delivery.
|
|
77
|
+
public let scheduler: Context
|
|
78
|
+
|
|
79
|
+
/// Scheduler options that customize the delivery of elements.
|
|
80
|
+
public let options: Context.SchedulerOptions?
|
|
81
|
+
|
|
82
|
+
public init(upstream: Upstream,
|
|
83
|
+
scheduler: Context,
|
|
84
|
+
options: Context.SchedulerOptions?) {
|
|
85
|
+
self.upstream = upstream
|
|
86
|
+
self.scheduler = scheduler
|
|
87
|
+
self.options = options
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
91
|
+
where Upstream.Failure == Downstream.Failure,
|
|
92
|
+
Upstream.Output == Downstream.Input
|
|
93
|
+
{
|
|
94
|
+
let inner = Inner(scheduler: scheduler,
|
|
95
|
+
options: options,
|
|
96
|
+
downstream: subscriber)
|
|
97
|
+
upstream.subscribe(inner)
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
extension Publishers.ReceiveOn {
|
|
103
|
+
private final class Inner<Downstream: Subscriber>
|
|
104
|
+
: Subscriber,
|
|
105
|
+
Subscription,
|
|
106
|
+
CustomStringConvertible,
|
|
107
|
+
CustomReflectable,
|
|
108
|
+
CustomPlaygroundDisplayConvertible
|
|
109
|
+
where Downstream.Input == Upstream.Output, Downstream.Failure == Upstream.Failure
|
|
110
|
+
{
|
|
111
|
+
typealias Input = Upstream.Output
|
|
112
|
+
typealias Failure = Upstream.Failure
|
|
113
|
+
|
|
114
|
+
private let lock = UnfairLock.allocate()
|
|
115
|
+
private let downstream: Downstream
|
|
116
|
+
private let scheduler: Context
|
|
117
|
+
private let options: Context.SchedulerOptions?
|
|
118
|
+
private var state = SubscriptionStatus.awaitingSubscription
|
|
119
|
+
private let downstreamLock = UnfairRecursiveLock.allocate()
|
|
120
|
+
|
|
121
|
+
init(scheduler: Context,
|
|
122
|
+
options: Context.SchedulerOptions?,
|
|
123
|
+
downstream: Downstream) {
|
|
124
|
+
self.downstream = downstream
|
|
125
|
+
self.scheduler = scheduler
|
|
126
|
+
self.options = options
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
deinit {
|
|
130
|
+
lock.deallocate()
|
|
131
|
+
downstreamLock.deallocate()
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
func receive(subscription: Subscription) {
|
|
135
|
+
lock.lock()
|
|
136
|
+
guard case .awaitingSubscription = state else {
|
|
137
|
+
lock.unlock()
|
|
138
|
+
subscription.cancel()
|
|
139
|
+
return
|
|
140
|
+
}
|
|
141
|
+
state = .subscribed(subscription)
|
|
142
|
+
lock.unlock()
|
|
143
|
+
downstreamLock.lock()
|
|
144
|
+
downstream.receive(subscription: self)
|
|
145
|
+
downstreamLock.unlock()
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
149
|
+
lock.lock()
|
|
150
|
+
guard case .subscribed = state else {
|
|
151
|
+
lock.unlock()
|
|
152
|
+
return .none
|
|
153
|
+
}
|
|
154
|
+
lock.unlock()
|
|
155
|
+
scheduler.schedule(options: options) {
|
|
156
|
+
self.scheduledReceive(input)
|
|
157
|
+
}
|
|
158
|
+
return .none
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
private func scheduledReceive(_ input: Input) {
|
|
162
|
+
lock.lock()
|
|
163
|
+
guard state.subscription != nil else {
|
|
164
|
+
lock.unlock()
|
|
165
|
+
return
|
|
166
|
+
}
|
|
167
|
+
lock.unlock()
|
|
168
|
+
downstreamLock.lock()
|
|
169
|
+
let newDemand = downstream.receive(input)
|
|
170
|
+
downstreamLock.unlock()
|
|
171
|
+
if newDemand == .none { return }
|
|
172
|
+
lock.lock()
|
|
173
|
+
let subscription = state.subscription
|
|
174
|
+
lock.unlock()
|
|
175
|
+
subscription?.request(newDemand)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
func receive(completion: Subscribers.Completion<Failure>) {
|
|
179
|
+
lock.lock()
|
|
180
|
+
guard case let .subscribed(subscription) = state else {
|
|
181
|
+
lock.unlock()
|
|
182
|
+
return
|
|
183
|
+
}
|
|
184
|
+
state = .pendingTerminal(subscription)
|
|
185
|
+
lock.unlock()
|
|
186
|
+
scheduler.schedule(options: options) {
|
|
187
|
+
self.scheduledReceive(completion: completion)
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
private func scheduledReceive(completion: Subscribers.Completion<Failure>) {
|
|
192
|
+
lock.lock()
|
|
193
|
+
state = .terminal
|
|
194
|
+
lock.unlock()
|
|
195
|
+
downstreamLock.lock()
|
|
196
|
+
downstream.receive(completion: completion)
|
|
197
|
+
downstreamLock.unlock()
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
func request(_ demand: Subscribers.Demand) {
|
|
201
|
+
lock.lock()
|
|
202
|
+
guard case let .subscribed(subscription) = state else {
|
|
203
|
+
lock.unlock()
|
|
204
|
+
return
|
|
205
|
+
}
|
|
206
|
+
lock.unlock()
|
|
207
|
+
subscription.request(demand)
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
func cancel() {
|
|
211
|
+
lock.lock()
|
|
212
|
+
guard case let .subscribed(subscription) = state else {
|
|
213
|
+
lock.unlock()
|
|
214
|
+
return
|
|
215
|
+
}
|
|
216
|
+
state = .terminal
|
|
217
|
+
lock.unlock()
|
|
218
|
+
subscription.cancel()
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
var description: String { return "ReceiveOn" }
|
|
222
|
+
|
|
223
|
+
var customMirror: Mirror { return Mirror(self, children: EmptyCollection()) }
|
|
224
|
+
|
|
225
|
+
var playgroundDescription: Any { return description }
|
|
226
|
+
}
|
|
227
|
+
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.Reduce.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 09.10.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Applies a closure that collects each element of a stream and publishes a final
|
|
11
|
+
/// result upon completion.
|
|
12
|
+
///
|
|
13
|
+
/// Use `reduce(_:_:)` to collect a stream of elements and produce an accumulated
|
|
14
|
+
/// value based on a closure you provide.
|
|
15
|
+
///
|
|
16
|
+
/// In the following example, the `reduce(_:_:)` operator collects all the integer
|
|
17
|
+
/// values it receives from its upstream publisher:
|
|
18
|
+
///
|
|
19
|
+
/// let numbers = (0...10)
|
|
20
|
+
/// cancellable = numbers.publisher
|
|
21
|
+
/// .reduce(0, { accum, next in accum + next })
|
|
22
|
+
/// .sink { print("\($0)") }
|
|
23
|
+
///
|
|
24
|
+
/// // Prints: "55"
|
|
25
|
+
///
|
|
26
|
+
/// - Parameters:
|
|
27
|
+
/// - initialResult: The value that the closure receives the first time it’s called.
|
|
28
|
+
/// - nextPartialResult: A closure that produces a new value by taking
|
|
29
|
+
/// the previously-accumulated value and the next element it receives from
|
|
30
|
+
/// the upstream publisher.
|
|
31
|
+
/// - Returns: A publisher that applies the closure to all received elements and
|
|
32
|
+
/// produces an accumulated value when the upstream publisher finishes.
|
|
33
|
+
/// If `reduce(_:_:)` receives an error from the upstream publisher, the operator
|
|
34
|
+
/// delivers it to the downstream subscriber, the publisher terminates and publishes
|
|
35
|
+
/// no value.
|
|
36
|
+
public func reduce<Accumulator>(
|
|
37
|
+
_ initialResult: Accumulator,
|
|
38
|
+
_ nextPartialResult: @escaping (Accumulator, Output) -> Accumulator
|
|
39
|
+
) -> Publishers.Reduce<Self, Accumulator> {
|
|
40
|
+
return .init(upstream: self,
|
|
41
|
+
initial: initialResult,
|
|
42
|
+
nextPartialResult: nextPartialResult)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/// Applies an error-throwing closure that collects each element of a stream and
|
|
46
|
+
/// publishes a final result upon completion.
|
|
47
|
+
///
|
|
48
|
+
/// Use `tryReduce(_:_:)` to collect a stream of elements and produce an accumulated
|
|
49
|
+
/// value based on an error-throwing closure you provide.
|
|
50
|
+
/// If the closure throws an error, the publisher fails and passes the error to its
|
|
51
|
+
/// subscriber.
|
|
52
|
+
///
|
|
53
|
+
/// In the example below, the publisher’s `0` element causes the `myDivide(_:_:)`
|
|
54
|
+
/// function to throw an error and publish the `Double.nan` result:
|
|
55
|
+
///
|
|
56
|
+
/// struct DivisionByZeroError: Error {}
|
|
57
|
+
/// func myDivide(_ dividend: Double, _ divisor: Double) throws -> Double {
|
|
58
|
+
/// guard divisor != 0 else { throw DivisionByZeroError() }
|
|
59
|
+
/// return dividend / divisor
|
|
60
|
+
/// }
|
|
61
|
+
///
|
|
62
|
+
/// var numbers: [Double] = [5, 4, 3, 2, 1, 0]
|
|
63
|
+
/// numbers.publisher
|
|
64
|
+
/// .tryReduce(numbers.first!, { accum, next in try myDivide(accum, next) })
|
|
65
|
+
/// .catch({ _ in Just(Double.nan) })
|
|
66
|
+
/// .sink { print("\($0)") }
|
|
67
|
+
///
|
|
68
|
+
|
|
69
|
+
/// - Parameters:
|
|
70
|
+
/// - initialResult: The value that the closure receives the first time it’s called.
|
|
71
|
+
/// - nextPartialResult: An error-throwing closure that takes
|
|
72
|
+
/// the previously-accumulated value and the next element from the upstream
|
|
73
|
+
/// publisher to produce a new value.
|
|
74
|
+
///
|
|
75
|
+
/// - Returns: A publisher that applies the closure to all received elements and
|
|
76
|
+
/// produces an accumulated value when the upstream publisher finishes.
|
|
77
|
+
public func tryReduce<Accumulator>(
|
|
78
|
+
_ initialResult: Accumulator,
|
|
79
|
+
_ nextPartialResult: @escaping (Accumulator, Output) throws -> Accumulator
|
|
80
|
+
) -> Publishers.TryReduce<Self, Accumulator> {
|
|
81
|
+
return .init(upstream: self,
|
|
82
|
+
initial: initialResult,
|
|
83
|
+
nextPartialResult: nextPartialResult)
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
extension Publishers {
|
|
88
|
+
|
|
89
|
+
/// A publisher that applies a closure to all received elements and produces
|
|
90
|
+
/// an accumulated value when the upstream publisher finishes.
|
|
91
|
+
public struct Reduce<Upstream: Publisher, Output>: Publisher {
|
|
92
|
+
|
|
93
|
+
public typealias Failure = Upstream.Failure
|
|
94
|
+
|
|
95
|
+
public let upstream: Upstream
|
|
96
|
+
|
|
97
|
+
/// The initial value provided on the first invocation of the closure.
|
|
98
|
+
public let initial: Output
|
|
99
|
+
|
|
100
|
+
/// A closure that takes the previously-accumulated value and the next element
|
|
101
|
+
/// from the upstream publisher to produce a new value.
|
|
102
|
+
public let nextPartialResult: (Output, Upstream.Output) -> Output
|
|
103
|
+
|
|
104
|
+
public init(upstream: Upstream,
|
|
105
|
+
initial: Output,
|
|
106
|
+
nextPartialResult: @escaping (Output, Upstream.Output) -> Output) {
|
|
107
|
+
self.upstream = upstream
|
|
108
|
+
self.initial = initial
|
|
109
|
+
self.nextPartialResult = nextPartialResult
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
113
|
+
where Output == Downstream.Input, Upstream.Failure == Downstream.Failure
|
|
114
|
+
{
|
|
115
|
+
let inner = Inner(downstream: subscriber,
|
|
116
|
+
initial: initial,
|
|
117
|
+
reduce: nextPartialResult)
|
|
118
|
+
upstream.subscribe(inner)
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/// A publisher that applies an error-throwing closure to all received elements and
|
|
123
|
+
/// produces an accumulated value when the upstream publisher finishes.
|
|
124
|
+
public struct TryReduce<Upstream: Publisher, Output>: Publisher {
|
|
125
|
+
|
|
126
|
+
public typealias Failure = Error
|
|
127
|
+
|
|
128
|
+
/// The publisher from which this publisher receives elements.
|
|
129
|
+
public let upstream: Upstream
|
|
130
|
+
|
|
131
|
+
/// The initial value provided on the first invocation of the closure.
|
|
132
|
+
public let initial: Output
|
|
133
|
+
|
|
134
|
+
/// An error-throwing closure that takes the previously-accumulated value and
|
|
135
|
+
/// the next element from the upstream to produce a new value.
|
|
136
|
+
///
|
|
137
|
+
/// If this closure throws an error, the publisher fails and passes the error
|
|
138
|
+
/// to its subscriber.
|
|
139
|
+
public let nextPartialResult: (Output, Upstream.Output) throws -> Output
|
|
140
|
+
|
|
141
|
+
public init(
|
|
142
|
+
upstream: Upstream,
|
|
143
|
+
initial: Output,
|
|
144
|
+
nextPartialResult: @escaping (Output, Upstream.Output) throws -> Output
|
|
145
|
+
) {
|
|
146
|
+
self.upstream = upstream
|
|
147
|
+
self.initial = initial
|
|
148
|
+
self.nextPartialResult = nextPartialResult
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
152
|
+
where Output == Downstream.Input, Downstream.Failure == Error
|
|
153
|
+
{
|
|
154
|
+
let inner = Inner(downstream: subscriber,
|
|
155
|
+
initial: initial,
|
|
156
|
+
reduce: nextPartialResult)
|
|
157
|
+
upstream.subscribe(inner)
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
extension Publishers.Reduce {
|
|
163
|
+
private final class Inner<Downstream: Subscriber>
|
|
164
|
+
: ReduceProducer<Downstream,
|
|
165
|
+
Upstream.Output,
|
|
166
|
+
Output,
|
|
167
|
+
Upstream.Failure,
|
|
168
|
+
(Output, Upstream.Output) -> Output>
|
|
169
|
+
where Downstream.Input == Output, Upstream.Failure == Downstream.Failure
|
|
170
|
+
{
|
|
171
|
+
override func receive(
|
|
172
|
+
newValue: Upstream.Output
|
|
173
|
+
) -> PartialCompletion<Void, Downstream.Failure> {
|
|
174
|
+
result = reduce(result!, newValue)
|
|
175
|
+
return .continue
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
override var description: String { return "Reduce" }
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
extension Publishers.TryReduce {
|
|
183
|
+
private final class Inner<Downstream: Subscriber>
|
|
184
|
+
: ReduceProducer<Downstream,
|
|
185
|
+
Upstream.Output,
|
|
186
|
+
Output,
|
|
187
|
+
Upstream.Failure,
|
|
188
|
+
(Output, Upstream.Output) throws -> Output>
|
|
189
|
+
where Downstream.Input == Output, Downstream.Failure == Error
|
|
190
|
+
{
|
|
191
|
+
override func receive(
|
|
192
|
+
newValue: Upstream.Output
|
|
193
|
+
) -> PartialCompletion<Void, Downstream.Failure> {
|
|
194
|
+
do {
|
|
195
|
+
result = try reduce(result!, newValue)
|
|
196
|
+
return .continue
|
|
197
|
+
} catch {
|
|
198
|
+
return .failure(error)
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
override var description: String { return "TryReduce" }
|
|
203
|
+
}
|
|
204
|
+
}
|