@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,359 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.Throttle.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Stuart Austin on 14/11/2020.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
// swiftlint:disable generic_type_name line_length
|
|
10
|
+
|
|
11
|
+
/// Publishes either the most-recent or first element published by the upstream
|
|
12
|
+
/// publisher in the specified time interval.
|
|
13
|
+
///
|
|
14
|
+
/// Use `throttle(for:scheduler:latest:`` to selectively republish elements from
|
|
15
|
+
/// an upstream publisher during an interval you specify. Other elements received from
|
|
16
|
+
/// the upstream in the throttling interval aren’t republished.
|
|
17
|
+
///
|
|
18
|
+
/// In the example below, a `Timer.TimerPublisher` produces elements on 3-second
|
|
19
|
+
/// intervals; the `throttle(for:scheduler:latest:)` operator delivers the first
|
|
20
|
+
/// event, then republishes only the latest event in the following ten second
|
|
21
|
+
/// intervals:
|
|
22
|
+
///
|
|
23
|
+
/// cancellable = Timer.publish(every: 3.0, on: .main, in: .default)
|
|
24
|
+
/// .autoconnect()
|
|
25
|
+
/// .print("\(Date().description)")
|
|
26
|
+
/// .throttle(for: 10.0, scheduler: RunLoop.main, latest: true)
|
|
27
|
+
/// .sink(
|
|
28
|
+
/// receiveCompletion: { print ("Completion: \($0).") },
|
|
29
|
+
/// receiveValue: { print("Received Timestamp \($0).") }
|
|
30
|
+
/// )
|
|
31
|
+
///
|
|
32
|
+
/// // Prints:
|
|
33
|
+
/// // Publish at: 2020-03-19 18:26:54 +0000: receive value: (2020-03-19 18:26:57 +0000)
|
|
34
|
+
/// // Received Timestamp 2020-03-19 18:26:57 +0000.
|
|
35
|
+
/// // Publish at: 2020-03-19 18:26:54 +0000: receive value: (2020-03-19 18:27:00 +0000)
|
|
36
|
+
/// // Publish at: 2020-03-19 18:26:54 +0000: receive value: (2020-03-19 18:27:03 +0000)
|
|
37
|
+
/// // Publish at: 2020-03-19 18:26:54 +0000: receive value: (2020-03-19 18:27:06 +0000)
|
|
38
|
+
/// // Publish at: 2020-03-19 18:26:54 +0000: receive value: (2020-03-19 18:27:09 +0000)
|
|
39
|
+
/// // Received Timestamp 2020-03-19 18:27:09 +0000.
|
|
40
|
+
///
|
|
41
|
+
/// - Parameters:
|
|
42
|
+
/// - interval: The interval at which to find and emit either the most recent or
|
|
43
|
+
/// the first element, expressed in the time system of the scheduler.
|
|
44
|
+
/// - scheduler: The scheduler on which to publish elements.
|
|
45
|
+
/// - latest: A Boolean value that indicates whether to publish the most recent
|
|
46
|
+
/// element. If `false`, the publisher emits the first element received during
|
|
47
|
+
/// the interval.
|
|
48
|
+
/// - Returns: A publisher that emits either the most-recent or first element received
|
|
49
|
+
/// during the specified interval.
|
|
50
|
+
public func throttle<S>(for interval: S.SchedulerTimeType.Stride,
|
|
51
|
+
scheduler: S,
|
|
52
|
+
latest: Bool) -> Publishers.Throttle<Self, S>
|
|
53
|
+
where S: Scheduler
|
|
54
|
+
{
|
|
55
|
+
return .init(upstream: self,
|
|
56
|
+
interval: interval,
|
|
57
|
+
scheduler: scheduler,
|
|
58
|
+
latest: latest)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// swiftlint:enable generic_type_name line_length
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
extension Publishers {
|
|
65
|
+
|
|
66
|
+
/// A publisher that publishes either the most-recent or first element published by
|
|
67
|
+
/// the upstream publisher in a specified time interval.
|
|
68
|
+
public struct Throttle<Upstream, Context>: Publisher
|
|
69
|
+
where Upstream: Publisher, Context: Scheduler
|
|
70
|
+
{
|
|
71
|
+
|
|
72
|
+
/// The kind of values published by this publisher.
|
|
73
|
+
public typealias Output = Upstream.Output
|
|
74
|
+
|
|
75
|
+
/// The kind of errors this publisher might publish.
|
|
76
|
+
///
|
|
77
|
+
/// Use `Never` if this `Publisher` does not publish errors.
|
|
78
|
+
public typealias Failure = Upstream.Failure
|
|
79
|
+
|
|
80
|
+
/// The publisher from which this publisher receives elements.
|
|
81
|
+
public let upstream: Upstream
|
|
82
|
+
|
|
83
|
+
/// The interval in which to find and emit the most recent element.
|
|
84
|
+
public let interval: Context.SchedulerTimeType.Stride
|
|
85
|
+
|
|
86
|
+
/// The scheduler on which to publish elements.
|
|
87
|
+
public let scheduler: Context
|
|
88
|
+
|
|
89
|
+
/// A Boolean value indicating whether to publish the most recent element.
|
|
90
|
+
///
|
|
91
|
+
/// If `false`, the publisher emits the first element received during
|
|
92
|
+
/// the interval.
|
|
93
|
+
public let latest: Bool
|
|
94
|
+
|
|
95
|
+
public init(upstream: Upstream,
|
|
96
|
+
interval: Context.SchedulerTimeType.Stride,
|
|
97
|
+
scheduler: Context,
|
|
98
|
+
latest: Bool) {
|
|
99
|
+
|
|
100
|
+
self.upstream = upstream
|
|
101
|
+
self.interval = interval
|
|
102
|
+
self.scheduler = scheduler
|
|
103
|
+
self.latest = latest
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// swiftlint:disable generic_type_name
|
|
107
|
+
|
|
108
|
+
/// Attaches the specified subscriber to this publisher.
|
|
109
|
+
///
|
|
110
|
+
/// Implementations of ``Publisher`` must implement this method.
|
|
111
|
+
///
|
|
112
|
+
/// The provided implementation of ``Publisher/subscribe(_:)-4u8kn``calls
|
|
113
|
+
/// this method.
|
|
114
|
+
///
|
|
115
|
+
/// - Parameter subscriber: The subscriber to attach to this ``Publisher``,
|
|
116
|
+
/// after which it can receive values.
|
|
117
|
+
public func receive<S>(subscriber: S)
|
|
118
|
+
where S: Subscriber, Upstream.Failure == S.Failure, Upstream.Output == S.Input
|
|
119
|
+
{
|
|
120
|
+
let inner = Inner(interval: interval,
|
|
121
|
+
scheduler: scheduler,
|
|
122
|
+
latest: latest,
|
|
123
|
+
downstream: subscriber)
|
|
124
|
+
upstream.subscribe(inner)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// swiftlint:enable generic_type_name
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
extension Publishers.Throttle {
|
|
132
|
+
private final class Inner<Downstream: Subscriber>
|
|
133
|
+
: Subscriber,
|
|
134
|
+
Subscription,
|
|
135
|
+
CustomStringConvertible,
|
|
136
|
+
CustomReflectable,
|
|
137
|
+
CustomPlaygroundDisplayConvertible
|
|
138
|
+
where Downstream.Input == Upstream.Output, Downstream.Failure == Upstream.Failure
|
|
139
|
+
{
|
|
140
|
+
typealias Input = Upstream.Output
|
|
141
|
+
typealias Failure = Upstream.Failure
|
|
142
|
+
|
|
143
|
+
private enum State {
|
|
144
|
+
case awaitingSubscription(Downstream)
|
|
145
|
+
case subscribed(Subscription, Downstream)
|
|
146
|
+
case pendingTerminal(Subscription, Downstream)
|
|
147
|
+
case terminal
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
private let lock = UnfairLock.allocate()
|
|
151
|
+
private let interval: Context.SchedulerTimeType.Stride
|
|
152
|
+
private let scheduler: Context
|
|
153
|
+
private let latest: Bool
|
|
154
|
+
private var state: State
|
|
155
|
+
private let downstreamLock = UnfairRecursiveLock.allocate()
|
|
156
|
+
|
|
157
|
+
private var lastEmissionTime: Context.SchedulerTimeType?
|
|
158
|
+
|
|
159
|
+
private var pendingInput: Input?
|
|
160
|
+
private var pendingCompletion: Subscribers.Completion<Failure>?
|
|
161
|
+
|
|
162
|
+
private var demand: Subscribers.Demand = .none
|
|
163
|
+
|
|
164
|
+
private var lastTime: Context.SchedulerTimeType
|
|
165
|
+
|
|
166
|
+
init(interval: Context.SchedulerTimeType.Stride,
|
|
167
|
+
scheduler: Context,
|
|
168
|
+
latest: Bool,
|
|
169
|
+
downstream: Downstream) {
|
|
170
|
+
self.state = .awaitingSubscription(downstream)
|
|
171
|
+
self.interval = interval
|
|
172
|
+
self.scheduler = scheduler
|
|
173
|
+
self.latest = latest
|
|
174
|
+
|
|
175
|
+
self.lastTime = scheduler.now
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
deinit {
|
|
179
|
+
lock.deallocate()
|
|
180
|
+
downstreamLock.deallocate()
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
func receive(subscription: Subscription) {
|
|
184
|
+
lock.lock()
|
|
185
|
+
guard case let .awaitingSubscription(downstream) = state else {
|
|
186
|
+
lock.unlock()
|
|
187
|
+
subscription.cancel()
|
|
188
|
+
return
|
|
189
|
+
}
|
|
190
|
+
self.lastTime = scheduler.now
|
|
191
|
+
|
|
192
|
+
state = .subscribed(subscription, downstream)
|
|
193
|
+
lock.unlock()
|
|
194
|
+
|
|
195
|
+
subscription.request(.unlimited)
|
|
196
|
+
|
|
197
|
+
downstreamLock.lock()
|
|
198
|
+
downstream.receive(subscription: self)
|
|
199
|
+
downstreamLock.unlock()
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
203
|
+
lock.lock()
|
|
204
|
+
guard case .subscribed = state else {
|
|
205
|
+
lock.unlock()
|
|
206
|
+
return .none
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
let lastTime = scheduler.now
|
|
210
|
+
self.lastTime = lastTime
|
|
211
|
+
|
|
212
|
+
guard demand > .none else {
|
|
213
|
+
lock.unlock()
|
|
214
|
+
return .none
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
let hasScheduledOutput = (pendingInput != nil || pendingCompletion != nil)
|
|
218
|
+
|
|
219
|
+
if hasScheduledOutput && latest {
|
|
220
|
+
pendingInput = input
|
|
221
|
+
lock.unlock()
|
|
222
|
+
} else if !hasScheduledOutput {
|
|
223
|
+
let minimumEmissionTime =
|
|
224
|
+
lastEmissionTime.map { $0.advanced(by: interval) }
|
|
225
|
+
|
|
226
|
+
let emissionTime =
|
|
227
|
+
minimumEmissionTime.map { Swift.max(lastTime, $0) } ?? lastTime
|
|
228
|
+
|
|
229
|
+
demand -= 1
|
|
230
|
+
|
|
231
|
+
pendingInput = input
|
|
232
|
+
lock.unlock()
|
|
233
|
+
|
|
234
|
+
let action: () -> Void = { [weak self] in
|
|
235
|
+
self?.scheduledEmission()
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if emissionTime == lastTime {
|
|
239
|
+
scheduler.schedule(action)
|
|
240
|
+
} else {
|
|
241
|
+
scheduler.schedule(after: emissionTime, action)
|
|
242
|
+
}
|
|
243
|
+
} else {
|
|
244
|
+
lock.unlock()
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
return .none
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
func receive(completion: Subscribers.Completion<Failure>) {
|
|
251
|
+
lock.lock()
|
|
252
|
+
guard case let .subscribed(subscription, downstream) = state else {
|
|
253
|
+
lock.unlock()
|
|
254
|
+
return
|
|
255
|
+
}
|
|
256
|
+
let lastTime = scheduler.now
|
|
257
|
+
self.lastTime = lastTime
|
|
258
|
+
state = .pendingTerminal(subscription, downstream)
|
|
259
|
+
|
|
260
|
+
let hasScheduledOutput = (pendingInput != nil || pendingCompletion != nil)
|
|
261
|
+
|
|
262
|
+
if hasScheduledOutput && pendingCompletion == nil {
|
|
263
|
+
pendingCompletion = completion
|
|
264
|
+
lock.unlock()
|
|
265
|
+
} else if !hasScheduledOutput {
|
|
266
|
+
pendingCompletion = completion
|
|
267
|
+
lock.unlock()
|
|
268
|
+
|
|
269
|
+
scheduler.schedule { [weak self] in
|
|
270
|
+
self?.scheduledEmission()
|
|
271
|
+
}
|
|
272
|
+
} else {
|
|
273
|
+
lock.unlock()
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
private func scheduledEmission() {
|
|
278
|
+
lock.lock()
|
|
279
|
+
|
|
280
|
+
let downstream: Downstream
|
|
281
|
+
|
|
282
|
+
switch state {
|
|
283
|
+
case .awaitingSubscription, .terminal:
|
|
284
|
+
lock.unlock()
|
|
285
|
+
return
|
|
286
|
+
case let .subscribed(_, foundDownstream),
|
|
287
|
+
let .pendingTerminal(_, foundDownstream):
|
|
288
|
+
downstream = foundDownstream
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if self.pendingInput != nil && self.pendingCompletion == nil {
|
|
292
|
+
lastEmissionTime = scheduler.now
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
let pendingInput = self.pendingInput.take()
|
|
296
|
+
let pendingCompletion = self.pendingCompletion.take()
|
|
297
|
+
|
|
298
|
+
if pendingCompletion != nil {
|
|
299
|
+
state = .terminal
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
lock.unlock()
|
|
303
|
+
|
|
304
|
+
downstreamLock.lock()
|
|
305
|
+
|
|
306
|
+
let newDemand: Subscribers.Demand
|
|
307
|
+
if let input = pendingInput {
|
|
308
|
+
newDemand = downstream.receive(input)
|
|
309
|
+
} else {
|
|
310
|
+
newDemand = .none
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if let completion = pendingCompletion {
|
|
314
|
+
downstream.receive(completion: completion)
|
|
315
|
+
}
|
|
316
|
+
downstreamLock.unlock()
|
|
317
|
+
|
|
318
|
+
guard newDemand > 0 else { return }
|
|
319
|
+
self.lock.lock()
|
|
320
|
+
demand += newDemand
|
|
321
|
+
self.lock.unlock()
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
func request(_ demand: Subscribers.Demand) {
|
|
325
|
+
guard demand > 0 else { return }
|
|
326
|
+
lock.lock()
|
|
327
|
+
guard case .subscribed = state else {
|
|
328
|
+
lock.unlock()
|
|
329
|
+
return
|
|
330
|
+
}
|
|
331
|
+
self.demand += demand
|
|
332
|
+
lock.unlock()
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
func cancel() {
|
|
336
|
+
lock.lock()
|
|
337
|
+
|
|
338
|
+
let subscription: Subscription?
|
|
339
|
+
switch state {
|
|
340
|
+
case let .subscribed(existingSubscription, _),
|
|
341
|
+
let .pendingTerminal(existingSubscription, _):
|
|
342
|
+
subscription = existingSubscription
|
|
343
|
+
case .awaitingSubscription, .terminal:
|
|
344
|
+
subscription = nil
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
state = .terminal
|
|
348
|
+
lock.unlock()
|
|
349
|
+
|
|
350
|
+
subscription?.cancel()
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
var description: String { return "Throttle" }
|
|
354
|
+
|
|
355
|
+
var customMirror: Mirror { return Mirror(self, children: EmptyCollection()) }
|
|
356
|
+
|
|
357
|
+
var playgroundDescription: Any { return description }
|
|
358
|
+
}
|
|
359
|
+
}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publishers.Timeout.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 14.06.2020.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Terminates publishing if the upstream publisher exceeds the specified time
|
|
11
|
+
/// interval without producing an element.
|
|
12
|
+
///
|
|
13
|
+
/// Use `timeout(_:scheduler:options:customError:)` to terminate a publisher if
|
|
14
|
+
/// an element isn’t delivered within a timeout interval you specify.
|
|
15
|
+
///
|
|
16
|
+
/// In the example below, a `PassthroughSubject` publishes `String` elements and is
|
|
17
|
+
/// configured to time out if no new elements are received within its `TIME_OUT`
|
|
18
|
+
/// window of 5 seconds. A single value is published after the specified 2-second
|
|
19
|
+
/// `WAIT_TIME`, after which no more elements are available; the publisher then times
|
|
20
|
+
/// out and completes normally.
|
|
21
|
+
///
|
|
22
|
+
/// var WAIT_TIME : Int = 2
|
|
23
|
+
/// var TIMEOUT_TIME : Int = 5
|
|
24
|
+
///
|
|
25
|
+
/// let subject = PassthroughSubject<String, Never>()
|
|
26
|
+
/// let cancellable = subject
|
|
27
|
+
/// .timeout(.seconds(TIMEOUT_TIME),
|
|
28
|
+
/// scheduler: DispatchQueue.main,
|
|
29
|
+
/// options: nil,
|
|
30
|
+
/// customError: nil)
|
|
31
|
+
/// .sink(
|
|
32
|
+
/// receiveCompletion: { print ("completion: \($0) at \(Date())") },
|
|
33
|
+
/// receiveValue: { print ("value: \($0) at \(Date())") }
|
|
34
|
+
/// )
|
|
35
|
+
///
|
|
36
|
+
/// DispatchQueue.main.asyncAfter(
|
|
37
|
+
/// deadline: .now() + .seconds(WAIT_TIME),
|
|
38
|
+
/// execute: {
|
|
39
|
+
/// subject.send("Some data - sent after a delay of \(WAIT_TIME) seconds")
|
|
40
|
+
/// }
|
|
41
|
+
/// )
|
|
42
|
+
///
|
|
43
|
+
/// // Prints:
|
|
44
|
+
/// // value: Some data - sent after a delay of 2 seconds at
|
|
45
|
+
/// // 2020-03-10 23:47:59 +0000
|
|
46
|
+
/// // completion: finished at 2020-03-10 23:48:04 +0000
|
|
47
|
+
///
|
|
48
|
+
/// If `customError` is `nil`, the publisher completes normally; if you provide
|
|
49
|
+
/// a closure for the `customError` argument, the upstream publisher is instead
|
|
50
|
+
/// terminated upon timeout, and the error is delivered to the downstream.
|
|
51
|
+
///
|
|
52
|
+
/// - Parameters:
|
|
53
|
+
/// - interval: The maximum time interval the publisher can go without emitting
|
|
54
|
+
/// an element, expressed in the time system of the scheduler.
|
|
55
|
+
/// - scheduler: The scheduler to deliver events on.
|
|
56
|
+
/// - options: Scheduler options that customize the delivery of elements.
|
|
57
|
+
/// - customError: A closure that executes if the publisher times out.
|
|
58
|
+
/// The publisher sends the failure returned by this closure to the subscriber as
|
|
59
|
+
/// the reason for termination.
|
|
60
|
+
/// - Returns: A publisher that terminates if the specified interval elapses with no
|
|
61
|
+
/// events received from the upstream publisher.
|
|
62
|
+
public func timeout<Context: Scheduler>(
|
|
63
|
+
_ interval: Context.SchedulerTimeType.Stride,
|
|
64
|
+
scheduler: Context,
|
|
65
|
+
options: Context.SchedulerOptions? = nil,
|
|
66
|
+
customError: (() -> Failure)? = nil
|
|
67
|
+
) -> Publishers.Timeout<Self, Context> {
|
|
68
|
+
return .init(upstream: self,
|
|
69
|
+
interval: interval,
|
|
70
|
+
scheduler: scheduler,
|
|
71
|
+
options: options,
|
|
72
|
+
customError: customError)
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
extension Publishers {
|
|
77
|
+
|
|
78
|
+
public struct Timeout<Upstream: Publisher, Context: Scheduler>: Publisher {
|
|
79
|
+
|
|
80
|
+
public typealias Output = Upstream.Output
|
|
81
|
+
|
|
82
|
+
public typealias Failure = Upstream.Failure
|
|
83
|
+
|
|
84
|
+
public let upstream: Upstream
|
|
85
|
+
|
|
86
|
+
public let interval: Context.SchedulerTimeType.Stride
|
|
87
|
+
|
|
88
|
+
public let scheduler: Context
|
|
89
|
+
|
|
90
|
+
public let options: Context.SchedulerOptions?
|
|
91
|
+
|
|
92
|
+
public let customError: (() -> Upstream.Failure)?
|
|
93
|
+
|
|
94
|
+
public init(upstream: Upstream,
|
|
95
|
+
interval: Context.SchedulerTimeType.Stride,
|
|
96
|
+
scheduler: Context,
|
|
97
|
+
options: Context.SchedulerOptions?,
|
|
98
|
+
customError: (() -> Publishers.Timeout<Upstream, Context>.Failure)?) {
|
|
99
|
+
self.upstream = upstream
|
|
100
|
+
self.interval = interval
|
|
101
|
+
self.scheduler = scheduler
|
|
102
|
+
self.options = options
|
|
103
|
+
self.customError = customError
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
public func receive<Downsteam: Subscriber>(subscriber: Downsteam)
|
|
107
|
+
where Downsteam.Failure == Failure, Downsteam.Input == Output
|
|
108
|
+
{
|
|
109
|
+
let inner = Inner(downstream: subscriber,
|
|
110
|
+
interval: interval,
|
|
111
|
+
scheduler: scheduler,
|
|
112
|
+
options: options,
|
|
113
|
+
customError: customError)
|
|
114
|
+
upstream.subscribe(inner)
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
extension Publishers.Timeout {
|
|
120
|
+
private final class Inner<Downstream: Subscriber>
|
|
121
|
+
: Subscriber,
|
|
122
|
+
Subscription,
|
|
123
|
+
CustomStringConvertible,
|
|
124
|
+
CustomReflectable,
|
|
125
|
+
CustomPlaygroundDisplayConvertible
|
|
126
|
+
where Downstream.Input == Upstream.Output, Downstream.Failure == Upstream.Failure
|
|
127
|
+
{
|
|
128
|
+
typealias Input = Upstream.Output
|
|
129
|
+
|
|
130
|
+
typealias Failure = Upstream.Failure
|
|
131
|
+
|
|
132
|
+
private let lock = UnfairLock.allocate()
|
|
133
|
+
|
|
134
|
+
private let downstreamLock = UnfairRecursiveLock.allocate()
|
|
135
|
+
|
|
136
|
+
private let downstream: Downstream
|
|
137
|
+
|
|
138
|
+
private let interval: Context.SchedulerTimeType.Stride
|
|
139
|
+
|
|
140
|
+
private let scheduler: Context
|
|
141
|
+
|
|
142
|
+
private let options: Context.SchedulerOptions?
|
|
143
|
+
|
|
144
|
+
private let customError: (() -> Upstream.Failure)?
|
|
145
|
+
|
|
146
|
+
private var state = SubscriptionStatus.awaitingSubscription
|
|
147
|
+
|
|
148
|
+
private var didTimeout = false
|
|
149
|
+
|
|
150
|
+
private var timer: AnyCancellable?
|
|
151
|
+
|
|
152
|
+
private var initialDemand = false
|
|
153
|
+
|
|
154
|
+
init(downstream: Downstream,
|
|
155
|
+
interval: Context.SchedulerTimeType.Stride,
|
|
156
|
+
scheduler: Context,
|
|
157
|
+
options: Context.SchedulerOptions?,
|
|
158
|
+
customError: (() -> Upstream.Failure)?) {
|
|
159
|
+
self.downstream = downstream
|
|
160
|
+
self.interval = interval
|
|
161
|
+
self.scheduler = scheduler
|
|
162
|
+
self.options = options
|
|
163
|
+
self.customError = customError
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
deinit {
|
|
167
|
+
lock.deallocate()
|
|
168
|
+
downstreamLock.deallocate()
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
func receive(subscription: Subscription) {
|
|
172
|
+
lock.lock()
|
|
173
|
+
guard case .awaitingSubscription = state else {
|
|
174
|
+
lock.unlock()
|
|
175
|
+
subscription.cancel()
|
|
176
|
+
return
|
|
177
|
+
}
|
|
178
|
+
state = .subscribed(subscription)
|
|
179
|
+
timer = timeoutClock()
|
|
180
|
+
lock.unlock()
|
|
181
|
+
downstreamLock.lock()
|
|
182
|
+
downstream.receive(subscription: self)
|
|
183
|
+
downstreamLock.unlock()
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
187
|
+
lock.lock()
|
|
188
|
+
guard !didTimeout, case .subscribed = state else {
|
|
189
|
+
lock.unlock()
|
|
190
|
+
return .none
|
|
191
|
+
}
|
|
192
|
+
timer?.cancel()
|
|
193
|
+
didTimeout = false
|
|
194
|
+
timer = timeoutClock()
|
|
195
|
+
lock.unlock()
|
|
196
|
+
scheduler.schedule(options: options) {
|
|
197
|
+
self.scheduledReceive(input)
|
|
198
|
+
}
|
|
199
|
+
return .none
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
func receive(completion: Subscribers.Completion<Failure>) {
|
|
203
|
+
lock.lock()
|
|
204
|
+
guard case .subscribed = state else {
|
|
205
|
+
lock.unlock()
|
|
206
|
+
return
|
|
207
|
+
}
|
|
208
|
+
timer?.cancel()
|
|
209
|
+
lock.unlock()
|
|
210
|
+
scheduler.schedule(options: options) {
|
|
211
|
+
self.scheduledReceive(completion: completion)
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
func request(_ demand: Subscribers.Demand) {
|
|
216
|
+
lock.lock()
|
|
217
|
+
guard case let .subscribed(subscription) = state else {
|
|
218
|
+
lock.unlock()
|
|
219
|
+
return
|
|
220
|
+
}
|
|
221
|
+
if !initialDemand {
|
|
222
|
+
timer = timeoutClock()
|
|
223
|
+
initialDemand = true
|
|
224
|
+
}
|
|
225
|
+
lock.unlock()
|
|
226
|
+
subscription.request(demand)
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
func cancel() {
|
|
230
|
+
lock.lock()
|
|
231
|
+
guard case let .subscribed(subscription) = state else {
|
|
232
|
+
lock.unlock()
|
|
233
|
+
return
|
|
234
|
+
}
|
|
235
|
+
state = .terminal
|
|
236
|
+
lock.unlock()
|
|
237
|
+
timer?.cancel()
|
|
238
|
+
subscription.cancel()
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
var description: String { return "Timeout" }
|
|
242
|
+
|
|
243
|
+
var customMirror: Mirror { return Mirror(self, children: EmptyCollection()) }
|
|
244
|
+
|
|
245
|
+
var playgroundDescription: Any { return description }
|
|
246
|
+
|
|
247
|
+
private func timedOut() {
|
|
248
|
+
lock.lock()
|
|
249
|
+
guard !didTimeout, case let .subscribed(subscription) = state else {
|
|
250
|
+
lock.unlock()
|
|
251
|
+
return
|
|
252
|
+
}
|
|
253
|
+
didTimeout = true
|
|
254
|
+
state = .terminal
|
|
255
|
+
lock.unlock()
|
|
256
|
+
subscription.cancel()
|
|
257
|
+
downstreamLock.lock()
|
|
258
|
+
downstream
|
|
259
|
+
.receive(completion: customError.map { .failure($0()) } ?? .finished)
|
|
260
|
+
downstreamLock.unlock()
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
private func timeoutClock() -> AnyCancellable {
|
|
264
|
+
let cancellable = scheduler
|
|
265
|
+
.schedule(after: scheduler.now.advanced(by: interval),
|
|
266
|
+
interval: interval,
|
|
267
|
+
tolerance: scheduler.minimumTolerance,
|
|
268
|
+
options: options,
|
|
269
|
+
timedOut)
|
|
270
|
+
return AnyCancellable(cancellable.cancel)
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
private func scheduledReceive(_ input: Input) {
|
|
274
|
+
lock.lock()
|
|
275
|
+
guard !didTimeout, case let .subscribed(subscription) = state else {
|
|
276
|
+
lock.unlock()
|
|
277
|
+
return
|
|
278
|
+
}
|
|
279
|
+
lock.unlock()
|
|
280
|
+
downstreamLock.lock()
|
|
281
|
+
let newDemand = downstream.receive(input)
|
|
282
|
+
downstreamLock.unlock()
|
|
283
|
+
if newDemand != .none {
|
|
284
|
+
subscription.request(newDemand)
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
private func scheduledReceive(completion: Subscribers.Completion<Failure>) {
|
|
289
|
+
lock.lock()
|
|
290
|
+
guard case .subscribed = state else {
|
|
291
|
+
lock.unlock()
|
|
292
|
+
return
|
|
293
|
+
}
|
|
294
|
+
state = .terminal
|
|
295
|
+
lock.unlock()
|
|
296
|
+
downstreamLock.lock()
|
|
297
|
+
downstream.receive(completion: completion)
|
|
298
|
+
downstreamLock.unlock()
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|