@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,315 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Optional.Publisher.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 17.06.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Optional {
|
|
9
|
+
|
|
10
|
+
/// A namespace for disambiguation when both OpenCombine and Combine are imported.
|
|
11
|
+
///
|
|
12
|
+
/// Combine extends `Optional` with a nested type `Publisher`.
|
|
13
|
+
/// If you import both OpenCombine and Combine (either explicitly or implicitly,
|
|
14
|
+
/// e. g. when importing Foundation), you will not be able to write
|
|
15
|
+
/// `Optional<Int>.Publisher`, because Swift is unable to understand
|
|
16
|
+
/// which `Publisher` you're referring to.
|
|
17
|
+
///
|
|
18
|
+
/// So you have to write `Optional<Int>.OCombine.Publisher`.
|
|
19
|
+
///
|
|
20
|
+
/// This bug is tracked [here](https://bugs.swift.org/browse/SR-11183).
|
|
21
|
+
///
|
|
22
|
+
/// You can omit this whenever Combine is not available (e. g. on Linux).
|
|
23
|
+
public struct OCombine {
|
|
24
|
+
|
|
25
|
+
fileprivate let optional: Optional
|
|
26
|
+
|
|
27
|
+
fileprivate init(_ optional: Optional) {
|
|
28
|
+
self.optional = optional
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public var publisher: Publisher {
|
|
32
|
+
return Publisher(optional)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/// The type of a Combine publisher that publishes the value of a Swift optional
|
|
36
|
+
/// instance to each subscriber exactly once, if the instance has any value at
|
|
37
|
+
/// all.
|
|
38
|
+
///
|
|
39
|
+
/// In contrast with the `Just` publisher, which always produces a single value,
|
|
40
|
+
/// this publisher might not send any values and instead finish normally,
|
|
41
|
+
/// if `output` is `nil`.
|
|
42
|
+
public struct Publisher: Combine.Publisher {
|
|
43
|
+
|
|
44
|
+
/// The kind of value published by this publisher.
|
|
45
|
+
///
|
|
46
|
+
/// This publisher produces the type wrapped by the optional.
|
|
47
|
+
public typealias Output = Wrapped
|
|
48
|
+
|
|
49
|
+
/// The kind of error this publisher might publish.
|
|
50
|
+
///
|
|
51
|
+
/// The optional publisher never produces errors.
|
|
52
|
+
public typealias Failure = Never
|
|
53
|
+
|
|
54
|
+
/// The output to deliver to each subscriber.
|
|
55
|
+
public let output: Wrapped?
|
|
56
|
+
|
|
57
|
+
/// Creates a publisher to emit the value of the optional, or to finish
|
|
58
|
+
/// immediately if the optional doesn't have a value.
|
|
59
|
+
///
|
|
60
|
+
/// - Parameter output: The result to deliver to each subscriber.
|
|
61
|
+
public init(_ output: Output?) {
|
|
62
|
+
self.output = output
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/// Implements the Publisher protocol by accepting the subscriber and
|
|
66
|
+
/// immediately publishing the optional’s value if it has one, or finishing
|
|
67
|
+
/// normally if it doesn’t.
|
|
68
|
+
///
|
|
69
|
+
/// - Parameter subscriber: The subscriber to add.
|
|
70
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
71
|
+
where Output == Downstream.Input, Failure == Downstream.Failure
|
|
72
|
+
{
|
|
73
|
+
if let output = output {
|
|
74
|
+
subscriber.receive(subscription: Inner(value: output,
|
|
75
|
+
downstream: subscriber))
|
|
76
|
+
} else {
|
|
77
|
+
subscriber.receive(subscription: Subscriptions.empty)
|
|
78
|
+
subscriber.receive(completion: .finished)
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
public var ocombine: OCombine {
|
|
85
|
+
return .init(self)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
#if !canImport(Combine)
|
|
89
|
+
/// The type of a Combine publisher that publishes the value of a Swift optional
|
|
90
|
+
/// instance to each subscriber exactly once, if the instance has any value at
|
|
91
|
+
/// all.
|
|
92
|
+
///
|
|
93
|
+
/// In contrast with the `Just` publisher, which always produces a single value,
|
|
94
|
+
/// this publisher might not send any values and instead finish normally,
|
|
95
|
+
/// if `output` is `nil`.
|
|
96
|
+
public typealias Publisher = OCombine.Publisher
|
|
97
|
+
|
|
98
|
+
public var publisher: Publisher {
|
|
99
|
+
return Publisher(self)
|
|
100
|
+
}
|
|
101
|
+
#endif
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
extension Optional.OCombine {
|
|
105
|
+
private final class Inner<Downstream: Subscriber>
|
|
106
|
+
: Subscription,
|
|
107
|
+
CustomStringConvertible,
|
|
108
|
+
CustomReflectable,
|
|
109
|
+
CustomPlaygroundDisplayConvertible
|
|
110
|
+
where Downstream.Input == Wrapped
|
|
111
|
+
{
|
|
112
|
+
// NOTE: this class has been audited for thread safety.
|
|
113
|
+
// Combine doesn't use any locking here.
|
|
114
|
+
|
|
115
|
+
private var downstream: Downstream?
|
|
116
|
+
private let output: Wrapped
|
|
117
|
+
|
|
118
|
+
init(value: Wrapped, downstream: Downstream) {
|
|
119
|
+
self.output = value
|
|
120
|
+
self.downstream = downstream
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
func request(_ demand: Subscribers.Demand) {
|
|
124
|
+
demand.assertNonZero()
|
|
125
|
+
guard let downstream = self.downstream.take() else { return }
|
|
126
|
+
_ = downstream.receive(output)
|
|
127
|
+
downstream.receive(completion: .finished)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
func cancel() {
|
|
131
|
+
downstream = nil
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
var description: String { return "Optional" }
|
|
135
|
+
|
|
136
|
+
var customMirror: Mirror {
|
|
137
|
+
return Mirror(self, unlabeledChildren: CollectionOfOne(output))
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
var playgroundDescription: Any { return description }
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
extension Optional.OCombine.Publisher: Equatable where Wrapped: Equatable {}
|
|
145
|
+
|
|
146
|
+
extension Optional.OCombine.Publisher where Wrapped: Equatable {
|
|
147
|
+
|
|
148
|
+
public func contains(_ output: Output) -> Optional<Bool>.OCombine.Publisher {
|
|
149
|
+
return .init(self.output.map { $0 == output })
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
public func removeDuplicates() -> Optional<Wrapped>.OCombine.Publisher {
|
|
153
|
+
return self
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
extension Optional.OCombine.Publisher where Wrapped: Comparable {
|
|
158
|
+
|
|
159
|
+
public func min() -> Optional<Wrapped>.OCombine.Publisher {
|
|
160
|
+
return self
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
public func max() -> Optional<Wrapped>.OCombine.Publisher {
|
|
164
|
+
return self
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
extension Optional.OCombine.Publisher {
|
|
169
|
+
|
|
170
|
+
public func allSatisfy(
|
|
171
|
+
_ predicate: (Output) -> Bool
|
|
172
|
+
) -> Optional<Bool>.OCombine.Publisher {
|
|
173
|
+
return .init(self.output.map(predicate))
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
public func collect() -> Optional<[Output]>.OCombine.Publisher {
|
|
177
|
+
return .init(self.output.map { [$0] } ?? [])
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
public func compactMap<ElementOfResult>(
|
|
181
|
+
_ transform: (Output) -> ElementOfResult?
|
|
182
|
+
) -> Optional<ElementOfResult>.OCombine.Publisher {
|
|
183
|
+
return .init(self.output.flatMap(transform))
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
public func min(
|
|
187
|
+
by areInIncreasingOrder: (Output, Output) -> Bool
|
|
188
|
+
) -> Optional<Output>.OCombine.Publisher {
|
|
189
|
+
return self
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
public func max(
|
|
193
|
+
by areInIncreasingOrder: (Output, Output) -> Bool
|
|
194
|
+
) -> Optional<Output>.OCombine.Publisher {
|
|
195
|
+
return self
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
public func contains(
|
|
199
|
+
where predicate: (Output) -> Bool
|
|
200
|
+
) -> Optional<Bool>.OCombine.Publisher {
|
|
201
|
+
return .init(self.output.map(predicate))
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
public func count() -> Optional<Int>.OCombine.Publisher {
|
|
205
|
+
return .init(self.output.map { _ in 1 })
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
public func dropFirst(_ count: Int = 1) -> Optional<Output>.OCombine.Publisher {
|
|
209
|
+
precondition(count >= 0, "count must not be negative")
|
|
210
|
+
return .init(self.output.flatMap { count == 0 ? $0 : nil })
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
public func drop(
|
|
214
|
+
while predicate: (Output) -> Bool
|
|
215
|
+
) -> Optional<Output>.OCombine.Publisher {
|
|
216
|
+
return .init(self.output.flatMap { predicate($0) ? nil : $0 })
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
public func first() -> Optional<Output>.OCombine.Publisher {
|
|
220
|
+
return self
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
public func first(
|
|
224
|
+
where predicate: (Output) -> Bool
|
|
225
|
+
) -> Optional<Output>.OCombine.Publisher {
|
|
226
|
+
return .init(output.flatMap { predicate($0) ? $0 : nil })
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
public func last() -> Optional<Output>.OCombine.Publisher {
|
|
230
|
+
return self
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
public func last(
|
|
234
|
+
where predicate: (Output) -> Bool
|
|
235
|
+
) -> Optional<Output>.OCombine.Publisher {
|
|
236
|
+
return .init(output.flatMap { predicate($0) ? $0 : nil })
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
public func filter(
|
|
240
|
+
_ isIncluded: (Output) -> Bool
|
|
241
|
+
) -> Optional<Output>.OCombine.Publisher {
|
|
242
|
+
return .init(output.flatMap { isIncluded($0) ? $0 : nil })
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
public func ignoreOutput() -> Empty<Output, Failure> {
|
|
246
|
+
return .init()
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
public func map<ElementOfResult>(
|
|
250
|
+
_ transform: (Output) -> ElementOfResult
|
|
251
|
+
) -> Optional<ElementOfResult>.OCombine.Publisher {
|
|
252
|
+
return .init(output.map(transform))
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
public func output(at index: Int) -> Optional<Output>.OCombine.Publisher {
|
|
256
|
+
precondition(index >= 0, "index must not be negative")
|
|
257
|
+
return .init(output.flatMap { index == 0 ? $0 : nil })
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
public func output<RangeExpression: Swift.RangeExpression>(
|
|
261
|
+
in range: RangeExpression
|
|
262
|
+
) -> Optional<Output>.OCombine.Publisher where RangeExpression.Bound == Int {
|
|
263
|
+
let range = range.relative(to: 0 ..< Int.max)
|
|
264
|
+
precondition(range.lowerBound >= 0, "lowerBound must not be negative")
|
|
265
|
+
|
|
266
|
+
// I don't know why, but Combine has this precondition
|
|
267
|
+
precondition(range.upperBound < .max - 1)
|
|
268
|
+
return .init(
|
|
269
|
+
output.flatMap { (range.lowerBound == 0 && range.upperBound != 0) ? $0 : nil }
|
|
270
|
+
)
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
public func prefix(_ maxLength: Int) -> Optional<Output>.OCombine.Publisher {
|
|
274
|
+
precondition(maxLength >= 0, "maxLength must not be negative")
|
|
275
|
+
return .init(output.flatMap { maxLength > 0 ? $0 : nil })
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
public func prefix(
|
|
279
|
+
while predicate: (Output) -> Bool
|
|
280
|
+
) -> Optional<Output>.OCombine.Publisher {
|
|
281
|
+
return .init(output.flatMap { predicate($0) ? $0 : nil })
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
public func reduce<Accumulator>(
|
|
285
|
+
_ initialResult: Accumulator,
|
|
286
|
+
_ nextPartialResult: (Accumulator, Output) -> Accumulator
|
|
287
|
+
) -> Optional<Accumulator>.OCombine.Publisher {
|
|
288
|
+
return .init(output.map { nextPartialResult(initialResult, $0) })
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
public func scan<ElementOfResult>(
|
|
292
|
+
_ initialResult: ElementOfResult,
|
|
293
|
+
_ nextPartialResult: (ElementOfResult, Output) -> ElementOfResult
|
|
294
|
+
) -> Optional<ElementOfResult>.OCombine.Publisher {
|
|
295
|
+
return .init(output.map { nextPartialResult(initialResult, $0) })
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
public func removeDuplicates(
|
|
299
|
+
by predicate: (Output, Output) -> Bool
|
|
300
|
+
) -> Optional<Output>.OCombine.Publisher {
|
|
301
|
+
return self
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
public func replaceError(with output: Output) -> Optional<Output>.OCombine.Publisher {
|
|
305
|
+
return self
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
public func replaceEmpty(with output: Output) -> Just<Output> {
|
|
309
|
+
return .init(self.output ?? output)
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
public func retry(_ times: Int) -> Optional<Output>.OCombine.Publisher {
|
|
313
|
+
return self
|
|
314
|
+
}
|
|
315
|
+
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.AllSatisfy.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 09.10.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Publishes a single Boolean value that indicates whether all received elements pass
|
|
11
|
+
/// a given predicate.
|
|
12
|
+
///
|
|
13
|
+
/// Use the `allSatisfy(_:)` operator to determine if all elements in a stream satisfy
|
|
14
|
+
/// a criteria you provide. When this publisher receives an element, it runs
|
|
15
|
+
/// the predicate against the element. If the predicate returns `false`, the publisher
|
|
16
|
+
/// produces a `false` value and finishes. If the upstream publisher finishes
|
|
17
|
+
/// normally, this publisher produces a `true` value and finishes.
|
|
18
|
+
///
|
|
19
|
+
/// In the example below, the `allSatisfy(_:)` operator tests if each an integer array
|
|
20
|
+
/// publisher’s elements fall into the `targetRange`:
|
|
21
|
+
///
|
|
22
|
+
/// let targetRange = (-1...100)
|
|
23
|
+
/// let numbers = [-1, 0, 10, 5]
|
|
24
|
+
/// numbers.publisher
|
|
25
|
+
/// .allSatisfy { targetRange.contains($0) }
|
|
26
|
+
/// .sink { print("\($0)") }
|
|
27
|
+
///
|
|
28
|
+
/// // Prints: "true"
|
|
29
|
+
///
|
|
30
|
+
/// With operators similar to `reduce(_:_:)`, this publisher produces at most one
|
|
31
|
+
/// value.
|
|
32
|
+
///
|
|
33
|
+
/// > Note: Upon receiving any request greater than zero, this publisher requests
|
|
34
|
+
/// unlimited elements from the upstream publisher.
|
|
35
|
+
///
|
|
36
|
+
/// - Parameter predicate: A closure that evaluates each received element.
|
|
37
|
+
/// Return `true` to continue, or `false` to cancel the upstream and complete.
|
|
38
|
+
/// - Returns: A publisher that publishes a Boolean value that indicates whether
|
|
39
|
+
/// all received elements pass a given predicate.
|
|
40
|
+
public func allSatisfy(
|
|
41
|
+
_ predicate: @escaping (Output) -> Bool
|
|
42
|
+
) -> Publishers.AllSatisfy<Self> {
|
|
43
|
+
return .init(upstream: self, predicate: predicate)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/// Publishes a single Boolean value that indicates whether all received elements pass
|
|
47
|
+
/// a given error-throwing predicate.
|
|
48
|
+
///
|
|
49
|
+
/// Use the `tryAllSatisfy(_:)` operator to determine if all elements in a stream
|
|
50
|
+
/// satisfy a criteria in an error-throwing predicate you provide. When this publisher
|
|
51
|
+
/// receives an element, it runs the predicate against the element. If the predicate
|
|
52
|
+
/// returns `false`, the publisher produces a `false` value and finishes.
|
|
53
|
+
/// If the upstream publisher finishes normally, this publisher produces a `true`
|
|
54
|
+
/// value and finishes. If the predicate throws an error, the publisher fails and
|
|
55
|
+
/// passes the error to its downstream subscriber.
|
|
56
|
+
///
|
|
57
|
+
/// In the example below, an error-throwing predicate tests if each of an integer
|
|
58
|
+
/// array publisher’s elements fall into the `targetRange`; the predicate throws
|
|
59
|
+
/// an error if an element is zero and terminates the stream.
|
|
60
|
+
///
|
|
61
|
+
/// let targetRange = (-1...100)
|
|
62
|
+
/// let numbers = [-1, 10, 5, 0]
|
|
63
|
+
///
|
|
64
|
+
/// numbers.publisher
|
|
65
|
+
/// .tryAllSatisfy { anInt in
|
|
66
|
+
/// guard anInt != 0 else { throw RangeError() }
|
|
67
|
+
/// return targetRange.contains(anInt)
|
|
68
|
+
/// }
|
|
69
|
+
/// .sink(
|
|
70
|
+
/// receiveCompletion: { print ("completion: \($0)") },
|
|
71
|
+
/// receiveValue: { print ("value: \($0)") }
|
|
72
|
+
/// )
|
|
73
|
+
///
|
|
74
|
+
/// // Prints: "completion: failure(RangeError())"
|
|
75
|
+
///
|
|
76
|
+
/// With operators similar to `reduce(_:_:)`, this publisher produces at most one
|
|
77
|
+
/// value.
|
|
78
|
+
///
|
|
79
|
+
/// > Note: Upon receiving any request greater than zero, this publisher requests
|
|
80
|
+
/// unlimited elements from the upstream publisher.
|
|
81
|
+
///
|
|
82
|
+
/// - Parameter predicate: A closure that evaluates each received element. Return
|
|
83
|
+
/// `true` to continue, or `false` to cancel the upstream and complete. The closure
|
|
84
|
+
/// may throw an error, in which case the publisher cancels the upstream publisher
|
|
85
|
+
/// and fails with the thrown error.
|
|
86
|
+
/// - Returns: A publisher that publishes a Boolean value that indicates whether all
|
|
87
|
+
/// received elements pass a given predicate.
|
|
88
|
+
public func tryAllSatisfy(
|
|
89
|
+
_ predicate: @escaping (Output) throws -> Bool
|
|
90
|
+
) -> Publishers.TryAllSatisfy<Self> {
|
|
91
|
+
return .init(upstream: self, predicate: predicate)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
extension Publishers {
|
|
96
|
+
|
|
97
|
+
/// A publisher that publishes a single Boolean value that indicates whether
|
|
98
|
+
/// all received elements pass a given predicate.
|
|
99
|
+
public struct AllSatisfy<Upstream: Publisher>: Publisher {
|
|
100
|
+
|
|
101
|
+
public typealias Output = Bool
|
|
102
|
+
|
|
103
|
+
public typealias Failure = Upstream.Failure
|
|
104
|
+
|
|
105
|
+
/// The publisher from which this publisher receives elements.
|
|
106
|
+
public let upstream: Upstream
|
|
107
|
+
|
|
108
|
+
/// A closure that evaluates each received element.
|
|
109
|
+
///
|
|
110
|
+
/// Return `true` to continue, or `false` to cancel the upstream and finish.
|
|
111
|
+
public let predicate: (Upstream.Output) -> Bool
|
|
112
|
+
|
|
113
|
+
public init(upstream: Upstream, predicate: @escaping (Upstream.Output) -> Bool) {
|
|
114
|
+
self.upstream = upstream
|
|
115
|
+
self.predicate = predicate
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
119
|
+
where Upstream.Failure == Downstream.Failure, Downstream.Input == Bool
|
|
120
|
+
{
|
|
121
|
+
upstream.subscribe(Inner(downstream: subscriber, predicate: predicate))
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/// A publisher that publishes a single Boolean value that indicates whether
|
|
126
|
+
/// all received elements pass a given error-throwing predicate.
|
|
127
|
+
public struct TryAllSatisfy<Upstream: Publisher>: Publisher {
|
|
128
|
+
|
|
129
|
+
public typealias Output = Bool
|
|
130
|
+
|
|
131
|
+
public typealias Failure = Error
|
|
132
|
+
|
|
133
|
+
/// The publisher from which this publisher receives elements.
|
|
134
|
+
public let upstream: Upstream
|
|
135
|
+
|
|
136
|
+
/// A closure that evaluates each received element.
|
|
137
|
+
///
|
|
138
|
+
/// Return `true` to continue, or `false` to cancel the upstream and complete.
|
|
139
|
+
/// The closure may throw, in which case the publisher cancels the upstream
|
|
140
|
+
/// publisher and fails with the thrown error.
|
|
141
|
+
public let predicate: (Upstream.Output) throws -> Bool
|
|
142
|
+
|
|
143
|
+
public init(upstream: Upstream,
|
|
144
|
+
predicate: @escaping (Upstream.Output) throws -> Bool) {
|
|
145
|
+
self.upstream = upstream
|
|
146
|
+
self.predicate = predicate
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
150
|
+
where Downstream.Failure == Error, Downstream.Input == Bool
|
|
151
|
+
{
|
|
152
|
+
upstream.subscribe(Inner(downstream: subscriber, predicate: predicate))
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
extension Publishers.AllSatisfy {
|
|
158
|
+
private final class Inner<Downstream: Subscriber>
|
|
159
|
+
: ReduceProducer<Downstream,
|
|
160
|
+
Upstream.Output,
|
|
161
|
+
Bool,
|
|
162
|
+
Upstream.Failure,
|
|
163
|
+
(Upstream.Output) -> Bool>
|
|
164
|
+
where Downstream.Input == Output, Upstream.Failure == Downstream.Failure
|
|
165
|
+
{
|
|
166
|
+
fileprivate init(downstream: Downstream,
|
|
167
|
+
predicate: @escaping (Upstream.Output) -> Bool) {
|
|
168
|
+
super.init(downstream: downstream, initial: true, reduce: predicate)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
override func receive(
|
|
172
|
+
newValue: Upstream.Output
|
|
173
|
+
) -> PartialCompletion<Void, Downstream.Failure> {
|
|
174
|
+
if !reduce(newValue) {
|
|
175
|
+
result = false
|
|
176
|
+
return .finished
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return .continue
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
override var description: String { return "AllSatisfy" }
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
extension Publishers.TryAllSatisfy {
|
|
187
|
+
private final class Inner<Downstream: Subscriber>
|
|
188
|
+
: ReduceProducer<Downstream,
|
|
189
|
+
Upstream.Output,
|
|
190
|
+
Bool,
|
|
191
|
+
Upstream.Failure,
|
|
192
|
+
(Upstream.Output) throws -> Bool>
|
|
193
|
+
where Downstream.Input == Output, Downstream.Failure == Error
|
|
194
|
+
{
|
|
195
|
+
fileprivate init(downstream: Downstream,
|
|
196
|
+
predicate: @escaping (Upstream.Output) throws -> Bool) {
|
|
197
|
+
super.init(downstream: downstream, initial: true, reduce: predicate)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
override func receive(
|
|
201
|
+
newValue: Upstream.Output
|
|
202
|
+
) -> PartialCompletion<Void, Downstream.Failure> {
|
|
203
|
+
do {
|
|
204
|
+
if try !reduce(newValue) {
|
|
205
|
+
result = false
|
|
206
|
+
return .finished
|
|
207
|
+
}
|
|
208
|
+
} catch {
|
|
209
|
+
return .failure(error)
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return .continue
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
override var description: String { return "TryAllSatisfy" }
|
|
216
|
+
}
|
|
217
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.AssertNoFailure.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 25.12.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Raises a fatal error when its upstream publisher fails, and otherwise republishes
|
|
11
|
+
/// all received input.
|
|
12
|
+
///
|
|
13
|
+
/// Use `assertNoFailure()` for internal integrity checks that are active during
|
|
14
|
+
/// testing. However, it is important to note that, like its Swift counterpart
|
|
15
|
+
/// `fatalError(_:)`, the `assertNoFailure()` operator asserts a fatal exception when
|
|
16
|
+
/// triggered during development and testing, _and_ in shipping versions of code.
|
|
17
|
+
///
|
|
18
|
+
/// In the example below, a `CurrentValueSubject` publishes the initial and second
|
|
19
|
+
/// values successfully. The third value, containing a `genericSubjectError`, causes
|
|
20
|
+
/// the `assertNoFailure()` operator to assert a fatal exception stopping the process:
|
|
21
|
+
///
|
|
22
|
+
/// public enum SubjectError: Error {
|
|
23
|
+
/// case genericSubjectError
|
|
24
|
+
/// }
|
|
25
|
+
///
|
|
26
|
+
/// let subject = CurrentValueSubject<String, Error>("initial value")
|
|
27
|
+
/// subject
|
|
28
|
+
/// .assertNoFailure()
|
|
29
|
+
/// .sink(receiveCompletion: { print ("completion: \($0)") },
|
|
30
|
+
/// receiveValue: { print ("value: \($0).") }
|
|
31
|
+
/// )
|
|
32
|
+
///
|
|
33
|
+
/// subject.send("second value")
|
|
34
|
+
/// subject.send(completion: .failure(SubjectError.genericSubjectError))
|
|
35
|
+
///
|
|
36
|
+
/// // Prints:
|
|
37
|
+
/// // value: initial value.
|
|
38
|
+
/// // value: second value.
|
|
39
|
+
/// // The process then terminates in the debugger as the assertNoFailure
|
|
40
|
+
/// // operator catches the genericSubjectError.
|
|
41
|
+
///
|
|
42
|
+
/// - Parameters:
|
|
43
|
+
/// - prefix: A string used at the beginning of the fatal error message.
|
|
44
|
+
/// - file: A filename used in the error message. This defaults to `#file`.
|
|
45
|
+
/// - line: A line number used in the error message. This defaults to `#line`.
|
|
46
|
+
/// - Returns: A publisher that raises a fatal error when its upstream publisher
|
|
47
|
+
/// fails.
|
|
48
|
+
public func assertNoFailure(_ prefix: String = "",
|
|
49
|
+
file: StaticString = #file,
|
|
50
|
+
line: UInt = #line) -> Publishers.AssertNoFailure<Self> {
|
|
51
|
+
return .init(upstream: self, prefix: prefix, file: file, line: line)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
extension Publishers {
|
|
56
|
+
|
|
57
|
+
/// A publisher that raises a fatal error upon receiving any failure, and otherwise
|
|
58
|
+
/// republishes all received input.
|
|
59
|
+
///
|
|
60
|
+
/// Use this function for internal integrity checks that are active during testing but
|
|
61
|
+
/// don't affect performance of shipping code.
|
|
62
|
+
public struct AssertNoFailure<Upstream: Publisher>: Publisher {
|
|
63
|
+
|
|
64
|
+
public typealias Output = Upstream.Output
|
|
65
|
+
|
|
66
|
+
public typealias Failure = Never
|
|
67
|
+
|
|
68
|
+
/// The publisher from which this publisher receives elements.
|
|
69
|
+
public let upstream: Upstream
|
|
70
|
+
|
|
71
|
+
/// The string used at the beginning of the fatal error message.
|
|
72
|
+
public let prefix: String
|
|
73
|
+
|
|
74
|
+
/// The filename used in the error message.
|
|
75
|
+
public let file: StaticString
|
|
76
|
+
|
|
77
|
+
/// The line number used in the error message.
|
|
78
|
+
public let line: UInt
|
|
79
|
+
|
|
80
|
+
public init(upstream: Upstream, prefix: String, file: StaticString, line: UInt) {
|
|
81
|
+
self.upstream = upstream
|
|
82
|
+
self.prefix = prefix
|
|
83
|
+
self.file = file
|
|
84
|
+
self.line = line
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
88
|
+
where Downstream.Input == Output, Downstream.Failure == Never
|
|
89
|
+
{
|
|
90
|
+
upstream.subscribe(Inner(downstream: subscriber,
|
|
91
|
+
prefix: prefix,
|
|
92
|
+
file: file,
|
|
93
|
+
line: line))
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
extension Publishers.AssertNoFailure {
|
|
99
|
+
private struct Inner<Downstream: Subscriber>
|
|
100
|
+
: Subscriber,
|
|
101
|
+
CustomStringConvertible,
|
|
102
|
+
CustomReflectable,
|
|
103
|
+
CustomPlaygroundDisplayConvertible
|
|
104
|
+
where Downstream.Input == Upstream.Output, Downstream.Failure == Never
|
|
105
|
+
{
|
|
106
|
+
typealias Input = Upstream.Output
|
|
107
|
+
|
|
108
|
+
typealias Failure = Upstream.Failure
|
|
109
|
+
|
|
110
|
+
private let downstream: Downstream
|
|
111
|
+
|
|
112
|
+
private let prefix: String
|
|
113
|
+
|
|
114
|
+
private let file: StaticString
|
|
115
|
+
|
|
116
|
+
private let line: UInt
|
|
117
|
+
|
|
118
|
+
let combineIdentifier = CombineIdentifier()
|
|
119
|
+
|
|
120
|
+
init(downstream: Downstream, prefix: String, file: StaticString, line: UInt) {
|
|
121
|
+
self.downstream = downstream
|
|
122
|
+
self.prefix = prefix
|
|
123
|
+
self.file = file
|
|
124
|
+
self.line = line
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
func receive(subscription: Subscription) {
|
|
128
|
+
downstream.receive(subscription: subscription)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
132
|
+
return downstream.receive(input)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
func receive(completion: Subscribers.Completion<Failure>) {
|
|
136
|
+
switch completion {
|
|
137
|
+
case .finished:
|
|
138
|
+
downstream.receive(completion: .finished)
|
|
139
|
+
case .failure(let error):
|
|
140
|
+
let prefix = self.prefix.isEmpty ? "" : self.prefix + ": "
|
|
141
|
+
fatalError("\(prefix)\(error)", file: file, line: line)
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
var description: String { return "AssertNoFailure" }
|
|
146
|
+
|
|
147
|
+
var customMirror: Mirror {
|
|
148
|
+
let children: [Mirror.Child] = [
|
|
149
|
+
("file", file),
|
|
150
|
+
("line", line),
|
|
151
|
+
("prefix", prefix)
|
|
152
|
+
]
|
|
153
|
+
return Mirror(self, children: children)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
var playgroundDescription: Any { return description }
|
|
157
|
+
}
|
|
158
|
+
}
|