@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,397 @@
|
|
|
1
|
+
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
// ┃ ┃
|
|
3
|
+
// ┃ Auto-generated from GYB template. DO NOT EDIT! ┃
|
|
4
|
+
// ┃ ┃
|
|
5
|
+
// ┃ ┃
|
|
6
|
+
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
7
|
+
//
|
|
8
|
+
// Publisher+Concurrency.swift
|
|
9
|
+
//
|
|
10
|
+
//
|
|
11
|
+
// Created by Sergej Jaskiewicz on 28.08.2021.
|
|
12
|
+
//
|
|
13
|
+
|
|
14
|
+
#if canImport(_Concurrency) && compiler(>=5.5)
|
|
15
|
+
import _Concurrency
|
|
16
|
+
#endif
|
|
17
|
+
|
|
18
|
+
#if canImport(_Concurrency) && compiler(>=5.5) || compiler(>=5.5.1)
|
|
19
|
+
extension Publisher where Failure == Never {
|
|
20
|
+
|
|
21
|
+
/// The elements produced by the publisher, as an asynchronous sequence.
|
|
22
|
+
///
|
|
23
|
+
/// This property provides an `AsyncPublisher`, which allows you to use
|
|
24
|
+
/// the Swift `async`-`await` syntax to receive the publisher's elements.
|
|
25
|
+
/// Because `AsyncPublisher` conforms to `AsyncSequence`, you iterate over its
|
|
26
|
+
/// elements with a `for`-`await`-`in` loop, rather than attaching a subscriber.
|
|
27
|
+
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
|
|
28
|
+
public var values: AsyncPublisher<Self> {
|
|
29
|
+
return .init(self)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/// A publisher that exposes its elements as an asynchronous sequence.
|
|
34
|
+
///
|
|
35
|
+
/// `AsyncPublisher` conforms to `AsyncSequence`, which allows callers to receive
|
|
36
|
+
/// values with the `for`-`await`-`in` syntax, rather than attaching a `Subscriber`.
|
|
37
|
+
///
|
|
38
|
+
/// Use the `values` property of the `Publisher` protocol to wrap an existing publisher
|
|
39
|
+
/// with an instance of this type.
|
|
40
|
+
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
|
|
41
|
+
public struct AsyncPublisher<Upstream: Publisher>: AsyncSequence
|
|
42
|
+
where Upstream.Failure == Never
|
|
43
|
+
{
|
|
44
|
+
|
|
45
|
+
public typealias Element = Upstream.Output
|
|
46
|
+
|
|
47
|
+
/// The iterator that produces elements of the asynchronous publisher sequence.
|
|
48
|
+
public struct Iterator: AsyncIteratorProtocol {
|
|
49
|
+
|
|
50
|
+
public typealias Element = Upstream.Output
|
|
51
|
+
|
|
52
|
+
fileprivate let inner: Inner
|
|
53
|
+
|
|
54
|
+
/// Produces the next element in the prefix sequence.
|
|
55
|
+
///
|
|
56
|
+
/// - Returns: The next published element, or `nil` if the publisher finishes
|
|
57
|
+
/// normally.
|
|
58
|
+
public mutating func next() async -> Element? {
|
|
59
|
+
return await withTaskCancellationHandler(
|
|
60
|
+
operation: { [inner] in await inner.next() },
|
|
61
|
+
onCancel: { [inner] in inner.cancel() }
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/// The type of asynchronous iterator that produces elements of this
|
|
67
|
+
/// asynchronous sequence.
|
|
68
|
+
public typealias AsyncIterator = Iterator
|
|
69
|
+
|
|
70
|
+
private let publisher: Upstream
|
|
71
|
+
|
|
72
|
+
/// Creates a publisher that exposes elements received from an upstream publisher as
|
|
73
|
+
/// a throwing asynchronous sequence.
|
|
74
|
+
///
|
|
75
|
+
/// - Parameter publisher: An upstream publisher. The asynchronous publisher converts
|
|
76
|
+
/// elements received from this publisher into an asynchronous sequence.
|
|
77
|
+
public init(_ publisher: Upstream) {
|
|
78
|
+
self.publisher = publisher
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/// Creates the asynchronous iterator that produces elements of this asynchronous
|
|
82
|
+
/// sequence.
|
|
83
|
+
///
|
|
84
|
+
/// - Returns: An instance of the `AsyncIterator` type used to produce elements of
|
|
85
|
+
/// the asynchronous sequence.
|
|
86
|
+
public func makeAsyncIterator() -> Iterator {
|
|
87
|
+
let inner = Iterator.Inner()
|
|
88
|
+
publisher.subscribe(inner)
|
|
89
|
+
return Iterator(inner: inner)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
|
|
94
|
+
extension AsyncPublisher.Iterator {
|
|
95
|
+
|
|
96
|
+
fileprivate final class Inner: Subscriber, Cancellable {
|
|
97
|
+
typealias Input = Upstream.Output
|
|
98
|
+
typealias Failure = Upstream.Failure
|
|
99
|
+
|
|
100
|
+
private enum State {
|
|
101
|
+
case awaitingSubscription
|
|
102
|
+
case subscribed(Subscription)
|
|
103
|
+
case terminal
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
private let lock = UnfairLock.allocate()
|
|
107
|
+
private var pending: [UnsafeContinuation<Input?, Never>] = []
|
|
108
|
+
private var state = State.awaitingSubscription
|
|
109
|
+
private var pendingDemand = Subscribers.Demand.none
|
|
110
|
+
|
|
111
|
+
deinit {
|
|
112
|
+
lock.deallocate()
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
func receive(subscription: Subscription) {
|
|
116
|
+
lock.lock()
|
|
117
|
+
guard case .awaitingSubscription = state else {
|
|
118
|
+
lock.unlock()
|
|
119
|
+
subscription.cancel()
|
|
120
|
+
return
|
|
121
|
+
}
|
|
122
|
+
state = .subscribed(subscription)
|
|
123
|
+
let pendingDemand = self.pendingDemand
|
|
124
|
+
self.pendingDemand = .none
|
|
125
|
+
lock.unlock()
|
|
126
|
+
if pendingDemand != .none {
|
|
127
|
+
subscription.request(pendingDemand)
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
132
|
+
lock.lock()
|
|
133
|
+
guard case .subscribed = state else {
|
|
134
|
+
let pending = self.pending.take()
|
|
135
|
+
lock.unlock()
|
|
136
|
+
pending.resumeAllWithNil()
|
|
137
|
+
return .none
|
|
138
|
+
}
|
|
139
|
+
precondition(!pending.isEmpty, "Received an output without requesting demand")
|
|
140
|
+
let continuation = pending.removeFirst()
|
|
141
|
+
lock.unlock()
|
|
142
|
+
continuation.resume(returning: input)
|
|
143
|
+
return .none
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
func receive(completion: Subscribers.Completion<Failure>) {
|
|
147
|
+
lock.lock()
|
|
148
|
+
state = .terminal
|
|
149
|
+
let pending = self.pending.take()
|
|
150
|
+
lock.unlock()
|
|
151
|
+
pending.resumeAllWithNil()
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
func cancel() {
|
|
155
|
+
lock.lock()
|
|
156
|
+
let pending = self.pending.take()
|
|
157
|
+
guard case .subscribed(let subscription) = state else {
|
|
158
|
+
state = .terminal
|
|
159
|
+
lock.unlock()
|
|
160
|
+
pending.resumeAllWithNil()
|
|
161
|
+
return
|
|
162
|
+
}
|
|
163
|
+
state = .terminal
|
|
164
|
+
lock.unlock()
|
|
165
|
+
subscription.cancel()
|
|
166
|
+
pending.resumeAllWithNil()
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
fileprivate func next() async -> Input? {
|
|
170
|
+
return await withUnsafeContinuation { continuation in
|
|
171
|
+
lock.lock()
|
|
172
|
+
switch state {
|
|
173
|
+
case .awaitingSubscription:
|
|
174
|
+
pending.append(continuation)
|
|
175
|
+
pendingDemand += 1
|
|
176
|
+
lock.unlock()
|
|
177
|
+
case .subscribed(let subscription):
|
|
178
|
+
pending.append(continuation)
|
|
179
|
+
lock.unlock()
|
|
180
|
+
subscription.request(.max(1))
|
|
181
|
+
case .terminal:
|
|
182
|
+
lock.unlock()
|
|
183
|
+
continuation.resume(returning: nil)
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
extension Publisher {
|
|
190
|
+
|
|
191
|
+
/// The elements produced by the publisher, as a throwing asynchronous sequence.
|
|
192
|
+
///
|
|
193
|
+
/// This property provides an `AsyncThrowingPublisher`, which allows you to use
|
|
194
|
+
/// the Swift `async`-`await` syntax to receive the publisher's elements.
|
|
195
|
+
/// Because `AsyncPublisher` conforms to `AsyncSequence`, you iterate over its
|
|
196
|
+
/// elements with a `for`-`await`-`in` loop, rather than attaching a subscriber.
|
|
197
|
+
/// If the publisher terminates with an error, the awaiting caller receives the error
|
|
198
|
+
/// as a `throw`.
|
|
199
|
+
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
|
|
200
|
+
public var values: AsyncThrowingPublisher<Self> {
|
|
201
|
+
return .init(self)
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/// A publisher that exposes its elements as a throwing asynchronous sequence.
|
|
206
|
+
///
|
|
207
|
+
/// `AsyncThrowingPublisher` conforms to `AsyncSequence`, which allows callers to receive
|
|
208
|
+
/// values with the `for`-`await`-`in` syntax, rather than attaching a `Subscriber`.
|
|
209
|
+
/// If the upstream publisher terminates with an error, `AsyncThrowingPublisher` throws
|
|
210
|
+
/// the error to the awaiting caller.
|
|
211
|
+
///
|
|
212
|
+
/// Use the `values` property of the `Publisher` protocol to wrap an existing publisher
|
|
213
|
+
/// with an instance of this type.
|
|
214
|
+
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
|
|
215
|
+
public struct AsyncThrowingPublisher<Upstream: Publisher>: AsyncSequence
|
|
216
|
+
{
|
|
217
|
+
|
|
218
|
+
public typealias Element = Upstream.Output
|
|
219
|
+
|
|
220
|
+
/// The iterator that produces elements of the asynchronous publisher sequence.
|
|
221
|
+
public struct Iterator: AsyncIteratorProtocol {
|
|
222
|
+
|
|
223
|
+
public typealias Element = Upstream.Output
|
|
224
|
+
|
|
225
|
+
fileprivate let inner: Inner
|
|
226
|
+
|
|
227
|
+
/// Produces the next element in the prefix sequence.
|
|
228
|
+
///
|
|
229
|
+
/// - Returns: The next published element, or `nil` if the publisher finishes
|
|
230
|
+
/// normally.
|
|
231
|
+
/// If the publisher terminates with an error, the call point receives
|
|
232
|
+
/// the error as a `throw`.
|
|
233
|
+
public mutating func next() async throws -> Element? {
|
|
234
|
+
return try await withTaskCancellationHandler(
|
|
235
|
+
operation: { [inner] in try await inner.next() },
|
|
236
|
+
onCancel: { [inner] in inner.cancel() }
|
|
237
|
+
)
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/// The type of asynchronous iterator that produces elements of this
|
|
242
|
+
/// asynchronous sequence.
|
|
243
|
+
public typealias AsyncIterator = Iterator
|
|
244
|
+
|
|
245
|
+
private let publisher: Upstream
|
|
246
|
+
|
|
247
|
+
/// Creates a publisher that exposes elements received from an upstream publisher as
|
|
248
|
+
/// an asynchronous sequence.
|
|
249
|
+
///
|
|
250
|
+
/// - Parameter publisher: An upstream publisher. The asynchronous publisher converts
|
|
251
|
+
/// elements received from this publisher into an asynchronous sequence.
|
|
252
|
+
public init(_ publisher: Upstream) {
|
|
253
|
+
self.publisher = publisher
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/// Creates the asynchronous iterator that produces elements of this asynchronous
|
|
257
|
+
/// sequence.
|
|
258
|
+
///
|
|
259
|
+
/// - Returns: An instance of the `AsyncIterator` type used to produce elements of
|
|
260
|
+
/// the asynchronous sequence.
|
|
261
|
+
public func makeAsyncIterator() -> Iterator {
|
|
262
|
+
let inner = Iterator.Inner()
|
|
263
|
+
publisher.subscribe(inner)
|
|
264
|
+
return Iterator(inner: inner)
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
|
|
269
|
+
extension AsyncThrowingPublisher.Iterator {
|
|
270
|
+
|
|
271
|
+
fileprivate final class Inner: Subscriber, Cancellable {
|
|
272
|
+
typealias Input = Upstream.Output
|
|
273
|
+
typealias Failure = Upstream.Failure
|
|
274
|
+
|
|
275
|
+
private enum State {
|
|
276
|
+
case awaitingSubscription
|
|
277
|
+
case subscribed(Subscription)
|
|
278
|
+
case terminal(Error?)
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
private let lock = UnfairLock.allocate()
|
|
282
|
+
private var pending: [UnsafeContinuation<Input?, Error>] = []
|
|
283
|
+
private var state = State.awaitingSubscription
|
|
284
|
+
private var pendingDemand = Subscribers.Demand.none
|
|
285
|
+
|
|
286
|
+
deinit {
|
|
287
|
+
lock.deallocate()
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
func receive(subscription: Subscription) {
|
|
291
|
+
lock.lock()
|
|
292
|
+
guard case .awaitingSubscription = state else {
|
|
293
|
+
lock.unlock()
|
|
294
|
+
subscription.cancel()
|
|
295
|
+
return
|
|
296
|
+
}
|
|
297
|
+
state = .subscribed(subscription)
|
|
298
|
+
let pendingDemand = self.pendingDemand
|
|
299
|
+
self.pendingDemand = .none
|
|
300
|
+
lock.unlock()
|
|
301
|
+
if pendingDemand != .none {
|
|
302
|
+
subscription.request(pendingDemand)
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
func receive(_ input: Input) -> Subscribers.Demand {
|
|
307
|
+
lock.lock()
|
|
308
|
+
guard case .subscribed = state else {
|
|
309
|
+
let pending = self.pending.take()
|
|
310
|
+
lock.unlock()
|
|
311
|
+
pending.resumeAllWithNil()
|
|
312
|
+
return .none
|
|
313
|
+
}
|
|
314
|
+
precondition(!pending.isEmpty, "Received an output without requesting demand")
|
|
315
|
+
let continuation = pending.removeFirst()
|
|
316
|
+
lock.unlock()
|
|
317
|
+
continuation.resume(returning: input)
|
|
318
|
+
return .none
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
func receive(completion: Subscribers.Completion<Failure>) {
|
|
322
|
+
lock.lock()
|
|
323
|
+
switch state {
|
|
324
|
+
case .awaitingSubscription, .subscribed:
|
|
325
|
+
if let continuation = pending.first {
|
|
326
|
+
state = .terminal(nil)
|
|
327
|
+
let remaining = pending.take().dropFirst()
|
|
328
|
+
lock.unlock()
|
|
329
|
+
switch completion {
|
|
330
|
+
case .finished:
|
|
331
|
+
continuation.resume(returning: nil)
|
|
332
|
+
case .failure(let error):
|
|
333
|
+
continuation.resume(throwing: error)
|
|
334
|
+
}
|
|
335
|
+
remaining.resumeAllWithNil()
|
|
336
|
+
} else {
|
|
337
|
+
state = .terminal(completion.failure)
|
|
338
|
+
lock.unlock()
|
|
339
|
+
}
|
|
340
|
+
case .terminal:
|
|
341
|
+
let pending = self.pending.take()
|
|
342
|
+
lock.unlock()
|
|
343
|
+
pending.resumeAllWithNil()
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
func cancel() {
|
|
348
|
+
lock.lock()
|
|
349
|
+
let pending = self.pending.take()
|
|
350
|
+
guard case .subscribed(let subscription) = state else {
|
|
351
|
+
state = .terminal(nil)
|
|
352
|
+
lock.unlock()
|
|
353
|
+
pending.resumeAllWithNil()
|
|
354
|
+
return
|
|
355
|
+
}
|
|
356
|
+
state = .terminal(nil)
|
|
357
|
+
lock.unlock()
|
|
358
|
+
subscription.cancel()
|
|
359
|
+
pending.resumeAllWithNil()
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
fileprivate func next() async throws -> Input? {
|
|
363
|
+
return try await withUnsafeThrowingContinuation { continuation in
|
|
364
|
+
lock.lock()
|
|
365
|
+
switch state {
|
|
366
|
+
case .awaitingSubscription:
|
|
367
|
+
pending.append(continuation)
|
|
368
|
+
pendingDemand += 1
|
|
369
|
+
lock.unlock()
|
|
370
|
+
case .subscribed(let subscription):
|
|
371
|
+
pending.append(continuation)
|
|
372
|
+
lock.unlock()
|
|
373
|
+
subscription.request(.max(1))
|
|
374
|
+
case .terminal(nil):
|
|
375
|
+
lock.unlock()
|
|
376
|
+
continuation.resume(returning: nil)
|
|
377
|
+
case .terminal(let error?):
|
|
378
|
+
state = .terminal(nil)
|
|
379
|
+
lock.unlock()
|
|
380
|
+
continuation.resume(throwing: error)
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
|
|
388
|
+
extension Sequence {
|
|
389
|
+
fileprivate func resumeAllWithNil<Output, Failure: Error>()
|
|
390
|
+
where Element == UnsafeContinuation<Output?, Failure>
|
|
391
|
+
{
|
|
392
|
+
for continuation in self {
|
|
393
|
+
continuation.resume(returning: nil)
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
#endif
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
//
|
|
2
|
+
// CurrentValueSubject.swift
|
|
3
|
+
//
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 11.06.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
/// A subject that wraps a single value and publishes a new element whenever the value
|
|
9
|
+
/// changes.
|
|
10
|
+
///
|
|
11
|
+
/// Unlike `PassthroughSubject`, `CurrentValueSubject` maintains a buffer of the most
|
|
12
|
+
/// recently published element.
|
|
13
|
+
///
|
|
14
|
+
/// Calling `send(_:)` on a `CurrentValueSubject` also updates the current value, making
|
|
15
|
+
/// it equivalent to updating the `value` directly.
|
|
16
|
+
public final class CurrentValueSubject<Output, Failure: Error>: Subject {
|
|
17
|
+
|
|
18
|
+
private let lock = UnfairLock.allocate()
|
|
19
|
+
|
|
20
|
+
private var active = true
|
|
21
|
+
|
|
22
|
+
private var completion: Subscribers.Completion<Failure>?
|
|
23
|
+
|
|
24
|
+
private var downstreams = ConduitList<Output, Failure>.empty
|
|
25
|
+
|
|
26
|
+
private var currentValue: Output
|
|
27
|
+
|
|
28
|
+
private var upstreamSubscriptions: [Subscription] = []
|
|
29
|
+
|
|
30
|
+
/// The value wrapped by this subject, published as a new element whenever it changes.
|
|
31
|
+
public var value: Output {
|
|
32
|
+
get {
|
|
33
|
+
lock.lock()
|
|
34
|
+
defer { lock.unlock() }
|
|
35
|
+
return currentValue
|
|
36
|
+
}
|
|
37
|
+
set {
|
|
38
|
+
lock.lock()
|
|
39
|
+
currentValue = newValue
|
|
40
|
+
sendValueAndConsumeLock(newValue)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/// Creates a current value subject with the given initial value.
|
|
45
|
+
///
|
|
46
|
+
/// - Parameter value: The initial value to publish.
|
|
47
|
+
public init(_ value: Output) {
|
|
48
|
+
self.currentValue = value
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
deinit {
|
|
52
|
+
for subscription in upstreamSubscriptions {
|
|
53
|
+
subscription.cancel()
|
|
54
|
+
}
|
|
55
|
+
lock.deallocate()
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public func send(subscription: Subscription) {
|
|
59
|
+
lock.lock()
|
|
60
|
+
upstreamSubscriptions.append(subscription)
|
|
61
|
+
lock.unlock()
|
|
62
|
+
subscription.request(.unlimited)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public func receive<Downstream: Subscriber>(subscriber: Downstream)
|
|
66
|
+
where Output == Downstream.Input, Failure == Downstream.Failure
|
|
67
|
+
{
|
|
68
|
+
lock.lock()
|
|
69
|
+
if active {
|
|
70
|
+
let conduit = Conduit(parent: self, downstream: subscriber)
|
|
71
|
+
downstreams.insert(conduit)
|
|
72
|
+
lock.unlock()
|
|
73
|
+
subscriber.receive(subscription: conduit)
|
|
74
|
+
} else {
|
|
75
|
+
let completion = self.completion!
|
|
76
|
+
lock.unlock()
|
|
77
|
+
subscriber.receive(subscription: Subscriptions.empty)
|
|
78
|
+
subscriber.receive(completion: completion)
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
public func send(_ input: Output) {
|
|
83
|
+
lock.lock()
|
|
84
|
+
sendValueAndConsumeLock(input)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
private func sendValueAndConsumeLock(_ newValue: Output) {
|
|
88
|
+
#if DEBUG
|
|
89
|
+
lock.assertOwner()
|
|
90
|
+
#endif
|
|
91
|
+
guard active else {
|
|
92
|
+
lock.unlock()
|
|
93
|
+
return
|
|
94
|
+
}
|
|
95
|
+
currentValue = newValue
|
|
96
|
+
let downstreams = self.downstreams
|
|
97
|
+
lock.unlock()
|
|
98
|
+
downstreams.forEach { conduit in
|
|
99
|
+
conduit.offer(newValue)
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
public func send(completion: Subscribers.Completion<Failure>) {
|
|
104
|
+
lock.lock()
|
|
105
|
+
guard active else {
|
|
106
|
+
lock.unlock()
|
|
107
|
+
return
|
|
108
|
+
}
|
|
109
|
+
active = false
|
|
110
|
+
self.completion = completion
|
|
111
|
+
let downstreams = self.downstreams.take()
|
|
112
|
+
lock.unlock()
|
|
113
|
+
downstreams.forEach { conduit in
|
|
114
|
+
conduit.finish(completion: completion)
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
private func disassociate(_ conduit: ConduitBase<Output, Failure>) {
|
|
119
|
+
lock.lock()
|
|
120
|
+
guard active else {
|
|
121
|
+
lock.unlock()
|
|
122
|
+
return
|
|
123
|
+
}
|
|
124
|
+
downstreams.remove(conduit)
|
|
125
|
+
lock.unlock()
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
extension CurrentValueSubject {
|
|
130
|
+
|
|
131
|
+
private final class Conduit<Downstream: Subscriber>
|
|
132
|
+
: ConduitBase<Output, Failure>,
|
|
133
|
+
CustomStringConvertible,
|
|
134
|
+
CustomReflectable,
|
|
135
|
+
CustomPlaygroundDisplayConvertible
|
|
136
|
+
where Downstream.Input == Output, Downstream.Failure == Failure
|
|
137
|
+
{
|
|
138
|
+
|
|
139
|
+
fileprivate var parent: CurrentValueSubject?
|
|
140
|
+
|
|
141
|
+
fileprivate var downstream: Downstream?
|
|
142
|
+
|
|
143
|
+
fileprivate var demand = Subscribers.Demand.none
|
|
144
|
+
|
|
145
|
+
private var lock = UnfairLock.allocate()
|
|
146
|
+
|
|
147
|
+
private var downstreamLock = UnfairRecursiveLock.allocate()
|
|
148
|
+
|
|
149
|
+
private var deliveredCurrentValue = false
|
|
150
|
+
|
|
151
|
+
fileprivate init(parent: CurrentValueSubject,
|
|
152
|
+
downstream: Downstream) {
|
|
153
|
+
self.parent = parent
|
|
154
|
+
self.downstream = downstream
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
deinit {
|
|
158
|
+
lock.deallocate()
|
|
159
|
+
downstreamLock.deallocate()
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
override func offer(_ output: Output) {
|
|
163
|
+
lock.lock()
|
|
164
|
+
guard demand > 0, let downstream = self.downstream else {
|
|
165
|
+
deliveredCurrentValue = false
|
|
166
|
+
lock.unlock()
|
|
167
|
+
return
|
|
168
|
+
}
|
|
169
|
+
demand -= 1
|
|
170
|
+
deliveredCurrentValue = true
|
|
171
|
+
lock.unlock()
|
|
172
|
+
downstreamLock.lock()
|
|
173
|
+
let newDemand = downstream.receive(output)
|
|
174
|
+
downstreamLock.unlock()
|
|
175
|
+
guard newDemand > 0 else { return }
|
|
176
|
+
lock.lock()
|
|
177
|
+
demand += newDemand
|
|
178
|
+
lock.unlock()
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
override func finish(completion: Subscribers.Completion<Failure>) {
|
|
182
|
+
lock.lock()
|
|
183
|
+
guard let downstream = self.downstream.take() else {
|
|
184
|
+
lock.unlock()
|
|
185
|
+
return
|
|
186
|
+
}
|
|
187
|
+
let parent = self.parent.take()
|
|
188
|
+
lock.unlock()
|
|
189
|
+
parent?.disassociate(self)
|
|
190
|
+
downstreamLock.lock()
|
|
191
|
+
downstream.receive(completion: completion)
|
|
192
|
+
downstreamLock.unlock()
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
override func request(_ demand: Subscribers.Demand) {
|
|
196
|
+
demand.assertNonZero()
|
|
197
|
+
lock.lock()
|
|
198
|
+
guard let downstream = self.downstream else {
|
|
199
|
+
lock.unlock()
|
|
200
|
+
return
|
|
201
|
+
}
|
|
202
|
+
if deliveredCurrentValue {
|
|
203
|
+
self.demand += demand
|
|
204
|
+
lock.unlock()
|
|
205
|
+
return
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Hasn't yet delivered the current value
|
|
209
|
+
|
|
210
|
+
self.demand += demand
|
|
211
|
+
deliveredCurrentValue = true
|
|
212
|
+
if let currentValue = self.parent?.value {
|
|
213
|
+
self.demand -= 1
|
|
214
|
+
lock.unlock()
|
|
215
|
+
downstreamLock.lock()
|
|
216
|
+
let newDemand = downstream.receive(currentValue)
|
|
217
|
+
downstreamLock.unlock()
|
|
218
|
+
guard newDemand > 0 else { return }
|
|
219
|
+
lock.lock()
|
|
220
|
+
self.demand += newDemand
|
|
221
|
+
}
|
|
222
|
+
lock.unlock()
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
override func cancel() {
|
|
226
|
+
lock.lock()
|
|
227
|
+
if downstream.take() == nil {
|
|
228
|
+
lock.unlock()
|
|
229
|
+
return
|
|
230
|
+
}
|
|
231
|
+
let parent = self.parent.take()
|
|
232
|
+
lock.unlock()
|
|
233
|
+
parent?.disassociate(self)
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
var description: String { return "CurrentValueSubject" }
|
|
237
|
+
|
|
238
|
+
var customMirror: Mirror {
|
|
239
|
+
lock.lock()
|
|
240
|
+
defer { lock.unlock() }
|
|
241
|
+
let children: [Mirror.Child] = [
|
|
242
|
+
("parent", parent as Any),
|
|
243
|
+
("downstream", downstream as Any),
|
|
244
|
+
("demand", demand),
|
|
245
|
+
("subject", parent as Any)
|
|
246
|
+
]
|
|
247
|
+
return Mirror(self, children: children)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
var playgroundDescription: Any { return description }
|
|
251
|
+
}
|
|
252
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
//
|
|
2
|
+
// CustomCombineIdentifierConvertible.swift
|
|
3
|
+
// OpenCombine
|
|
4
|
+
//
|
|
5
|
+
// Created by Sergej Jaskiewicz on 10.06.2019.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
/// A protocol for uniquely identifying publisher streams.
|
|
9
|
+
///
|
|
10
|
+
/// If you create a custom `Subscription` or `Subscriber` type, implement this protocol
|
|
11
|
+
/// so that development tools can uniquely identify publisher chains in your app.
|
|
12
|
+
/// If your type is a class, OpenCombine provides an implementation of `combineIdentifier`
|
|
13
|
+
/// for you.
|
|
14
|
+
/// If your type is a structure, set up the identifier as follows:
|
|
15
|
+
///
|
|
16
|
+
/// let combineIdentifier = CombineIdentifier()
|
|
17
|
+
public protocol CustomCombineIdentifierConvertible {
|
|
18
|
+
|
|
19
|
+
/// A unique identifier for identifying publisher streams.
|
|
20
|
+
var combineIdentifier: CombineIdentifier { get }
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
extension CustomCombineIdentifierConvertible where Self: AnyObject {
|
|
24
|
+
|
|
25
|
+
public var combineIdentifier: CombineIdentifier {
|
|
26
|
+
return CombineIdentifier(self)
|
|
27
|
+
}
|
|
28
|
+
}
|