@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,241 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.Output.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 24.10.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Republishes elements up to the specified maximum count.
|
|
11
|
+
///
|
|
12
|
+
/// Use `prefix(_:)` to limit the number of elements republished to the downstream
|
|
13
|
+
/// subscriber.
|
|
14
|
+
///
|
|
15
|
+
/// In the example below, the `prefix(_:)` operator limits its output to the first
|
|
16
|
+
/// two elements before finishing normally:
|
|
17
|
+
///
|
|
18
|
+
/// let numbers = (0...10)
|
|
19
|
+
/// cancellable = numbers.publisher
|
|
20
|
+
/// .prefix(2)
|
|
21
|
+
/// .sink { print("\($0)", terminator: " ") }
|
|
22
|
+
///
|
|
23
|
+
/// // Prints: "0 1"
|
|
24
|
+
///
|
|
25
|
+
/// - Parameter maxLength: The maximum number of elements to republish.
|
|
26
|
+
/// - Returns: A publisher that publishes up to the specified number of elements
|
|
27
|
+
/// before completing.
|
|
28
|
+
public func prefix(_ maxLength: Int) -> Publishers.Output<Self> {
|
|
29
|
+
return output(in: ..<maxLength)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
extension Publisher {
|
|
34
|
+
|
|
35
|
+
/// Publishes a specific element, indicated by its index in the sequence of published
|
|
36
|
+
/// elements.
|
|
37
|
+
///
|
|
38
|
+
/// Use `output(at:)` when you need to republish a specific element specified by
|
|
39
|
+
/// its position in the stream. If the publisher completes normally or with an error
|
|
40
|
+
/// before publishing the specified element, then the publisher doesn’t produce any
|
|
41
|
+
/// elements.
|
|
42
|
+
///
|
|
43
|
+
/// In the example below, the array publisher emits the fifth element in the sequence
|
|
44
|
+
/// of published elements:
|
|
45
|
+
///
|
|
46
|
+
/// let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
|
47
|
+
/// numbers.publisher
|
|
48
|
+
/// .output(at: 5)
|
|
49
|
+
/// .sink { print("\($0)") }
|
|
50
|
+
///
|
|
51
|
+
/// // Prints: "6"
|
|
52
|
+
///
|
|
53
|
+
/// - Parameter index: The index that indicates the element to publish.
|
|
54
|
+
/// - Returns: A publisher that publishes a specific indexed element.
|
|
55
|
+
public func output(at index: Int) -> Publishers.Output<Self> {
|
|
56
|
+
return output(in: index...index)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/// Publishes elements specified by their range in the sequence of published elements.
|
|
60
|
+
///
|
|
61
|
+
/// Use `output(in:)` to republish a range indices you specify in the published
|
|
62
|
+
/// stream. After publishing all elements, the publisher finishes normally.
|
|
63
|
+
/// If the publisher completes normally or with an error before producing all
|
|
64
|
+
/// the elements in the range, it doesn’t publish the remaining elements.
|
|
65
|
+
///
|
|
66
|
+
/// In the example below, an array publisher emits the subset of elements at
|
|
67
|
+
/// the indices in the specified range:
|
|
68
|
+
///
|
|
69
|
+
/// let numbers = [1, 1, 2, 2, 2, 3, 4, 5, 6]
|
|
70
|
+
/// numbers.publisher
|
|
71
|
+
/// .output(in: (3...5))
|
|
72
|
+
/// .sink { print("\($0)", terminator: " ") }
|
|
73
|
+
///
|
|
74
|
+
/// // Prints: "2 2 3"
|
|
75
|
+
///
|
|
76
|
+
/// - Parameter range: A range that indicates which elements to publish.
|
|
77
|
+
/// - Returns: A publisher that publishes elements specified by a range.
|
|
78
|
+
public func output<Range: RangeExpression>(in range: Range) -> Publishers.Output<Self>
|
|
79
|
+
where Range.Bound == Int
|
|
80
|
+
{
|
|
81
|
+
return .init(upstream: self, range: range.relative(to: 0 ..< .max))
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
extension Publishers {
|
|
86
|
+
|
|
87
|
+
/// A publisher that publishes elements specified by a range in the sequence of
|
|
88
|
+
/// published elements.
|
|
89
|
+
public struct Output<Upstream: Publisher>: Publisher {
|
|
90
|
+
|
|
91
|
+
public typealias Output = Upstream.Output
|
|
92
|
+
|
|
93
|
+
public typealias Failure = Upstream.Failure
|
|
94
|
+
|
|
95
|
+
/// The publisher that this publisher receives elements from.
|
|
96
|
+
public let upstream: Upstream
|
|
97
|
+
|
|
98
|
+
/// The range of elements to publish.
|
|
99
|
+
public let range: CountableRange<Int>
|
|
100
|
+
|
|
101
|
+
/// Creates a publisher that publishes elements specified by a range.
|
|
102
|
+
///
|
|
103
|
+
/// - Parameters:
|
|
104
|
+
/// - upstream: The publisher that this publisher receives elements from.
|
|
105
|
+
/// - range: The range of elements to publish.
|
|
106
|
+
public init(upstream: Upstream, range: CountableRange<Int>) {
|
|
107
|
+
precondition(range.lowerBound >= 0, "lowerBound must not be negative")
|
|
108
|
+
precondition(range.upperBound >= 0, "upperBound must not be negative")
|
|
109
|
+
self.upstream = upstream
|
|
110
|
+
self.range = range
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
114
|
+
where Upstream.Failure == Downstream.Failure,
|
|
115
|
+
Upstream.Output == Downstream.Input
|
|
116
|
+
{
|
|
117
|
+
upstream.subscribe(Inner(downstream: subscriber, range: range))
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
extension Publishers.Output: Equatable where Upstream: Equatable {}
|
|
123
|
+
|
|
124
|
+
extension Publishers.Output {
|
|
125
|
+
private final class Inner<Downstream: Subscriber>
|
|
126
|
+
: Subscriber,
|
|
127
|
+
Subscription,
|
|
128
|
+
CustomStringConvertible,
|
|
129
|
+
CustomReflectable,
|
|
130
|
+
CustomPlaygroundDisplayConvertible
|
|
131
|
+
where Downstream.Input == Upstream.Output, Downstream.Failure == Upstream.Failure
|
|
132
|
+
{
|
|
133
|
+
// NOTE: This class has been audited for thread safety
|
|
134
|
+
|
|
135
|
+
typealias Input = Upstream.Output
|
|
136
|
+
|
|
137
|
+
typealias Failure = Upstream.Failure
|
|
138
|
+
|
|
139
|
+
private let downstream: Downstream
|
|
140
|
+
|
|
141
|
+
private var status = SubscriptionStatus.awaitingSubscription
|
|
142
|
+
|
|
143
|
+
private var remainingUntilStart: Int
|
|
144
|
+
|
|
145
|
+
private var remainingCount: Int
|
|
146
|
+
|
|
147
|
+
private let lock = UnfairLock.allocate()
|
|
148
|
+
|
|
149
|
+
fileprivate init(downstream: Downstream, range: CountableRange<Int>) {
|
|
150
|
+
self.downstream = downstream
|
|
151
|
+
self.remainingUntilStart = range.lowerBound
|
|
152
|
+
self.remainingCount = range.count
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
deinit {
|
|
156
|
+
lock.deallocate()
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
func receive(subscription: Subscription) {
|
|
160
|
+
lock.lock()
|
|
161
|
+
guard case .awaitingSubscription = status else {
|
|
162
|
+
lock.unlock()
|
|
163
|
+
subscription.cancel()
|
|
164
|
+
return
|
|
165
|
+
}
|
|
166
|
+
status = .subscribed(subscription)
|
|
167
|
+
lock.unlock()
|
|
168
|
+
downstream.receive(subscription: self)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
func receive(_ input: Upstream.Output) -> Subscribers.Demand {
|
|
172
|
+
if remainingUntilStart > 0 {
|
|
173
|
+
remainingUntilStart -= 1
|
|
174
|
+
return .max(1)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
let newDemand: Subscribers.Demand
|
|
178
|
+
if remainingCount > 0 {
|
|
179
|
+
remainingCount -= 1
|
|
180
|
+
newDemand = downstream.receive(input)
|
|
181
|
+
} else {
|
|
182
|
+
newDemand = .none
|
|
183
|
+
cancelUpstreamAndFinish()
|
|
184
|
+
}
|
|
185
|
+
return newDemand
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
func receive(completion: Subscribers.Completion<Upstream.Failure>) {
|
|
189
|
+
lock.lock()
|
|
190
|
+
guard case .subscribed = status else {
|
|
191
|
+
lock.unlock()
|
|
192
|
+
return
|
|
193
|
+
}
|
|
194
|
+
status = .terminal
|
|
195
|
+
lock.unlock()
|
|
196
|
+
downstream.receive(completion: completion)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
func request(_ demand: Subscribers.Demand) {
|
|
200
|
+
lock.lock()
|
|
201
|
+
guard case let .subscribed(subscription) = status else {
|
|
202
|
+
lock.unlock()
|
|
203
|
+
return
|
|
204
|
+
}
|
|
205
|
+
lock.unlock()
|
|
206
|
+
subscription.request(demand)
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
func cancel() {
|
|
210
|
+
lock.lock()
|
|
211
|
+
guard case let .subscribed(subscription) = status else {
|
|
212
|
+
lock.unlock()
|
|
213
|
+
return
|
|
214
|
+
}
|
|
215
|
+
status = .terminal
|
|
216
|
+
lock.unlock()
|
|
217
|
+
subscription.cancel()
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
var description: String { return "Output" }
|
|
221
|
+
|
|
222
|
+
var customMirror: Mirror { return Mirror(self, children: EmptyCollection()) }
|
|
223
|
+
|
|
224
|
+
var playgroundDescription: Any { return description }
|
|
225
|
+
|
|
226
|
+
// MARK: - Private
|
|
227
|
+
|
|
228
|
+
private func cancelUpstreamAndFinish() {
|
|
229
|
+
assert(remainingCount == 0)
|
|
230
|
+
lock.lock()
|
|
231
|
+
guard case let .subscribed(subscription) = status else {
|
|
232
|
+
lock.unlock()
|
|
233
|
+
return
|
|
234
|
+
}
|
|
235
|
+
status = .terminal
|
|
236
|
+
lock.unlock()
|
|
237
|
+
subscription.cancel()
|
|
238
|
+
downstream.receive(completion: .finished)
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.PrefixUntilOutput.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 08.11.2020.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Republishes elements until another publisher emits an element.
|
|
11
|
+
///
|
|
12
|
+
/// After the second publisher publishes an element, the publisher returned by this
|
|
13
|
+
/// method finishes.
|
|
14
|
+
///
|
|
15
|
+
/// - Parameter publisher: A second publisher.
|
|
16
|
+
/// - Returns: A publisher that republishes elements until the second publisher
|
|
17
|
+
/// publishes an element.
|
|
18
|
+
public func prefix<Other: Publisher>(
|
|
19
|
+
untilOutputFrom publisher: Other
|
|
20
|
+
) -> Publishers.PrefixUntilOutput<Self, Other> {
|
|
21
|
+
return .init(upstream: self, other: publisher)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
extension Publishers {
|
|
26
|
+
public struct PrefixUntilOutput<Upstream: Publisher, Other: Publisher>: Publisher {
|
|
27
|
+
|
|
28
|
+
public typealias Output = Upstream.Output
|
|
29
|
+
|
|
30
|
+
public typealias Failure = Upstream.Failure
|
|
31
|
+
|
|
32
|
+
/// The publisher from which this publisher receives elements.
|
|
33
|
+
public let upstream: Upstream
|
|
34
|
+
|
|
35
|
+
/// Another publisher, whose first output causes this publisher to finish.
|
|
36
|
+
public let other: Other
|
|
37
|
+
|
|
38
|
+
public init(upstream: Upstream, other: Other) {
|
|
39
|
+
self.upstream = upstream
|
|
40
|
+
self.other = other
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
44
|
+
where Downstream.Failure == Failure, Downstream.Input == Output
|
|
45
|
+
{
|
|
46
|
+
upstream.subscribe(Inner(downstream: subscriber, trigger: other))
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
extension Publishers.PrefixUntilOutput {
|
|
52
|
+
private final class Inner<Downstream: Subscriber>
|
|
53
|
+
: Subscriber,
|
|
54
|
+
Subscription
|
|
55
|
+
where Downstream.Input == Upstream.Output, Downstream.Failure == Upstream.Failure
|
|
56
|
+
{
|
|
57
|
+
typealias Input = Upstream.Output
|
|
58
|
+
|
|
59
|
+
typealias Failure = Upstream.Failure
|
|
60
|
+
|
|
61
|
+
private struct Termination: Subscriber {
|
|
62
|
+
|
|
63
|
+
let inner: Inner
|
|
64
|
+
|
|
65
|
+
var combineIdentifier: CombineIdentifier {
|
|
66
|
+
return inner.combineIdentifier
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
func receive(subscription: Subscription) {
|
|
70
|
+
inner.terminationReceive(subscription: subscription)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
func receive(_ input: Other.Output) -> Subscribers.Demand {
|
|
74
|
+
return inner.terminationReceive(input)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
func receive(completion: Subscribers.Completion<Other.Failure>) {
|
|
78
|
+
inner.terminationReceive(completion: completion)
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
private var termination: Termination?
|
|
83
|
+
private var prefixState = SubscriptionStatus.awaitingSubscription
|
|
84
|
+
private var terminationState = SubscriptionStatus.awaitingSubscription
|
|
85
|
+
private var triggered = false
|
|
86
|
+
private let lock = UnfairLock.allocate()
|
|
87
|
+
private let downstream: Downstream
|
|
88
|
+
|
|
89
|
+
init(downstream: Downstream, trigger: Other) {
|
|
90
|
+
self.downstream = downstream
|
|
91
|
+
let termination = Termination(inner: self)
|
|
92
|
+
self.termination = termination
|
|
93
|
+
trigger.subscribe(termination)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
deinit {
|
|
97
|
+
lock.deallocate()
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
func receive(subscription: Subscription) {
|
|
101
|
+
lock.lock()
|
|
102
|
+
guard case .awaitingSubscription = prefixState else {
|
|
103
|
+
lock.unlock()
|
|
104
|
+
subscription.cancel()
|
|
105
|
+
return
|
|
106
|
+
}
|
|
107
|
+
prefixState = triggered ? .terminal : .subscribed(subscription)
|
|
108
|
+
lock.unlock()
|
|
109
|
+
downstream.receive(subscription: self)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
113
|
+
lock.lock()
|
|
114
|
+
guard case .subscribed = prefixState else {
|
|
115
|
+
lock.unlock()
|
|
116
|
+
return .none
|
|
117
|
+
}
|
|
118
|
+
lock.unlock()
|
|
119
|
+
return downstream.receive(input)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
func receive(completion: Subscribers.Completion<Failure>) {
|
|
123
|
+
lock.lock()
|
|
124
|
+
let prefixState = self.prefixState
|
|
125
|
+
let terminationSubscription = terminationState.subscription
|
|
126
|
+
self.prefixState = .terminal
|
|
127
|
+
terminationState = .terminal
|
|
128
|
+
termination = nil
|
|
129
|
+
lock.unlock()
|
|
130
|
+
terminationSubscription?.cancel()
|
|
131
|
+
if case .subscribed = prefixState {
|
|
132
|
+
downstream.receive(completion: completion)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
func request(_ demand: Subscribers.Demand) {
|
|
137
|
+
lock.lock()
|
|
138
|
+
guard case let .subscribed(subscription) = prefixState else {
|
|
139
|
+
lock.unlock()
|
|
140
|
+
return
|
|
141
|
+
}
|
|
142
|
+
lock.unlock()
|
|
143
|
+
subscription.request(demand)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
func cancel() {
|
|
147
|
+
lock.lock()
|
|
148
|
+
let prefixSubscription = prefixState.subscription
|
|
149
|
+
let terminationSubscription = terminationState.subscription
|
|
150
|
+
prefixState = .terminal
|
|
151
|
+
terminationState = .terminal
|
|
152
|
+
lock.unlock()
|
|
153
|
+
prefixSubscription?.cancel()
|
|
154
|
+
terminationSubscription?.cancel()
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// MARK: - Private
|
|
158
|
+
|
|
159
|
+
private func terminationReceive(subscription: Subscription) {
|
|
160
|
+
lock.lock()
|
|
161
|
+
guard case .awaitingSubscription = terminationState else {
|
|
162
|
+
lock.unlock()
|
|
163
|
+
subscription.cancel()
|
|
164
|
+
return
|
|
165
|
+
}
|
|
166
|
+
terminationState = .subscribed(subscription)
|
|
167
|
+
lock.unlock()
|
|
168
|
+
subscription.request(.max(1))
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private func terminationReceive(_ input: Other.Output) -> Subscribers.Demand {
|
|
172
|
+
lock.lock()
|
|
173
|
+
guard case .subscribed = terminationState else {
|
|
174
|
+
lock.unlock()
|
|
175
|
+
return .none
|
|
176
|
+
}
|
|
177
|
+
let prefixSubscription = prefixState.subscription
|
|
178
|
+
prefixState = .terminal
|
|
179
|
+
terminationState = .terminal
|
|
180
|
+
termination = nil
|
|
181
|
+
triggered = true
|
|
182
|
+
lock.unlock()
|
|
183
|
+
prefixSubscription?.cancel()
|
|
184
|
+
downstream.receive(completion: .finished)
|
|
185
|
+
return .none
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
private func terminationReceive(
|
|
189
|
+
completion: Subscribers.Completion<Other.Failure>
|
|
190
|
+
) {
|
|
191
|
+
lock.lock()
|
|
192
|
+
terminationState = .terminal
|
|
193
|
+
termination = nil
|
|
194
|
+
lock.unlock()
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.PrefixWhile.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 24.10.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Republishes elements while a predicate closure indicates publishing should
|
|
11
|
+
/// continue.
|
|
12
|
+
///
|
|
13
|
+
/// Use `prefix(while:)` to emit values while elements from the upstream publishe
|
|
14
|
+
/// meet a condition you specify. The publisher finishes when the closure returns
|
|
15
|
+
/// `false`.
|
|
16
|
+
///
|
|
17
|
+
/// In the example below, the `prefix(while:)` operator emits values while the element
|
|
18
|
+
/// it receives is less than five:
|
|
19
|
+
///
|
|
20
|
+
/// let numbers = (0...10)
|
|
21
|
+
/// numbers.publisher
|
|
22
|
+
/// .prefix { $0 < 5 }
|
|
23
|
+
/// .sink { print("\($0)", terminator: " ") }
|
|
24
|
+
///
|
|
25
|
+
/// // Prints: "0 1 2 3 4"
|
|
26
|
+
///
|
|
27
|
+
/// - Parameter predicate: A closure that takes an element as its parameter and
|
|
28
|
+
/// returns a Boolean value that indicates whether publishing should continue.
|
|
29
|
+
/// - Returns: A publisher that passes through elements until the predicate indicates
|
|
30
|
+
/// publishing should finish.
|
|
31
|
+
public func prefix(
|
|
32
|
+
while predicate: @escaping (Output) -> Bool
|
|
33
|
+
) -> Publishers.PrefixWhile<Self> {
|
|
34
|
+
return .init(upstream: self, predicate: predicate)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/// Republishes elements while an error-throwing predicate closure indicates
|
|
38
|
+
/// publishing should continue.
|
|
39
|
+
///
|
|
40
|
+
/// Use `tryPrefix(while:)` to emit values from the upstream publisher that meet
|
|
41
|
+
/// a condition you specify in an error-throwing closure.
|
|
42
|
+
/// The publisher finishes when the closure returns `false`. If the closure throws
|
|
43
|
+
/// an error, the publisher fails with that error.
|
|
44
|
+
///
|
|
45
|
+
/// struct OutOfRangeError: Error {}
|
|
46
|
+
///
|
|
47
|
+
/// let numbers = (0...10).reversed()
|
|
48
|
+
/// cancellable = numbers.publisher
|
|
49
|
+
/// .tryPrefix {
|
|
50
|
+
/// guard $0 != 0 else { throw OutOfRangeError() }
|
|
51
|
+
/// return $0 <= numbers.max()!
|
|
52
|
+
/// }
|
|
53
|
+
/// .sink(
|
|
54
|
+
/// receiveCompletion: { print ("completion: \($0)", terminator: " ") },
|
|
55
|
+
/// receiveValue: { print ("\($0)", terminator: " ") }
|
|
56
|
+
/// )
|
|
57
|
+
///
|
|
58
|
+
/// // Prints: "10 9 8 7 6 5 4 3 2 1 completion: failure(OutOfRangeError()) "
|
|
59
|
+
///
|
|
60
|
+
/// - Parameter predicate: A closure that takes an element as its parameter and
|
|
61
|
+
/// returns a Boolean value indicating whether publishing should continue.
|
|
62
|
+
/// - Returns: A publisher that passes through elements until the predicate throws or
|
|
63
|
+
/// indicates publishing should finish.
|
|
64
|
+
public func tryPrefix(
|
|
65
|
+
while predicate: @escaping (Output) throws -> Bool
|
|
66
|
+
) -> Publishers.TryPrefixWhile<Self> {
|
|
67
|
+
return .init(upstream: self, predicate: predicate)
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
extension Publishers {
|
|
72
|
+
|
|
73
|
+
/// A publisher that republishes elements while a predicate closure indicates
|
|
74
|
+
/// publishing should continue.
|
|
75
|
+
public struct PrefixWhile<Upstream: Publisher>: Publisher {
|
|
76
|
+
|
|
77
|
+
public typealias Output = Upstream.Output
|
|
78
|
+
|
|
79
|
+
public typealias Failure = Upstream.Failure
|
|
80
|
+
|
|
81
|
+
/// The publisher from which this publisher receives elements.
|
|
82
|
+
public let upstream: Upstream
|
|
83
|
+
|
|
84
|
+
/// The closure that determines whether whether publishing should continue.
|
|
85
|
+
public let predicate: (Upstream.Output) -> Bool
|
|
86
|
+
|
|
87
|
+
public init(upstream: Upstream, predicate: @escaping (Upstream.Output) -> Bool) {
|
|
88
|
+
self.upstream = upstream
|
|
89
|
+
self.predicate = predicate
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
93
|
+
where Upstream.Failure == Downstream.Failure,
|
|
94
|
+
Upstream.Output == Downstream.Input
|
|
95
|
+
{
|
|
96
|
+
upstream.subscribe(Inner(downstream: subscriber, filter: predicate))
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/// A publisher that republishes elements while an error-throwing predicate closure
|
|
101
|
+
/// indicates publishing should continue.
|
|
102
|
+
public struct TryPrefixWhile<Upstream: Publisher>: Publisher {
|
|
103
|
+
|
|
104
|
+
public typealias Output = Upstream.Output
|
|
105
|
+
|
|
106
|
+
public typealias Failure = Error
|
|
107
|
+
|
|
108
|
+
/// The publisher from which this publisher receives elements.
|
|
109
|
+
public let upstream: Upstream
|
|
110
|
+
|
|
111
|
+
/// The error-throwing closure that determines whether publishing should continue.
|
|
112
|
+
public let predicate: (Upstream.Output) throws -> Bool
|
|
113
|
+
|
|
114
|
+
public init(upstream: Upstream,
|
|
115
|
+
predicate: @escaping (Upstream.Output) throws -> Bool) {
|
|
116
|
+
self.upstream = upstream
|
|
117
|
+
self.predicate = predicate
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
121
|
+
where Upstream.Output == Downstream.Input, Downstream.Failure == Error
|
|
122
|
+
{
|
|
123
|
+
upstream.subscribe(Inner(downstream: subscriber, filter: predicate))
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
extension Publishers.PrefixWhile {
|
|
129
|
+
private final class Inner<Downstream: Subscriber>
|
|
130
|
+
: FilterProducer<Downstream,
|
|
131
|
+
Upstream.Output,
|
|
132
|
+
Upstream.Output,
|
|
133
|
+
Upstream.Failure,
|
|
134
|
+
(Upstream.Output) -> Bool>
|
|
135
|
+
where Downstream.Input == Upstream.Output, Downstream.Failure == Upstream.Failure
|
|
136
|
+
{
|
|
137
|
+
typealias Input = Upstream.Output
|
|
138
|
+
|
|
139
|
+
typealias Failure = Upstream.Failure
|
|
140
|
+
|
|
141
|
+
override func receive(
|
|
142
|
+
newValue: Input
|
|
143
|
+
) -> PartialCompletion<Upstream.Output?, Downstream.Failure> {
|
|
144
|
+
return filter(newValue) ? .continue(newValue) : .finished
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
override var description: String { return "PrefixWhile" }
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
extension Publishers.TryPrefixWhile {
|
|
152
|
+
private final class Inner<Downstream: Subscriber>
|
|
153
|
+
: FilterProducer<Downstream,
|
|
154
|
+
Upstream.Output,
|
|
155
|
+
Upstream.Output,
|
|
156
|
+
Upstream.Failure,
|
|
157
|
+
(Upstream.Output) throws -> Bool>
|
|
158
|
+
where Downstream.Input == Upstream.Output, Downstream.Failure == Error
|
|
159
|
+
{
|
|
160
|
+
typealias Input = Upstream.Output
|
|
161
|
+
|
|
162
|
+
typealias Failure = Upstream.Failure
|
|
163
|
+
|
|
164
|
+
override func receive(
|
|
165
|
+
newValue: Input
|
|
166
|
+
) -> PartialCompletion<Upstream.Output?, Downstream.Failure> {
|
|
167
|
+
do {
|
|
168
|
+
return try filter(newValue) ? .continue(newValue) : .finished
|
|
169
|
+
} catch {
|
|
170
|
+
return .failure(error)
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
override var description: String { return "TryPrefixWhile" }
|
|
175
|
+
}
|
|
176
|
+
}
|