@swiftbrowser/swift 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Package.swift +200 -9
- package/README.md +7 -9
- package/Sources/AVFoundation/AVFoundation.swift +131 -0
- package/Sources/AVFoundation/Asset.swift +487 -0
- package/Sources/AVFoundation/AudioSession.swift +144 -0
- package/Sources/AVFoundation/CMTime.swift +303 -0
- package/Sources/AVFoundation/Capture.swift +688 -0
- package/Sources/AVFoundation/Player.swift +749 -0
- package/Sources/AVFoundation/PlayerView.swift +117 -0
- package/Sources/AVKit/AVKit.swift +132 -0
- package/Sources/Accelerate/Accelerate.swift +122 -0
- package/Sources/AppIntents/AppIntents.swift +144 -0
- package/Sources/AppIntents/Parameters.swift +220 -0
- package/Sources/AppIntents/Shortcuts.swift +159 -0
- package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
- package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
- package/Sources/AuthenticationServices/Authorization.swift +251 -0
- package/Sources/Charts/Charts.swift +0 -4
- package/Sources/Combine/AnyCancellable.swift +65 -0
- package/Sources/Combine/AnyPublisher.swift +148 -0
- package/Sources/Combine/AnySubscriber.swift +230 -0
- package/Sources/Combine/Cancellable.swift +35 -0
- package/Sources/Combine/Codable.swift +29 -0
- package/Sources/Combine/CombineIdentifier.swift +45 -0
- package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
- package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
- package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
- package/Sources/Combine/CurrentValueSubject.swift +252 -0
- package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
- package/Sources/Combine/Future.swift +228 -0
- package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
- package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
- package/Sources/Combine/Helpers/ConduitList.swift +59 -0
- package/Sources/Combine/Helpers/DebugHook.swift +177 -0
- package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
- package/Sources/Combine/Helpers/Locking.swift +30 -0
- package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
- package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
- package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
- package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
- package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
- package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
- package/Sources/Combine/Helpers/Utils.swift +30 -0
- package/Sources/Combine/Helpers/Violations.swift +33 -0
- package/Sources/Combine/ImmediateScheduler.swift +178 -0
- package/Sources/Combine/LICENSE +21 -0
- package/Sources/Combine/NotificationPublisher.swift +48 -0
- package/Sources/Combine/ObjectWillChange.swift +46 -0
- package/Sources/Combine/PassthroughSubject.swift +222 -0
- package/Sources/Combine/Publisher+Subscribe.swift +53 -0
- package/Sources/Combine/Publishers/Deferred.swift +48 -0
- package/Sources/Combine/Publishers/Empty.swift +54 -0
- package/Sources/Combine/Publishers/Fail.swift +42 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
- package/Sources/Combine/Publishers/Just.swift +313 -0
- package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
- package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
- package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
- package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
- package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
- package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
- package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
- package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
- package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
- package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
- package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
- package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
- package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
- package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
- package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
- package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
- package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
- package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
- package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
- package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
- package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
- package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
- package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
- package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
- package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
- package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
- package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
- package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
- package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
- package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
- package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
- package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
- package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
- package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
- package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
- package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
- package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
- package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
- package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
- package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
- package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
- package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
- package/Sources/Combine/Publishers/Publishers.swift +13 -0
- package/Sources/Combine/Publishers/Record.swift +237 -0
- package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
- package/Sources/Combine/Result.swift +46 -0
- package/Sources/Combine/Scheduler.swift +89 -0
- package/Sources/Combine/Schedulers.swift +211 -0
- package/Sources/Combine/Subject+Void.swift +17 -0
- package/Sources/Combine/Subscriber+Void.swift +20 -0
- package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
- package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
- package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
- package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
- package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
- package/Sources/Combine/Subscription.swift +22 -0
- package/Sources/Combine/Subscriptions.swift +42 -0
- package/Sources/Combine/SwiftUIObservation.swift +10 -0
- package/Sources/Combine/_Introspection.swift +107 -0
- package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
- package/Sources/Compression/Compression.swift +365 -0
- package/Sources/Compression/Deflate.swift +407 -0
- package/Sources/Compression/Zlib.swift +179 -0
- package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
- package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
- package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
- package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
- package/Sources/CoreImage/CIColor.swift +41 -0
- package/Sources/CoreImage/CIContext.swift +31 -0
- package/Sources/CoreImage/CIDetector.swift +57 -0
- package/Sources/CoreImage/CIFilter.swift +243 -0
- package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
- package/Sources/CoreImage/CIImage.swift +162 -0
- package/Sources/CoreImage/QRCode.swift +393 -0
- package/Sources/CoreLocation/Coordinate.swift +30 -0
- package/Sources/CoreLocation/Location.swift +65 -0
- package/Sources/CoreML/Evaluation.swift +414 -0
- package/Sources/CoreML/FeatureValue.swift +266 -0
- package/Sources/CoreML/Model.swift +269 -0
- package/Sources/CoreML/MultiArray.swift +92 -0
- package/Sources/CoreML/Specification.swift +233 -0
- package/Sources/CoreText/CoreText.swift +64 -0
- package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
- package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
- package/Sources/CryptoKit/CryptoKit.swift +375 -0
- package/Sources/CryptoKit/Curve25519.swift +317 -0
- package/Sources/CryptoKit/P256.swift +321 -0
- package/Sources/FoundationBridge/AppStorage.swift +165 -0
- package/Sources/FoundationBridge/AssetResources.swift +90 -0
- package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
- package/Sources/FoundationBridge/AsyncImage.swift +116 -0
- package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
- package/Sources/{_FoundationCommon → FoundationBridge}/Bundle.swift +41 -4
- package/Sources/FoundationBridge/CombineExports.swift +8 -0
- package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
- package/Sources/FoundationBridge/Dispatch.swift +458 -0
- package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
- package/Sources/FoundationBridge/FileImporter.swift +128 -0
- package/Sources/FoundationBridge/FileSystem.swift +68 -0
- package/Sources/FoundationBridge/FoundationBridge.swift +24 -72
- package/Sources/FoundationBridge/HostResolution.swift +31 -0
- package/Sources/FoundationBridge/ItemProvider.swift +655 -0
- package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
- package/Sources/FoundationBridge/Links.swift +127 -0
- package/Sources/FoundationBridge/ListFormatter.swift +32 -0
- package/Sources/FoundationBridge/Localization.swift +149 -0
- package/Sources/FoundationBridge/Locks.swift +50 -0
- package/Sources/FoundationBridge/Markdown.swift +527 -0
- package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
- package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
- package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
- package/Sources/FoundationBridge/Operation.swift +195 -0
- package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
- package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
- package/Sources/FoundationBridge/SceneStorage.swift +78 -0
- package/Sources/FoundationBridge/SecurityExports.swift +8 -0
- package/Sources/FoundationBridge/Selector.swift +226 -0
- package/Sources/FoundationBridge/StringComparators.swift +17 -0
- package/Sources/FoundationBridge/Table.swift +211 -0
- package/Sources/FoundationBridge/TextAttributes.swift +42 -0
- package/Sources/FoundationBridge/Timer.swift +6 -1
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/{_FoundationCommon → FoundationBridge}/UserDefaults.swift +17 -4
- package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
- package/Sources/FoundationBridge/WebSocket.swift +187 -0
- package/Sources/FoundationModels/FoundationModels.swift +1098 -0
- package/Sources/ImageIO/GIF.swift +72 -0
- package/Sources/ImageIO/ImageIO.swift +248 -0
- package/Sources/ImageIO/ImageTypes.swift +28 -0
- package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
- package/Sources/LocalAuthentication/LAContext.swift +86 -0
- package/Sources/MapKit/Geometry.swift +223 -0
- package/Sources/MapKit/Map.swift +638 -0
- package/Sources/MapKit/MapView.swift +229 -0
- package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
- package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
- package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
- package/Sources/OSLog/OSLog.swift +6 -0
- package/Sources/Photos/Photos.swift +572 -0
- package/Sources/PhotosUI/PhotosPicker.swift +248 -0
- package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
- package/Sources/QuickLook/QuickLook.swift +168 -0
- package/Sources/SafariServices/SafariServices.swift +106 -0
- package/Sources/Security/Security.swift +332 -0
- package/Sources/StoreKit/AppStore.swift +207 -0
- package/Sources/StoreKit/Products.swift +280 -0
- package/Sources/StoreKit/RequestReview.swift +28 -0
- package/Sources/StoreKit/StoreKit1.swift +486 -0
- package/Sources/StoreKit/StoreViews.swift +428 -0
- package/Sources/StoreKit/Transactions.swift +197 -0
- package/Sources/SwiftData/Macros.swift +58 -0
- package/Sources/SwiftData/ModelActor.swift +38 -0
- package/Sources/SwiftData/ModelContainer.swift +129 -0
- package/Sources/SwiftData/ModelContext.swift +451 -0
- package/Sources/SwiftData/PersistentModel.swift +238 -0
- package/Sources/SwiftData/Properties.swift +261 -0
- package/Sources/SwiftData/Query.swift +256 -0
- package/Sources/SwiftData/Schema.swift +192 -0
- package/Sources/SwiftData/Store.swift +146 -0
- package/Sources/SwiftData/StringPredicates.swift +125 -0
- package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
- package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
- package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
- package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
- package/Sources/SwiftDataMacros/Plugin.swift +18 -0
- package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
- package/Sources/SwiftUI/API/Accessibility.swift +55 -6
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +1 -1
- package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
- package/Sources/SwiftUI/API/Animation.swift +37 -5
- package/Sources/SwiftUI/API/App.swift +31 -1
- package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
- package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
- package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
- package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
- package/Sources/SwiftUI/API/Canvas.swift +337 -0
- package/Sources/SwiftUI/API/Color.swift +104 -28
- package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
- package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
- package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
- package/Sources/SwiftUI/API/Commands.swift +106 -0
- package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
- package/Sources/SwiftUI/API/ContentShape.swift +33 -0
- package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
- package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
- package/Sources/SwiftUI/API/Controls.swift +59 -27
- package/Sources/SwiftUI/API/CustomLayout.swift +49 -10
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +1 -1
- package/Sources/SwiftUI/API/EditMode.swift +25 -82
- package/Sources/SwiftUI/API/Effects.swift +105 -7
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +93 -9
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +11 -3
- package/Sources/SwiftUI/API/Gauge.swift +3 -2
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +13 -2
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +1 -1
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +1 -1
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +13 -6
- package/Sources/SwiftUI/API/Layout.swift +67 -12
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +61 -6
- package/Sources/SwiftUI/API/Menu.swift +8 -1
- package/Sources/SwiftUI/API/Modifiers.swift +80 -10
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +24 -9
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +16 -2
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +48 -31
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +11 -2
- package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
- package/Sources/SwiftUI/API/Popover.swift +41 -0
- package/Sources/SwiftUI/API/Preferences.swift +262 -0
- package/Sources/SwiftUI/API/Presentation.swift +17 -4
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +164 -37
- package/Sources/SwiftUI/API/Publishers.swift +4 -4
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +3 -2
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +3 -3
- package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
- package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +105 -7
- package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
- package/Sources/SwiftUI/API/Sharing.swift +193 -0
- package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
- package/Sources/SwiftUI/API/State.swift +18 -1
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
- package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
- package/Sources/SwiftUI/API/TabContent.swift +841 -0
- package/Sources/SwiftUI/API/Table.swift +382 -0
- package/Sources/SwiftUI/API/Tabs.swift +148 -4
- package/Sources/SwiftUI/API/Tasks.swift +2 -2
- package/Sources/SwiftUI/API/Text.swift +386 -0
- package/Sources/SwiftUI/API/TextDates.swift +61 -0
- package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
- package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
- package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
- package/Sources/SwiftUI/API/Toolbar.swift +52 -16
- package/Sources/SwiftUI/API/Transfer.swift +145 -0
- package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
- package/Sources/SwiftUI/API/Video.swift +64 -0
- package/Sources/SwiftUI/API/View.swift +10 -2
- package/Sources/SwiftUI/API/ViewModifier.swift +4 -1
- package/Sources/SwiftUI/API/VisualEffect.swift +74 -1
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +7 -1
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +17 -3
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Localization/Localization.swift +498 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +2 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +37 -1
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +76 -4
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +58 -12
- package/Sources/SwiftUI/Runtime/Reconciler.swift +10 -1
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +977 -198
- package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
- package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
- package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
- package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
- package/Sources/Symbols/Symbols.swift +25 -0
- package/Sources/Translation/Translation.swift +423 -0
- package/Sources/UIKit/Activity.swift +213 -0
- package/Sources/UIKit/Alerts.swift +69 -0
- package/Sources/UIKit/AppDelegate.swift +222 -0
- package/Sources/UIKit/Appearance.swift +84 -0
- package/Sources/UIKit/ColorConversions.swift +70 -0
- package/Sources/UIKit/Controls.swift +225 -0
- package/Sources/UIKit/Device.swift +200 -0
- package/Sources/UIKit/Feedback.swift +65 -0
- package/Sources/UIKit/Font.swift +307 -0
- package/Sources/UIKit/Graphics.swift +204 -0
- package/Sources/UIKit/HostingController.swift +185 -0
- package/Sources/UIKit/Identity.swift +24 -0
- package/Sources/UIKit/Introspectable.swift +510 -0
- package/Sources/UIKit/Pasteboard.swift +363 -0
- package/Sources/UIKit/PhotoAlbum.swift +81 -0
- package/Sources/UIKit/RemoteNotifications.swift +15 -0
- package/Sources/UIKit/Representable.swift +288 -0
- package/Sources/UIKit/SafeArea.swift +12 -0
- package/Sources/UIKit/SceneDelegates.swift +132 -0
- package/Sources/UIKit/Scenes.swift +40 -0
- package/Sources/UIKit/ScrollView.swift +157 -0
- package/Sources/UIKit/ShortcutItems.swift +67 -0
- package/Sources/UIKit/SymbolConfiguration.swift +124 -0
- package/Sources/UIKit/TargetAction.swift +123 -0
- package/Sources/UIKit/TextPaste.swift +161 -0
- package/Sources/UIKit/TextView.swift +538 -0
- package/Sources/UIKit/UIKit.swift +292 -0
- package/Sources/UIKit/UIView.swift +855 -0
- package/Sources/UIKit/ViewTranslation.swift +311 -0
- package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
- package/Sources/UserNotifications/Content.swift +370 -0
- package/Sources/UserNotifications/NotificationCenter.swift +309 -0
- package/Sources/WeatherKit/WeatherKit.swift +228 -0
- package/Sources/WebKit/WebKit.swift +245 -0
- package/Sources/os/os.swift +376 -0
- package/Sources/zlib/zlib.swift +6 -0
- package/index.d.ts +1 -1
- package/index.mjs +2 -2
- package/manifest.d.mts +2 -0
- package/manifest.mjs +39 -0
- package/package.json +5 -3
- package/sync-sources.mjs +21 -7
- package/Sources/FoundationLite/Common.swift +0 -3
- package/Sources/FoundationLite/FoundationLite.swift +0 -171
- package/Sources/FoundationLite/Interaction.swift +0 -146
- package/Sources/FoundationLite/Timer.swift +0 -48
- package/Sources/_FoundationCommon/_FoundationCommon.swift +0 -10
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
//
|
|
2
|
+
// ImmediateScheduler.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 11.06.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
/// A scheduler for performing synchronous actions.
|
|
9
|
+
///
|
|
10
|
+
/// You can only use this scheduler for immediate actions. If you attempt to schedule
|
|
11
|
+
/// actions after a specific date, this scheduler ignores the date and performs them
|
|
12
|
+
/// immediately.
|
|
13
|
+
public struct ImmediateScheduler: Scheduler {
|
|
14
|
+
|
|
15
|
+
/// The time type used by the immediate scheduler.
|
|
16
|
+
public struct SchedulerTimeType: Strideable {
|
|
17
|
+
|
|
18
|
+
fileprivate init() {}
|
|
19
|
+
|
|
20
|
+
/// Returns the distance to another immediate scheduler time; this distance is
|
|
21
|
+
/// always `0` in the context of an immediate scheduler.
|
|
22
|
+
///
|
|
23
|
+
/// - Parameter other: The other scheduler time.
|
|
24
|
+
/// - Returns: `0`, as a `Stride`.
|
|
25
|
+
public func distance(to other: SchedulerTimeType) -> Stride { return 0 }
|
|
26
|
+
|
|
27
|
+
/// Advances the time by the specified amount; this is meaningless in the context
|
|
28
|
+
/// of an immediate scheduler.
|
|
29
|
+
///
|
|
30
|
+
/// - Parameter n: The amount to advance by. The `ImmediateScheduler` ignores this
|
|
31
|
+
/// value.
|
|
32
|
+
/// - Returns: An empty `SchedulerTimeType`.
|
|
33
|
+
public func advanced(by _: Stride) -> SchedulerTimeType {
|
|
34
|
+
return SchedulerTimeType()
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/// The increment by which the immediate scheduler counts time.
|
|
38
|
+
public struct Stride: ExpressibleByFloatLiteral,
|
|
39
|
+
Comparable,
|
|
40
|
+
SignedNumeric,
|
|
41
|
+
Codable,
|
|
42
|
+
SchedulerTimeIntervalConvertible {
|
|
43
|
+
|
|
44
|
+
/// The type used when evaluating floating-point literals.
|
|
45
|
+
public typealias FloatLiteralType = Double
|
|
46
|
+
|
|
47
|
+
/// The type used when evaluating integer literals.
|
|
48
|
+
public typealias IntegerLiteralType = Int
|
|
49
|
+
|
|
50
|
+
/// The type used for expressing the stride’s magnitude.
|
|
51
|
+
public typealias Magnitude = Int
|
|
52
|
+
|
|
53
|
+
/// The value of this time interval in seconds.
|
|
54
|
+
public var magnitude: Int
|
|
55
|
+
|
|
56
|
+
/// Creates an immediate scheduler time interval from the given time interval.
|
|
57
|
+
@inlinable
|
|
58
|
+
public init(_ value: Int) {
|
|
59
|
+
magnitude = value
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/// Creates an immediate scheduler time interval from an integer seconds
|
|
63
|
+
/// value.
|
|
64
|
+
@inlinable
|
|
65
|
+
public init(integerLiteral value: Int) {
|
|
66
|
+
self.init(value)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/// Creates an immediate scheduler time interval from a floating-point seconds
|
|
70
|
+
/// value.
|
|
71
|
+
@inlinable
|
|
72
|
+
public init(floatLiteral value: Double) {
|
|
73
|
+
self.init(Int(value))
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/// Creates an immediate scheduler time interval from a binary integer type.
|
|
77
|
+
///
|
|
78
|
+
/// If `exactly` can’t convert to an `Int`, the resulting time interval is
|
|
79
|
+
/// `nil`.
|
|
80
|
+
@inlinable
|
|
81
|
+
public init?<BinaryIntegerType: BinaryInteger>(
|
|
82
|
+
exactly source: BinaryIntegerType
|
|
83
|
+
) {
|
|
84
|
+
guard let magnitude = Int(exactly: source) else {
|
|
85
|
+
return nil
|
|
86
|
+
}
|
|
87
|
+
self.init(magnitude)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@inlinable
|
|
91
|
+
public static func < (lhs: Stride, rhs: Stride) -> Bool {
|
|
92
|
+
return lhs.magnitude < rhs.magnitude
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@inlinable
|
|
96
|
+
public static func * (lhs: Stride, rhs: Stride) -> Stride {
|
|
97
|
+
return Stride(lhs.magnitude * rhs.magnitude)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
@inlinable
|
|
101
|
+
public static func + (lhs: Stride, rhs: Stride) -> Stride {
|
|
102
|
+
return Stride(lhs.magnitude + rhs.magnitude)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
@inlinable
|
|
106
|
+
public static func - (lhs: Stride, rhs: Stride) -> Stride {
|
|
107
|
+
return Stride(lhs.magnitude - rhs.magnitude)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@inlinable
|
|
111
|
+
public static func -= (lhs: inout Stride, rhs: Stride) {
|
|
112
|
+
lhs.magnitude -= rhs.magnitude
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
public static func *= (lhs: inout Stride, rhs: Stride) {
|
|
116
|
+
lhs.magnitude *= rhs.magnitude
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
public static func += (lhs: inout Stride, rhs: Stride) {
|
|
120
|
+
lhs.magnitude += rhs.magnitude
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
public static func seconds(_: Int) -> Stride { return 0 }
|
|
124
|
+
|
|
125
|
+
public static func seconds(_: Double) -> Stride { return 0 }
|
|
126
|
+
|
|
127
|
+
public static func milliseconds(_: Int) -> Stride { return 0 }
|
|
128
|
+
|
|
129
|
+
public static func microseconds(_: Int) -> Stride { return 0 }
|
|
130
|
+
|
|
131
|
+
public static func nanoseconds(_: Int) -> Stride { return 0 }
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/// A type that defines options accepted by the immediate scheduler.
|
|
136
|
+
public typealias SchedulerOptions = Never
|
|
137
|
+
|
|
138
|
+
/// The shared instance of the immediate scheduler.
|
|
139
|
+
///
|
|
140
|
+
/// You cannot create instances of the immediate scheduler yourself. Use only
|
|
141
|
+
/// the shared instance.
|
|
142
|
+
public static let shared = ImmediateScheduler()
|
|
143
|
+
|
|
144
|
+
/// Performs the action at the next possible opportunity.
|
|
145
|
+
@inlinable
|
|
146
|
+
public func schedule(options: SchedulerOptions?, _ action: @escaping () -> Void) {
|
|
147
|
+
action()
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/// The immediate scheduler’s definition of the current moment in time.
|
|
151
|
+
public var now: SchedulerTimeType { return SchedulerTimeType() }
|
|
152
|
+
|
|
153
|
+
/// The minimum tolerance allowed by the immediate scheduler.
|
|
154
|
+
public var minimumTolerance: SchedulerTimeType.Stride { return 0 }
|
|
155
|
+
|
|
156
|
+
/// Performs the action at some time after the specified date.
|
|
157
|
+
///
|
|
158
|
+
/// The immediate scheduler ignores `date` and performs the action immediately.
|
|
159
|
+
public func schedule(after date: SchedulerTimeType,
|
|
160
|
+
tolerance: SchedulerTimeType.Stride,
|
|
161
|
+
options: SchedulerOptions?,
|
|
162
|
+
_ action: @escaping () -> Void) {
|
|
163
|
+
action()
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/// Performs the action at some time after the specified date, at the specified
|
|
167
|
+
/// frequency, optionally taking into account tolerance if possible.
|
|
168
|
+
///
|
|
169
|
+
/// The immediate scheduler ignores `date` and performs the action immediately.
|
|
170
|
+
public func schedule(after date: SchedulerTimeType,
|
|
171
|
+
interval: SchedulerTimeType.Stride,
|
|
172
|
+
tolerance: SchedulerTimeType.Stride,
|
|
173
|
+
options: SchedulerOptions?,
|
|
174
|
+
_ action: @escaping () -> Void) -> Cancellable {
|
|
175
|
+
action()
|
|
176
|
+
return Subscriptions.empty
|
|
177
|
+
}
|
|
178
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2019 Sergej Jaskiewicz
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// `NotificationCenter.default.publisher(for:)` as a Combine publisher, as
|
|
2
|
+
// Apple's Foundation makes it: subscribers receive the matching
|
|
3
|
+
// notifications, as many as they have asked for, until they cancel.
|
|
4
|
+
// (FoundationBridge declares the publisher, which SwiftUI's `onReceive` takes
|
|
5
|
+
// without Combine.)
|
|
6
|
+
|
|
7
|
+
import Foundation
|
|
8
|
+
import FoundationBridge
|
|
9
|
+
|
|
10
|
+
extension FoundationBridge.NotificationCenter.Publisher: Publisher {
|
|
11
|
+
public typealias Failure = Never
|
|
12
|
+
|
|
13
|
+
public func receive<S: Subscriber>(subscriber: S) where S.Input == Notification, S.Failure == Never {
|
|
14
|
+
subscriber.receive(subscription: NotificationSubscription(subscriber: subscriber, publisher: self))
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
private final class NotificationSubscription<Downstream: Subscriber>: Subscription, @unchecked Sendable
|
|
19
|
+
where Downstream.Input == Notification, Downstream.Failure == Never {
|
|
20
|
+
private var downstream: Downstream?
|
|
21
|
+
private var demand = Subscribers.Demand.none
|
|
22
|
+
private let center: FoundationBridge.NotificationCenter
|
|
23
|
+
private var token: (any NSObjectProtocol)?
|
|
24
|
+
|
|
25
|
+
init(subscriber: Downstream, publisher: FoundationBridge.NotificationCenter.Publisher) {
|
|
26
|
+
downstream = subscriber
|
|
27
|
+
center = publisher.center
|
|
28
|
+
token = publisher.center.addObserver(forName: publisher.name, object: publisher.object, queue: nil) { [weak self] note in
|
|
29
|
+
self?.deliver(note)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
func request(_ demand: Subscribers.Demand) {
|
|
34
|
+
self.demand += demand
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private func deliver(_ note: Notification) {
|
|
38
|
+
guard let downstream, demand > 0 else { return }
|
|
39
|
+
demand -= 1
|
|
40
|
+
demand += downstream.receive(note)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
func cancel() {
|
|
44
|
+
if let token { center.removeObserver(token) }
|
|
45
|
+
token = nil
|
|
46
|
+
downstream = nil
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// `objectWillChange` as a Combine publisher. The SwiftUI shim's
|
|
2
|
+
// `ObservableObjectPublisher` tells the views that observe its object; this
|
|
3
|
+
// makes it a `Publisher` of `Void` too, so `object.objectWillChange.sink { }`
|
|
4
|
+
// (ButtonKit forwards one model's changes to another this way) and the
|
|
5
|
+
// operators work. A subscriber hears every `send()` while it has demand,
|
|
6
|
+
// until it cancels.
|
|
7
|
+
|
|
8
|
+
import SwiftUI
|
|
9
|
+
|
|
10
|
+
extension ObservableObjectPublisher: Publisher {
|
|
11
|
+
public typealias Output = Void
|
|
12
|
+
public typealias Failure = Never
|
|
13
|
+
|
|
14
|
+
public func receive<S: Subscriber>(subscriber: S) where S.Input == Void, S.Failure == Never {
|
|
15
|
+
subscriber.receive(subscription: ObjectWillChangeSubscription(publisher: self, subscriber: subscriber))
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
private final class ObjectWillChangeSubscription<S: Subscriber>: Subscription where S.Input == Void, S.Failure == Never {
|
|
20
|
+
private weak var publisher: ObservableObjectPublisher?
|
|
21
|
+
private var subscriber: S?
|
|
22
|
+
private var token: AnyObject?
|
|
23
|
+
private var demand = Subscribers.Demand.none
|
|
24
|
+
|
|
25
|
+
init(publisher: ObservableObjectPublisher, subscriber: S) {
|
|
26
|
+
self.publisher = publisher
|
|
27
|
+
self.subscriber = subscriber
|
|
28
|
+
token = publisher._subscribe { [weak self] in self?.receive() }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private func receive() {
|
|
32
|
+
guard demand > 0, let subscriber else { return }
|
|
33
|
+
demand -= 1
|
|
34
|
+
demand += subscriber.receive(())
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
func request(_ demand: Subscribers.Demand) {
|
|
38
|
+
self.demand += demand
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
func cancel() {
|
|
42
|
+
if let token { publisher?._unsubscribe(token) }
|
|
43
|
+
token = nil
|
|
44
|
+
subscriber = nil
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
//
|
|
2
|
+
// PassthroughSubject.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 11.06.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
/// A subject that broadcasts elements to downstream subscribers.
|
|
9
|
+
///
|
|
10
|
+
/// As a concrete implementation of `Subject`, the `PassthroughSubject` provides
|
|
11
|
+
/// a convenient way to adapt existing imperative code to the Combine model.
|
|
12
|
+
///
|
|
13
|
+
/// Unlike `CurrentValueSubject`, a `PassthroughSubject` doesn’t have an initial value or
|
|
14
|
+
/// a buffer of the most recently-published element.
|
|
15
|
+
/// A `PassthroughSubject` drops values if there are no subscribers, or its current demand
|
|
16
|
+
/// is zero.
|
|
17
|
+
public final class PassthroughSubject<Output, Failure: Error>: Subject {
|
|
18
|
+
|
|
19
|
+
private let lock = UnfairLock.allocate()
|
|
20
|
+
|
|
21
|
+
private var active = true
|
|
22
|
+
|
|
23
|
+
private var completion: Subscribers.Completion<Failure>?
|
|
24
|
+
|
|
25
|
+
private var downstreams = ConduitList<Output, Failure>.empty
|
|
26
|
+
|
|
27
|
+
internal var upstreamSubscriptions: [Subscription] = []
|
|
28
|
+
|
|
29
|
+
internal var hasAnyDownstreamDemand = false
|
|
30
|
+
|
|
31
|
+
public init() {}
|
|
32
|
+
|
|
33
|
+
deinit {
|
|
34
|
+
for subscription in upstreamSubscriptions {
|
|
35
|
+
subscription.cancel()
|
|
36
|
+
}
|
|
37
|
+
lock.deallocate()
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public func send(subscription: Subscription) {
|
|
41
|
+
lock.lock()
|
|
42
|
+
upstreamSubscriptions.append(subscription)
|
|
43
|
+
let hasAnyDownstreamDemand = self.hasAnyDownstreamDemand
|
|
44
|
+
lock.unlock()
|
|
45
|
+
if hasAnyDownstreamDemand {
|
|
46
|
+
subscription.request(.unlimited)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
51
|
+
where Output == Downstream.Input, Failure == Downstream.Failure
|
|
52
|
+
{
|
|
53
|
+
lock.lock()
|
|
54
|
+
if active {
|
|
55
|
+
let conduit = Conduit(parent: self, downstream: subscriber)
|
|
56
|
+
downstreams.insert(conduit)
|
|
57
|
+
lock.unlock()
|
|
58
|
+
subscriber.receive(subscription: conduit)
|
|
59
|
+
} else {
|
|
60
|
+
let completion = self.completion!
|
|
61
|
+
lock.unlock()
|
|
62
|
+
subscriber.receive(subscription: Subscriptions.empty)
|
|
63
|
+
subscriber.receive(completion: completion)
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public func send(_ input: Output) {
|
|
68
|
+
lock.lock()
|
|
69
|
+
guard active else {
|
|
70
|
+
lock.unlock()
|
|
71
|
+
return
|
|
72
|
+
}
|
|
73
|
+
let downstreams = self.downstreams
|
|
74
|
+
lock.unlock()
|
|
75
|
+
downstreams.forEach { conduit in
|
|
76
|
+
conduit.offer(input)
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public func send(completion: Subscribers.Completion<Failure>) {
|
|
81
|
+
lock.lock()
|
|
82
|
+
guard active else {
|
|
83
|
+
lock.unlock()
|
|
84
|
+
return
|
|
85
|
+
}
|
|
86
|
+
active = false
|
|
87
|
+
self.completion = completion
|
|
88
|
+
let downstreams = self.downstreams.take()
|
|
89
|
+
lock.unlock()
|
|
90
|
+
downstreams.forEach { conduit in
|
|
91
|
+
conduit.finish(completion: completion)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private func acknowledgeDownstreamDemand() {
|
|
96
|
+
lock.lock()
|
|
97
|
+
if hasAnyDownstreamDemand {
|
|
98
|
+
lock.unlock()
|
|
99
|
+
return
|
|
100
|
+
}
|
|
101
|
+
hasAnyDownstreamDemand = true
|
|
102
|
+
let upstreamSubscriptions = self.upstreamSubscriptions
|
|
103
|
+
lock.unlock()
|
|
104
|
+
for subscription in upstreamSubscriptions {
|
|
105
|
+
subscription.request(.unlimited)
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
private func disassociate(_ conduit: ConduitBase<Output, Failure>) {
|
|
110
|
+
lock.lock()
|
|
111
|
+
guard active else {
|
|
112
|
+
lock.unlock()
|
|
113
|
+
return
|
|
114
|
+
}
|
|
115
|
+
downstreams.remove(conduit)
|
|
116
|
+
lock.unlock()
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
extension PassthroughSubject {
|
|
121
|
+
|
|
122
|
+
private final class Conduit<Downstream: Subscriber>
|
|
123
|
+
: ConduitBase<Output, Failure>,
|
|
124
|
+
CustomStringConvertible,
|
|
125
|
+
CustomReflectable,
|
|
126
|
+
CustomPlaygroundDisplayConvertible
|
|
127
|
+
where Downstream.Input == Output, Downstream.Failure == Failure
|
|
128
|
+
{
|
|
129
|
+
|
|
130
|
+
fileprivate var parent: PassthroughSubject?
|
|
131
|
+
|
|
132
|
+
fileprivate var downstream: Downstream?
|
|
133
|
+
|
|
134
|
+
fileprivate var demand = Subscribers.Demand.none
|
|
135
|
+
|
|
136
|
+
private var lock = UnfairLock.allocate()
|
|
137
|
+
|
|
138
|
+
private var downstreamLock = UnfairRecursiveLock.allocate()
|
|
139
|
+
|
|
140
|
+
fileprivate init(parent: PassthroughSubject,
|
|
141
|
+
downstream: Downstream) {
|
|
142
|
+
self.parent = parent
|
|
143
|
+
self.downstream = downstream
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
deinit {
|
|
147
|
+
lock.deallocate()
|
|
148
|
+
downstreamLock.deallocate()
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
override func offer(_ output: Output) {
|
|
152
|
+
lock.lock()
|
|
153
|
+
guard demand > 0, let downstream = self.downstream else {
|
|
154
|
+
lock.unlock()
|
|
155
|
+
return
|
|
156
|
+
}
|
|
157
|
+
demand -= 1
|
|
158
|
+
lock.unlock()
|
|
159
|
+
downstreamLock.lock()
|
|
160
|
+
let newDemand = downstream.receive(output)
|
|
161
|
+
downstreamLock.unlock()
|
|
162
|
+
guard newDemand > 0 else { return }
|
|
163
|
+
lock.lock()
|
|
164
|
+
demand += newDemand
|
|
165
|
+
lock.unlock()
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
override func finish(completion: Subscribers.Completion<Failure>) {
|
|
169
|
+
lock.lock()
|
|
170
|
+
guard let downstream = self.downstream.take() else {
|
|
171
|
+
lock.unlock()
|
|
172
|
+
return
|
|
173
|
+
}
|
|
174
|
+
let parent = self.parent.take()
|
|
175
|
+
lock.unlock()
|
|
176
|
+
parent?.disassociate(self)
|
|
177
|
+
downstreamLock.lock()
|
|
178
|
+
downstream.receive(completion: completion)
|
|
179
|
+
downstreamLock.unlock()
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
override func request(_ demand: Subscribers.Demand) {
|
|
183
|
+
demand.assertNonZero()
|
|
184
|
+
lock.lock()
|
|
185
|
+
if self.downstream == nil {
|
|
186
|
+
lock.unlock()
|
|
187
|
+
return
|
|
188
|
+
}
|
|
189
|
+
self.demand += demand
|
|
190
|
+
let parent = self.parent
|
|
191
|
+
lock.unlock()
|
|
192
|
+
parent?.acknowledgeDownstreamDemand()
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
override func cancel() {
|
|
196
|
+
lock.lock()
|
|
197
|
+
if downstream.take() == nil {
|
|
198
|
+
lock.unlock()
|
|
199
|
+
return
|
|
200
|
+
}
|
|
201
|
+
let parent = self.parent.take()
|
|
202
|
+
lock.unlock()
|
|
203
|
+
parent?.disassociate(self)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
var description: String { return "PassthroughSubject" }
|
|
207
|
+
|
|
208
|
+
var customMirror: Mirror {
|
|
209
|
+
lock.lock()
|
|
210
|
+
defer { lock.unlock() }
|
|
211
|
+
let children: [Mirror.Child] = [
|
|
212
|
+
("parent", parent as Any),
|
|
213
|
+
("downstream", downstream as Any),
|
|
214
|
+
("demand", demand),
|
|
215
|
+
("subject", parent as Any)
|
|
216
|
+
]
|
|
217
|
+
return Mirror(self, children: children)
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
var playgroundDescription: Any { return description }
|
|
221
|
+
}
|
|
222
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Publisher+Subscribe.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 23.04.2023.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
extension Publisher {
|
|
9
|
+
|
|
10
|
+
/// Attaches the specified subscriber to this publisher.
|
|
11
|
+
///
|
|
12
|
+
/// Always call this function instead of `receive(subscriber:)`.
|
|
13
|
+
/// Adopters of `Publisher` must implement `receive(subscriber:)`.
|
|
14
|
+
/// The implementation of `subscribe(_:)` in this extension calls through to
|
|
15
|
+
/// `receive(subscriber:)`.
|
|
16
|
+
/// - SeeAlso: `receive(subscriber:)`
|
|
17
|
+
/// - Parameters:
|
|
18
|
+
/// - subscriber: The subscriber to attach to this `Publisher`. After attaching,
|
|
19
|
+
/// the subscriber can start to receive values.
|
|
20
|
+
public func subscribe<Subscriber: Combine.Subscriber>(_ subscriber: Subscriber)
|
|
21
|
+
where Failure == Subscriber.Failure, Output == Subscriber.Input
|
|
22
|
+
{
|
|
23
|
+
if let hook = DebugHook.getGlobalHook() {
|
|
24
|
+
if var marker = subscriber as? SubscriberTapMarker {
|
|
25
|
+
let anySubscriber = marker.inner
|
|
26
|
+
as! AnySubscriber<Subscriber.Input, Subscriber.Failure>
|
|
27
|
+
hook.willReceive(publisher: self, subscriber: anySubscriber)
|
|
28
|
+
receive(subscriber: subscriber)
|
|
29
|
+
hook.didReceive(publisher: self, subscriber: anySubscriber)
|
|
30
|
+
} else {
|
|
31
|
+
let tap = SubscriberTap(subscriber: subscriber)
|
|
32
|
+
hook.willReceive(publisher: self, subscriber: subscriber)
|
|
33
|
+
receive(subscriber: tap)
|
|
34
|
+
hook.didReceive(publisher: self, subscriber: subscriber)
|
|
35
|
+
}
|
|
36
|
+
} else {
|
|
37
|
+
receive(subscriber: subscriber)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/// Attaches the specified subject to this publisher.
|
|
42
|
+
///
|
|
43
|
+
/// - Parameter subject: The subject to attach to this publisher.
|
|
44
|
+
public func subscribe<Subject: Combine.Subject>(
|
|
45
|
+
_ subject: Subject
|
|
46
|
+
) -> AnyCancellable
|
|
47
|
+
where Failure == Subject.Failure, Output == Subject.Output
|
|
48
|
+
{
|
|
49
|
+
let subscriber = SubjectSubscriber(subject)
|
|
50
|
+
self.subscribe(subscriber)
|
|
51
|
+
return AnyCancellable(subscriber)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Deferred.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Joseph Spadafora on 7/7/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
/// A publisher that awaits subscription before running the supplied closure
|
|
9
|
+
/// to create a publisher for the new subscriber.
|
|
10
|
+
public struct Deferred<DeferredPublisher: Publisher>: Publisher {
|
|
11
|
+
|
|
12
|
+
/// The kind of values published by this publisher.
|
|
13
|
+
public typealias Output = DeferredPublisher.Output
|
|
14
|
+
|
|
15
|
+
/// The kind of errors this publisher might publish.
|
|
16
|
+
///
|
|
17
|
+
/// Use `Never` if this `Publisher` does not publish errors.
|
|
18
|
+
public typealias Failure = DeferredPublisher.Failure
|
|
19
|
+
|
|
20
|
+
/// The closure to execute when this deferred publisher receives a subscription.
|
|
21
|
+
///
|
|
22
|
+
/// The publisher returned by this closure immediately
|
|
23
|
+
/// receives the incoming subscription.
|
|
24
|
+
public let createPublisher: () -> DeferredPublisher
|
|
25
|
+
|
|
26
|
+
/// Creates a deferred publisher.
|
|
27
|
+
///
|
|
28
|
+
/// - Parameter createPublisher: The closure to execute
|
|
29
|
+
/// when calling `subscribe(_:)`.
|
|
30
|
+
public init(createPublisher: @escaping () -> DeferredPublisher) {
|
|
31
|
+
self.createPublisher = createPublisher
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/// This function is called to attach the specified `Subscriber`
|
|
35
|
+
/// to this `Publisher` by `subscribe(_:)`
|
|
36
|
+
///
|
|
37
|
+
/// - SeeAlso: `subscribe(_:)`
|
|
38
|
+
/// - Parameters:
|
|
39
|
+
/// - subscriber: The subscriber to attach to this `Publisher`.
|
|
40
|
+
/// once attached it can begin to receive values.
|
|
41
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
42
|
+
where Failure == Downstream.Failure,
|
|
43
|
+
Output == Downstream.Input
|
|
44
|
+
{
|
|
45
|
+
let deferredPublisher = createPublisher()
|
|
46
|
+
deferredPublisher.subscribe(subscriber)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Empty.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 16.06.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
/// A publisher that never publishes any values, and optionally finishes immediately.
|
|
9
|
+
///
|
|
10
|
+
/// You can create a ”Never” publisher — one which never sends values and never
|
|
11
|
+
/// finishes or fails — with the initializer `Empty(completeImmediately: false)`.
|
|
12
|
+
public struct Empty<Output, Failure: Error>: Publisher, Equatable {
|
|
13
|
+
|
|
14
|
+
/// Creates an empty publisher.
|
|
15
|
+
///
|
|
16
|
+
/// - Parameter completeImmediately: A Boolean value that indicates whether
|
|
17
|
+
/// the publisher should immediately finish.
|
|
18
|
+
public init(completeImmediately: Bool = true) {
|
|
19
|
+
self.completeImmediately = completeImmediately
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/// Creates an empty publisher with the given completion behavior and output and
|
|
23
|
+
/// failure types.
|
|
24
|
+
///
|
|
25
|
+
/// Use this initializer to connect the empty publisher to subscribers or other
|
|
26
|
+
/// publishers that have specific output and failure types.
|
|
27
|
+
///
|
|
28
|
+
/// - Parameters:
|
|
29
|
+
/// - completeImmediately: A Boolean value that indicates whether the publisher
|
|
30
|
+
/// should immediately finish.
|
|
31
|
+
/// - outputType: The output type exposed by this publisher.
|
|
32
|
+
/// - failureType: The failure type exposed by this publisher.
|
|
33
|
+
public init(completeImmediately: Bool = true,
|
|
34
|
+
outputType: Output.Type,
|
|
35
|
+
failureType: Failure.Type) {
|
|
36
|
+
self.init(completeImmediately: completeImmediately)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/// A Boolean value that indicates whether the publisher immediately sends
|
|
40
|
+
/// a completion.
|
|
41
|
+
///
|
|
42
|
+
/// If `true`, the publisher finishes immediately after sending a subscription
|
|
43
|
+
/// to the subscriber. If `false`, it never completes.
|
|
44
|
+
public let completeImmediately: Bool
|
|
45
|
+
|
|
46
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
47
|
+
where Output == Downstream.Input, Failure == Downstream.Failure
|
|
48
|
+
{
|
|
49
|
+
subscriber.receive(subscription: Subscriptions.empty)
|
|
50
|
+
if completeImmediately {
|
|
51
|
+
subscriber.receive(completion: .finished)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|