@swiftbrowser/swift 0.0.0-stage → 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 +214 -0
- package/README.md +10 -2
- 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 +61 -0
- 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/FoundationBridge/Bundle.swift +119 -0
- 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 +29 -0
- 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/Locale.swift +86 -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 +53 -0
- package/Sources/FoundationBridge/UITextChecker.swift +30 -0
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/FoundationBridge/UserDefaults.swift +183 -0
- 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 +181 -0
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +221 -0
- package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
- package/Sources/SwiftUI/API/Animation.swift +285 -0
- package/Sources/SwiftUI/API/App.swift +87 -0
- 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 +237 -0
- 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 +300 -0
- package/Sources/SwiftUI/API/CustomLayout.swift +442 -0
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +92 -0
- package/Sources/SwiftUI/API/EditMode.swift +212 -0
- package/Sources/SwiftUI/API/Effects.swift +388 -0
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +439 -0
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +137 -0
- package/Sources/SwiftUI/API/Font.swift +131 -0
- package/Sources/SwiftUI/API/Gauge.swift +290 -0
- package/Sources/SwiftUI/API/Geometry.swift +89 -0
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +135 -0
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +342 -0
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +188 -0
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +124 -0
- package/Sources/SwiftUI/API/Layout.swift +220 -0
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +331 -0
- package/Sources/SwiftUI/API/Menu.swift +58 -0
- package/Sources/SwiftUI/API/Modifiers.swift +313 -0
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +386 -0
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +293 -0
- package/Sources/SwiftUI/API/OnChange.swift +48 -0
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +411 -0
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +185 -0
- 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 +122 -0
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +517 -0
- package/Sources/SwiftUI/API/Publishers.swift +107 -0
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +84 -0
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +104 -0
- 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 +409 -0
- 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 +144 -0
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
- package/Sources/SwiftUI/API/StrokeStyle.swift +30 -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 +263 -0
- package/Sources/SwiftUI/API/Tasks.swift +35 -0
- 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/Timeline.swift +212 -0
- package/Sources/SwiftUI/API/Toolbar.swift +251 -0
- 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 +215 -0
- package/Sources/SwiftUI/API/ViewModifier.swift +43 -0
- package/Sources/SwiftUI/API/VisualEffect.swift +155 -0
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +325 -0
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +660 -0
- package/Sources/SwiftUI/Charts/ChartContent.swift +376 -0
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Charts/Marks.swift +204 -0
- package/Sources/SwiftUI/Charts/Plottable.swift +99 -0
- package/Sources/SwiftUI/Charts/Scales.swift +326 -0
- package/Sources/SwiftUI/Localization/Localization.swift +498 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +85 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +101 -0
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +143 -0
- package/Sources/SwiftUI/Runtime/JSONParser.swift +443 -0
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +152 -0
- package/Sources/SwiftUI/Runtime/Reconciler.swift +219 -0
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +2146 -0
- 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 +2 -0
- package/index.mjs +16 -0
- package/manifest.d.mts +2 -0
- package/manifest.mjs +39 -0
- package/package.json +30 -4
- package/sync-sources.mjs +33 -0
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.Debounce.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 17.12.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Publishes elements only after a specified time interval elapses between events.
|
|
11
|
+
///
|
|
12
|
+
/// Use the `debounce(for:scheduler:options:)` operator to control the number of
|
|
13
|
+
/// values and time between delivery of values from the upstream publisher. This
|
|
14
|
+
/// operator is useful to process bursty or high-volume event streams where you need
|
|
15
|
+
/// to reduce the number of values delivered to the downstream to a rate you specify.
|
|
16
|
+
///
|
|
17
|
+
/// In this example, a `PassthroughSubject` publishes elements on a schedule defined
|
|
18
|
+
/// by the `bounces` array. The array is composed of tuples representing a value sent
|
|
19
|
+
/// by the `PassthroughSubject`, and a `TimeInterval` ranging from one-quarter second
|
|
20
|
+
/// up to 2 seconds that drives a delivery timer. As the queue builds, elements
|
|
21
|
+
/// arriving faster than one-half second `debounceInterval` are discarded, while
|
|
22
|
+
/// elements arriving at a rate slower than `debounceInterval` are passed through to
|
|
23
|
+
/// the `sink(receiveValue:)` operator.
|
|
24
|
+
///
|
|
25
|
+
/// let bounces:[(Int,TimeInterval)] = [
|
|
26
|
+
/// (0, 0),
|
|
27
|
+
/// (1, 0.25), // 0.25s interval since last index
|
|
28
|
+
/// (2, 1), // 0.75s interval since last index
|
|
29
|
+
/// (3, 1.25), // 0.25s interval since last index
|
|
30
|
+
/// (4, 1.5), // 0.25s interval since last index
|
|
31
|
+
/// (5, 2) // 0.5s interval since last index
|
|
32
|
+
/// ]
|
|
33
|
+
///
|
|
34
|
+
/// let subject = PassthroughSubject<Int, Never>()
|
|
35
|
+
/// cancellable = subject
|
|
36
|
+
/// .debounce(for: .seconds(0.5), scheduler: RunLoop.main)
|
|
37
|
+
/// .sink { index in
|
|
38
|
+
/// print ("Received index \(index)")
|
|
39
|
+
/// }
|
|
40
|
+
///
|
|
41
|
+
/// for bounce in bounces {
|
|
42
|
+
/// DispatchQueue.main.asyncAfter(deadline: .now() + bounce.1) {
|
|
43
|
+
/// subject.send(bounce.0)
|
|
44
|
+
/// }
|
|
45
|
+
/// }
|
|
46
|
+
///
|
|
47
|
+
/// // Prints:
|
|
48
|
+
/// // Received index 1
|
|
49
|
+
/// // Received index 4
|
|
50
|
+
/// // Received index 5
|
|
51
|
+
///
|
|
52
|
+
/// // Here is the event flow shown from the perspective of time, showing value
|
|
53
|
+
/// // delivery through the `debounce()` operator:
|
|
54
|
+
///
|
|
55
|
+
/// // Time 0: Send index 0.
|
|
56
|
+
/// // Time 0.25: Send index 1. Index 0 was waiting and is discarded.
|
|
57
|
+
/// // Time 0.75: Debounce period ends, publish index 1.
|
|
58
|
+
/// // Time 1: Send index 2.
|
|
59
|
+
/// // Time 1.25: Send index 3. Index 2 was waiting and is discarded.
|
|
60
|
+
/// // Time 1.5: Send index 4. Index 3 was waiting and is discarded.
|
|
61
|
+
/// // Time 2: Debounce period ends, publish index 4. Also, send index 5.
|
|
62
|
+
/// // Time 2.5: Debounce period ends, publish index 5.
|
|
63
|
+
///
|
|
64
|
+
/// - Parameters:
|
|
65
|
+
/// - dueTime: The time the publisher should wait before publishing an element.
|
|
66
|
+
/// - scheduler: The scheduler on which this publisher delivers elements
|
|
67
|
+
/// - options: Scheduler options that customize this publisher’s delivery
|
|
68
|
+
/// of elements.
|
|
69
|
+
/// - Returns: A publisher that publishes events only after a specified time elapses.
|
|
70
|
+
public func debounce<Context: Scheduler>(
|
|
71
|
+
for dueTime: Context.SchedulerTimeType.Stride,
|
|
72
|
+
scheduler: Context,
|
|
73
|
+
options: Context.SchedulerOptions? = nil
|
|
74
|
+
) -> Publishers.Debounce<Self, Context> {
|
|
75
|
+
return .init(upstream: self,
|
|
76
|
+
dueTime: dueTime,
|
|
77
|
+
scheduler: scheduler,
|
|
78
|
+
options: options)
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
extension Publishers {
|
|
83
|
+
|
|
84
|
+
/// A publisher that publishes elements only after a specified time interval elapses
|
|
85
|
+
/// between events.
|
|
86
|
+
public struct Debounce<Upstream: Publisher, Context: Scheduler>: Publisher {
|
|
87
|
+
|
|
88
|
+
public typealias Output = Upstream.Output
|
|
89
|
+
|
|
90
|
+
public typealias Failure = Upstream.Failure
|
|
91
|
+
|
|
92
|
+
/// The publisher from which this publisher receives elements.
|
|
93
|
+
public let upstream: Upstream
|
|
94
|
+
|
|
95
|
+
/// The amount of time the publisher should wait before publishing an element.
|
|
96
|
+
public let dueTime: Context.SchedulerTimeType.Stride
|
|
97
|
+
|
|
98
|
+
/// The scheduler on which this publisher delivers elements.
|
|
99
|
+
public let scheduler: Context
|
|
100
|
+
|
|
101
|
+
/// Scheduler options that customize this publisher’s delivery of elements.
|
|
102
|
+
public let options: Context.SchedulerOptions?
|
|
103
|
+
|
|
104
|
+
public init(upstream: Upstream,
|
|
105
|
+
dueTime: Context.SchedulerTimeType.Stride,
|
|
106
|
+
scheduler: Context,
|
|
107
|
+
options: Context.SchedulerOptions?) {
|
|
108
|
+
self.upstream = upstream
|
|
109
|
+
self.dueTime = dueTime
|
|
110
|
+
self.scheduler = scheduler
|
|
111
|
+
self.options = options
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
115
|
+
where Downstream.Failure == Failure, Downstream.Input == Output
|
|
116
|
+
{
|
|
117
|
+
let inner = Inner(downstream: subscriber,
|
|
118
|
+
dueTime: dueTime,
|
|
119
|
+
scheduler: scheduler,
|
|
120
|
+
options: options)
|
|
121
|
+
upstream.subscribe(inner)
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
extension Publishers.Debounce {
|
|
127
|
+
private final class Inner<Downstream: Subscriber>
|
|
128
|
+
: Subscriber,
|
|
129
|
+
Subscription,
|
|
130
|
+
CustomStringConvertible,
|
|
131
|
+
CustomReflectable,
|
|
132
|
+
CustomPlaygroundDisplayConvertible
|
|
133
|
+
where Upstream.Output == Downstream.Input,
|
|
134
|
+
Upstream.Failure == Downstream.Failure
|
|
135
|
+
{
|
|
136
|
+
typealias Input = Upstream.Output
|
|
137
|
+
|
|
138
|
+
typealias Failure = Upstream.Failure
|
|
139
|
+
|
|
140
|
+
private typealias Generation = UInt64
|
|
141
|
+
|
|
142
|
+
private enum CancellerState {
|
|
143
|
+
case pending
|
|
144
|
+
case active(Cancellable)
|
|
145
|
+
|
|
146
|
+
fileprivate func cancel() {
|
|
147
|
+
if case let .active(cancellable) = self {
|
|
148
|
+
cancellable.cancel()
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
private let lock = UnfairLock.allocate()
|
|
154
|
+
|
|
155
|
+
private let downstreamLock = UnfairRecursiveLock.allocate()
|
|
156
|
+
|
|
157
|
+
private let downstream: Downstream
|
|
158
|
+
|
|
159
|
+
private let dueTime: Context.SchedulerTimeType.Stride
|
|
160
|
+
|
|
161
|
+
private let scheduler: Context
|
|
162
|
+
|
|
163
|
+
private let options: Context.SchedulerOptions?
|
|
164
|
+
|
|
165
|
+
private var state = SubscriptionStatus.awaitingSubscription
|
|
166
|
+
|
|
167
|
+
private var currentCancellers = [Generation : CancellerState]()
|
|
168
|
+
|
|
169
|
+
private var currentValue: Output?
|
|
170
|
+
|
|
171
|
+
private var currentGeneration: Generation = 0
|
|
172
|
+
|
|
173
|
+
private var downstreamDemand = Subscribers.Demand.none
|
|
174
|
+
|
|
175
|
+
init(downstream: Downstream,
|
|
176
|
+
dueTime: Context.SchedulerTimeType.Stride,
|
|
177
|
+
scheduler: Context,
|
|
178
|
+
options: Context.SchedulerOptions?) {
|
|
179
|
+
self.downstream = downstream
|
|
180
|
+
self.dueTime = dueTime
|
|
181
|
+
self.scheduler = scheduler
|
|
182
|
+
self.options = options
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
deinit {
|
|
186
|
+
lock.deallocate()
|
|
187
|
+
downstreamLock.deallocate()
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
func receive(subscription: Subscription) {
|
|
191
|
+
lock.lock()
|
|
192
|
+
guard case .awaitingSubscription = state else {
|
|
193
|
+
lock.unlock()
|
|
194
|
+
subscription.cancel()
|
|
195
|
+
return
|
|
196
|
+
}
|
|
197
|
+
state = .subscribed(subscription)
|
|
198
|
+
lock.unlock()
|
|
199
|
+
downstreamLock.lock()
|
|
200
|
+
downstream.receive(subscription: self)
|
|
201
|
+
downstreamLock.unlock()
|
|
202
|
+
subscription.request(.unlimited)
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
206
|
+
lock.lock()
|
|
207
|
+
guard case .subscribed = state else {
|
|
208
|
+
lock.unlock()
|
|
209
|
+
return .none
|
|
210
|
+
}
|
|
211
|
+
currentGeneration += 1
|
|
212
|
+
let generation = currentGeneration
|
|
213
|
+
currentValue = input
|
|
214
|
+
let due = scheduler.now.advanced(by: dueTime)
|
|
215
|
+
let previousCancellers = self.currentCancellers.take()
|
|
216
|
+
currentCancellers[generation] = .pending
|
|
217
|
+
lock.unlock()
|
|
218
|
+
let newCanceller = scheduler.schedule(after: due,
|
|
219
|
+
interval: dueTime,
|
|
220
|
+
tolerance: scheduler.minimumTolerance,
|
|
221
|
+
options: options) {
|
|
222
|
+
self.due(generation: generation)
|
|
223
|
+
}
|
|
224
|
+
lock.lock()
|
|
225
|
+
currentCancellers[generation] = .active(newCanceller)
|
|
226
|
+
lock.unlock()
|
|
227
|
+
for canceller in previousCancellers.values {
|
|
228
|
+
canceller.cancel()
|
|
229
|
+
}
|
|
230
|
+
return .none
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
func receive(completion: Subscribers.Completion<Failure>) {
|
|
234
|
+
lock.lock()
|
|
235
|
+
guard case .subscribed = state else {
|
|
236
|
+
lock.unlock()
|
|
237
|
+
return
|
|
238
|
+
}
|
|
239
|
+
state = .terminal
|
|
240
|
+
let previousCancellers = currentCancellers.take()
|
|
241
|
+
lock.unlock()
|
|
242
|
+
for canceller in previousCancellers.values {
|
|
243
|
+
canceller.cancel()
|
|
244
|
+
}
|
|
245
|
+
scheduler.schedule {
|
|
246
|
+
self.downstreamLock.lock()
|
|
247
|
+
self.downstream.receive(completion: completion)
|
|
248
|
+
self.downstreamLock.unlock()
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
func request(_ demand: Subscribers.Demand) {
|
|
253
|
+
lock.lock()
|
|
254
|
+
guard case .subscribed = state else {
|
|
255
|
+
lock.unlock()
|
|
256
|
+
return
|
|
257
|
+
}
|
|
258
|
+
downstreamDemand += demand
|
|
259
|
+
lock.unlock()
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
func cancel() {
|
|
263
|
+
lock.lock()
|
|
264
|
+
guard case .subscribed(let subscription) = state else {
|
|
265
|
+
lock.unlock()
|
|
266
|
+
return
|
|
267
|
+
}
|
|
268
|
+
state = .terminal
|
|
269
|
+
let previousCancellers = currentCancellers.take()
|
|
270
|
+
lock.unlock()
|
|
271
|
+
for canceller in previousCancellers.values {
|
|
272
|
+
canceller.cancel()
|
|
273
|
+
}
|
|
274
|
+
subscription.cancel()
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
var description: String { return "Debounce" }
|
|
278
|
+
|
|
279
|
+
var customMirror: Mirror {
|
|
280
|
+
let children: [Mirror.Child] = [
|
|
281
|
+
("downstream", downstream),
|
|
282
|
+
("downstreamDemand", downstreamDemand),
|
|
283
|
+
("currentValue", currentValue as Any)
|
|
284
|
+
]
|
|
285
|
+
return Mirror(self, children: children)
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
var playgroundDescription: Any { return description }
|
|
289
|
+
|
|
290
|
+
private func due(generation: Generation) {
|
|
291
|
+
lock.lock()
|
|
292
|
+
guard case .subscribed = state else {
|
|
293
|
+
lock.unlock()
|
|
294
|
+
return
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// If this condition holds, it means that no values were received
|
|
298
|
+
// in this time frame => we should propagate the current value downstream.
|
|
299
|
+
guard generation == currentGeneration, let value = currentValue else {
|
|
300
|
+
let canceller = currentCancellers[generation]
|
|
301
|
+
lock.unlock()
|
|
302
|
+
canceller?.cancel()
|
|
303
|
+
return
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
guard let canceller = currentCancellers[generation].take() else {
|
|
307
|
+
lock.unlock()
|
|
308
|
+
return
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
let hasAnyDemand = downstreamDemand != .none
|
|
312
|
+
if hasAnyDemand {
|
|
313
|
+
downstreamDemand -= 1
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
lock.unlock()
|
|
317
|
+
canceller.cancel()
|
|
318
|
+
|
|
319
|
+
guard hasAnyDemand else { return }
|
|
320
|
+
|
|
321
|
+
downstreamLock.lock()
|
|
322
|
+
let newDemand = downstream.receive(value)
|
|
323
|
+
downstreamLock.unlock()
|
|
324
|
+
|
|
325
|
+
if newDemand == .none { return }
|
|
326
|
+
|
|
327
|
+
lock.lock()
|
|
328
|
+
downstreamDemand += newDemand
|
|
329
|
+
lock.unlock()
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.Delay.swift
|
|
3
|
+
// OpenCombine
|
|
4
|
+
//
|
|
5
|
+
// Created by Евгений Богомолов on 07/09/2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Delays delivery of all output to the downstream receiver by a specified amount of
|
|
11
|
+
/// time on a particular scheduler.
|
|
12
|
+
///
|
|
13
|
+
/// Use `delay(for:tolerance:scheduler:options:)` when you need to delay the delivery
|
|
14
|
+
/// of elements to a downstream by a specified amount of time.
|
|
15
|
+
///
|
|
16
|
+
/// In this example, a `Timer` publishes an event every second.
|
|
17
|
+
/// The `delay(for:tolerance:scheduler:options:)` operator holds the delivery of
|
|
18
|
+
/// the initial element for 3 seconds (±0.5 seconds), after which each element is
|
|
19
|
+
/// delivered to the downstream on the main run loop after the specified delay:
|
|
20
|
+
///
|
|
21
|
+
/// let df = DateFormatter()
|
|
22
|
+
/// df.dateStyle = .none
|
|
23
|
+
/// df.timeStyle = .long
|
|
24
|
+
/// cancellable = Timer.publish(every: 1.0, on: .main, in: .default)
|
|
25
|
+
/// .autoconnect()
|
|
26
|
+
/// .handleEvents(receiveOutput: { date in
|
|
27
|
+
/// print ("Sending Timestamp \'\(df.string(from: date))\' to delay()")
|
|
28
|
+
/// })
|
|
29
|
+
/// .delay(for: .seconds(3), scheduler: RunLoop.main, options: .none)
|
|
30
|
+
/// .sink(
|
|
31
|
+
/// receiveCompletion: { print ("completion: \($0)", terminator: "\n") },
|
|
32
|
+
/// receiveValue: { value in
|
|
33
|
+
/// let now = Date()
|
|
34
|
+
/// print("""
|
|
35
|
+
/// At \(df.string(from: now)) received Timestamp \
|
|
36
|
+
/// \'\(df.string(from: value))\' \
|
|
37
|
+
/// sent: \(String(format: "%.2f", now.timeIntervalSince(value)))
|
|
38
|
+
/// secs ago
|
|
39
|
+
/// """)
|
|
40
|
+
/// }
|
|
41
|
+
/// )
|
|
42
|
+
///
|
|
43
|
+
/// // Prints:
|
|
44
|
+
/// // Sending Timestamp '5:02:33 PM PDT' to delay()
|
|
45
|
+
/// // Sending Timestamp '5:02:34 PM PDT' to delay()
|
|
46
|
+
/// // Sending Timestamp '5:02:35 PM PDT' to delay()
|
|
47
|
+
/// // Sending Timestamp '5:02:36 PM PDT' to delay()
|
|
48
|
+
/// // At 5:02:36 PM PDT received Timestamp '5:02:33 PM PDT' sent: 3.00
|
|
49
|
+
/// // secs ago
|
|
50
|
+
/// // Sending Timestamp '5:02:37 PM PDT' to delay()
|
|
51
|
+
/// // At 5:02:37 PM PDT received Timestamp '5:02:34 PM PDT' sent: 3.00
|
|
52
|
+
/// // secs ago
|
|
53
|
+
/// // Sending Timestamp '5:02:38 PM PDT' to delay()
|
|
54
|
+
/// // At 5:02:38 PM PDT received Timestamp '5:02:35 PM PDT' sent: 3.00
|
|
55
|
+
/// // secs ago
|
|
56
|
+
///
|
|
57
|
+
/// The delay affects the delivery of elements and completion, but not of the original
|
|
58
|
+
/// subscription.
|
|
59
|
+
///
|
|
60
|
+
/// - Parameters:
|
|
61
|
+
/// - interval: The amount of time to delay.
|
|
62
|
+
/// - tolerance: The allowed tolerance in firing delayed events.
|
|
63
|
+
/// - scheduler: The scheduler to deliver the delayed events.
|
|
64
|
+
/// - options: Options relevant to the scheduler’s behavior.
|
|
65
|
+
/// - Returns: A publisher that delays delivery of elements and completion to
|
|
66
|
+
/// the downstream receiver.
|
|
67
|
+
public func delay<Context: Scheduler>(
|
|
68
|
+
for interval: Context.SchedulerTimeType.Stride,
|
|
69
|
+
tolerance: Context.SchedulerTimeType.Stride? = nil,
|
|
70
|
+
scheduler: Context,
|
|
71
|
+
options: Context.SchedulerOptions? = nil
|
|
72
|
+
) -> Publishers.Delay<Self, Context> {
|
|
73
|
+
return .init(upstream: self,
|
|
74
|
+
interval: interval,
|
|
75
|
+
tolerance: tolerance ?? scheduler.minimumTolerance,
|
|
76
|
+
scheduler: scheduler,
|
|
77
|
+
options: options)
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
extension Publishers {
|
|
82
|
+
|
|
83
|
+
/// A publisher that delays delivery of elements and completion
|
|
84
|
+
/// to the downstream receiver.
|
|
85
|
+
public struct Delay<Upstream: Publisher, Context: Scheduler>: Publisher {
|
|
86
|
+
|
|
87
|
+
public typealias Output = Upstream.Output
|
|
88
|
+
|
|
89
|
+
public typealias Failure = Upstream.Failure
|
|
90
|
+
|
|
91
|
+
/// The publisher that this publisher receives elements from.
|
|
92
|
+
public let upstream: Upstream
|
|
93
|
+
|
|
94
|
+
/// The amount of time to delay.
|
|
95
|
+
public let interval: Context.SchedulerTimeType.Stride
|
|
96
|
+
|
|
97
|
+
/// The allowed tolerance in firing delayed events.
|
|
98
|
+
public let tolerance: Context.SchedulerTimeType.Stride
|
|
99
|
+
|
|
100
|
+
/// The scheduler to deliver the delayed events.
|
|
101
|
+
public let scheduler: Context
|
|
102
|
+
|
|
103
|
+
public let options: Context.SchedulerOptions?
|
|
104
|
+
|
|
105
|
+
public init(upstream: Upstream,
|
|
106
|
+
interval: Context.SchedulerTimeType.Stride,
|
|
107
|
+
tolerance: Context.SchedulerTimeType.Stride,
|
|
108
|
+
scheduler: Context,
|
|
109
|
+
options: Context.SchedulerOptions? = nil)
|
|
110
|
+
{
|
|
111
|
+
self.upstream = upstream
|
|
112
|
+
self.interval = interval
|
|
113
|
+
self.tolerance = tolerance
|
|
114
|
+
self.scheduler = scheduler
|
|
115
|
+
self.options = options
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
119
|
+
where Upstream.Failure == Downstream.Failure,
|
|
120
|
+
Upstream.Output == Downstream.Input
|
|
121
|
+
{
|
|
122
|
+
let inner = Inner(downstream: subscriber,
|
|
123
|
+
interval: interval,
|
|
124
|
+
tolerance: tolerance,
|
|
125
|
+
scheduler: scheduler,
|
|
126
|
+
options: options)
|
|
127
|
+
upstream.subscribe(inner)
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
extension Publishers.Delay {
|
|
133
|
+
private final class Inner<Downstream: Subscriber>
|
|
134
|
+
: Subscriber,
|
|
135
|
+
Subscription
|
|
136
|
+
where Downstream.Input == Upstream.Output, Downstream.Failure == Upstream.Failure
|
|
137
|
+
{
|
|
138
|
+
typealias Input = Upstream.Output
|
|
139
|
+
typealias Failure = Upstream.Failure
|
|
140
|
+
|
|
141
|
+
private let lock = UnfairLock.allocate()
|
|
142
|
+
private let downstream: Downstream
|
|
143
|
+
private let interval: Context.SchedulerTimeType.Stride
|
|
144
|
+
private let tolerance: Context.SchedulerTimeType.Stride
|
|
145
|
+
private let scheduler: Context
|
|
146
|
+
private let options: Context.SchedulerOptions?
|
|
147
|
+
private var state = SubscriptionStatus.awaitingSubscription
|
|
148
|
+
private let downstreamLock = UnfairRecursiveLock.allocate()
|
|
149
|
+
|
|
150
|
+
fileprivate init(downstream: Downstream,
|
|
151
|
+
interval: Context.SchedulerTimeType.Stride,
|
|
152
|
+
tolerance: Context.SchedulerTimeType.Stride,
|
|
153
|
+
scheduler: Context,
|
|
154
|
+
options: Context.SchedulerOptions?) {
|
|
155
|
+
self.downstream = downstream
|
|
156
|
+
self.interval = interval
|
|
157
|
+
self.tolerance = tolerance
|
|
158
|
+
self.scheduler = scheduler
|
|
159
|
+
self.options = options
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
deinit {
|
|
163
|
+
lock.deallocate()
|
|
164
|
+
downstreamLock.deallocate()
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
private func schedule(_ work: @escaping () -> Void) {
|
|
168
|
+
scheduler
|
|
169
|
+
.schedule(after: scheduler.now.advanced(by: interval),
|
|
170
|
+
tolerance: tolerance,
|
|
171
|
+
options: options,
|
|
172
|
+
work)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
func receive(subscription: Subscription) {
|
|
176
|
+
lock.lock()
|
|
177
|
+
guard case .awaitingSubscription = state else {
|
|
178
|
+
lock.unlock()
|
|
179
|
+
subscription.cancel()
|
|
180
|
+
return
|
|
181
|
+
}
|
|
182
|
+
state = .subscribed(subscription)
|
|
183
|
+
lock.unlock()
|
|
184
|
+
downstreamLock.lock()
|
|
185
|
+
downstream.receive(subscription: self)
|
|
186
|
+
downstreamLock.unlock()
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
190
|
+
lock.lock()
|
|
191
|
+
guard case .subscribed = state else {
|
|
192
|
+
lock.unlock()
|
|
193
|
+
return .none
|
|
194
|
+
}
|
|
195
|
+
lock.unlock()
|
|
196
|
+
schedule {
|
|
197
|
+
self.scheduledReceive(input)
|
|
198
|
+
}
|
|
199
|
+
return .none
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
private func scheduledReceive(_ input: Input) {
|
|
203
|
+
lock.lock()
|
|
204
|
+
guard state.subscription != nil else {
|
|
205
|
+
lock.unlock()
|
|
206
|
+
return
|
|
207
|
+
}
|
|
208
|
+
lock.unlock()
|
|
209
|
+
downstreamLock.lock()
|
|
210
|
+
let newDemand = downstream.receive(input)
|
|
211
|
+
downstreamLock.unlock()
|
|
212
|
+
if newDemand == .none { return }
|
|
213
|
+
lock.lock()
|
|
214
|
+
let subscription = state.subscription
|
|
215
|
+
lock.unlock()
|
|
216
|
+
subscription?.request(newDemand)
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
func receive(completion: Subscribers.Completion<Failure>) {
|
|
220
|
+
lock.lock()
|
|
221
|
+
guard case let .subscribed(subscription) = state else {
|
|
222
|
+
lock.unlock()
|
|
223
|
+
return
|
|
224
|
+
}
|
|
225
|
+
state = .pendingTerminal(subscription)
|
|
226
|
+
lock.unlock()
|
|
227
|
+
schedule {
|
|
228
|
+
self.scheduledReceive(completion: completion)
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
private func scheduledReceive(completion: Subscribers.Completion<Failure>) {
|
|
233
|
+
lock.lock()
|
|
234
|
+
guard case .pendingTerminal = state else {
|
|
235
|
+
assertionFailure(
|
|
236
|
+
"This branch should not be reachable! Please report a bug."
|
|
237
|
+
)
|
|
238
|
+
lock.unlock()
|
|
239
|
+
return
|
|
240
|
+
}
|
|
241
|
+
state = .terminal
|
|
242
|
+
lock.unlock()
|
|
243
|
+
downstreamLock.lock()
|
|
244
|
+
downstream.receive(completion: completion)
|
|
245
|
+
downstreamLock.unlock()
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
func request(_ demand: Subscribers.Demand) {
|
|
249
|
+
lock.lock()
|
|
250
|
+
guard case let .subscribed(subscription) = state else {
|
|
251
|
+
lock.unlock()
|
|
252
|
+
return
|
|
253
|
+
}
|
|
254
|
+
lock.unlock()
|
|
255
|
+
subscription.request(demand)
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
func cancel() {
|
|
259
|
+
lock.lock()
|
|
260
|
+
guard case let .subscribed(subscription) = state else {
|
|
261
|
+
lock.unlock()
|
|
262
|
+
return
|
|
263
|
+
}
|
|
264
|
+
state = .terminal
|
|
265
|
+
lock.unlock()
|
|
266
|
+
subscription.cancel()
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|