@swiftbrowser/swift 0.1.0 → 0.3.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 +68 -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 +125 -10
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +100 -9
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +11 -3
- package/Sources/SwiftUI/API/Gauge.swift +26 -10
- 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 +71 -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 +88 -12
- 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 +14 -4
- 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 +168 -39
- 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 +86 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +187 -8
- 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 +46 -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 +524 -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 +41 -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,356 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.Buffer.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 08.01.2020.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Buffers elements received from an upstream publisher.
|
|
11
|
+
///
|
|
12
|
+
/// Use `buffer(size:prefetch:whenFull:)` to collect a specific number of elements
|
|
13
|
+
/// from an upstream publisher before republishing them to the downstream subscriber
|
|
14
|
+
/// according to the `Publishers.BufferingStrategy` and `Publishers.PrefetchStrategy`
|
|
15
|
+
/// strategy you specify.
|
|
16
|
+
///
|
|
17
|
+
/// If the publisher completes before reaching the `size` threshold, it buffers
|
|
18
|
+
/// the elements and publishes them downstream prior to completion.
|
|
19
|
+
///
|
|
20
|
+
/// - Parameters:
|
|
21
|
+
/// - size: The maximum number of elements to store.
|
|
22
|
+
/// - prefetch: The strategy to initially populate the buffer.
|
|
23
|
+
/// - whenFull: The action to take when the buffer becomes full.
|
|
24
|
+
/// - Returns: A publisher that buffers elements received from an upstream publisher.
|
|
25
|
+
public func buffer(
|
|
26
|
+
size: Int,
|
|
27
|
+
prefetch: Publishers.PrefetchStrategy,
|
|
28
|
+
whenFull: Publishers.BufferingStrategy<Failure>
|
|
29
|
+
) -> Publishers.Buffer<Self> {
|
|
30
|
+
return .init(upstream: self,
|
|
31
|
+
size: size,
|
|
32
|
+
prefetch: prefetch,
|
|
33
|
+
whenFull: whenFull)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
extension Publishers {
|
|
38
|
+
|
|
39
|
+
/// A strategy for filling a buffer.
|
|
40
|
+
public enum PrefetchStrategy {
|
|
41
|
+
|
|
42
|
+
/// A strategy to fill the buffer at subscription time, and keep it full
|
|
43
|
+
/// thereafter.
|
|
44
|
+
///
|
|
45
|
+
/// This strategy starts by making a demand equal to the buffer’s size from
|
|
46
|
+
/// the upstream when the subscriber first connects. Afterwards, it continues
|
|
47
|
+
/// to demand elements from the upstream to try to keep the buffer full.
|
|
48
|
+
case keepFull
|
|
49
|
+
|
|
50
|
+
/// A strategy that avoids prefetching and instead performs requests on demand.
|
|
51
|
+
///
|
|
52
|
+
/// This strategy just forwards the downstream’s requests to the upstream
|
|
53
|
+
/// publisher.
|
|
54
|
+
case byRequest
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/// A strategy that handles exhaustion of a buffer’s capacity.
|
|
58
|
+
public enum BufferingStrategy<Failure: Error> {
|
|
59
|
+
|
|
60
|
+
/// When the buffer is full, discard the newly received element.
|
|
61
|
+
case dropNewest
|
|
62
|
+
|
|
63
|
+
/// When the buffer is full, discard the oldest element in the buffer.
|
|
64
|
+
case dropOldest
|
|
65
|
+
|
|
66
|
+
/// When the buffer is full, execute the closure to provide a custom error.
|
|
67
|
+
case customError(() -> Failure)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/// A publisher that buffers elements received from an upstream publisher.
|
|
71
|
+
public struct Buffer<Upstream: Publisher>: Publisher {
|
|
72
|
+
|
|
73
|
+
public typealias Output = Upstream.Output
|
|
74
|
+
|
|
75
|
+
public typealias Failure = Upstream.Failure
|
|
76
|
+
|
|
77
|
+
/// The publisher from which this publisher receives elements.
|
|
78
|
+
public let upstream: Upstream
|
|
79
|
+
|
|
80
|
+
/// The maximum number of elements to store.
|
|
81
|
+
public let size: Int
|
|
82
|
+
|
|
83
|
+
/// The strategy for initially populating the buffer.
|
|
84
|
+
public let prefetch: Publishers.PrefetchStrategy
|
|
85
|
+
|
|
86
|
+
/// The action to take when the buffer becomes full.
|
|
87
|
+
public let whenFull: Publishers.BufferingStrategy<Failure>
|
|
88
|
+
|
|
89
|
+
/// Creates a publisher that buffers elements received from an upstream publisher.
|
|
90
|
+
/// - Parameter upstream: The publisher from which this publisher receives
|
|
91
|
+
/// elements.
|
|
92
|
+
/// - Parameter size: The maximum number of elements to store.
|
|
93
|
+
/// - Parameter prefetch: The strategy for initially populating the buffer.
|
|
94
|
+
/// - Parameter whenFull: The action to take when the buffer becomes full.
|
|
95
|
+
public init(upstream: Upstream,
|
|
96
|
+
size: Int,
|
|
97
|
+
prefetch: Publishers.PrefetchStrategy,
|
|
98
|
+
whenFull: Publishers.BufferingStrategy<Failure>) {
|
|
99
|
+
self.upstream = upstream
|
|
100
|
+
self.size = size
|
|
101
|
+
self.prefetch = prefetch
|
|
102
|
+
self.whenFull = whenFull
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
106
|
+
where Downstream.Input == Output, Downstream.Failure == Failure
|
|
107
|
+
{
|
|
108
|
+
let inner = Inner(downstream: subscriber,
|
|
109
|
+
size: size,
|
|
110
|
+
prefetch: prefetch,
|
|
111
|
+
whenFull: whenFull)
|
|
112
|
+
upstream.subscribe(inner)
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
extension Publishers.PrefetchStrategy: Equatable {}
|
|
118
|
+
|
|
119
|
+
extension Publishers.PrefetchStrategy: Hashable {}
|
|
120
|
+
|
|
121
|
+
extension Publishers.Buffer {
|
|
122
|
+
private final class Inner<Downstream: Subscriber>
|
|
123
|
+
: Subscriber,
|
|
124
|
+
Subscription,
|
|
125
|
+
CustomStringConvertible,
|
|
126
|
+
CustomReflectable,
|
|
127
|
+
CustomPlaygroundDisplayConvertible
|
|
128
|
+
where Downstream.Input == Upstream.Output, Downstream.Failure == Upstream.Failure
|
|
129
|
+
{
|
|
130
|
+
typealias Input = Upstream.Output
|
|
131
|
+
|
|
132
|
+
typealias Failure = Upstream.Failure
|
|
133
|
+
|
|
134
|
+
private let lock = UnfairLock.allocate()
|
|
135
|
+
|
|
136
|
+
private var recursion = false
|
|
137
|
+
|
|
138
|
+
private let size: Int
|
|
139
|
+
|
|
140
|
+
private let prefetch: Publishers.PrefetchStrategy // keepFull is 0x0
|
|
141
|
+
|
|
142
|
+
private let whenFull: Publishers.BufferingStrategy<Failure>
|
|
143
|
+
|
|
144
|
+
private let downstream: Downstream
|
|
145
|
+
|
|
146
|
+
private var state = SubscriptionStatus.awaitingSubscription
|
|
147
|
+
|
|
148
|
+
private var downstreamDemand = Subscribers.Demand.none
|
|
149
|
+
|
|
150
|
+
// TODO: Use a deque here?
|
|
151
|
+
// Need to measure performance with large buffers and `dropOldest` strategy.
|
|
152
|
+
private var values = [Input]()
|
|
153
|
+
|
|
154
|
+
private var upstreamFailed = false
|
|
155
|
+
|
|
156
|
+
private var terminal: Subscribers.Completion<Failure>?
|
|
157
|
+
|
|
158
|
+
init(downstream: Downstream,
|
|
159
|
+
size: Int,
|
|
160
|
+
prefetch: Publishers.PrefetchStrategy,
|
|
161
|
+
whenFull: Publishers.BufferingStrategy<Failure>) {
|
|
162
|
+
self.size = size
|
|
163
|
+
self.prefetch = prefetch
|
|
164
|
+
self.whenFull = whenFull
|
|
165
|
+
self.downstream = downstream
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
deinit {
|
|
169
|
+
lock.deallocate()
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
func receive(subscription: Subscription) {
|
|
173
|
+
lock.lock()
|
|
174
|
+
guard case .awaitingSubscription = state else {
|
|
175
|
+
lock.unlock()
|
|
176
|
+
subscription.cancel()
|
|
177
|
+
return
|
|
178
|
+
}
|
|
179
|
+
state = .subscribed(subscription)
|
|
180
|
+
lock.unlock()
|
|
181
|
+
|
|
182
|
+
let upstreamDemand: Subscribers.Demand
|
|
183
|
+
switch prefetch {
|
|
184
|
+
case .keepFull:
|
|
185
|
+
upstreamDemand = .max(size)
|
|
186
|
+
case .byRequest:
|
|
187
|
+
upstreamDemand = .unlimited
|
|
188
|
+
}
|
|
189
|
+
subscription.request(upstreamDemand)
|
|
190
|
+
downstream.receive(subscription: self)
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
194
|
+
lock.lock()
|
|
195
|
+
guard case let .subscribed(subscription) = state else {
|
|
196
|
+
lock.unlock()
|
|
197
|
+
return .none
|
|
198
|
+
}
|
|
199
|
+
switch terminal {
|
|
200
|
+
case nil, .finished?:
|
|
201
|
+
if values.count >= size {
|
|
202
|
+
switch whenFull {
|
|
203
|
+
case .dropNewest:
|
|
204
|
+
lock.unlock()
|
|
205
|
+
return drain()
|
|
206
|
+
case .dropOldest:
|
|
207
|
+
values.removeFirst()
|
|
208
|
+
case let .customError(makeError):
|
|
209
|
+
terminal = .failure(makeError())
|
|
210
|
+
lock.unlock()
|
|
211
|
+
subscription.cancel()
|
|
212
|
+
return .none
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
values.append(input)
|
|
217
|
+
lock.unlock()
|
|
218
|
+
return drain()
|
|
219
|
+
case .failure?:
|
|
220
|
+
lock.unlock()
|
|
221
|
+
return .none
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
func receive(completion: Subscribers.Completion<Upstream.Failure>) {
|
|
226
|
+
lock.lock()
|
|
227
|
+
guard case .subscribed = state, terminal == nil else {
|
|
228
|
+
lock.unlock()
|
|
229
|
+
return
|
|
230
|
+
}
|
|
231
|
+
terminal = completion
|
|
232
|
+
lock.unlock()
|
|
233
|
+
_ = drain()
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
func request(_ demand: Subscribers.Demand) {
|
|
237
|
+
lock.lock()
|
|
238
|
+
guard case let .subscribed(subscription) = state else {
|
|
239
|
+
lock.unlock()
|
|
240
|
+
return
|
|
241
|
+
}
|
|
242
|
+
downstreamDemand += demand
|
|
243
|
+
let recursion = self.recursion
|
|
244
|
+
lock.unlock()
|
|
245
|
+
if recursion {
|
|
246
|
+
return
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
let more = drain()
|
|
250
|
+
if more != .none {
|
|
251
|
+
// Request the number of items just enough to fill the buffer.
|
|
252
|
+
subscription.request(more)
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
func cancel() {
|
|
257
|
+
lock.lock()
|
|
258
|
+
guard case let .subscribed(subscription) = state else {
|
|
259
|
+
lock.unlock()
|
|
260
|
+
return
|
|
261
|
+
}
|
|
262
|
+
state = .terminal
|
|
263
|
+
values = []
|
|
264
|
+
lock.unlock()
|
|
265
|
+
subscription.cancel()
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
private func drain() -> Subscribers.Demand {
|
|
269
|
+
var upstreamDemand = Subscribers.Demand.none
|
|
270
|
+
lock.lock()
|
|
271
|
+
while true {
|
|
272
|
+
guard case .subscribed = state else {
|
|
273
|
+
lock.unlock()
|
|
274
|
+
return upstreamDemand
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if downstreamDemand > 0 {
|
|
278
|
+
if values.isEmpty {
|
|
279
|
+
if let completion = terminal {
|
|
280
|
+
state = .terminal
|
|
281
|
+
lock.unlock()
|
|
282
|
+
downstream.receive(completion: completion)
|
|
283
|
+
} else {
|
|
284
|
+
lock.unlock()
|
|
285
|
+
}
|
|
286
|
+
return upstreamDemand
|
|
287
|
+
}
|
|
288
|
+
} else {
|
|
289
|
+
if let completion = terminal, case .failure = completion {
|
|
290
|
+
state = .terminal
|
|
291
|
+
lock.unlock()
|
|
292
|
+
downstream.receive(completion: completion)
|
|
293
|
+
} else {
|
|
294
|
+
lock.unlock()
|
|
295
|
+
}
|
|
296
|
+
return upstreamDemand
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
let poppedValues = lockedPop(downstreamDemand)
|
|
300
|
+
assert(poppedValues.count > 0,
|
|
301
|
+
"""
|
|
302
|
+
We check that the buffer is not empty and downstreamDemand is \
|
|
303
|
+
nonzero, how can this be triggered?
|
|
304
|
+
""")
|
|
305
|
+
|
|
306
|
+
// This should not crash because `lockedPop(_:)` returns at most
|
|
307
|
+
// `downstreamDemand` items.
|
|
308
|
+
downstreamDemand -= poppedValues.count
|
|
309
|
+
|
|
310
|
+
recursion = true
|
|
311
|
+
lock.unlock()
|
|
312
|
+
|
|
313
|
+
var newDownstreamDemand = Subscribers.Demand.none
|
|
314
|
+
var additionalUpstreamDemand = 0
|
|
315
|
+
|
|
316
|
+
for value in poppedValues {
|
|
317
|
+
newDownstreamDemand += downstream.receive(value)
|
|
318
|
+
additionalUpstreamDemand += 1
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
if prefetch == .keepFull {
|
|
322
|
+
upstreamDemand += additionalUpstreamDemand
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
lock.lock()
|
|
326
|
+
recursion = false
|
|
327
|
+
downstreamDemand += newDownstreamDemand
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
private func lockedPop(_ demand: Subscribers.Demand) -> [Input] {
|
|
332
|
+
assert(demand > 0)
|
|
333
|
+
guard let max = demand.max else {
|
|
334
|
+
return values.take()
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
let poppedValues = Array(values.prefix(max))
|
|
338
|
+
values.removeFirst(poppedValues.count)
|
|
339
|
+
return poppedValues
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
var description: String { return "Buffer" }
|
|
343
|
+
|
|
344
|
+
var customMirror: Mirror {
|
|
345
|
+
let children: [Mirror.Child] = [
|
|
346
|
+
("values", values),
|
|
347
|
+
("state", state),
|
|
348
|
+
("downstreamDemand", downstreamDemand),
|
|
349
|
+
("terminal", terminal as Any)
|
|
350
|
+
]
|
|
351
|
+
return Mirror(self, children: children)
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
var playgroundDescription: Any { return description }
|
|
355
|
+
}
|
|
356
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.Collect.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 09.10.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Collects all received elements, and emits a single array of the collection when
|
|
11
|
+
/// the upstream publisher finishes.
|
|
12
|
+
///
|
|
13
|
+
/// Use `collect()` to gather elements into an array that the operator emits after
|
|
14
|
+
/// the upstream publisher finishes.
|
|
15
|
+
///
|
|
16
|
+
/// If the upstream publisher fails with an error, this publisher forwards the error
|
|
17
|
+
/// to the downstream receiver instead of sending its output.
|
|
18
|
+
///
|
|
19
|
+
/// This publisher requests an unlimited number of elements from the upstream
|
|
20
|
+
/// publisher and uses an unbounded amount of memory to store the received values.
|
|
21
|
+
/// The publisher may exert memory pressure on the system for very large sets of
|
|
22
|
+
/// elements.
|
|
23
|
+
///
|
|
24
|
+
/// The `collect()` operator only sends the collected array to its downstream receiver
|
|
25
|
+
/// after a request whose demand is greater than 0 items. Otherwise, `collect()` waits
|
|
26
|
+
/// until it receives a non-zero request.
|
|
27
|
+
///
|
|
28
|
+
/// In the example below, an Integer range is a publisher that emits an array of
|
|
29
|
+
/// integers:
|
|
30
|
+
///
|
|
31
|
+
/// let numbers = (0...10)
|
|
32
|
+
/// cancellable = numbers.publisher
|
|
33
|
+
/// .collect()
|
|
34
|
+
/// .sink { print("\($0)") }
|
|
35
|
+
///
|
|
36
|
+
/// // Prints: "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"
|
|
37
|
+
///
|
|
38
|
+
/// - Returns: A publisher that collects all received items and returns them as
|
|
39
|
+
/// an array upon completion.
|
|
40
|
+
public func collect() -> Publishers.Collect<Self> {
|
|
41
|
+
return .init(upstream: self)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
extension Publishers {
|
|
46
|
+
|
|
47
|
+
/// A publisher that buffers items.
|
|
48
|
+
public struct Collect<Upstream: Publisher>: Publisher {
|
|
49
|
+
|
|
50
|
+
public typealias Output = [Upstream.Output]
|
|
51
|
+
|
|
52
|
+
public typealias Failure = Upstream.Failure
|
|
53
|
+
|
|
54
|
+
/// The publisher that this publisher receives elements from.
|
|
55
|
+
public let upstream: Upstream
|
|
56
|
+
|
|
57
|
+
public init(upstream: Upstream) {
|
|
58
|
+
self.upstream = upstream
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
62
|
+
where Upstream.Failure == Downstream.Failure,
|
|
63
|
+
Downstream.Input == [Upstream.Output]
|
|
64
|
+
{
|
|
65
|
+
upstream.subscribe(Inner(downstream: subscriber))
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
extension Publishers.Collect: Equatable where Upstream: Equatable {}
|
|
71
|
+
|
|
72
|
+
extension Publishers.Collect {
|
|
73
|
+
private final class Inner<Downstream: Subscriber>
|
|
74
|
+
: ReduceProducer<Downstream,
|
|
75
|
+
Upstream.Output,
|
|
76
|
+
[Upstream.Output],
|
|
77
|
+
Upstream.Failure,
|
|
78
|
+
Void>
|
|
79
|
+
where Downstream.Input == [Upstream.Output],
|
|
80
|
+
Downstream.Failure == Upstream.Failure
|
|
81
|
+
{
|
|
82
|
+
fileprivate init(downstream: Downstream) {
|
|
83
|
+
super.init(downstream: downstream, initial: [], reduce: ())
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
override func receive(
|
|
87
|
+
newValue: Upstream.Output
|
|
88
|
+
) -> PartialCompletion<Void, Downstream.Failure> {
|
|
89
|
+
result!.append(newValue)
|
|
90
|
+
return .continue
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
override var description: String {
|
|
94
|
+
return "Collect"
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
override var customMirror: Mirror {
|
|
98
|
+
let children: CollectionOfOne<Mirror.Child> = .init(("count", result!.count))
|
|
99
|
+
return Mirror(self, children: children)
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.CollectByCount.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 24.12.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Collects up to the specified number of elements, and then emits a single array of
|
|
11
|
+
/// the collection.
|
|
12
|
+
///
|
|
13
|
+
/// Use `collect(_:)` to emit arrays of at most `count` elements from an upstream
|
|
14
|
+
/// publisher. If the upstream publisher finishes before collecting the specified
|
|
15
|
+
/// number of elements, the publisher sends an array of only the items it received
|
|
16
|
+
/// This may be fewer than `count` elements.
|
|
17
|
+
///
|
|
18
|
+
/// If the upstream publisher fails with an error, this publisher forwards the error
|
|
19
|
+
/// to the downstream receiver instead of sending its output.
|
|
20
|
+
///
|
|
21
|
+
/// In the example below, the `collect(_:)` operator emits one partial and two full
|
|
22
|
+
/// arrays based on the requested collection size of `5`:
|
|
23
|
+
///
|
|
24
|
+
/// let numbers = (0...10)
|
|
25
|
+
/// cancellable = numbers.publisher
|
|
26
|
+
/// .collect(5)
|
|
27
|
+
/// .sink { print("\($0), terminator: " "") }
|
|
28
|
+
///
|
|
29
|
+
/// // Prints "[0, 1, 2, 3, 4] [5, 6, 7, 8, 9] [10] "
|
|
30
|
+
///
|
|
31
|
+
/// > Note: When this publisher receives a request for `.max(n)` elements, it requests
|
|
32
|
+
/// `.max(count * n)` from the upstream publisher.
|
|
33
|
+
///
|
|
34
|
+
/// - Parameter count: The maximum number of received elements to buffer before
|
|
35
|
+
/// publishing.
|
|
36
|
+
/// - Returns: A publisher that collects up to the specified number of elements, and
|
|
37
|
+
/// then publishes them as an array.
|
|
38
|
+
public func collect(_ count: Int) -> Publishers.CollectByCount<Self> {
|
|
39
|
+
return .init(upstream: self, count: count)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
extension Publishers {
|
|
44
|
+
|
|
45
|
+
/// A publisher that buffers a maximum number of items.
|
|
46
|
+
public struct CollectByCount<Upstream: Publisher>: Publisher {
|
|
47
|
+
|
|
48
|
+
public typealias Output = [Upstream.Output]
|
|
49
|
+
|
|
50
|
+
public typealias Failure = Upstream.Failure
|
|
51
|
+
|
|
52
|
+
/// The publisher from which this publisher receives elements.
|
|
53
|
+
public let upstream: Upstream
|
|
54
|
+
|
|
55
|
+
/// The maximum number of received elements to buffer before publishing.
|
|
56
|
+
public let count: Int
|
|
57
|
+
|
|
58
|
+
public init(upstream: Upstream, count: Int) {
|
|
59
|
+
self.upstream = upstream
|
|
60
|
+
self.count = count
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
64
|
+
where Downstream.Failure == Failure, Downstream.Input == Output
|
|
65
|
+
{
|
|
66
|
+
upstream.subscribe(Inner(downstream: subscriber, count: count))
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
extension Publishers.CollectByCount: Equatable where Upstream: Equatable {}
|
|
72
|
+
|
|
73
|
+
extension Publishers.CollectByCount {
|
|
74
|
+
private final class Inner<Downstream: Subscriber>
|
|
75
|
+
: Subscriber,
|
|
76
|
+
Subscription,
|
|
77
|
+
CustomStringConvertible,
|
|
78
|
+
CustomReflectable,
|
|
79
|
+
CustomPlaygroundDisplayConvertible
|
|
80
|
+
where Downstream.Input == [Upstream.Output],
|
|
81
|
+
Downstream.Failure == Upstream.Failure
|
|
82
|
+
{
|
|
83
|
+
typealias Input = Upstream.Output
|
|
84
|
+
|
|
85
|
+
typealias Failure = Upstream.Failure
|
|
86
|
+
|
|
87
|
+
private let downstream: Downstream
|
|
88
|
+
|
|
89
|
+
private let count: Int
|
|
90
|
+
|
|
91
|
+
private var buffer: [Input] = []
|
|
92
|
+
|
|
93
|
+
private var subscription: Subscription?
|
|
94
|
+
|
|
95
|
+
private var finished = false
|
|
96
|
+
|
|
97
|
+
private let lock = UnfairLock.allocate()
|
|
98
|
+
|
|
99
|
+
init(downstream: Downstream, count: Int) {
|
|
100
|
+
self.downstream = downstream
|
|
101
|
+
self.count = count
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
deinit {
|
|
105
|
+
lock.deallocate()
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
func receive(subscription: Subscription) {
|
|
109
|
+
lock.lock()
|
|
110
|
+
if finished || self.subscription != nil {
|
|
111
|
+
lock.unlock()
|
|
112
|
+
subscription.cancel()
|
|
113
|
+
return
|
|
114
|
+
}
|
|
115
|
+
self.subscription = subscription
|
|
116
|
+
lock.unlock()
|
|
117
|
+
downstream.receive(subscription: self)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
func receive(_ input: Upstream.Output) -> Subscribers.Demand {
|
|
121
|
+
lock.lock()
|
|
122
|
+
if subscription == nil {
|
|
123
|
+
lock.unlock()
|
|
124
|
+
return .none
|
|
125
|
+
}
|
|
126
|
+
buffer.append(input)
|
|
127
|
+
guard buffer.count == count else {
|
|
128
|
+
lock.unlock()
|
|
129
|
+
return .none
|
|
130
|
+
}
|
|
131
|
+
let output = self.buffer.take()
|
|
132
|
+
lock.unlock()
|
|
133
|
+
return downstream.receive(output) * count
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
func receive(completion: Subscribers.Completion<Upstream.Failure>) {
|
|
137
|
+
lock.lock()
|
|
138
|
+
subscription = nil
|
|
139
|
+
finished = true
|
|
140
|
+
switch completion {
|
|
141
|
+
case .finished:
|
|
142
|
+
if buffer.isEmpty {
|
|
143
|
+
lock.unlock()
|
|
144
|
+
} else {
|
|
145
|
+
let buffer = self.buffer.take()
|
|
146
|
+
lock.unlock()
|
|
147
|
+
_ = downstream.receive(buffer)
|
|
148
|
+
}
|
|
149
|
+
case .failure:
|
|
150
|
+
buffer = []
|
|
151
|
+
lock.unlock()
|
|
152
|
+
}
|
|
153
|
+
downstream.receive(completion: completion)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
func request(_ demand: Subscribers.Demand) {
|
|
157
|
+
demand.assertNonZero()
|
|
158
|
+
lock.lock()
|
|
159
|
+
if let subscription = self.subscription {
|
|
160
|
+
lock.unlock()
|
|
161
|
+
subscription.request(demand * count)
|
|
162
|
+
} else {
|
|
163
|
+
lock.unlock()
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
func cancel() {
|
|
168
|
+
lock.lock()
|
|
169
|
+
if let subscription = self.subscription.take() {
|
|
170
|
+
buffer = []
|
|
171
|
+
finished = true
|
|
172
|
+
lock.unlock()
|
|
173
|
+
subscription.cancel()
|
|
174
|
+
} else {
|
|
175
|
+
lock.unlock()
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
var description: String { return "CollectByCount" }
|
|
180
|
+
|
|
181
|
+
var customMirror: Mirror {
|
|
182
|
+
lock.lock()
|
|
183
|
+
defer { lock.unlock() }
|
|
184
|
+
let children: [Mirror.Child] = [
|
|
185
|
+
("downstream", downstream),
|
|
186
|
+
("upstreamSubscription", subscription as Any),
|
|
187
|
+
("buffer", buffer),
|
|
188
|
+
("count", count)
|
|
189
|
+
]
|
|
190
|
+
return Mirror(self, children: children)
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
var playgroundDescription: Any { return description }
|
|
194
|
+
}
|
|
195
|
+
}
|