diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 7f7485b..7e033db 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -8,10 +8,10 @@ on: jobs: build-and-test: - runs-on: macos-12 + runs-on: macos-14 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4.2.2 - name: Build run: swift build -v - name: Run tests diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 9fa8dad..436ae8b 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -9,16 +9,16 @@ on: jobs: update_documentation: name: Update documentation - runs-on: macos-12 + runs-on: macos-14 steps: - name: Checkout repository uses: actions/checkout@v3 - name: Setup Swift version - uses: swift-actions/setup-swift@v1 + uses: swift-actions/setup-swift@v2.0.0 with: - swift-version: "5.7" + swift-version: "5.10" - name: Generate documentation - uses: fwcd/swift-docc-action@v1 + uses: fwcd/swift-docc-action@v1.0.2 with: target: Boutique output: ./docs diff --git a/.swiftpm/xcode/xcshareddata/xcschemes/Boutique.xcscheme b/.swiftpm/xcode/xcshareddata/xcschemes/Boutique.xcscheme deleted file mode 100644 index 7c30600..0000000 --- a/.swiftpm/xcode/xcshareddata/xcschemes/Boutique.xcscheme +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Demo/Demo.xcodeproj/project.pbxproj b/Demo/Demo.xcodeproj/project.pbxproj index 380b79c..152ada8 100644 --- a/Demo/Demo.xcodeproj/project.pbxproj +++ b/Demo/Demo.xcodeproj/project.pbxproj @@ -380,7 +380,6 @@ INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -410,7 +409,6 @@ INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/Demo/Demo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Demo/Demo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index adcedcc..334629e 100644 --- a/Demo/Demo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Demo/Demo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,4 @@ { - "originHash" : "70ca90eb3fbfec4a3d93a1da9661356805637a48d9b94fd45ff8771cc4dd7582", "pins" : [ { "identity" : "bodega", @@ -38,5 +37,5 @@ } } ], - "version" : 3 + "version" : 2 } diff --git a/Demo/Demo/App/App.BoutiqueDemo.swift b/Demo/Demo/App/App.BoutiqueDemo.swift index c94a65e..006fbe4 100644 --- a/Demo/Demo/App/App.BoutiqueDemo.swift +++ b/Demo/Demo/App/App.BoutiqueDemo.swift @@ -2,12 +2,12 @@ import SwiftUI @main struct BoutiqueDemoApp: App { - @State private var appState = AppState() + @StateObject private var appState = AppState() var body: some Scene { WindowGroup { ContentView() - .environment(appState) + .environmentObject(appState) .onAppear(perform: { // Saving the last time the app was opened to demonstrate how @StoredValue // persists values. The next time you open the app it should print diff --git a/Demo/Demo/App/App.State.swift b/Demo/Demo/App/App.State.swift index 633ac04..c792ca9 100644 --- a/Demo/Demo/App/App.State.swift +++ b/Demo/Demo/App/App.State.swift @@ -1,17 +1,10 @@ import Boutique import Foundation -@Observable -final class AppState { - @ObservationIgnored +final class AppState: ObservableObject { @StoredValue(key: "funkyRedPandaModeEnabled") var funkyRedPandaModeEnabled = false - @ObservationIgnored - @StoredValue(key: "fetchedRedPandas") - var fetchedRedPandas: [URL] = [] - - @ObservationIgnored @StoredValue(key: "lastAppLaunchTimestamp") var lastAppLaunchTimestamp = nil } diff --git a/Demo/Demo/App/ContentView.swift b/Demo/Demo/App/ContentView.swift index e50d2c2..54d19c4 100644 --- a/Demo/Demo/App/ContentView.swift +++ b/Demo/Demo/App/ContentView.swift @@ -1,17 +1,15 @@ import SwiftUI struct ContentView: View { - @Environment(AppState.self) private var appState - @StateObject private var carouselFocusController = ScrollFocusController() - @State private var imagesController = ImagesController() + @StateObject private var imagesController = ImagesController() var body: some View { VStack(spacing: 0.0) { FavoritesCarouselView() .padding(.bottom, 8.0) .environmentObject(carouselFocusController) - .environment(imagesController) + .environmentObject(imagesController) Divider() @@ -22,32 +20,5 @@ struct ContentView: View { } .padding(.horizontal, 16.0) .background(Color.palette.background) - .onChange(of: self.appState.funkyRedPandaModeEnabled) { oldValue, newValue in - print("Funky red panda mode was \(oldValue) and now is \(newValue)") - } - .task({ - await self.monitorImageStoreEvents() - }) - } -} - -private extension ContentView { - func monitorImageStoreEvents() async { - for await event in self.imagesController.$images.events { - switch event.operation { - - case .initialized: - print("[Store Event: initial] Our Images Store has initialized") - - case .loaded: - print("[Store Event: loaded] Our Images Store has loaded with images", event.items.map(\.url)) - - case .insert: - print("[Store Event: insert] Our Images Store inserted images", event.items.map(\.url)) - - case .remove: - print("[Store Event: remove] Our Images Store removed images", event.items.map(\.url)) - } - } } } diff --git a/Demo/Demo/Components/FavoritesCarouselView.swift b/Demo/Demo/Components/FavoritesCarouselView.swift index 6f83876..2b15e00 100644 --- a/Demo/Demo/Components/FavoritesCarouselView.swift +++ b/Demo/Demo/Components/FavoritesCarouselView.swift @@ -44,13 +44,14 @@ import SwiftUI /// A horizontally scrolling carousel that displays the red panda images a user has favorited. struct FavoritesCarouselView: View { - @Environment(AppState.self) private var appState - @Environment(ImagesController.self) private var imagesController + @EnvironmentObject private var imagesController: ImagesController @State private var animation: Animation? = nil @State private var images: [RemoteImage] = [] @State private var itemsHaveLoaded = false + @EnvironmentObject private var appState: AppState + var body: some View { VStack { // Demonstrating how an EmptyStateView can work with Boutique by leveraging itemsHaveLoaded @@ -74,19 +75,18 @@ struct FavoritesCarouselView: View { EmptyView() } } - .onChange(of: self.imagesController.images, initial: true, { - self.images = self.imagesController.images.sorted(by: { $0.createdAt > $1.createdAt}) + .onReceive(self.imagesController.$images.$items, perform: { + self.images = $0.sorted(by: { $0.createdAt > $1.createdAt}) }) .frame(height: 200.0) .background(Color.palette.background) - .task({ - do { - try await self.imagesController.$images.itemsHaveLoaded() - self.itemsHaveLoaded = true - } catch { + .onStoreDidLoad( + self.imagesController.$images, + update: $itemsHaveLoaded, + onError: { error in print("Failed to load images", error) } - }) + ) } } @@ -116,18 +116,8 @@ private extension FavoritesCarouselView { Button(action: { Task { - try await imagesController.clearAllImages() - self.appState.$fetchedRedPandas.reset() + self.appState.$funkyRedPandaModeEnabled.toggle() } - }, label: { - Image(systemName: "xmark.circle.fill") - .opacity(self.images.isEmpty ? 0.0 : 1.0) - .font(.title) - .foregroundColor(.red) - }) - - Button(action: { - self.appState.funkyRedPandaModeEnabled.toggle() }, label: { Image(systemName: "sun.max.circle.fill") .opacity(self.images.isEmpty ? 0.0 : 1.0) @@ -142,14 +132,15 @@ private extension FavoritesCarouselView { }) Button(action: { - print("We've seen \(self.appState.fetchedRedPandas.count) red pandas") - print(self.appState.fetchedRedPandas) + Task { + try await imagesController.clearAllImages() + } }, label: { - Text("\(self.appState.fetchedRedPandas.count)") + Image(systemName: "xmark.circle.fill") + .opacity(self.images.isEmpty ? 0.0 : 1.0) .font(.title) - .monospacedDigit() + .foregroundColor(.red) }) - } .padding(.top) } diff --git a/Demo/Demo/Components/RedPandaCardView.swift b/Demo/Demo/Components/RedPandaCardView.swift index 05484e8..45d6f3d 100644 --- a/Demo/Demo/Components/RedPandaCardView.swift +++ b/Demo/Demo/Components/RedPandaCardView.swift @@ -3,13 +3,16 @@ import SwiftUI /// A view that fetches a red panda image from the server and allows a user to favorite the red panda. struct RedPandaCardView: View { - @Environment(AppState.self) private var appState @EnvironmentObject private var focusController: ScrollFocusController - @State private var imagesController = ImagesController() + @StateObject private var imagesController = ImagesController() + @State private var currentImage: RemoteImage? + @State private var requestInFlight = false + @EnvironmentObject private var appState: AppState + @State private var progress: CGFloat = 0.0 var body: some View { @@ -119,15 +122,6 @@ private extension RedPandaCardView { self.currentImage = nil // Assigning nil shows the progress spinner self.currentImage = try await self.imagesController.fetchImage() - - guard let url = self.currentImage?.url else { return } - - if self.appState.fetchedRedPandas.contains(url) { - print("Fetched an already seen red panda from URL", url) - } else { - self.appState.$fetchedRedPandas.append(url) - print("Fetched a new red panda from URL", url) - } } var currentImageIsSaved: Bool { diff --git a/Demo/Demo/Images/ImagesController.swift b/Demo/Demo/Images/ImagesController.swift index 75781a4..75663ee 100644 --- a/Demo/Demo/Images/ImagesController.swift +++ b/Demo/Demo/Images/ImagesController.swift @@ -15,10 +15,8 @@ import SwiftUI // @StateObject private var imagesController = ImagesController(store: Store.imagesStore) /// A controller that allows you to fetch images remotely, and save or delete them from a `Store`. -@Observable -final class ImagesController { +final class ImagesController: ObservableObject { /// The `Store` that we'll be using to save images. - @ObservationIgnored @Stored(in: .imagesStore) var images /// Fetches `RemoteImage` from the API, providing the user with a red panda if the request succeeds. diff --git a/Package.resolved b/Package.resolved index 1c63914..334629e 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,4 @@ { - "originHash" : "cc0a5555f8ada9d39eb7aa3ebf517983770c3fb59b40991749c3f025fce9ea00", "pins" : [ { "identity" : "bodega", @@ -38,5 +37,5 @@ } } ], - "version" : 3 + "version" : 2 } diff --git a/Package.swift b/Package.swift index bb99868..c9b9e2d 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version: 5.10 +// swift-tools-version: 5.6 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription @@ -6,8 +6,8 @@ import PackageDescription let package = Package( name: "Boutique", platforms: [ - .iOS(.v17), - .macOS(.v14), + .iOS(.v13), + .macOS(.v11), ], products: [ .library( diff --git a/Package@swift-6.0.swift b/Package@swift-6.0.swift deleted file mode 100644 index f1f8f0e..0000000 --- a/Package@swift-6.0.swift +++ /dev/null @@ -1,42 +0,0 @@ -// swift-tools-version: 6.0 -// The swift-tools-version declares the minimum version of Swift required to build this package. - -import PackageDescription - -let package = Package( - name: "Boutique", - platforms: [ - .iOS(.v17), - .macOS(.v14), - ], - products: [ - .library( - name: "Boutique", - targets: ["Boutique"]), - ], - dependencies: [ - .package(url: "https://github.com/mergesort/Bodega.git", exact: Version(2, 1, 3)), - .package(url: "https://github.com/apple/swift-collections", from: Version(1, 0, 3)), - .package(url: "https://github.com/apple/swift-docc-plugin", from: Version(1, 0, 0)), - ], - targets: [ - .target( - name: "Boutique", - dependencies: [ - .byName(name: "Bodega"), - .product(name: "OrderedCollections", package: "swift-collections") - ], - exclude: [ - "../../Images", - "../../Performance Profiler", - ], - swiftSettings: [ - .define("ENABLE_TESTABILITY", .when(configuration: .debug)) - ] - ), - .testTarget( - name: "BoutiqueTests", - dependencies: ["Boutique"] - ), - ] -) diff --git a/Performance Profiler/Performance Profiler.xcodeproj/project.pbxproj b/Performance Profiler/Performance Profiler.xcodeproj/project.pbxproj index 2869199..ceb69f4 100644 --- a/Performance Profiler/Performance Profiler.xcodeproj/project.pbxproj +++ b/Performance Profiler/Performance Profiler.xcodeproj/project.pbxproj @@ -34,8 +34,8 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - B75946822C29D0D100959EA1 /* Boutique */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = Boutique; path = ..; sourceTree = ""; }; B7DE210C287352DD005C4058 /* Performance Profiler.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Performance Profiler.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + B7DE21C028736FAC005C4058 /* Boutique */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = Boutique; path = ..; sourceTree = ""; }; B7DE21C928737779005C4058 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; B7DE21CA28737779005C4058 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; B7DE21D7287378A3005C4058 /* Telegrama-Raw.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Telegrama-Raw.otf"; sourceTree = ""; }; @@ -78,7 +78,7 @@ B7DE20FF287352DB005C4058 = { isa = PBXGroup; children = ( - B75946822C29D0D100959EA1 /* Boutique */, + B7DE21C028736FAC005C4058 /* Boutique */, B7DE21DC2873A1B9005C4058 /* Sources */, B7DE21C828737779005C4058 /* Resources */, B7DE210D287352DD005C4058 /* Products */, @@ -431,7 +431,7 @@ INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.5; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -465,7 +465,7 @@ INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.5; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/Performance Profiler/Performance Profiler.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Performance Profiler/Performance Profiler.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 53cd2bf..aa46d4a 100644 --- a/Performance Profiler/Performance Profiler.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Performance Profiler/Performance Profiler.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,13 +1,12 @@ { - "originHash" : "70ca90eb3fbfec4a3d93a1da9661356805637a48d9b94fd45ff8771cc4dd7582", "pins" : [ { "identity" : "bodega", "kind" : "remoteSourceControl", "location" : "https://github.com/mergesort/Bodega.git", "state" : { - "revision" : "bfd8871e9c2590d31b200e54c75428a71483afdf", - "version" : "2.1.3" + "revision" : "3e7c1c58ad9a46aa8551cebfe87770003cdaaaca", + "version" : "2.0.2" } }, { @@ -15,8 +14,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/stephencelis/SQLite.swift.git", "state" : { - "revision" : "a95fc6df17d108bd99210db5e8a9bac90fe984b8", - "version" : "0.15.3" + "revision" : "4d543d811ee644fa4cc4bfa0be996b4dd6ba0f54", + "version" : "0.13.3" } }, { @@ -24,8 +23,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-collections", "state" : { - "revision" : "ee97538f5b81ae89698fd95938896dec5217b148", - "version" : "1.1.1" + "revision" : "48254824bb4248676bf7ce56014ff57b142b77eb", + "version" : "1.0.2" } }, { @@ -33,19 +32,10 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-docc-plugin", "state" : { - "revision" : "26ac5758409154cc448d7ab82389c520fa8a8247", - "version" : "1.3.0" - } - }, - { - "identity" : "swift-docc-symbolkit", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-docc-symbolkit", - "state" : { - "revision" : "b45d1f2ed151d057b54504d653e0da5552844e34", + "revision" : "3303b164430d9a7055ba484c8ead67a52f7b74f6", "version" : "1.0.0" } } ], - "version" : 3 + "version" : 2 } diff --git a/Performance Profiler/Sources/ContentView/CompactContentView.swift b/Performance Profiler/Sources/ContentView/CompactContentView.swift index b005ce6..7f7a3dd 100644 --- a/Performance Profiler/Sources/ContentView/CompactContentView.swift +++ b/Performance Profiler/Sources/ContentView/CompactContentView.swift @@ -2,7 +2,7 @@ import Foundation import SwiftUI struct CompactContentView: View { - @State private var richNotesController = RichNotesController(store: .notesStore) + @StateObject private var richNotesController = RichNotesController(store: .notesStore) @State private var notes: [RichNote] = [] @State private var operation = RichNotesOperation(action: .add) @@ -32,37 +32,7 @@ struct CompactContentView: View { ) .padding(16.0) - OperationProgressView(operation: self.operation) - - CountButtonContainerView( - operation: self.$operation, - addItemsAction: { itemCount in - self.failableAsyncOperation({ - try await richNotesController.addItems(count: itemCount) - }) - }, - removeItemsAction: { itemCount in - self.failableAsyncOperation({ - try await richNotesController.removeItems(count: itemCount) - }) - }, - removeAllAction: { - self.failableAsyncOperation({ - try await self.richNotesController.removeAll() - }) - } - ) - .padding(.horizontal, 32.0) - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) - .animation(.easeInOut(duration: 0.15), value: self.operation.action) - - Text("Selected Operation") - .fontWeight(.bold) - .textShadow() - .font(.telegramaRaw(style: .title1)) - .frame(maxWidth: .infinity) - .frame(height: 64.0) - .foregroundColor(.white) + OperationProgressView(operationInProgress: self.$operation.isInProgress) HStack(alignment: .center, spacing: 16.0) { RichNotesOperationsView(operation: self.$operation) @@ -70,6 +40,11 @@ struct CompactContentView: View { .padding(16.0) .padding(.horizontal, 16.0) + CountButtonContainerView(operation: self.$operation) + .padding(.horizontal, 32.0) + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + .animation(.easeInOut(duration: 0.15), value: self.operation.action) + Spacer() } .background(Color.palette.appBackground) @@ -78,7 +53,7 @@ struct CompactContentView: View { self.operation.action = .loading self.operation.isInProgress = true }) - .onChange(of: self.richNotesController.notes, initial: true, { + .onReceive(richNotesController.$notes.$items, perform: { if self.operation.action == .loading { self.operation.action = .add let initialMarkerTime = self.storeLaunchDuration @@ -86,20 +61,7 @@ struct CompactContentView: View { self.operation.isInProgress = false } - self.notes = self.richNotesController.notes + self.notes = $0 }) } } - -private extension CompactContentView { - func failableAsyncOperation(_ action: @escaping () async throws -> Void) { - Task { - do { - try await action() - } catch { - print("Error running operation", error) - self.operation.isInProgress = false - } - } - } -} diff --git a/Performance Profiler/Sources/ContentView/CountButtonContainerView.swift b/Performance Profiler/Sources/ContentView/CountButtonContainerView.swift index 01c4735..022654f 100644 --- a/Performance Profiler/Sources/ContentView/CountButtonContainerView.swift +++ b/Performance Profiler/Sources/ContentView/CountButtonContainerView.swift @@ -1,12 +1,9 @@ import SwiftUI struct CountButtonContainerView: View { + @StateObject private var richNotesController = RichNotesController(store: .notesStore) @Binding var operation: RichNotesOperation - let addItemsAction: (Int) -> Void - let removeItemsAction: (Int) -> Void - let removeAllAction: () -> Void - @SizeClassDependentValue(regular: 16.0, compact: 8.0) private var stackSpacing @SizeClassDependentValue(regular: Edge.leading, compact: Edge.trailing) private var animatedEdge @@ -31,7 +28,9 @@ struct CountButtonContainerView: View { }) if self.operation.action == .remove { - Self.countButton("All OBJECTS", color: buttonColor, action: self.removeAllAction) + Self.countButton("All OBJECTS", color: buttonColor, action: { + try await self.richNotesController.removeAll() + }) .transition(.move(edge: animatedEdge)) } } @@ -45,10 +44,15 @@ struct CountButtonContainerView: View { // to make the progress state change show up correctly when adding a large amount of items try await Task.sleep(nanoseconds: 10_000_000) - if self.operation.action == .add { - self.addItemsAction(count) - } else { - self.removeItemsAction(count) + do { + if self.operation.action == .add { + try await richNotesController.addItems(count: count) + } else { + try await richNotesController.removeItems(count: count) + } + } catch { + print("Error running operation", error) + self.operation.isInProgress = false } self.operation.isInProgress = false diff --git a/Performance Profiler/Sources/ContentView/OperationProgressView.swift b/Performance Profiler/Sources/ContentView/OperationProgressView.swift index c5767d2..cabfb60 100644 --- a/Performance Profiler/Sources/ContentView/OperationProgressView.swift +++ b/Performance Profiler/Sources/ContentView/OperationProgressView.swift @@ -1,12 +1,11 @@ import SwiftUI struct OperationProgressView: View { - var operation: RichNotesOperation - + @Binding var operationInProgress: Bool @SizeClassDependentValue(regular: UIFont.TextStyle.title3, compact: UIFont.TextStyle.body) private var fontStyle var body: some View { - Text(self.title) + Text(self.operationInProgress ? "Operation in Progress…" : "Operation Complete") .textShadow() .padding(16.0) .background(Color.palette.terminalBackground) @@ -15,14 +14,3 @@ struct OperationProgressView: View { .font(.telegramaRaw(style: fontStyle)) } } - -private extension OperationProgressView { - var title: String { - switch self.operation.action { - case .add: "Insert" - case .remove: "Remove" - case .loading: "Operation in Progress…" - case .none: "Operation Complete" - } - } -} diff --git a/Performance Profiler/Sources/ContentView/RegularContentView.swift b/Performance Profiler/Sources/ContentView/RegularContentView.swift index 791b071..ce73b30 100644 --- a/Performance Profiler/Sources/ContentView/RegularContentView.swift +++ b/Performance Profiler/Sources/ContentView/RegularContentView.swift @@ -2,41 +2,24 @@ import Foundation import SwiftUI struct RegularContentView: View { + @StateObject private var richNotesController = RichNotesController(store: .notesStore) + @State private var notes: [RichNote] = [] @State private var operation = RichNotesOperation(action: .add) @State private var storeLaunchDuration: TimeInterval = 0.0 - private var richNotesController = RichNotesController(store: .notesStore) - var body: some View { HStack { VStack(spacing: 0.0) { RichNotesOperationsView(operation: self.$operation) - CountButtonContainerView( - operation: self.$operation, - addItemsAction: { itemCount in - self.failableAsyncOperation({ - try await richNotesController.addItems(count: itemCount) - }) - }, - removeItemsAction: { itemCount in - self.failableAsyncOperation({ - try await richNotesController.removeItems(count: itemCount) - }) - }, - removeAllAction: { - self.failableAsyncOperation({ - try await self.richNotesController.removeAll() - }) - } - ) - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) - .animation(.easeInOut(duration: 0.15), value: self.operation.action) + CountButtonContainerView(operation: self.$operation) + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + .animation(.easeInOut(duration: 0.15), value: self.operation.action) Spacer() - OperationProgressView(operation: self.operation) + OperationProgressView(operationInProgress: self.$operation.isInProgress) } .padding(16.0) .frame(width: 360.0) @@ -79,21 +62,21 @@ struct RegularContentView: View { self.operation.action = .loading self.operation.isInProgress = true }) - .onChange(of: self.richNotesController.notes, initial: true, { - self.notes = self.richNotesController.notes + .onReceive(richNotesController.$notes.$items, perform: { + if self.operation.action == .loading { + self.operation.action = .add + let initialMarkerTime = self.storeLaunchDuration + self.storeLaunchDuration = ProcessInfo.processInfo.systemUptime - initialMarkerTime + self.operation.isInProgress = false + } + + self.notes = $0 }) } } -private extension RegularContentView { - func failableAsyncOperation(_ action: @escaping () async throws -> Void) { - Task { - do { - try await action() - } catch { - print("Error running operation", error) - self.operation.isInProgress = false - } - } +private extension CompactContentView { + static func formattedMemory(bytes: Int, unit: ByteCountFormatStyle.Units = .mb) -> String { + ByteCountFormatStyle(style: .memory, allowedUnits: unit).format(Int64(bytes)) } } diff --git a/Performance Profiler/Sources/RichNotes/Models.Demo.swift b/Performance Profiler/Sources/RichNotes/Models.Demo.swift index fa045fe..5a03a5a 100644 --- a/Performance Profiler/Sources/RichNotes/Models.Demo.swift +++ b/Performance Profiler/Sources/RichNotes/Models.Demo.swift @@ -61,12 +61,6 @@ public struct Image: Codable, Equatable { let height: Float } -extension String { - struct LoremIpsum {} - - static let loremIpsum = LoremIpsum() -} - extension String.LoremIpsum { var tenWords: String { return "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo" diff --git a/Performance Profiler/Sources/RichNotes/RichNotesController.swift b/Performance Profiler/Sources/RichNotes/RichNotesController.swift index 132a80e..b3a8221 100644 --- a/Performance Profiler/Sources/RichNotes/RichNotesController.swift +++ b/Performance Profiler/Sources/RichNotes/RichNotesController.swift @@ -1,10 +1,8 @@ import Boutique import SwiftUI -@Observable -final class RichNotesController { - @ObservationIgnored - @Stored(in: .notesStore) var notes: [RichNote] +final class RichNotesController: ObservableObject { + @Stored var notes: [RichNote] init(store: Store) { self._notes = Stored(in: store) @@ -32,10 +30,10 @@ final class RichNotesController { } func removeItems(count: Int) async throws { - let removalCount = min(self.notes.count, count) + let removalCount = min(await self.notes.count, count) do { - let firstElements = Array(self.notes[0..(storage: SQLiteStorageEngine.default(appendingPath: "SpanishRedPandaStorage")) +/// private var spanishRedPanda = nil +/// ``` +/// +/// Using @``AsyncStoredValue`` is also straightforward, there are only two functions. +/// To change the value of the @``AsyncStoredValue``, you can use the ``set(_:)`` and ``reset()`` functions. +/// ``` +/// $redPanda.set(RedPanda(cuteRating: 99)) // The @AsyncStoredValue has a new red panda +/// $redPanda.reset() // The @AsyncStoredValue is nil +/// ``` +/// +/// One last bit of advice, when calling ``set(_:)`` and ``reset()`` don't forget to put a `$` +/// in front of the the `$storedValue`. +/// +/// See: ``set(_:)`` and ``reset()`` docs for a more in depth explanation. +@MainActor +@propertyWrapper +public struct AsyncStoredValue { + private let cancellableBox: CancellableBox + private let defaultValue: Item + + /// Initializes an @``AsyncStoredValue``. + /// + /// This initializer allows you to specify an item to save and a `StorageEngine` where the `Item` should be stored. + /// For example if you were to create a `StorageEngine` that has it's own concept of keys or even allows + /// you to store items in the Keychain, you would need to be able to provide the underlying storage mechanism. + /// + /// - Parameters: + /// - wrappedValue: An value set when initializing an @``AsyncStoredValue`` + /// - storage: A `StorageEngine` that defines where the value will be stored. + public init(wrappedValue: Item, storage: StorageEngine) { + let innerStore = Store(storage: storage, cacheIdentifier: \.id) + self.cancellableBox = CancellableBox(innerStore) + + self.defaultValue = wrappedValue + } + + /// The currently stored value + public var wrappedValue: Item { + self.cancellableBox.store.items.first?.value ?? self.defaultValue + } + + /// An @``AsyncStoredValue`` which exposes ``set(_:)`` and ``reset()`` functions alongside a ``publisher``. + public var projectedValue: AsyncStoredValue { self } + + /// A Combine publisher that allows you to observe any changes to the @``AsyncStoredValue``. + public var publisher: AnyPublisher { + self.cancellableBox.store.$items.map({ + $0.first?.value ?? self.defaultValue + }) + .eraseToAnyPublisher() + } + + /// Sets a value for the @``AsyncStoredValue`` property. + /// + /// You may run into an error that says + /// + /// ``` + /// "'set' is inaccessible due to 'internal' protection level." + /// ``` + /// + /// If that occurs the fix is straightforward. Rather than calling `storedValue.set(newValue)` + /// you need to call `$storedValue.set(newValue)`, with a dollar sign ($) in front of `storedValue`. + /// + /// When using a property wrapper the ``wrappedValue`` is an `Item`, but the `projectedValue` + /// is a `AsyncStoredValue`. That means you are accessing the `storedValue` you're interacting + /// with, a value type `Item`. But it is the `projectedValue` that is the `AsyncStoredValue`, + /// that property and has the ``set(_:) function. + /// + /// This follows similar conventions to the `@Published` property wrapper. + /// `@Published var items: [Item]` allows you to use `items` as a regular `[Item]`, + /// but `$items` projects `AnyPublisher<[Item], Never>` so you can subscribe to changes items produces. + /// Within Boutique the @Stored property wrapper works very similarly. + /// + /// - Parameter value: The value to set @``AsyncStoredValue`` to. + public func set(_ value: Item) async throws { + try await self.cancellableBox.store.insert(UniqueItem(value: value)) + } + + /// Resets the @``AsyncStoredValue`` to the default value. + /// + /// You may run into an error that says + /// + /// ``` + /// "'reset' is inaccessible due to 'internal' protection level." + /// ``` + /// + /// If that occurs the fix is straightforward. Rather than calling `storedValue.reset()` + /// you need to call `$storedValue.reset()`, with a dollar sign ($) in front of `storedValue`. + /// + /// When using a property wrapper the ``wrappedValue`` is an `Item`, but the `projectedValue` + /// is a `AsyncStoredValue`. That means when you access `storedValue` you're interacting + /// with the item itself, of type `Item`. But it's the `projectedValue` that is + /// the `AsyncStoredValue` type, and has the ``reset()`` function. + /// + /// This follows similar conventions to the `@Published` property wrapper. + /// `@Published var items: [Item]` would let you use `items` as a regular `[Item]`, + /// but $items projects `AnyPublisher<[Item], Never>` so you can subscribe to changes items produces. + /// Within Boutique the @Stored property wrapper works very similarly. + public func reset() async throws { + try await self.cancellableBox.store.removeAll() + } + + public static subscript( + _enclosingInstance instance: Instance, + wrapped wrappedKeyPath: KeyPath, + storage storageKeyPath: KeyPath + ) -> Item { + let wrapper = instance[keyPath: storageKeyPath] + + if wrapper.cancellableBox.cancellable == nil { + wrapper.cancellableBox.cancellable = wrapper.cancellableBox.store + .objectWillChange + .sink(receiveValue: { [instance] in + func publisher(_ value: T) -> ObservableObjectPublisher? { + return (Proxy() as? ObservableObjectProxy)?.extractObjectWillChange(value) + } + + let objectWillChangePublisher = _openExistential(instance as Any, do: publisher) + + objectWillChangePublisher?.send() + }) + } + + return wrapper.wrappedValue + } +} + +private extension AsyncStoredValue { + // An internal type to box the item being saved in the Store ensuring + // we can only ever have one item due to the hard-coded `cacheIdentifier`. + struct UniqueItem: Codable, Equatable { + var id: String { "unique-value" } + var value: Item + } + + final class CancellableBox { + let store: Store + var cancellable: AnyCancellable? + + init(_ store: Store) { + self.store = store + } + } +} diff --git a/Sources/Boutique/Internal/BoxedValue.swift b/Sources/Boutique/BoxedValue.swift similarity index 96% rename from Sources/Boutique/Internal/BoxedValue.swift rename to Sources/Boutique/BoxedValue.swift index 5b5b9f4..325dc7b 100644 --- a/Sources/Boutique/Internal/BoxedValue.swift +++ b/Sources/Boutique/BoxedValue.swift @@ -1,3 +1,4 @@ +import Combine import Foundation extension JSONEncoder { diff --git a/Sources/Boutique/Internal/CachedValue.swift b/Sources/Boutique/CachedValue.swift similarity index 94% rename from Sources/Boutique/Internal/CachedValue.swift rename to Sources/Boutique/CachedValue.swift index 6b5085f..4b443bb 100644 --- a/Sources/Boutique/Internal/CachedValue.swift +++ b/Sources/Boutique/CachedValue.swift @@ -4,7 +4,7 @@ import Foundation /// to create a `JSONDecoder` and invoke a decode step every time we need to access a `StoredValue` externally. internal final class CachedValue { private var cachedValue: Item? - public let retrieveValue: () -> Item + public var retrieveValue: () -> Item init(retrieveValue: @escaping () -> Item) { self.retrieveValue = retrieveValue diff --git a/Sources/Boutique/Documentation.docc/Articles/Boutique.md b/Sources/Boutique/Documentation.docc/Articles/Boutique.md index f843609..4ee8c01 100644 --- a/Sources/Boutique/Documentation.docc/Articles/Boutique.md +++ b/Sources/Boutique/Documentation.docc/Articles/Boutique.md @@ -14,7 +14,7 @@ You'll notice that it looks almost identical to any other SwiftUI app, an explic ## Getting Started -Boutique only has one concept you need to understand. When you save data to the ``Store`` your data will be persisted automatically for you and exposed as a regular Swift array. The @``StoredValue``, and @``SecurelyStoredValue`` property wrappers work the same way, but instead of an array when you call `$storedValue.set(value)` a singular Swift value will be saved. You'll never have to think about databases, everything in your app is a regular Swift array or value using your app's models, with straightforward code that looks like any other app. +Boutique only has one concept you need to understand. When you save data to the ``Store`` your data will be persisted automatically for you and exposed as a regular Swift array. The @``StoredValue``, @``SecurelyStoredValue``, and @``AsyncStoredValue`` property wrappers work the same way, but instead of an array when you call `$storedValue.set(value)` a singular Swift value will be saved. You'll never have to think about databases, everything in your app is a regular Swift array or value using your app's models, with straightforward code that looks like any other app. You may be familiar with the ``Store`` from [Redux](https://redux.js.org/) or [The Composable Architecture](https://github.com/pointfreeco/swift-composable-architecture), but unlike those frameworks you won't need to worry about adding Actions or Reducers. With this ``Store`` implementation all your data is persisted for you automatically, no additional code required. This allows you to build realtime updating apps with full offline support in an incredibly simple and straightforward manner. diff --git a/Sources/Boutique/Documentation.docc/Articles/The @Stored Family Of Property Wrappers.md b/Sources/Boutique/Documentation.docc/Articles/The @Stored Family Of Property Wrappers.md index 2e5126e..2757927 100644 --- a/Sources/Boutique/Documentation.docc/Articles/The @Stored Family Of Property Wrappers.md +++ b/Sources/Boutique/Documentation.docc/Articles/The @Stored Family Of Property Wrappers.md @@ -6,9 +6,9 @@ Property Wrappers that take the ``Store`` and make it magical. ✨ In discussed how to initialize a ``Store``, and how to subsequently use it to insert and remove items from that ``Store``. All of the code treats the ``Store`` as an easier to use database, but what if we could remove that layer of abstraction? -The promise of Boutique is that you work with regular Swift values and arrays, yet have your data persisted automatically. The @``Stored``, @``StoredValue``, and @``SecurelyStoredValue`` property wrappers are what help Boutique deliver on that promise. +The promise of Boutique is that you work with regular Swift values and arrays, yet have your data persisted automatically. The @``Stored``, @``StoredValue``, @``SecurelyStoredValue``, and @``AsyncStoredValue`` property wrappers are what help Boutique deliver on that promise. -Using @``Stored`` provides a ``Store`` with array-like ergonomics, while @``StoredValue``, and @``SecurelyStoredValue``, offer similar support for storing single values rather than arrays. +Using @``Stored`` provides a ``Store`` with array-like ergonomics, while @``StoredValue``, @``SecurelyStoredValue``, and @``AsyncStoredValue`` offer similar support for storing single values rather than arrays. That's a lot of words to discuss how @``Stored`` works under the hood, but seeing some code should make it clearer how to integrate a @``Stored`` array into your app. @@ -136,7 +136,7 @@ This looks simpler, but it's deceptively unperformant. Every time `notesControll ## @StoredValue -The ``Store`` and @``Stored`` were created to store an array of data because most data apps render comes in the form of an array. But occasionally we need to store an individual value, that's where @``StoredValue`` and @``SecurelyStoredValue`` come in handy. +The ``Store`` and @``Stored`` were created to store an array of data because most data apps render comes in the form of an array. But occasionally we need to store an individual value, that's where @``StoredValue``@``SecurelyStoredValue``, and @``AsyncStoredValue`` come in handy. Whether you need to save an important piece of information for the next time your app is launched or if want to change how an app looks based on a user's settings, those app configurations are individual values that you'll want to persist. @@ -154,7 +154,7 @@ You can also store nil values var lastOpenedDate: Date? = nil ``` -Or even an enum, as long as it conforms to `Codable`, `Sendable`, and `Equatable`. +Or even an enum, as long as it conforms to `Codable` and `Equatable`. ```swift @StoredValue(key: "currentTheme") var currentlySelectedTheme = .light @@ -162,7 +162,7 @@ var currentlySelectedTheme = .light A more complex example for a hypothetical video player app may look something like this. ```swift -struct UserPreferences: Codable, Sendable, Equatable { +struct UserPreferences: Codable, Equatable { var hasHapticsEnabled: Bool var prefersDarkMode: Bool var prefersWideScreen: Bool @@ -197,6 +197,12 @@ $hasHapticsEnabled.toggle() $hasHapticsEnabled.set(!hasHapticsEnabled) ``` +## @AsyncStoredValue + +An @``AsyncStoredValue`` is very similar to ``StoredValue``, the main difference is that rather than storing individual values in `UserDefaults` an ``AsyncStoredValue`` is stored in a `StorageEngine`, much like a ``Store``. This allows you to build your own custom persistence layer for storing values, such as building a `KeychainStorageEngine` to store individual values in the keychain much the same way we can choose our own persistence layer for @``Stored``. + +The API for using @``AsyncStoredValue`` is identical to @``StoredValue``, so the @``StoredValue`` examples above will work for @``AsyncStoredValue``. The main difference is that values are received in an async manner, so you have to be prepared to not receive a value immediately or on demand. It may seem strange to have an async alternative to @``StoredValue``, but if you have a `StorageEngine` based upon a remote service such as CloudKit or built atop your app's server API, you'll appreciate the ability to transparently store and persist individual values the same way you would any other data received from your API. + ## @SecurelyStoredValue The @``SecurelyStoredValue`` property wrapper automagically persists a single `Item` in the system `Keychain` @@ -214,7 +220,7 @@ Unlike @``StoredValue`` properties @``SecurelyStoredValue`` properties cannot be @SecurelyStoredValue(key: "redPanda") ``` -Using a @``SecurelyStoredValue`` is the same as a regular @``StoredValue``, the only difference is that the two methods are `set(_:)` and `remove()`, rather than `set(_:)` and `reset()` +Using a @``SecurelyStoredValue`` is the same as a regular @``StoredValue``, the only difference is that the two methods are ``set(_:)`` and ``remove()``, rather than ``set(_:)`` and ``reset()`` ```swift try self.$storedPassword.set("p@ssw0rd") // self.storedPassword is now set to "p@assw0rd" try self.$storedPassword.remove() // self.storedPassword is now nil @@ -222,7 +228,7 @@ try self.$storedPassword.remove() // self.storedPassword is now nil ## Further Exploration -Now that we've covered @``Stored``, @``StoredValue``, and @``SecurelyStoredValue`` we can see how these property wrappers enable your app to work with regular Swift values and arrays, but have your app available offline with realtime state updates easier than ever. There isn't much left to learn about using Boutique, but if you want to explore further you can start using Boutique in one of your apps! +Now that we've covered @``Stored``, @``StoredValue``, @``SecurelyStoredValue``, and @``AsyncStoredValue`` we can see how these property wrappers enable your app to work with regular Swift values and arrays, but have your app available offline with realtime state updates easier than ever. There isn't much left to learn about using Boutique, but if you want to explore further you can start using Boutique in one of your apps! As a reminder you can always play around with the code yourself. diff --git a/Sources/Boutique/Documentation.docc/Articles/Using Stores.md b/Sources/Boutique/Documentation.docc/Articles/Using Stores.md index e00777d..3e3b116 100644 --- a/Sources/Boutique/Documentation.docc/Articles/Using Stores.md +++ b/Sources/Boutique/Documentation.docc/Articles/Using Stores.md @@ -22,7 +22,7 @@ let store = Store( - The `storage` parameter is populated with a `StorageEngine`, you can read more about it in [Bodega's StorageEngine documentation](https://mergesort.github.io/Bodega/documentation/bodega/using-storageengines). Our SQLite database will be created in the platform's default storage directory, nested in an `Items` subdirectory. On macOS this will be the `Application Support` directory, and on every other platform such as iOS this will be the `Documents` directory. If you need finer control over the location you can specify a `FileManager.Directory` such as `.documents`, `.caches`, `.temporary`, or even provide your own URL, also explored in [Bodega's StorageEngine documentation](https://mergesort.github.io/Bodega/documentation/bodega/using-storageengines). -- The `cacheIdentifier` is a `KeyPath` that your model must provide. That may seem unconventional at first, so let's break it down. Much like how protocols enforce a contract, the KeyPath is doing the same for our model. To be inserted into our ``Store`` and saved to disk our models must conform to `Codable & Sendable & Equatable`, both of which are reasonable constraints given the data has to be serializable and searchable. But what we're trying to avoid is making our models have to conform to a specialized caching protocol, we want to be able to save any ol' object you already have in your app. Instead of creating a protocol like `Storable`, we instead ask the model to tell us how we can derive a unique string which will be used as a key when storing the item. +- The `cacheIdentifier` is a `KeyPath` that your model must provide. That may seem unconventional at first, so let's break it down. Much like how protocols enforce a contract, the KeyPath is doing the same for our model. To be inserted into our ``Store`` and saved to disk our models must conform to `Codable & Equatable`, both of which are reasonable constraints given the data has to be serializable and searchable. But what we're trying to avoid is making our models have to conform to a specialized caching protocol, we want to be able to save any ol' object you already have in your app. Instead of creating a protocol like `Storable`, we instead ask the model to tell us how we can derive a unique string which will be used as a key when storing the item. If your model (in this case `Item`) already conforms to `Identifiable`, we can simplify our initializer by eschewing the `cacheIdentifier` parameter. @@ -114,11 +114,64 @@ func getItems() async -> [Item] { The synchronous initializer is a sensible default, but if your app's needs dictate displaying data only once you've loaded all of the necessary items the asynchronous initializers are there to help. +## Observing Store Loading State + +You can manually observe the loading state of a ``Store`` as we do in `getItems()` above, but Boutique also provides a ``onStoreDidLoad`` function to observe the loading state of a ``Store`` in SwiftUI. + +```swift +struct ContentView: View { + @Stored var items: [Item] + @State var itemsHaveLoaded = false + + var body: some View { + VStack { + AlwaysVisibleBanner() + + if self.itemsHaveLoaded { + if self.items.isEmpty { + EmptyStateView() + } else { + ItemsView(items: self.items) + } + } else { + LoadingStateView() + } + } + .onStoreDidLoad( + self.$items, + update: $itemsHaveLoaded, + onError: { error in + log.error("Failed to load items", error) + } + ) + } +} +``` + +This allows for a clean separation of Views to display across three different states: +- When the Store has finished loading and has items +- When the Store has finished loading and has no items +- When the Store is loading (and implicitly has no items) + +You can also choose to use the closure-oriented variant of ``onStoreDidLoad`` to perform any additional logic when the ``Store`` has finished loading. Patterns like MVVM choose to isolate this logic ViewModel, and you can still choose to do that, but exposing this method on a View provides more flexibility to work with your preferred architecture. In the example below we will filter the items in a ``Store`` based on some criteria, to display only the relevant items in our View. + +```swift +.onStoreDidLoad( + self.$items, + onLoad: { + self.items = self.filteredItems(self.items) + }, + onError: { error in + log.error("Failed to load items", error) + } +) +``` + ## Further Exploration, @Stored And More Building an app using the ``Store`` can be really powerful because it leans into SwiftUI's state-driven architecture, while providing you with offline-first capabilities, realtime updates across your app, with almost no additional code required. -We've introduced the ``Store``, but the real power lies when you start to use Boutique's property wrappers, @``Stored``, @``StoredValue``, and @``SecurelyStoredValue``. These property wrappers help deliver on the promise of working with regular Swift values and arrays yet having data persisted automatically, without ever having to think about the concept of a database. +We've introduced the ``Store``, but the real power lies when you start to use Boutique's property wrappers, @``Stored``, @``StoredValue``, @``SecurelyStoredValue``, and @``AsyncStoredValue``. These property wrappers help deliver on the promise of working with regular Swift values and arrays yet having data persisted automatically, without ever having to think about the concept of a database. The next step is to explore how they work, with a small example SwiftUI app. diff --git a/Sources/Boutique/Internal/AsyncValueSubject.swift b/Sources/Boutique/Internal/AsyncValueSubject.swift deleted file mode 100644 index 90cb921..0000000 --- a/Sources/Boutique/Internal/AsyncValueSubject.swift +++ /dev/null @@ -1,56 +0,0 @@ -import Foundation - -@MainActor -internal final class AsyncValueSubject { - typealias BufferingPolicy = AsyncStream.Continuation.BufferingPolicy - - var value: Value - var bufferingPolicy: BufferingPolicy - - private var continuations: [UInt: AsyncStream.Continuation] = [:] - private var count: UInt = 0 - - public init(_ initialValue: Value, bufferingPolicy: BufferingPolicy = .unbounded) { - self.value = initialValue - self.bufferingPolicy = bufferingPolicy - } - - func send(_ newValue: Value) { - self.value = newValue - - for (_, continuation) in continuations { - continuation.yield(newValue) - } - } - - func `inout`(_ apply: @Sendable (inout Value) -> Void) { - apply(&value) - - for (_, continuation) in self.continuations { - continuation.yield(value) - } - } - - var values: AsyncStream { - AsyncStream(bufferingPolicy: self.bufferingPolicy) { continuation in - self.insert(continuation) - } - } -} - -private extension AsyncValueSubject { - func insert(_ continuation: AsyncStream.Continuation) { - continuation.yield(value) - let id = count + 1 - count = id - continuations[id] = continuation - continuation.onTermination = { @Sendable [weak self] _ in - guard let self else { return } - Task { await self.remove(continuation: id) } - } - } - - func remove(continuation id: UInt) { - continuations.removeValue(forKey: id) - } -} diff --git a/Sources/Boutique/Internal/JSONCoders.swift b/Sources/Boutique/JSONCoders.swift similarity index 100% rename from Sources/Boutique/Internal/JSONCoders.swift rename to Sources/Boutique/JSONCoders.swift diff --git a/Sources/Boutique/Internal/Keychain.swift b/Sources/Boutique/Keychain.swift similarity index 100% rename from Sources/Boutique/Internal/Keychain.swift rename to Sources/Boutique/Keychain.swift diff --git a/Sources/Boutique/ObservableObjectProxy.swift b/Sources/Boutique/ObservableObjectProxy.swift new file mode 100644 index 0000000..d255747 --- /dev/null +++ b/Sources/Boutique/ObservableObjectProxy.swift @@ -0,0 +1,24 @@ +// This code is used in `@Stored`, `@StoredValue`, and `@AsyncStoredValue` +// but I gotta be honest I have no idea how this works but it does. +// +// Basically there's a proxy that extracts the nested ObservableObjectPublisher +// but I don't know how it works. You can thank Ian Keen (@iankay on Twitter) +// for this code, he's an absolutely brilliant developer and great guy. + +import Combine + +protocol ObservableObjectProxy { + func extractObjectWillChange(_ instance: T) -> ObservableObjectPublisher +} + +struct Proxy { + func extract(_ instance: A, _ extract: (Base) -> B) -> C { + return extract(instance as! Base) as! C + } +} + +extension Proxy: ObservableObjectProxy where Base: ObservableObject, Base.ObjectWillChangePublisher == ObservableObjectPublisher { + func extractObjectWillChange(_ instance: T) -> ObservableObjectPublisher { + extract(instance) { $0.objectWillChange } + } +} diff --git a/Sources/Boutique/SecurelyStoredValue.swift b/Sources/Boutique/SecurelyStoredValue.swift index 3b7ec12..2dd5200 100644 --- a/Sources/Boutique/SecurelyStoredValue.swift +++ b/Sources/Boutique/SecurelyStoredValue.swift @@ -1,5 +1,6 @@ +import Combine import Foundation -import Observation +import SwiftUI /// The @``SecurelyStoredValue`` property wrapper automagically persists a single `Item` in the system `Keychain` /// rather than an array of items that would be persisted in a ``Store`` or using @``Stored``. @@ -7,12 +8,12 @@ import Observation /// You should use @``SecurelyStoredValue`` rather than @``StoredValue`` when you need to store /// sensitive values such as passwords or auth tokens, since a @``StoredValue`` will be persisted in `UserDefaults`. /// -/// This fulfills the same needs as many other Keychain wrappers, but in a Boutique-like manner. +/// This is fulfills the same needs as many other Keychain wrappers, but in a Boutique-like manner. /// /// Values are delivered synchronously and are available on app launch, using the system `Keychain` -/// as the backing store. +/// as the backing store. If you wish to use your own `StorageEngine` you can use @``AsyncStoredValue``. /// -/// Unlike @``StoredValue`` properties, @``SecurelyStoredValue`` properties cannot be provided a default value. +/// Unlike @``StoredValue`` properties @``SecurelyStoredValue`` properties cannot be provided a default value. /// ``` /// @SecurelyStoredValue(key: "redPanda") /// private var redPanda @@ -36,46 +37,31 @@ import Observation /// in front of the the `$storedValue`. /// /// See: ``set(_:)`` and ``remove()`` docs for a more in depth explanation. -@MainActor -@Observable @propertyWrapper -public final class SecurelyStoredValue { - private let observationRegistrar = ObservationRegistrar() - private let valueSubject = AsyncValueSubject(nil) - +public struct SecurelyStoredValue { + private let cancellableBox = CancellableBox() + private let itemSubject = CurrentValueSubject(nil) private let key: String private let service: String? private let group: String? - /// Initializes a new @``SecurelyStoredValue``. - /// - /// - Parameters: - /// - key: The key to use when storing the value in the keychain. - /// - service: The service to use when storing the value in the keychain. - /// - group: The group to use when storing the value in the keychain. public init(key: String, service: KeychainService? = nil, group: KeychainGroup? = nil) { self.key = key self.service = service?.value self.group = group?.value - - let initialValue = Self.storedValue(group: group?.value, service: self.keychainService, account: key) - self.valueSubject.send(initialValue) } /// The currently stored value public var wrappedValue: Item? { - self.retrieveItem() + Self.storedValue(group: self.group, service: self.keychainService, account: self.key) } - /// A ``SecurelyStoredValue`` which exposes ``set(_:)`` and ``remove()`` functions alongside an `AsyncStream` of ``values``. + /// A ``SecurelyStoredValue`` which exposes ``set(_:)`` and ``remove()`` functions alongside a ``publisher``. public var projectedValue: SecurelyStoredValue { self } - /// An `AsyncStream` that emits all value changes of a @``SecurelyStoredValue``. - /// - /// This stream will emit the initial value when subscribed to, and will further emit - /// any changes to the value when ``set(_:)`` or ``remove()`` are called. - public var values: AsyncStream { - self.valueSubject.values + /// A Combine publisher that allows you to observe all changes to the @``SecurelyStoredValue``. + public var publisher: AnyPublisher { + self.itemSubject.eraseToAnyPublisher() } /// Sets a value for the @``SecurelyStoredValue`` property. @@ -100,6 +86,7 @@ public final class SecurelyStoredValue { /// Within Boutique the @Stored property wrapper works very similarly. /// /// - Parameter value: The value to set @``SecurelyStoredValue`` to. + @MainActor public func set(_ value: Item?) throws { if let value { if self.wrappedValue == nil { @@ -109,13 +96,11 @@ public final class SecurelyStoredValue { // Since updating a value does not seem to work, I've rewritten `set` to first set a `nil` value // then the desired value, which will effectively call `set` with a new value, which does work. // This will be fixed in the future, and we will restore the call-site to say `self.update(value)`. - // try self.remove() - self.removeItem(shouldPublishChanges: false) + try self.remove() try self.insert(value) } } else { - // try self.remove() - self.removeItem(shouldPublishChanges: false) + try self.remove() } } @@ -142,13 +127,34 @@ public final class SecurelyStoredValue { @MainActor public func remove() throws { if self.wrappedValue != nil { - // try self.removeItem() - self.removeItem(shouldPublishChanges: true) + try self.removeItem() } else if self.wrappedValue == nil && Self.keychainValueExists(group: self.group, service: self.keychainService, account: self.key) { - // try self.removeItem() - self.removeItem(shouldPublishChanges: true) + try self.removeItem() } } + + public static subscript( + _enclosingInstance instance: Instance, + wrapped wrappedKeyPath: KeyPath, + storage storageKeyPath: KeyPath + ) -> Item? { + let wrapper = instance[keyPath: storageKeyPath] + + if wrapper.cancellableBox.cancellable == nil { + wrapper.cancellableBox.cancellable = wrapper.itemSubject + .receive(on: RunLoop.main) + .sink(receiveValue: { [instance] _ in + func publisher(_ value: T) -> ObservableObjectPublisher? { + return (Proxy() as? ObservableObjectProxy)?.extractObjectWillChange(value) + } + + let objectWillChangePublisher = _openExistential(instance as Any, do: publisher) + objectWillChangePublisher?.send() + }) + } + + return wrapper.wrappedValue + } } private extension SecurelyStoredValue { @@ -172,105 +178,64 @@ private extension SecurelyStoredValue { } func insert(_ value: Item) throws { - try observationRegistrar.withMutation(of: self, keyPath: \.wrappedValue) { - let keychainQuery = [ - kSecClass: kSecClassGenericPassword, - kSecAttrService: self.keychainService, - kSecAttrAccount: self.key, - kSecValueData: try JSONCoders.encoder.encodeBoxedData(item: value) - ] - .withGroup(self.group) - .mapToStringDictionary() - - let status = SecItemAdd(keychainQuery as CFDictionary, nil) - - if status == errSecSuccess || status == errSecDuplicateItem { - self.valueSubject.send(value) - } else { - throw KeychainError(status: status) - } + let keychainQuery = [ + kSecClass: kSecClassGenericPassword, + kSecAttrService: self.keychainService, + kSecAttrAccount: self.key, + kSecValueData: try JSONCoders.encoder.encodeBoxedData(item: value) + ] + .withGroup(self.group) + .mapToStringDictionary() + + let status = SecItemAdd(keychainQuery as CFDictionary, nil) + + if status == errSecSuccess || status == errSecDuplicateItem { + self.itemSubject.send(value) + } else { + throw KeychainError(status: status) } } func update(_ value: Item) throws { - try observationRegistrar.withMutation(of: self, keyPath: \.wrappedValue) { - let keychainQuery = [ - kSecClass: kSecClassGenericPassword, - kSecAttrService: self.keychainService, - kSecAttrAccount: self.key, - kSecValueData: try JSONCoders.encoder.encodeBoxedData(item: value) - ] - .withGroup(self.group) - .mapToStringDictionary() - - let status = SecItemUpdate(keychainQuery as CFDictionary, keychainQuery as CFDictionary) - - if status == errSecSuccess { - self.valueSubject.send(value) - } else { - throw KeychainError(status: status) - } + let keychainQuery = [ + kSecClass: kSecClassGenericPassword, + kSecAttrService: self.keychainService, + kSecAttrAccount: self.key, + kSecValueData: try JSONCoders.encoder.encodeBoxedData(item: value) + ] + .withGroup(self.group) + .mapToStringDictionary() + + let status = SecItemUpdate(keychainQuery as CFDictionary, keychainQuery as CFDictionary) + + if status == errSecSuccess { + self.itemSubject.send(value) + } else { + throw KeychainError(status: status) } } - func removeItem(shouldPublishChanges: Bool) { - let removeItem = { - var keychainQuery = [ - kSecClass: kSecClassGenericPassword, - kSecAttrService: self.keychainService, - kSecAttrAccount: self.key - ] - .withGroup(self.group) - .mapToStringDictionary() + func removeItem() throws { + var keychainQuery = [ + kSecClass: kSecClassGenericPassword, + kSecAttrService: self.keychainService, + kSecAttrAccount: key + ] + .withGroup(self.group) + .mapToStringDictionary() #if os(macOS) - // This line must exist on OS X, but must not exist on iOS. - // Source: https://github.com/square/Valet/blob/c095ce0ac15716bee167aefc273e17c2c3cd4919/Sources/Valet/Internal/SecItem.swift#L123 - keychainQuery[kSecMatchLimit as String] = kSecMatchLimitAll + // This line must exist on OS X, but must not exist on iOS. + // Source: https://github.com/square/Valet/blob/c095ce0ac15716bee167aefc273e17c2c3cd4919/Sources/Valet/Internal/SecItem.swift#L123 + keychainQuery[kSecMatchLimit as String] = kSecMatchLimitAll #endif - let status = SecItemDelete(keychainQuery as CFDictionary) + let status = SecItemDelete(keychainQuery as CFDictionary) - if status == errSecSuccess || status == errSecItemNotFound { - if shouldPublishChanges { - self.valueSubject.send(nil) - } - } - } - - if shouldPublishChanges { - observationRegistrar.withMutation(of: self, keyPath: \.wrappedValue) { - removeItem() - } - } else { - removeItem() + if status == errSecSuccess || status == errSecItemNotFound { + self.itemSubject.send(nil) } } -// Restore this once we've fixed up the update bugs - -// func removeItem() { -// observationRegistrar.withMutation(of: self, keyPath: \.wrappedValue) { -// var keychainQuery = [ -// kSecClass: kSecClassGenericPassword, -// kSecAttrService: self.keychainService, -// kSecAttrAccount: key -// ] -// .withGroup(self.group) -// .mapToStringDictionary() -// -//#if os(macOS) -// // This line must exist on OS X, but must not exist on iOS. -// // Source: https://github.com/square/Valet/blob/c095ce0ac15716bee167aefc273e17c2c3cd4919/Sources/Valet/Internal/SecItem.swift#L123 -// keychainQuery[kSecMatchLimit as String] = kSecMatchLimitAll -//#endif -// let status = SecItemDelete(keychainQuery as CFDictionary) -// -// if status == errSecSuccess || status == errSecItemNotFound { -// self.valueSubject.send(nil) -// } -// } -// } - static func keychainValueExists(group: String?, service: String, account: String) -> Bool { let keychainQuery = [ kSecClass: kSecClassGenericPassword, @@ -287,12 +252,6 @@ private extension SecurelyStoredValue { return status != errSecItemNotFound } - func retrieveItem() -> Item? { - observationRegistrar.access(self, keyPath: \.wrappedValue) - - return Self.storedValue(group: self.group, service: self.keychainService, account: self.key) - } - var keychainService: String { self.service ?? Self.defaultService } @@ -322,3 +281,9 @@ private extension Dictionary where Key == CFString, Value == Any { return dictionary } } + +private extension SecurelyStoredValue { + final class CancellableBox { + var cancellable: AnyCancellable? + } +} diff --git a/Sources/Boutique/StorableItem.swift b/Sources/Boutique/StorableItem.swift deleted file mode 100644 index 07c0ed0..0000000 --- a/Sources/Boutique/StorableItem.swift +++ /dev/null @@ -1 +0,0 @@ -public typealias StorableItem = Codable & Sendable diff --git a/Sources/Boutique/Store+Observation.swift b/Sources/Boutique/Store+Observation.swift new file mode 100644 index 0000000..ef9e5a9 --- /dev/null +++ b/Sources/Boutique/Store+Observation.swift @@ -0,0 +1,39 @@ +import SwiftUI + +public extension View { + @available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) + /// Observes whether a ``Store`` has finished loading it's items. + /// + /// - Parameters: + /// - store: The ``Store`` whose loading is being observed. + /// - onLoad: The closure to call when the ``Store`` has finished loading. + /// - onError: The closure to call if an error occurs and the ``Store`` is not loaded. + func onStoreDidLoad(_ store: Store, onLoad: @escaping () -> Void, onError: ((Error) -> Void)? = nil) -> some View { + self.task({ + do { + try await store.itemsHaveLoaded() + onLoad() + } catch { + onError?(error) + } + }) + } + + @available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) + /// Observes whether a ``Store`` has finished loading it's items. + /// + /// - Parameters: + /// - store: The ``Store`` whose loading is being observed. + /// - update: A binding to that will be updated when the ``Store`` has finished loading. + /// - onError: The closure to call if an error occurs and the ``Store`` is not loaded. + func onStoreDidLoad(_ store: Store, update hasLoadedState: Binding, onError: ((Error) -> Void)? = nil) -> some View { + self.task({ + do { + try await store.itemsHaveLoaded() + hasLoadedState.wrappedValue = true + } catch { + onError?(error) + } + }) + } +} diff --git a/Sources/Boutique/Internal/Store.ItemRemovalStrategy.swift b/Sources/Boutique/Store.ItemRemovalStrategy.swift similarity index 100% rename from Sources/Boutique/Internal/Store.ItemRemovalStrategy.swift rename to Sources/Boutique/Store.ItemRemovalStrategy.swift diff --git a/Sources/Boutique/Store.Operation.swift b/Sources/Boutique/Store.Operation.swift index 816cf14..7d1e37b 100644 --- a/Sources/Boutique/Store.Operation.swift +++ b/Sources/Boutique/Store.Operation.swift @@ -6,7 +6,6 @@ public extension Store { /// them be split over two operations, and making two separate dispatches to the `@MainActor`. /// (Dispatching to the main actor multiple times can lead to users seeing odd visual experiences /// in SwiftUI apps, which is why Boutique goes to great lengths to help avoid that.) - @MainActor final class Operation { private let store: Store private var operationsHaveRun = false @@ -16,6 +15,24 @@ public extension Store { self.store = store } + /// Adds an item to the ``Store``. + /// + /// When an item is inserted with the same `cacheIdentifier` as an item that already exists in the ``Store`` + /// the item being inserted will replace the item in the ``Store``. You can think of the ``Store`` as a bag + /// of items, removing complexity when it comes to managing items, indices, and more, + /// but it also means you need to choose well thought out and uniquely identifying `cacheIdentifier`s. + /// + /// - Parameters: + /// - item: The item you are adding to the ``Store``. + @available( + *, deprecated, + renamed: "insert", + message: "This method is functionally equivalent to `insert` and will be removed in a future release. After using Boutique in practice for a while I decided that insert was a more semantically correct name for this operation on a Store, if you'd like to learn more you can see the discussion here. https://github.com/mergesort/Boutique/discussions/36" + ) + public func add(_ item: Item) async throws -> Operation { + try await self.insert(item) + } + /// Inserts an item into the ``Store``. /// /// When an item is inserted with the same `cacheIdentifier` as an item that already exists in the ``Store`` @@ -47,6 +64,22 @@ public extension Store { return self } + /// Adds an array of items to the ``Store``. + /// + /// Prefer inserting multiple items using this method instead of calling ``insert(_:)-1nu61`` + /// multiple times to avoid making multiple separate dispatches to the `@MainActor`. + /// + /// - Parameters: + /// - items: The items to add to the store. + @available( + *, deprecated, + renamed: "insert", + message: "This method is functionally equivalent to `insert` and will be removed in a future release. After using Boutique in practice for a while I decided that insert was a more semantically correct name for this operation on a Store, if you'd like to learn more you can see the discussion here. https://github.com/mergesort/Boutique/discussions/36" + ) + public func add(_ items: [Item]) async throws -> Operation { + try await self.insert(items) + } + /// Inserts an array of items into the ``Store``. /// /// Prefer inserting multiple items using this method instead of calling ``insert(_:)-1nu61`` @@ -90,7 +123,7 @@ public extension Store { /// /// Prefer removing multiple items using this method instead of calling ``remove(_:)-8ufsb`` /// multiple times to avoid making multiple separate dispatches to the `@MainActor`. - /// - Parameter items: The items you are removing from the `Store`. + /// - Parameter item: The items you are removing from the `Store`. public func remove(_ items: [Item]) async throws -> Operation { self.operations.append(ExecutableAction(action: .removeItems(items), executable: { try await $0.performRemove(items) diff --git a/Sources/Boutique/Store.swift b/Sources/Boutique/Store.swift index 0a65616..0c6b412 100644 --- a/Sources/Boutique/Store.swift +++ b/Sources/Boutique/Store.swift @@ -1,17 +1,12 @@ @_exported import Bodega import OrderedCollections import Foundation -import Observation /// A fancy persistence layer. /// /// A ``Store`` for your app which provides you a dual-layered data architecture with a very simple API. -/// -/// The ``Store`` exposes an array of items, which you can reference simply by calling `store.items`. -/// -/// Because ``Store`` implements the `@Observable` protocol, you can also observe and respond to changes reactively, for example in an `.onChange` handler. -/// -/// The ``Store`` also exposes an `AsyncStream` through the `values` property, which allows you to observe changes to the items in your ``Store`` with a `for await` loop. +/// The ``Store`` exposes a `@Published` property for your data, which allows you to read it's data synchronously +/// using `store.items`, or subscribe to `store.$items` reactively for real-time changes and updates. /// /// Under the hood the ``Store`` is doing the work of saving all changes to a persistence layer /// when you insert or remove items, which allows you to build an offline-first app @@ -20,7 +15,7 @@ import Observation /// **How The Store Works** /// /// A ``Store`` is a higher level abstraction than Bodega's `ObjectStorage`, containing and leveraging -/// an in-memory store, the `items` array, and a `StorageEngine` for it's persistence layer. +/// an in-memory store, the ``items`` array, and a `StorageEngine` for it's persistence layer. /// /// The `StorageEngine` you initialize a ``Store`` with (such as `DiskStorageEngine` or `SQLiteStorageEngine`) /// will be where items are stored permanently. If you do not provide a `StorageEngine` parameter @@ -48,11 +43,7 @@ import Observation /// a stable and unique `cacheIdentifier` is to conform to `Identifiable` and point to `\.id`. /// That is *not* required though, and you are free to use any `String` property on your `Item` /// or even a type which can be converted into a `String` such as `\.url.path`. -@MainActor -@Observable -public final class Store { - private let valueSubject: AsyncValueSubject> - +public final class Store: ObservableObject { private let storageEngine: StorageEngine private let cacheIdentifier: KeyPath @@ -61,7 +52,7 @@ public final class Store { /// The user can read the state of ``items`` at any time /// or subscribe to it however they wish, but you desire making modifications to ``items`` /// you must use ``insert(_:)-7z2oe``, ``remove(_:)-3nzlq``, or ``removeAll()-9zfmy``. - public private(set) var items: [Item] = [] + @MainActor @Published public private(set) var items: [Item] = [] /// Initializes a new ``Store`` for persisting items to a memory cache /// and a storage engine, to act as a source of truth. @@ -102,7 +93,6 @@ public final class Store { public init(storage: StorageEngine, cacheIdentifier: KeyPath) { self.storageEngine = storage self.cacheIdentifier = cacheIdentifier - self.valueSubject = AsyncValueSubject(.initial) // Begin loading items in the background. _ = self.loadStoreTask @@ -115,12 +105,11 @@ public final class Store { /// - storage: A `StorageEngine` to initialize a ``Store`` instance with. /// - cacheIdentifier: A `KeyPath` from the `Item` pointing to a `String`, which the ``Store`` /// will use to create a unique identifier for the item when it's saved. + @MainActor public init(storage: StorageEngine, cacheIdentifier: KeyPath) async throws { self.storageEngine = storage self.cacheIdentifier = cacheIdentifier - self.valueSubject = AsyncValueSubject(.initial) - - try await self.itemsHaveLoaded() + try await itemsHaveLoaded() } /// Awaits for ``items`` to be loaded. @@ -131,6 +120,27 @@ public final class Store { try await loadStoreTask.value } + /// Adds an item to the store. + /// + /// When an item is inserted with the same `cacheIdentifier` as an item that already exists in the ``Store`` + /// the item being inserted will replace the item in the ``Store``. You can think of the ``Store`` as a bag + /// of items, removing complexity when it comes to managing items, indices, and more, + /// but it also means you need to choose well thought out and uniquely identifying `cacheIdentifier`s. + /// + /// - Parameters: + /// - item: The item you are adding to the ``Store``. + /// - Returns: An ``Operation`` that can be used to add an item as part of a chain. + @_disfavoredOverload + @available( + *, deprecated, + renamed: "insert", + message: "This method is functionally equivalent to `insert` and will be removed in a future release. After using Boutique in practice for a while I decided that insert was a more semantically correct name for this operation on a Store, if you'd like to learn more you can see the discussion here. https://github.com/mergesort/Boutique/discussions/36" + ) + public func add(_ item: Item) async throws -> Operation { + let operation = Operation(store: self) + return try await operation.insert(item) + } + /// Inserts an item into the store. /// /// When an item is inserted with the same `cacheIdentifier` as an item that already exists in the ``Store`` @@ -147,6 +157,24 @@ public final class Store { return try await operation.insert(item) } + /// Adds an item to the ``Store``. + /// + /// When an item is inserted with the same `cacheIdentifier` as an item that already exists in the ``Store`` + /// the item being inserted will replace the item in the ``Store``. You can think of the ``Store`` as a bag + /// of items, removing complexity when it comes to managing items, indices, and more, + /// but it also means you need to choose well thought out and uniquely identifying `cacheIdentifier`s. + /// + /// - Parameters: + /// - item: The item you are adding to the ``Store``. + @available( + *, deprecated, + renamed: "insert", + message: "This method is functionally equivalent to `insert` and will be removed in a future release. After using Boutique in practice for a while I decided that insert was a more semantically correct name for this operation on a Store, if you'd like to learn more you can see the discussion here. https://github.com/mergesort/Boutique/discussions/36" + ) + public func add(_ item: Item) async throws { + try await self.performInsert(item) + } + /// Inserts an item into the ``Store``. /// /// When an item is inserted with the same `cacheIdentifier` as an item that already exists in the ``Store`` @@ -160,6 +188,25 @@ public final class Store { try await self.performInsert(item) } + /// Adds an array of items to the ``Store``. + /// + /// Prefer adding multiple items using this method instead of calling ``add(_:)-1ausm`` + /// multiple times to avoid making multiple separate dispatches to the `@MainActor`. + /// + /// - Parameters: + /// - items: The items to add to the store. + /// - Returns: An ``Operation`` that can be used to add items as part of a chain. + @_disfavoredOverload + @available( + *, deprecated, + renamed: "insert", + message: "This method is functionally equivalent to `insert` and will be removed in a future release. After using Boutique in practice for a while I decided that insert was a more semantically correct name for this operation on a Store, if you'd like to learn more you can see the discussion here. https://github.com/mergesort/Boutique/discussions/36" + ) + public func add(_ items: [Item]) async throws -> Operation { + let operation = Operation(store: self) + return try await operation.insert(items) + } + /// Inserts an array of items into the ``Store``. /// /// Prefer inserting multiple items using this method instead of calling ``insert(_:)-7z2oe`` @@ -174,6 +221,22 @@ public final class Store { return try await operation.insert(items) } + /// Adds an array of items to the ``Store``. + /// + /// Prefer adding multiple items using this method instead of calling ``insert(_:)-7z2oe`` + /// multiple times to avoid making multiple separate dispatches to the `@MainActor`. + /// + /// - Parameters: + /// - items: The items to add to the store. + @available( + *, deprecated, + renamed: "insert", + message: "This method is functionally equivalent to `insert` and will be removed in a future release. After using Boutique in practice for a while I decided that insert was a more semantically correct name for this operation on a Store, if you'd like to learn more you can see the discussion here. https://github.com/mergesort/Boutique/discussions/36" + ) + public func add(_ items: [Item]) async throws { + try await self.performInsert(items) + } + /// Inserts an array of items into the ``Store``. /// /// Prefer inserting multiple items using this method instead of calling ``insert(_:)-3j9hw`` @@ -245,16 +308,7 @@ public final class Store { try await self.performRemoveAll() } - /// An `AsyncStream` that emits all changes for the `items` in a ``Store``, . - /// - /// This stream will emit an `initial` value when subscribed to, and will further emit - /// any changes to the value with their assocaited operation when ``insert(_:)-3j9hw`` or ``remove(_:)-51ya6``, or ``removeAll()-1xc24`` are called. - public var events: AsyncStream> { - self.valueSubject.values - } - /// A `Task` that will kick off loading items into the ``Store``. - @ObservationIgnored private lazy var loadStoreTask: Task = Task { @MainActor in do { self.items = try await self.storageEngine.readAllData() @@ -263,8 +317,6 @@ public final class Store { self.items = [] throw error } - - self.valueSubject.send(.loaded(self.items)) } } @@ -281,18 +333,19 @@ public extension Store { /// - cacheIdentifier: A `KeyPath` from the `Item` pointing to a `String`, which the ``Store`` /// will use to create a unique identifier for the item when it's saved. /// - Returns: A ``Store`` that populates items in memory so you can pass a ``Store`` to @``Stored`` in SwiftUI Previews. - @MainActor static func previewStore(items: [Item], cacheIdentifier: KeyPath) -> Store { let store = Store( storage: SQLiteStorageEngine(directory: .temporary(appendingPath: "Previews"))!, // No files are written to disk cacheIdentifier: cacheIdentifier ) - store.items = items + Task.detached { @MainActor in + store.items = items + } return store } - + /// A ``Store`` to be used for SwiftUI Previews and only SwiftUI Previews! /// /// This version of a ``Store`` allows you to pass in the ``items`` you would like to render @@ -309,7 +362,7 @@ public extension Store { static func previewStore(items: [Item]) -> Store where Item: Identifiable, Item.ID == String { previewStore(items: items, cacheIdentifier: \.id) } - + /// A ``Store`` to be used for SwiftUI Previews and only SwiftUI Previews! /// /// This version of a ``Store`` allows you to pass in the ``items`` you would like to render @@ -332,10 +385,10 @@ public extension Store { // Internal versions of the `insert`, `remove`, and `removeAll` function code paths so we can avoid duplicating code. internal extension Store { func performInsert(_ item: Item, firstRemovingExistingItems existingItemsStrategy: ItemRemovalStrategy? = nil) async throws { - var currentItems = self.items + var currentItems = await self.items if let strategy = existingItemsStrategy { - var removedItems = [item] + var removedItems = currentItems try await self.removeItemsFromStorageEngine(&removedItems, withStrategy: strategy) // If we remove this one it will error self.removeItemsFromMemory(¤tItems, withStrategy: strategy, identifier: cacheIdentifier) @@ -350,17 +403,17 @@ internal extension Store { // We persist only the newly added items, rather than rewriting all of the items try await self.persistItem(item) - self.items = Array(currentValuesDictionary.values) - - self.valueSubject.send(.insert([item])) + await MainActor.run { [currentValuesDictionary] in + self.items = Array(currentValuesDictionary.values) + } } func performInsert(_ items: [Item], firstRemovingExistingItems existingItemsStrategy: ItemRemovalStrategy? = nil) async throws { - var currentItems = self.items + var currentItems = await self.items if let strategy = existingItemsStrategy { // Remove items from disk and memory based on the cache invalidation strategy - var removedItems = items + var removedItems = currentItems try await self.removeItemsFromStorageEngine(&removedItems, withStrategy: strategy) // This one is fine to remove... but why? // Is it the way we construct the items in the ordered dictionary? @@ -388,12 +441,11 @@ internal extension Store { } // We persist only the newly added items, rather than rewriting all of the items - let insertedItems = Array(insertedItemsDictionary.values) - try await self.persistItems(insertedItems) + try await self.persistItems(Array(insertedItemsDictionary.values)) - self.items = Array(currentValuesDictionary.values) - - self.valueSubject.send(.insert(insertedItems)) + await MainActor.run { [currentValuesDictionary] in + self.items = Array(currentValuesDictionary.values) + } } func performRemove(_ item: Item) async throws { @@ -402,11 +454,11 @@ internal extension Store { let cacheKeyString = item[keyPath: self.cacheIdentifier] let itemKeys = Set([cacheKeyString]) - self.items.removeAll(where: { item in - itemKeys.contains(item[keyPath: self.cacheIdentifier]) - }) - - self.valueSubject.send(.remove([item])) + await MainActor.run { + self.items.removeAll(where: { item in + itemKeys.contains(item[keyPath: self.cacheIdentifier]) + }) + } } func performRemove(_ items: [Item]) async throws { @@ -414,21 +466,19 @@ internal extension Store { try await self.removePersistedItems(items: items) - self.items.removeAll(where: { item in - itemKeys.contains(item[keyPath: self.cacheIdentifier]) - }) - - self.valueSubject.send(.remove(items)) + await MainActor.run { + self.items.removeAll(where: { item in + itemKeys.contains(item[keyPath: self.cacheIdentifier]) + }) + } } func performRemoveAll() async throws { - let currentItems = self.items - try await self.storageEngine.removeAllData() - self.items = [] - - self.valueSubject.send(.remove(currentItems)) + await MainActor.run { + self.items = [] + } } } diff --git a/Sources/Boutique/StoreEvent.swift b/Sources/Boutique/StoreEvent.swift deleted file mode 100644 index 997cf63..0000000 --- a/Sources/Boutique/StoreEvent.swift +++ /dev/null @@ -1,27 +0,0 @@ -/// An event associated with an operation performed a ``Store``. -public struct StoreEvent: StorableItem { - public let operation: Operation - public let items: [Item] - - public enum Operation: StorableItem { - case initialized, loaded, insert, remove - } -} - -internal extension StoreEvent { - static var initial: StoreEvent { - StoreEvent(operation: .initialized, items: []) - } - - static func loaded(_ items: [Item]) -> StoreEvent { - StoreEvent(operation: .loaded, items: items) - } - - static func insert(_ items: [Item]) -> StoreEvent { - StoreEvent(operation: .insert, items: items) - } - - static func remove(_ items: [Item]) -> StoreEvent { - StoreEvent(operation: .remove, items: items) - } -} diff --git a/Sources/Boutique/Stored.swift b/Sources/Boutique/Stored.swift index 9dfd4f0..50e8b48 100644 --- a/Sources/Boutique/Stored.swift +++ b/Sources/Boutique/Stored.swift @@ -1,23 +1,58 @@ -import Observation +import Combine /// The @``Stored`` property wrapper to automagically initialize a ``Store``. -@MainActor @propertyWrapper -public struct Stored { - private let store: Store +public struct Stored { + private let cancellableBox: CancellableBox /// Initializes a @``Stored`` property that will be exposed as an `[Item]` and project a `Store`. /// - Parameter store: The store that will be wrapped to expose as an array. public init(in store: Store) { - self.store = store + self.cancellableBox = CancellableBox(store) } + @MainActor /// The currently stored items public var wrappedValue: [Item] { - self.store.items + cancellableBox.store.items } public var projectedValue: Store { - self.store + cancellableBox.store + } + + @MainActor public static subscript( + _enclosingInstance instance: Instance, + wrapped wrappedKeyPath: KeyPath, + storage storageKeyPath: KeyPath + ) -> [Item] { + let wrapper = instance[keyPath: storageKeyPath] + + if wrapper.cancellableBox.cancellable == nil { + wrapper.cancellableBox.cancellable = wrapper.cancellableBox.store + .objectWillChange + .sink(receiveValue: { [instance] in + func publisher(_ value: T) -> ObservableObjectPublisher? { + return (Proxy() as? ObservableObjectProxy)?.extractObjectWillChange(value) + } + + let objectWillChangePublisher = _openExistential(instance as Any, do: publisher) + + objectWillChangePublisher?.send() + }) + } + + return wrapper.wrappedValue + } +} + +private extension Stored { + final class CancellableBox { + let store: Store + var cancellable: AnyCancellable? + + init(_ store: Store) { + self.store = store + } } } diff --git a/Sources/Boutique/StoredValue+Array.swift b/Sources/Boutique/StoredValue+Array.swift index c14c810..3eb93c9 100644 --- a/Sources/Boutique/StoredValue+Array.swift +++ b/Sources/Boutique/StoredValue+Array.swift @@ -13,12 +13,14 @@ public extension StoredValue where Item: RangeReplaceableCollection { /// ``` /// try await self.$redPandaList.append("Pabu") /// ``` + @MainActor func append(_ item: Item.Element) { var updatedArray = self.wrappedValue updatedArray.append(item) self.set(updatedArray) } + @MainActor /// A function that takes a value and removes it from an array if that value exists in the array, /// or adds it to the array if the value doesn't exist. /// - Parameter value: The value to add or remove from an array. @@ -29,35 +31,6 @@ public extension StoredValue where Item: RangeReplaceableCollection { } } -public extension StoredValue where Item: RangeReplaceableCollection, Item.Element: Equatable { - /// A function to replace a value in a @``StoredValue`` represented by an `Array` - /// without having to manually make an intermediate copy for every value update. - /// - /// This is meant to provide a simple ergonomic improvement, avoiding callsites like this. - /// ``` - /// guard let index = self.redPandaList.firstIndex(where: { $0.name == "Himalaya" }) else return - /// var updatedRedPandaList = self.redPandaList - /// updatedRedPandaList[index] = RedPanda(name: "Pabu") - /// self.$redPandaList.set(updatedRedPandaList) - /// ``` - /// - /// Instead this function provides a much simpler alternative. - /// ``` - /// self.$redPandaList.replace(RedPanda(name: "Himalaya"), RedPanda(name: "Pabu")) - /// ``` - @discardableResult - func replace(_ item: Item.Element, with updatedItem: Item.Element) -> Bool { - guard let index = self.wrappedValue.firstIndex(where: { $0 == item }) else { return false } - - var updatedArray = self.wrappedValue - updatedArray.remove(at: index) - updatedArray.insert(updatedItem, at: index) - self.set(updatedArray) - - return true - } -} - public extension SecurelyStoredValue { /// A function to append a @``SecurelyStoredValue`` represented by an `Array` /// without having to manually make an intermediate copy for every value update. @@ -77,37 +50,44 @@ public extension SecurelyStoredValue { /// To better match expected uses calling append on a currently nil SecurelyStoredValue /// will return a single element array of the passed in value, /// rather than returning nil or throwing an error. + @MainActor func append(_ value: Value) throws where Item == [Value] { var updatedArray = self.wrappedValue ?? [] updatedArray.append(value) try self.set(updatedArray) } +} - /// A function to replace a value in a @``StoredValue`` represented by an `Array` +public extension AsyncStoredValue where Item: RangeReplaceableCollection { + /// A function to append a @``StoredValue`` represented by an `Array` /// without having to manually make an intermediate copy for every value update. /// /// This is meant to provide a simple ergonomic improvement, avoiding callsites like this. /// ``` - /// guard let index = self.redPandaList.firstIndex(where: { $0.name == "Himalaya" }) else return /// var updatedRedPandaList = self.redPandaList - /// updatedRedPandaList[index] = RedPanda(name: "Pabu") + /// updatedRedPandaList.append("Pabu") /// self.$redPandaList.set(updatedRedPandaList) /// ``` /// /// Instead this function provides a much simpler alternative. /// ``` - /// try self.$redPandaList.replace(RedPanda(name: "Himalaya"), RedPanda(name: "Pabu")) + /// try await self.$redPandaList.append("Pabu") /// ``` - func replace(_ item: Item.Element, with updatedItem: Item.Element) throws -> Bool where Item == [Value] { - guard let array = self.wrappedValue else { return false } - guard let index = array.firstIndex(where: { $0 == item }) else { return false } + func append(_ item: Item.Element) async throws { + var updatedArray = self.wrappedValue + updatedArray.append(item) + try await self.set(updatedArray) + } - var updatedArray = array - updatedArray.remove(at: index) - updatedArray.insert(updatedItem, at: index) - try self.set(updatedArray) - return true + @MainActor + /// A function that takes a value and removes it from an array if that value exists in the array, + /// or adds it to the array if the value doesn't exist. + /// - Parameter value: The value to add or remove from an array. + func togglePresence(_ value: Value) async throws where Item == [Value] { + var updatedArray = self.wrappedValue + updatedArray.togglePresence(value) + try await self.set(updatedArray) } } diff --git a/Sources/Boutique/StoredValue+Binding.swift b/Sources/Boutique/StoredValue+Binding.swift index dc538ee..6383178 100644 --- a/Sources/Boutique/StoredValue+Binding.swift +++ b/Sources/Boutique/StoredValue+Binding.swift @@ -4,6 +4,7 @@ public extension StoredValue { /// A convenient way to create a `Binding` from a `StoredValue`. /// /// - Returns: A `Binding` of the `StoredValue` provided. + @MainActor var binding: Binding { Binding(get: { self.wrappedValue @@ -17,6 +18,7 @@ public extension SecurelyStoredValue { /// A convenient way to create a `Binding` from a `SecurelyStoredValue`. /// /// - Returns: A `Binding` of the `SecurelyStoredValue` provided. + @MainActor var binding: Binding { Binding(get: { self.wrappedValue @@ -25,3 +27,18 @@ public extension SecurelyStoredValue { }) } } + +public extension AsyncStoredValue { + /// A convenient way to create a `Binding` from an `AsyncStoredValue`. + /// + /// - Returns: A `Binding` of the `AsyncStoredValue` provided. + var binding: Binding { + Binding(get: { + self.wrappedValue + }, set: { value in + Task { + try await self.projectedValue.set(value) + } + }) + } +} diff --git a/Sources/Boutique/StoredValue+Bool.swift b/Sources/Boutique/StoredValue+Bool.swift index ef090ff..c3291b2 100644 --- a/Sources/Boutique/StoredValue+Bool.swift +++ b/Sources/Boutique/StoredValue+Bool.swift @@ -10,6 +10,7 @@ public extension StoredValue where Item == Bool { /// ``` /// self.appState.$proFeaturesEnabled.toggle() /// ``` + @MainActor func toggle() { self.set(!self.wrappedValue) } @@ -20,13 +21,14 @@ public extension SecurelyStoredValue where Item == Bool { /// /// This is meant to provide a simple ergonomic improvement, avoiding callsites like this. /// ``` - /// try self.appState.$isLoggedIn.set(!self.appState.proFeaturesEnabled) + /// self.appState.$isLoggedIn.set(!self.appState.proFeaturesEnabled) /// ``` /// /// Instead having a much simpler simpler option. /// ``` - /// try self.appState.$isLoggedIn.toggle() + /// self.appState.$isLoggedIn.toggle() /// ``` + @MainActor func toggle() throws { if let wrappedValue { try self.set(!wrappedValue) @@ -36,3 +38,19 @@ public extension SecurelyStoredValue where Item == Bool { } } +public extension AsyncStoredValue where Item == Bool { + /// A function to toggle an @``AsyncStoredValue`` that represent a `Bool`. + /// + /// This is meant to provide a simple ergonomic improvement, avoiding callsites like this. + /// ``` + /// try await self.appState.$proFeaturesEnabled.set(!self.appState.proFeaturesEnabled) + /// ``` + /// + /// Instead having a much simpler simpler option. + /// ``` + /// try await self.appState.$proFeaturesEnabled.toggle() + /// ``` + func toggle() async throws { + try await self.set(!self.wrappedValue) + } +} diff --git a/Sources/Boutique/StoredValue+Dictionary.swift b/Sources/Boutique/StoredValue+Dictionary.swift index 993122d..603c5dc 100644 --- a/Sources/Boutique/StoredValue+Dictionary.swift +++ b/Sources/Boutique/StoredValue+Dictionary.swift @@ -13,6 +13,7 @@ public extension StoredValue { /// ``` /// try await self.$redPandaList.update(key: "best", value: "Pabu") /// ``` + @MainActor func update(key: Key, value: Value?) where Item == [Key: Value] { var updatedDictionary = self.wrappedValue updatedDictionary[key] = value @@ -38,6 +39,7 @@ public extension SecurelyStoredValue { /// To better match expected uses calling update on a currently nil SecurelyStoredValue /// will return a single element dictionary of the passed in key/value, /// rather than returning nil or throwing an error. + @MainActor func update(key: Key, value: Value?) throws where Item == [Key: Value] { var updatedDictionary = self.wrappedValue ?? [:] updatedDictionary[key] = value @@ -45,3 +47,24 @@ public extension SecurelyStoredValue { } } +public extension AsyncStoredValue { + /// A function to set an @``AsyncStoredValue`` represented by a `Dictionary` + /// without having to manually make an intermediate copy for every value update. + /// + /// This is meant to provide a simple ergonomic improvement, avoiding callsites like this. + /// ``` + /// var updatedRedPandaList = try await self.redPandaList + /// updatedRedPandaList["best"] = "Pabu" + /// try await self.$redPandaList.set(updatedRedPandaList) + /// ``` + /// + /// Instead this function provides a much simpler alternative. + /// ``` + /// try await self.$redPandaList.update(key: "best", value: "Pabu") + /// ``` + func update(key: Key, value: Value?) async throws where Item == [Key: Value] { + var updatedDictionary = self.wrappedValue + updatedDictionary[key] = value + try await self.set(updatedDictionary) + } +} diff --git a/Sources/Boutique/StoredValue+KeypathSetter.swift b/Sources/Boutique/StoredValue+KeypathSetter.swift deleted file mode 100644 index c368052..0000000 --- a/Sources/Boutique/StoredValue+KeypathSetter.swift +++ /dev/null @@ -1,65 +0,0 @@ -import Foundation - -extension StoredValue { - /// A function to set the value of a property inside of a @``StoredValue`` object - /// without having to manually make an intermediate copy for every value update. - /// - /// This is meant to provide a simple ergonomic improvement for complex objects, - /// avoiding callsites like this. - /// - /// ``` - /// struct 3DCoordinates: Codable { - /// let x: Double - /// let y: Double - /// let z: Double - /// } - /// - /// var coordinates = self.coordinates - /// coordinates.x = 1.0 - /// self.$coordinates.set(coordinates) - /// ``` - /// - /// Instead this function provides a much simpler alternative. - /// ``` - /// self.$coordinates.set(\.x, to: 1.0) - /// ``` - public func set(_ keyPath: WritableKeyPath, to value: Value) { - var updatedValue = self.wrappedValue - updatedValue[keyPath: keyPath] = value - self.set(updatedValue) - } -} - -extension SecurelyStoredValue { - /// A function to set the value of a property inside of a @``StoredValue`` object - /// without having to manually make an intermediate copy for every value update. - /// - /// This is meant to provide a simple ergonomic improvement for complex objects, - /// avoiding callsites like this. - /// - /// ``` - /// struct 3DCoordinates: Codable { - /// let x: Double - /// let y: Double - /// let z: Double - /// } - /// - /// var coordinates = self.coordinates - /// coordinates.x = 1.0 - /// try self.$coordinates.set(coordinates) - /// ``` - /// - /// Instead this function provides a much simpler alternative. - /// ``` - /// try self.$coordinates.set(\.x, to: 1.0) - /// ``` - public func set(_ keyPath: WritableKeyPath, to value: Value) throws { - if let wrappedValue { - var updatedValue = wrappedValue - updatedValue[keyPath: keyPath] = value - try self.set(updatedValue) - } else { - throw KeychainError.couldNotAccessKeychain - } - } -} diff --git a/Sources/Boutique/StoredValue.swift b/Sources/Boutique/StoredValue.swift index 83fb151..43ea42d 100644 --- a/Sources/Boutique/StoredValue.swift +++ b/Sources/Boutique/StoredValue.swift @@ -1,66 +1,76 @@ +import Combine import Foundation -import Observation +import SwiftUI -@MainActor -@Observable +/// The @``StoredValue`` property wrapper to automagically persist a single `Item` in `UserDefaults` +/// rather than an array of items that would be persisted in a ``Store`` or using @``Stored``. +/// +/// You should use a @``StoredValue`` if you're only storing a single item, as opposed to a @``Store`` +/// which stores an array of items exposed as the `items: [Item]` property. +/// +/// This is useful for similar use cases as `UserDefaults`, where it's common to store only a single item +/// such as the app's `lastOpenedDate`, an object of the user's preferences, configurations, and more. +/// +/// Values are delivered synchronously and are available on app launch, using `UserDefaults` as the +/// backing store to accomplish this. If you wish to use your own `StorageEngine` you can use @``AsyncStoredValue``. +/// +/// You must initialize a @``StoredValue`` with a default value like you would any other Swift property. +/// ``` +/// @StoredValue(key: "redPanda") +/// private var redPanda = RedPanda(cuteRating: 100) +/// ``` +/// +/// A @``StoredValue`` can be nullable, but in that case you will have to specify the type as well. +/// ``` +/// @StoredValue(key: "pandaRojo") +/// private var spanishRedPanda = nil +/// ``` +/// +/// Using @``StoredValue`` is also straightforward, there are only two functions. +/// To change the value of the @``StoredValue``, you can use the ``set(_:)`` and ``reset()`` functions. +/// ``` +/// $redPanda.set(RedPanda(cuteRating: 99)) // The @StoredValue has a new red panda +/// $redPanda.reset() // The @AsyncStoredValue is nil +/// ``` +/// +/// One last bit of advice, when calling ``set(_:)`` and ``reset()`` don't forget to put a `$` +/// in front of the the `$storedValue`. +/// +/// See: ``set(_:)`` and ``reset()`` docs for a more in depth explanation. @propertyWrapper -public final class StoredValue { - private let observationRegistrar = ObservationRegistrar() - private let valueSubject: AsyncValueSubject - private let cachedValue: CachedValue - +public struct StoredValue { + private let cancellableBox = CancellableBox() private let defaultValue: Item private let key: String private let userDefaults: UserDefaults + private let itemSubject: CurrentValueSubject + + private var cachedValue: CachedValue - /// Initializes a new @``StoredValue``. - /// - /// - Parameters: - /// - key: The key to use when storing the value in `UserDefaults`. - /// - storage: The `UserDefaults` to use when storing the value. public init(wrappedValue: Item, key: String, storage userDefaults: UserDefaults = UserDefaults.standard) { self.key = key self.defaultValue = wrappedValue self.userDefaults = userDefaults let initialValue = Self.storedValue(forKey: key, userDefaults: userDefaults, defaultValue: defaultValue) - self.valueSubject = AsyncValueSubject(initialValue) - self.valueSubject.send(initialValue) + self.itemSubject = CurrentValueSubject(initialValue) self.cachedValue = CachedValue(retrieveValue: { Self.storedValue(forKey: key, userDefaults: userDefaults, defaultValue: initialValue) }) } - /// Initializes a new ``StoredValue`` directly, without using a property wrapper. - /// - /// - Parameters: - /// - key: The key to use when storing the value in `UserDefaults`. - /// - defaultValue: The default value to use when no value is stored. - /// - storage: The `UserDefaults` to use when storing the value. - public convenience init(key: String, default defaultValue: Item, storage userDefaults: UserDefaults = UserDefaults.standard) { - self.init(wrappedValue: defaultValue, key: key, storage: userDefaults) - } - /// The currently stored value public var wrappedValue: Item { - get { - self.retrieveItem() - } - set { - self.persistItem(newValue) - } + self.cachedValue.retrieveValue() } - /// A ``StoredValue`` which exposes ``set(_:)`` and ``reset()`` functions alongside an `AsyncStream` of ``values``. + /// A ``StoredValue`` which exposes ``set(_:)`` and ``reset()`` functions alongside a ``publisher``. public var projectedValue: StoredValue { self } - /// An `AsyncStream` that emits all value changes of a @``StoredValue``. - /// - /// This stream will emit the initial value when subscribed to, and will further emit - /// any changes to the value when ``set(_:)`` or ``reset()`` are called. - public var values: AsyncStream { - self.valueSubject.values + /// A Combine publisher that allows you to observe all changes to the @``StoredValue``. + public var publisher: AnyPublisher { + self.itemSubject.eraseToAnyPublisher() } /// Sets a value for the @``StoredValue`` property. @@ -84,9 +94,15 @@ public final class StoredValue { /// but `$items` projects `AnyPublisher<[Item], Never>` so you can subscribe to changes items produces. /// Within Boutique the @Stored property wrapper works very similarly. /// - /// - Parameter item: The value to set @``StoredValue`` to. - public func set(_ item: Item) { - self.persistItem(item) + /// - Parameter value: The value to set @``StoredValue`` to. + @MainActor + public func set(_ value: Item) { + let boxedValue = BoxedValue(value: value) + if let data = try? JSONCoders.encoder.encode(boxedValue) { + self.userDefaults.set(data, forKey: self.key) + self.cachedValue.set(value) + self.itemSubject.send(value) + } } /// Resets the @``StoredValue`` to the default value. @@ -109,31 +125,43 @@ public final class StoredValue { /// `@Published var items: [Item]` would let you use `items` as a regular `[Item]`, /// but $items projects `AnyPublisher<[Item], Never>` so you can subscribe to changes items produces. /// Within Boutique the @Stored property wrapper works very similarly. + @MainActor public func reset() { - self.persistItem(self.defaultValue) + let boxedValue = BoxedValue(value: self.defaultValue) + if let data = try? JSONCoders.encoder.encode(boxedValue) { + self.userDefaults.set(data, forKey: self.key) + self.cachedValue.set(self.defaultValue) + self.itemSubject.send(self.defaultValue) + } } -} -private extension StoredValue { - func retrieveItem() -> Item { - observationRegistrar.access(self, keyPath: \.wrappedValue) + public static subscript( + _enclosingInstance instance: Instance, + wrapped wrappedKeyPath: KeyPath, + storage storageKeyPath: KeyPath + ) -> Item { + let wrapper = instance[keyPath: storageKeyPath] - return self.cachedValue.retrieveValue() - } + if wrapper.cancellableBox.cancellable == nil { + wrapper.cancellableBox.cancellable = wrapper.itemSubject + .receive(on: RunLoop.main) + .sink(receiveValue: { [instance] _ in + func publisher(_ value: T) -> ObservableObjectPublisher? { + return (Proxy() as? ObservableObjectProxy)?.extractObjectWillChange(value) + } - func persistItem(_ item: Item) { - observationRegistrar.withMutation(of: self, keyPath: \.wrappedValue) { - let boxedValue = BoxedValue(value: item) - if let data = try? JSONCoders.encoder.encode(boxedValue) { - self.userDefaults.set(data, forKey: self.key) - self.cachedValue.set(item) - self.valueSubject.send(item) - } + let objectWillChangePublisher = _openExistential(instance as Any, do: publisher) + objectWillChangePublisher?.send() + }) } + + return wrapper.wrappedValue } +} +private extension StoredValue { static func storedValue(forKey key: String, userDefaults: UserDefaults, defaultValue: Item) -> Item { - if let storedValue = userDefaults.data(forKey: key), + if let storedValue = userDefaults.object(forKey: key) as? Data, let boxedValue = try? JSONCoders.decoder.decode(BoxedValue.self, from: storedValue) { return boxedValue.value } else { @@ -141,3 +169,9 @@ private extension StoredValue { } } } + +private extension StoredValue { + final class CancellableBox { + var cancellable: AnyCancellable? + } +} diff --git a/Tests/BoutiqueTests/AsyncStoreTests.swift b/Tests/BoutiqueTests/AsyncStoreTests.swift index f0649d4..5060156 100644 --- a/Tests/BoutiqueTests/AsyncStoreTests.swift +++ b/Tests/BoutiqueTests/AsyncStoreTests.swift @@ -1,56 +1,60 @@ @testable import Boutique -import Testing +import Combine +import XCTest -@MainActor -@Suite("Async Store Tests", .serialized) -struct AsyncStoreTests { +final class AsyncStoreTests: XCTestCase { private var asyncStore: Store! + private var cancellables: Set = [] - init() async throws { + override func setUp() async throws { asyncStore = try await Store( storage: SQLiteStorageEngine.default(appendingPath: "Tests"), cacheIdentifier: \.merchantID) try await asyncStore.removeAll() } - @Test("Test inserting a single item") + override func tearDown() { + cancellables.removeAll() + } + + @MainActor func testInsertingItem() async throws { try await asyncStore.insert(.coat) - #expect(asyncStore.items.contains(.coat)) + XCTAssertTrue(asyncStore.items.contains(.coat)) try await asyncStore.insert(.belt) - #expect(asyncStore.items.contains(.belt)) - #expect(asyncStore.items.count == 2) + XCTAssertTrue(asyncStore.items.contains(.belt)) + XCTAssertEqual(asyncStore.items.count, 2) } - @Test("Test inserting multiple items") - func testInsertingMultipleItems() async throws { + @MainActor + func testInsertingItems() async throws { try await asyncStore.insert([.coat, .sweater, .sweater, .purse]) - #expect(asyncStore.items.contains(.coat)) - #expect(asyncStore.items.contains(.sweater)) - #expect(asyncStore.items.contains(.purse)) + XCTAssertTrue(asyncStore.items.contains(.coat)) + XCTAssertTrue(asyncStore.items.contains(.sweater)) + XCTAssertTrue(asyncStore.items.contains(.purse)) } - @Test("Test inserting duplicate items") + @MainActor func testInsertingDuplicateItems() async throws { - #expect(asyncStore.items.isEmpty) + XCTAssertTrue(asyncStore.items.isEmpty) try await asyncStore.insert(.allItems) - #expect(asyncStore.items.count == 4) + XCTAssertEqual(asyncStore.items.count, 4) } - @Test("Test reading items") + @MainActor func testReadingItems() async throws { try await asyncStore.insert(.allItems) - #expect(asyncStore.items[0] == .coat) - #expect(asyncStore.items[1] == .sweater) - #expect(asyncStore.items[2] == .purse) - #expect(asyncStore.items[3] == .belt) + XCTAssertEqual(asyncStore.items[0], .coat) + XCTAssertEqual(asyncStore.items[1], .sweater) + XCTAssertEqual(asyncStore.items[2], .purse) + XCTAssertEqual(asyncStore.items[3], .belt) - #expect(asyncStore.items.count == 4) + XCTAssertEqual(asyncStore.items.count, 4) } - @Test("Test reading items persisted in a Store") + @MainActor func testReadingPersistedItems() async throws { try await asyncStore.insert(.allItems) @@ -59,42 +63,42 @@ struct AsyncStoreTests { storage: SQLiteStorageEngine.default(appendingPath: "Tests"), cacheIdentifier: \.merchantID) - #expect(newStore.items[0] == .coat) - #expect(newStore.items[1] == .sweater) - #expect(newStore.items[2] == .purse) - #expect(newStore.items[3] == .belt) + XCTAssertEqual(newStore.items[0], .coat) + XCTAssertEqual(newStore.items[1], .sweater) + XCTAssertEqual(newStore.items[2], .purse) + XCTAssertEqual(newStore.items[3], .belt) - #expect(newStore.items.count == 4) + XCTAssertEqual(newStore.items.count, 4) } - @Test("Test removing items") - func testRemovingSingleItems() async throws { + @MainActor + func testRemovingItems() async throws { try await asyncStore.insert(.allItems) try await asyncStore.remove(.coat) - #expect(!asyncStore.items.contains(.coat)) + XCTAssertFalse(asyncStore.items.contains(.coat)) - #expect(asyncStore.items.contains(.sweater)) - #expect(asyncStore.items.contains(.purse)) + XCTAssertTrue(asyncStore.items.contains(.sweater)) + XCTAssertTrue(asyncStore.items.contains(.purse)) try await asyncStore.remove([.sweater, .purse]) - #expect(!asyncStore.items.contains(.sweater)) - #expect(!asyncStore.items.contains(.purse)) + XCTAssertFalse(asyncStore.items.contains(.sweater)) + XCTAssertFalse(asyncStore.items.contains(.purse)) } - @Test("Test removing all items") + @MainActor func testRemoveAll() async throws { try await asyncStore.insert(.coat) - #expect(asyncStore.items.count == 1) + XCTAssertEqual(asyncStore.items.count, 1) try await asyncStore.removeAll() try await asyncStore.insert(.uniqueItems) - #expect(asyncStore.items.count == 4) + XCTAssertEqual(asyncStore.items.count, 4) try await asyncStore.removeAll() - #expect(asyncStore.items.isEmpty) + XCTAssertTrue(asyncStore.items.isEmpty) } - @Test("Test chaining insert operations") + @MainActor func testChainingInsertOperations() async throws { try await asyncStore.insert(.uniqueItems) @@ -104,11 +108,11 @@ struct AsyncStoreTests { .insert(.belt) .run() - #expect(asyncStore.items.count == 3) - #expect(asyncStore.items.contains(.sweater)) - #expect(asyncStore.items.contains(.purse)) - #expect(asyncStore.items.contains(.belt)) - #expect(!asyncStore.items.contains(.coat)) + XCTAssertEqual(asyncStore.items.count, 3) + XCTAssertTrue(asyncStore.items.contains(.sweater)) + XCTAssertTrue(asyncStore.items.contains(.purse)) + XCTAssertTrue(asyncStore.items.contains(.belt)) + XCTAssertFalse(asyncStore.items.contains(.coat)) try await asyncStore.removeAll() @@ -119,10 +123,10 @@ struct AsyncStoreTests { .insert(.sweater) .run() - #expect(asyncStore.items.count == 2) - #expect(asyncStore.items.contains(.coat)) - #expect(asyncStore.items.contains(.sweater)) - #expect(!asyncStore.items.contains(.belt)) + XCTAssertEqual(asyncStore.items.count, 2) + XCTAssertTrue(asyncStore.items.contains(.coat)) + XCTAssertTrue(asyncStore.items.contains(.sweater)) + XCTAssertFalse(asyncStore.items.contains(.belt)) try await asyncStore.removeAll() @@ -134,11 +138,11 @@ struct AsyncStoreTests { .insert([.sweater]) .run() - #expect(asyncStore.items.count == 2) - #expect(asyncStore.items.contains(.sweater)) - #expect(asyncStore.items.contains(.purse)) - #expect(!asyncStore.items.contains(.coat)) - #expect(!asyncStore.items.contains(.belt)) + XCTAssertEqual(asyncStore.items.count, 2) + XCTAssertTrue(asyncStore.items.contains(.sweater)) + XCTAssertTrue(asyncStore.items.contains(.purse)) + XCTAssertFalse(asyncStore.items.contains(.coat)) + XCTAssertFalse(asyncStore.items.contains(.belt)) try await asyncStore.removeAll() @@ -151,11 +155,11 @@ struct AsyncStoreTests { .insert(.sweater) .run() - #expect(asyncStore.items.count == 2) - #expect(asyncStore.items.contains(.sweater)) - #expect(asyncStore.items.contains(.purse)) - #expect(!asyncStore.items.contains(.coat)) - #expect(!asyncStore.items.contains(.belt)) + XCTAssertEqual(asyncStore.items.count, 2) + XCTAssertTrue(asyncStore.items.contains(.sweater)) + XCTAssertTrue(asyncStore.items.contains(.purse)) + XCTAssertFalse(asyncStore.items.contains(.coat)) + XCTAssertFalse(asyncStore.items.contains(.belt)) try await asyncStore.removeAll() @@ -164,10 +168,10 @@ struct AsyncStoreTests { .insert([.purse, .belt]) .run() - #expect(asyncStore.items.count == 3) - #expect(asyncStore.items.contains(.purse)) - #expect(asyncStore.items.contains(.belt)) - #expect(asyncStore.items.contains(.coat)) + XCTAssertEqual(asyncStore.items.count, 3) + XCTAssertTrue(asyncStore.items.contains(.purse)) + XCTAssertTrue(asyncStore.items.contains(.belt)) + XCTAssertTrue(asyncStore.items.contains(.coat)) try await asyncStore.removeAll() @@ -177,10 +181,10 @@ struct AsyncStoreTests { .remove(.purse) .run() - #expect(asyncStore.items.count == 2) - #expect(!asyncStore.items.contains(.purse)) - #expect(asyncStore.items.contains(.belt)) - #expect(asyncStore.items.contains(.coat)) + XCTAssertEqual(asyncStore.items.count, 2) + XCTAssertFalse(asyncStore.items.contains(.purse)) + XCTAssertTrue(asyncStore.items.contains(.belt)) + XCTAssertTrue(asyncStore.items.contains(.coat)) try await asyncStore.removeAll() @@ -191,10 +195,10 @@ struct AsyncStoreTests { .remove(.purse) .run() - #expect(asyncStore.items.count == 1) - #expect(!asyncStore.items.contains(.purse)) - #expect(asyncStore.items.contains(.belt)) - #expect(!asyncStore.items.contains(.coat)) + XCTAssertEqual(asyncStore.items.count, 1) + XCTAssertFalse(asyncStore.items.contains(.purse)) + XCTAssertTrue(asyncStore.items.contains(.belt)) + XCTAssertFalse(asyncStore.items.contains(.coat)) try await asyncStore.removeAll() @@ -205,10 +209,10 @@ struct AsyncStoreTests { .removeAll() .run() - #expect(asyncStore.items.count == 0) - #expect(!asyncStore.items.contains(.purse)) - #expect(!asyncStore.items.contains(.belt)) - #expect(!asyncStore.items.contains(.coat)) + XCTAssertEqual(asyncStore.items.count, 0) + XCTAssertFalse(asyncStore.items.contains(.purse)) + XCTAssertFalse(asyncStore.items.contains(.belt)) + XCTAssertFalse(asyncStore.items.contains(.coat)) try await asyncStore .insert([.coat]) @@ -216,13 +220,13 @@ struct AsyncStoreTests { .insert([.purse, .belt]) .run() - #expect(asyncStore.items.count == 2) - #expect(asyncStore.items.contains(.purse)) - #expect(asyncStore.items.contains(.belt)) - #expect(!asyncStore.items.contains(.coat)) + XCTAssertEqual(asyncStore.items.count, 2) + XCTAssertTrue(asyncStore.items.contains(.purse)) + XCTAssertTrue(asyncStore.items.contains(.belt)) + XCTAssertFalse(asyncStore.items.contains(.coat)) } - @Test("Test chaining remove operations") + @MainActor func testChainingRemoveOperations() async throws { try await asyncStore .insert(.uniqueItems) @@ -230,28 +234,28 @@ struct AsyncStoreTests { .remove(.purse) .run() - #expect(asyncStore.items.count == 2) - #expect(asyncStore.items.contains(.sweater)) - #expect(asyncStore.items.contains(.coat)) + XCTAssertEqual(asyncStore.items.count, 2) + XCTAssertTrue(asyncStore.items.contains(.sweater)) + XCTAssertTrue(asyncStore.items.contains(.coat)) try await asyncStore.insert(.uniqueItems) - #expect(asyncStore.items.count == 4) + XCTAssertEqual(asyncStore.items.count, 4) try await asyncStore .remove([.sweater, .coat]) .remove(.belt) .run() - #expect(asyncStore.items.count == 1) - #expect(asyncStore.items.contains(.purse)) + XCTAssertEqual(asyncStore.items.count, 1) + XCTAssertTrue(asyncStore.items.contains(.purse)) try await asyncStore .removeAll() .insert(.belt) .run() - #expect(asyncStore.items.count == 1) - #expect(asyncStore.items.contains(.belt)) + XCTAssertEqual(asyncStore.items.count, 1) + XCTAssertTrue(asyncStore.items.contains(.belt)) try await asyncStore .removeAll() @@ -259,86 +263,43 @@ struct AsyncStoreTests { .insert(.belt) .run() - #expect(asyncStore.items.count == 1) - #expect(asyncStore.items.contains(.belt)) + XCTAssertEqual(asyncStore.items.count, 1) + XCTAssertTrue(asyncStore.items.contains(.belt)) } - @Test("Test that chained operations don't execute unless explicitly run") - func testChainedOperationsDontExecuteUnlessRun() async throws { + @MainActor + func testChainingOperationsDontExecuteUnlessRun() async throws { let operation = try await asyncStore .insert(.coat) .insert([.purse, .belt]) - #expect(asyncStore.items.count == 0) - #expect(!asyncStore.items.contains(.purse)) - #expect(!asyncStore.items.contains(.belt)) - #expect(!asyncStore.items.contains(.coat)) + XCTAssertEqual(asyncStore.items.count, 0) + XCTAssertFalse(asyncStore.items.contains(.purse)) + XCTAssertFalse(asyncStore.items.contains(.belt)) + XCTAssertFalse(asyncStore.items.contains(.coat)) // Adding this line to get rid of the error about // `operation` being unused, given that's the point of the test. _ = operation } - @Test("Test the ability to observe an AsyncStream of Store.events by inserting one value at a time", .timeLimit(.minutes(1))) - func testAsyncStreamByInsertingSingleItems() async throws { - let populateStoreTask = Task { - var accumulatedValues: [BoutiqueItem] = [] - - for await event in asyncStore.events { - try asyncStore.validateStoreEvent(event: event) - - accumulatedValues += event.items - - if accumulatedValues.count == 4 { - #expect(accumulatedValues == [.coat, .sweater, .purse, .belt]) - return true - } - } - - return false - } - - #expect(asyncStore.items.isEmpty) - - Task { - let uniqueItems = [BoutiqueItem].uniqueItems - - try await asyncStore.insert(uniqueItems[0]) - try await asyncStore.insert(uniqueItems[1]) - try await asyncStore.insert(uniqueItems[2]) - try await asyncStore.insert(uniqueItems[3]) - } - - let populateStoreTaskCompleted = try await populateStoreTask.value - try #require(populateStoreTaskCompleted) - } - - @Test("Test the ability to observe an AsyncStream of Store.values by inserting an array of values", .timeLimit(.minutes(1))) - func testAsyncStreamByInsertingMultipleItems() async throws { - let populateStoreTask = Task { - var accumulatedValues: [BoutiqueItem] = [] - for await event in asyncStore.events { - try asyncStore.validateStoreEvent(event: event) + @MainActor + func testPublishedItemsSubscription() async throws { + let uniqueItems: [BoutiqueItem] = .uniqueItems + let expectation = XCTestExpectation(description: "uniqueItems is published and read") - accumulatedValues.append(contentsOf: event.items) + asyncStore.$items + .dropFirst() + .sink(receiveValue: { items in + XCTAssertEqual(items, uniqueItems) + expectation.fulfill() + }) + .store(in: &cancellables) - if accumulatedValues.count == 4 { - #expect(accumulatedValues == [.coat, .sweater, .purse, .belt]) - return true - } - } + XCTAssertTrue(asyncStore.items.isEmpty) - return false - } - - #expect(asyncStore.items.isEmpty) - - Task { - try await asyncStore.insert(.uniqueItems) - } - - let populateStoreTaskCompleted = try await populateStoreTask.value - try #require(populateStoreTaskCompleted) + // Sets items under the hood + try await asyncStore.insert(uniqueItems) + wait(for: [expectation], timeout: 1) } - } diff --git a/Tests/BoutiqueTests/AsyncStoredValueTests.swift b/Tests/BoutiqueTests/AsyncStoredValueTests.swift new file mode 100644 index 0000000..56ac4d0 --- /dev/null +++ b/Tests/BoutiqueTests/AsyncStoredValueTests.swift @@ -0,0 +1,137 @@ +import Boutique +import Combine +import SwiftUI +import XCTest + +final class AsyncStoredValueTests: XCTestCase { + private var cancellables: Set = [] + + @AsyncStoredValue(storage: SQLiteStorageEngine.default(appendingPath: "storedItem")) + private var storedItem = BoutiqueItem.coat + + @AsyncStoredValue(storage: SQLiteStorageEngine.default(appendingPath: "storedBool")) + private var storedBoolValue = false + + @AsyncStoredValue(storage: SQLiteStorageEngine.default(appendingPath: "storedDictionary")) + private var storedDictionaryValue: [String : String] = [:] + + @AsyncStoredValue(storage: SQLiteStorageEngine.default(appendingPath: "storedArray")) + private var storedArrayValue: [BoutiqueItem] = [] + + @AsyncStoredValue(storage: SQLiteStorageEngine.default(appendingPath: "storedBinding")) + private var storedBinding = BoutiqueItem.sweater + + override func setUp() async throws { + try await self.$storedItem.reset() + try await self.$storedBoolValue.reset() + try await self.$storedDictionaryValue.reset() + try await self.$storedArrayValue.reset() + try await self.$storedBinding.reset() + } + + func testStorageEngineBackedStoredValue() async throws { + XCTAssertEqual(self.storedItem, .coat) + + try await self.$storedItem.set(.belt) + XCTAssertEqual(self.storedItem, .belt) + + try await self.$storedItem.reset() + XCTAssertEqual(self.storedItem, .coat) + } + + func testBoolAsyncStoredValue() async throws { + XCTAssertEqual(self.storedBoolValue, false) + + try await self.$storedBoolValue.toggle() + XCTAssertEqual(self.storedBoolValue, true) + + try await self.$storedBoolValue.set(false) + XCTAssertEqual(self.storedBoolValue, false) + + try await self.$storedBoolValue.toggle() + XCTAssertEqual(self.storedBoolValue, true) + } + + func testStoredBoolValueToggle() async throws { + XCTAssertEqual(self.storedBoolValue, false) + + try await self.$storedBoolValue.toggle() + XCTAssertEqual(self.storedBoolValue, true) + + try await self.$storedBoolValue.set(false) + XCTAssertEqual(self.storedBoolValue, false) + + try await self.$storedBoolValue.toggle() + XCTAssertEqual(self.storedBoolValue, true) + } + + func testStoredDictionaryValueUpdate() async throws { + XCTAssertEqual(self.storedDictionaryValue, [:]) + + try await self.$storedDictionaryValue.update(key: BoutiqueItem.sweater.merchantID, value: BoutiqueItem.sweater.value) + XCTAssertEqual(self.storedDictionaryValue, [BoutiqueItem.sweater.merchantID : BoutiqueItem.sweater.value]) + + try await self.$storedDictionaryValue.update(key: BoutiqueItem.belt.merchantID, value: nil) + XCTAssertEqual(self.storedDictionaryValue, [BoutiqueItem.sweater.merchantID : BoutiqueItem.sweater.value]) + + try await self.$storedDictionaryValue.update(key: BoutiqueItem.sweater.merchantID, value: nil) + XCTAssertEqual(self.storedDictionaryValue, [:]) + } + + func testStoredArrayValueAppend() async throws { + XCTAssertEqual(self.storedArrayValue, []) + + try await self.$storedArrayValue.append(.sweater) + XCTAssertEqual(self.storedArrayValue, [.sweater]) + + try await self.$storedArrayValue.append(.belt) + XCTAssertEqual(self.storedArrayValue, [.sweater, .belt]) + } + + func testStoredArrayValueTogglePresence() async throws { + XCTAssertEqual(self.storedArrayValue, []) + + try await self.$storedArrayValue.togglePresence(.sweater) + XCTAssertEqual(self.storedArrayValue, [.sweater]) + + try await self.$storedArrayValue.togglePresence(.sweater) + XCTAssertEqual(self.storedArrayValue, []) + + try await self.$storedArrayValue.togglePresence(.sweater) + try await self.$storedArrayValue.togglePresence(.belt) + XCTAssertEqual(self.storedArrayValue, [.sweater, .belt]) + + try await self.$storedArrayValue.togglePresence(.belt) + XCTAssertEqual(self.storedArrayValue, [.sweater]) + } + + func testStoredBinding() async throws { + XCTAssertEqual(self.$storedBinding.binding.wrappedValue, Binding.constant(.sweater).wrappedValue) + + try await self.$storedBinding.set(.belt) + XCTAssertEqual(self.$storedBinding.binding.wrappedValue, Binding.constant(.belt).wrappedValue) + } + + func testStoredValuePublishedSubscription() async throws { + let expectation = XCTestExpectation(description: "@AsyncStoredValue publishes values correctly") + + var values: [BoutiqueItem] = [] + + self.$storedItem.publisher + .sink(receiveValue: { item in + values.append(item) + + if values.count == 4 { + XCTAssertEqual(values, [.coat, .sweater, .purse, .belt]) + expectation.fulfill() + } + }) + .store(in: &cancellables) + + try await self.$storedItem.set(.sweater) + try await self.$storedItem.set(.purse) + try await self.$storedItem.set(.belt) + + wait(for: [expectation], timeout: 1) + } +} diff --git a/Tests/BoutiqueTests/BoutiqueItem.swift b/Tests/BoutiqueTests/BoutiqueItem.swift index eea552c..02c2b5d 100644 --- a/Tests/BoutiqueTests/BoutiqueItem.swift +++ b/Tests/BoutiqueTests/BoutiqueItem.swift @@ -1,6 +1,6 @@ import Foundation -struct BoutiqueItem: Codable, Sendable, Equatable, Identifiable { +struct BoutiqueItem: Codable, Equatable, Identifiable { var id: String { self.merchantID } diff --git a/Tests/BoutiqueTests/SecurelyStoredValueTests.swift b/Tests/BoutiqueTests/SecurelyStoredValueTests.swift index fc6e580..7ca2fb5 100644 --- a/Tests/BoutiqueTests/SecurelyStoredValueTests.swift +++ b/Tests/BoutiqueTests/SecurelyStoredValueTests.swift @@ -1,10 +1,11 @@ import Boutique +import Combine import SwiftUI -import Testing +import XCTest + +final class SecurelyStoredValueTests: XCTestCase { + private var cancellables: Set = [] -@MainActor -@Suite("@SecurelyStoredValue Tests") -struct SecurelyStoredValueTests { @SecurelyStoredValue(key: "securePassword") private var storedPassword @@ -25,15 +26,19 @@ struct SecurelyStoredValueTests { @SecurelyStoredValue(key: "Boutique.SecurelyStoredValue.Test") private var storedExistingValue - + @SecurelyStoredValue(key: "secureGroupString", group: "com.boutique.tests") private var storedGroupValue - init() async throws { + @MainActor + override func setUp() async throws { if self.storedExistingValue == nil { try self.$storedExistingValue.set("Existence") } + } + @MainActor + override func tearDown() async throws { try self.$storedPassword.remove() try self.$storedBool.remove() try self.$storedItem.remove() @@ -43,133 +48,135 @@ struct SecurelyStoredValueTests { try self.$storedGroupValue.remove() } - @Test("Test that the previous SecurelyStoredValue was persisted") - func testPersistedValueExists() { + func testExistingValuePersists() { // Ensure that values not explicitly removed from the keychain continue to persist across runs - #expect(self.storedExistingValue != nil) + XCTAssertNotEqual(self.storedExistingValue, nil) } - @Test("Test that SecurelyStoredValue operations work as expected") - func testStoredValueOperations() async throws { - #expect(self.storedPassword == nil) + func testStoredValue() async throws { + XCTAssertEqual(self.storedPassword, nil) + + try await self.$storedPassword.set("p@ssw0rd") + XCTAssertEqual(self.storedPassword, "p@ssw0rd") + + try await self.$storedPassword.remove() + XCTAssertEqual(self.storedPassword, nil) + } + + @MainActor + func testStoredValueOnMainActor() throws { + XCTAssertEqual(self.storedPassword, nil) try self.$storedPassword.set("p@ssw0rd") - #expect(self.storedPassword == "p@ssw0rd") + XCTAssertEqual(self.storedPassword, "p@ssw0rd") try self.$storedPassword.remove() - #expect(self.storedPassword == nil) + XCTAssertEqual(self.storedPassword, nil) } - @Test("Test that SecurelyStoredValue works with custom types") - func testStoredValueCustomType() async throws { - #expect(self.storedItem == nil) + func testStoredCustomType() async throws { + XCTAssertEqual(self.storedItem, nil) - try self.$storedItem.set(.sweater) - #expect(self.storedItem == .sweater) + try await self.$storedItem.set(.sweater) + XCTAssertEqual(self.storedItem, .sweater) - try self.$storedItem.set(.belt) - #expect(self.storedItem == .belt) + try await self.$storedItem.set(.belt) + XCTAssertEqual(self.storedItem, .belt) - try self.$storedItem.remove() - #expect(self.storedItem == nil) + try await self.$storedItem.remove() + XCTAssertEqual(self.storedItem, nil) } - @Test("Test that SecurelyStoredValue works with array operations") - func testStoredArrayOperations() async throws { - #expect(self.storedArray == nil) + func testStoredArray() async throws { + XCTAssertEqual(self.storedArray, nil) - try self.$storedArray.set([.belt, .sweater]) - #expect(self.storedArray == [.belt, .sweater]) + try await self.$storedArray.set([.belt, .sweater]) + XCTAssertEqual(self.storedArray, [.belt, .sweater]) - try self.$storedArray.remove() - #expect(self.storedArray == nil) + try await self.$storedArray.remove() + XCTAssertEqual(self.storedArray, nil) } - @Test("Test that SecurelyStoredValue works when a group is specified") func testStoredGroupValue() async throws { - #expect(self.storedGroupValue == nil) + XCTAssertEqual(self.storedGroupValue, nil) - try self.$storedGroupValue.set("p@ssw0rd") - #expect(self.storedGroupValue == "p@ssw0rd") + try await self.$storedGroupValue.set("p@ssw0rd") + XCTAssertEqual(self.storedGroupValue, "p@ssw0rd") - try self.$storedGroupValue.remove() - #expect(self.storedGroupValue == nil) + try await self.$storedGroupValue.remove() + XCTAssertEqual(self.storedGroupValue, nil) } - @Test("Test that SecurelyStoredValue works with boolean values") - func testStoredBooleanValues() async throws { - #expect(self.storedBool == nil) + func testStoredBoolean() async throws { + XCTAssertEqual(self.storedBool, nil) - try self.$storedBool.set(true) - #expect(self.storedBool == true) + try await self.$storedBool.set(true) + XCTAssertEqual(self.storedBool, true) - try self.$storedBool.set(false) - #expect(self.storedBool == false) + try await self.$storedBool.set(false) + XCTAssertEqual(self.storedBool, false) - try self.$storedBool.toggle() - #expect(self.storedBool == true) + try await self.$storedBool.toggle() + XCTAssertEqual(self.storedBool, true) } - @Test("Test the StoredValue.update function when StoredValue is a dictionary") - func testStoredValueDictionaryUpdate() async throws { - #expect(self.storedDictionary == nil) + func testStoredDictionary() async throws { + XCTAssertEqual(self.storedDictionary, nil) - try self.$storedDictionary.update(key: BoutiqueItem.sweater.merchantID, value: .sweater) - #expect(self.storedDictionary == [BoutiqueItem.sweater.merchantID : .sweater]) + try await self.$storedDictionary.update(key: BoutiqueItem.sweater.merchantID, value: .sweater) + XCTAssertEqual(self.storedDictionary, [BoutiqueItem.sweater.merchantID : .sweater]) - try self.$storedDictionary.update(key: BoutiqueItem.belt.merchantID, value: nil) - #expect(self.storedDictionary == [BoutiqueItem.sweater.merchantID : .sweater]) + try await self.$storedDictionary.update(key: BoutiqueItem.belt.merchantID, value: nil) + XCTAssertEqual(self.storedDictionary, [BoutiqueItem.sweater.merchantID : .sweater]) - try self.$storedDictionary.update(key: BoutiqueItem.sweater.merchantID, value: nil) - #expect(self.storedDictionary == [:]) + try await self.$storedDictionary.update(key: BoutiqueItem.sweater.merchantID, value: nil) + XCTAssertEqual(self.storedDictionary, [:]) } - @Test("Test the StoredValue.append function when StoredValue is an array") - func testStoredValueArrayAppend() async throws { - #expect(self.storedArray == nil) + func testStoredArrayValueAppend() async throws { + XCTAssertEqual(self.storedArray, nil) - try self.$storedArray.append(.sweater) - #expect(self.storedArray == [.sweater]) + try await self.$storedArray.append(.sweater) + XCTAssertEqual(self.storedArray, [.sweater]) - try self.$storedArray.append(.belt) - #expect(self.storedArray == [.sweater, .belt]) + try await self.$storedArray.append(.belt) + XCTAssertEqual(self.storedArray, [.sweater, .belt]) } - @Test("Test StoredValue.binding") + @MainActor func testStoredBinding() async throws { - #expect(self.storedBinding == nil) - + XCTAssertEqual(self.storedBinding, nil) + // Using wrappedValue for our tests to work around the fact that Binding doesn't conform to Equatable - #expect(self.$storedBinding.binding.wrappedValue == nil) + XCTAssertEqual(self.$storedBinding.binding.wrappedValue, nil) try self.$storedBinding.set(.belt) - #expect(self.$storedBinding.binding.wrappedValue == Binding.constant(.belt).wrappedValue) + XCTAssertEqual(self.$storedBinding.binding.wrappedValue, Binding.constant(.belt).wrappedValue) } - @Test("Test the ability to observe an AsyncStream of StoredValue.values", .timeLimit(.minutes(1))) - func testStoredValuesAsyncStream() async throws { - let populateStoredValueTask = Task { - var values: [BoutiqueItem?] = [] - for await value in self.$storedItem.values { - values.append(value) + func testPublishedValueSubscription() async throws { + let expectation = XCTestExpectation(description: "@SecurelyStoredValue publishes values correctly") - if values.count == 4 { - #expect(values == [nil, .sweater, .purse, .belt]) - return true + var values: [BoutiqueItem] = [] + + self.$storedItem.publisher + .sink(receiveValue: { item in + if let item { + values.append(item) } - } - return false - } + if values.count == 4 { + XCTAssertEqual(values, [.coat, .purse, .sweater, .belt]) + expectation.fulfill() + } + }) + .store(in: &cancellables) - Task { - try self.$storedItem.set(.sweater) - try self.$storedItem.set(.purse) - try self.$storedItem.set(.belt) - } + try await self.$storedItem.set(.coat) + try await self.$storedItem.set(.purse) + try await self.$storedItem.set(.sweater) + try await self.$storedItem.set(.belt) - let populateStoredValueTaskCompleted = await populateStoredValueTask.value - try #require(populateStoredValueTaskCompleted) + await fulfillment(of: [expectation], timeout: 1) } - } diff --git a/Tests/BoutiqueTests/StoreEvent.Tests.Requirements.swift b/Tests/BoutiqueTests/StoreEvent.Tests.Requirements.swift deleted file mode 100644 index 9e36c1b..0000000 --- a/Tests/BoutiqueTests/StoreEvent.Tests.Requirements.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Boutique -import Testing - -extension Store { - func validateStoreEvent(event: StoreEvent) throws { - if self.items.isEmpty { - try #require(event.operation == .initialized || event.operation == .loaded || event.operation == .remove) - } else { - try #require(event.operation == .insert) - } - } -} diff --git a/Tests/BoutiqueTests/StoreTests.swift b/Tests/BoutiqueTests/StoreTests.swift index 8daf75f..b708082 100644 --- a/Tests/BoutiqueTests/StoreTests.swift +++ b/Tests/BoutiqueTests/StoreTests.swift @@ -1,12 +1,12 @@ @testable import Boutique -import Testing +import Combine +import XCTest -@MainActor -@Suite("Store Tests", .serialized) -struct StoreTests { +final class StoreTests: XCTestCase { private var store: Store! + private var cancellables: Set = [] - init() async throws { + override func setUp() async throws { // Returns a `Store` using the non-async init. This is a workaround for Swift prioritizing the // `async` version of the overload while in an `async` context, such as the `setUp()` here. // There's a separate `AsyncStoreTests` file with matching tests using the async init. @@ -20,44 +20,48 @@ struct StoreTests { try await store.removeAll() } - @Test("Test inserting a single item") + override func tearDown() { + cancellables.removeAll() + } + + @MainActor func testInsertingItem() async throws { try await store.insert(.coat) - #expect(store.items.contains(.coat)) + XCTAssertTrue(store.items.contains(.coat)) try await store.insert(.belt) - #expect(store.items.contains(.belt)) - #expect(store.items.count == 2) + XCTAssertTrue(store.items.contains(.belt)) + XCTAssertEqual(store.items.count, 2) } - @Test("Test inserting multiple items") - func testInsertingMultipleItems() async throws { + @MainActor + func testInsertingItems() async throws { try await store.insert([.coat, .sweater, .sweater, .purse]) - #expect(store.items.contains(.coat)) - #expect(store.items.contains(.sweater)) - #expect(store.items.contains(.purse)) + XCTAssertTrue(store.items.contains(.coat)) + XCTAssertTrue(store.items.contains(.sweater)) + XCTAssertTrue(store.items.contains(.purse)) } - @Test("Test inserting duplicate items") + @MainActor func testInsertingDuplicateItems() async throws { - #expect(store.items.isEmpty) + XCTAssertTrue(store.items.isEmpty) try await store.insert(.allItems) - #expect(store.items.count == 4) + XCTAssertEqual(store.items.count, 4) } - @Test("Test reading items") + @MainActor func testReadingItems() async throws { try await store.insert(.allItems) - #expect(store.items[0] == .coat) - #expect(store.items[1] == .sweater) - #expect(store.items[2] == .purse) - #expect(store.items[3] == .belt) + XCTAssertEqual(store.items[0], .coat) + XCTAssertEqual(store.items[1], .sweater) + XCTAssertEqual(store.items[2], .purse) + XCTAssertEqual(store.items[3], .belt) - #expect(store.items.count == 4) + XCTAssertEqual(store.items.count, 4) } - @Test("Test reading items persisted in a Store") + @MainActor func testReadingPersistedItems() async throws { try await store.insert(.allItems) @@ -66,42 +70,42 @@ struct StoreTests { storage: SQLiteStorageEngine.default(appendingPath: "Tests"), cacheIdentifier: \.merchantID) - #expect(newStore.items[0] == .coat) - #expect(newStore.items[1] == .sweater) - #expect(newStore.items[2] == .purse) - #expect(newStore.items[3] == .belt) + XCTAssertEqual(newStore.items[0], .coat) + XCTAssertEqual(newStore.items[1], .sweater) + XCTAssertEqual(newStore.items[2], .purse) + XCTAssertEqual(newStore.items[3], .belt) - #expect(newStore.items.count == 4) + XCTAssertEqual(newStore.items.count, 4) } - @Test("Test removing items") - func testRemovingSingleItems() async throws { + @MainActor + func testRemovingItems() async throws { try await store.insert(.allItems) try await store.remove(.coat) - #expect(!store.items.contains(.coat)) + XCTAssertFalse(store.items.contains(.coat)) - #expect(store.items.contains(.sweater)) - #expect(store.items.contains(.purse)) + XCTAssertTrue(store.items.contains(.sweater)) + XCTAssertTrue(store.items.contains(.purse)) try await store.remove([.sweater, .purse]) - #expect(!store.items.contains(.sweater)) - #expect(!store.items.contains(.purse)) + XCTAssertFalse(store.items.contains(.sweater)) + XCTAssertFalse(store.items.contains(.purse)) } - @Test("Test removing all items") + @MainActor func testRemoveAll() async throws { try await store.insert(.coat) - #expect(store.items.count == 1) + XCTAssertEqual(store.items.count, 1) try await store.removeAll() try await store.insert(.uniqueItems) - #expect(store.items.count == 4) + XCTAssertEqual(store.items.count, 4) try await store.removeAll() - #expect(store.items.isEmpty) + XCTAssertTrue(store.items.isEmpty) } - @Test("Test chaining insert operations") + @MainActor func testChainingInsertOperations() async throws { try await store.insert(.uniqueItems) @@ -111,11 +115,11 @@ struct StoreTests { .insert(.belt) .run() - #expect(store.items.count == 3) - #expect(store.items.contains(.sweater)) - #expect(store.items.contains(.purse)) - #expect(store.items.contains(.belt)) - #expect(!store.items.contains(.coat)) + XCTAssertEqual(store.items.count, 3) + XCTAssertTrue(store.items.contains(.sweater)) + XCTAssertTrue(store.items.contains(.purse)) + XCTAssertTrue(store.items.contains(.belt)) + XCTAssertFalse(store.items.contains(.coat)) try await store.removeAll() @@ -126,10 +130,10 @@ struct StoreTests { .insert(.sweater) .run() - #expect(store.items.count == 2) - #expect(store.items.contains(.coat)) - #expect(store.items.contains(.sweater)) - #expect(!store.items.contains(.belt)) + XCTAssertEqual(store.items.count, 2) + XCTAssertTrue(store.items.contains(.coat)) + XCTAssertTrue(store.items.contains(.sweater)) + XCTAssertFalse(store.items.contains(.belt)) try await store.removeAll() @@ -141,11 +145,11 @@ struct StoreTests { .insert([.sweater]) .run() - #expect(store.items.count == 2) - #expect(store.items.contains(.sweater)) - #expect(store.items.contains(.purse)) - #expect(!store.items.contains(.coat)) - #expect(!store.items.contains(.belt)) + XCTAssertEqual(store.items.count, 2) + XCTAssertTrue(store.items.contains(.sweater)) + XCTAssertTrue(store.items.contains(.purse)) + XCTAssertFalse(store.items.contains(.coat)) + XCTAssertFalse(store.items.contains(.belt)) try await store.removeAll() @@ -158,11 +162,11 @@ struct StoreTests { .insert(.sweater) .run() - #expect(store.items.count == 2) - #expect(store.items.contains(.sweater)) - #expect(store.items.contains(.purse)) - #expect(!store.items.contains(.coat)) - #expect(!store.items.contains(.belt)) + XCTAssertEqual(store.items.count, 2) + XCTAssertTrue(store.items.contains(.sweater)) + XCTAssertTrue(store.items.contains(.purse)) + XCTAssertFalse(store.items.contains(.coat)) + XCTAssertFalse(store.items.contains(.belt)) try await store.removeAll() @@ -171,10 +175,10 @@ struct StoreTests { .insert([.purse, .belt]) .run() - #expect(store.items.count == 3) - #expect(store.items.contains(.purse)) - #expect(store.items.contains(.belt)) - #expect(store.items.contains(.coat)) + XCTAssertEqual(store.items.count, 3) + XCTAssertTrue(store.items.contains(.purse)) + XCTAssertTrue(store.items.contains(.belt)) + XCTAssertTrue(store.items.contains(.coat)) try await store.removeAll() @@ -184,10 +188,10 @@ struct StoreTests { .remove(.purse) .run() - #expect(store.items.count == 2) - #expect(!store.items.contains(.purse)) - #expect(store.items.contains(.belt)) - #expect(store.items.contains(.coat)) + XCTAssertEqual(store.items.count, 2) + XCTAssertFalse(store.items.contains(.purse)) + XCTAssertTrue(store.items.contains(.belt)) + XCTAssertTrue(store.items.contains(.coat)) try await store.removeAll() @@ -198,10 +202,10 @@ struct StoreTests { .remove(.purse) .run() - #expect(store.items.count == 1) - #expect(!store.items.contains(.purse)) - #expect(store.items.contains(.belt)) - #expect(!store.items.contains(.coat)) + XCTAssertEqual(store.items.count, 1) + XCTAssertFalse(store.items.contains(.purse)) + XCTAssertTrue(store.items.contains(.belt)) + XCTAssertFalse(store.items.contains(.coat)) try await store.removeAll() @@ -212,10 +216,10 @@ struct StoreTests { .removeAll() .run() - #expect(store.items.count == 0) - #expect(!store.items.contains(.purse)) - #expect(!store.items.contains(.belt)) - #expect(!store.items.contains(.coat)) + XCTAssertEqual(store.items.count, 0) + XCTAssertFalse(store.items.contains(.purse)) + XCTAssertFalse(store.items.contains(.belt)) + XCTAssertFalse(store.items.contains(.coat)) try await store .insert([.coat]) @@ -223,13 +227,13 @@ struct StoreTests { .insert([.purse, .belt]) .run() - #expect(store.items.count == 2) - #expect(store.items.contains(.purse)) - #expect(store.items.contains(.belt)) - #expect(!store.items.contains(.coat)) + XCTAssertEqual(store.items.count, 2) + XCTAssertTrue(store.items.contains(.purse)) + XCTAssertTrue(store.items.contains(.belt)) + XCTAssertFalse(store.items.contains(.coat)) } - @Test("Test chaining remove operations") + @MainActor func testChainingRemoveOperations() async throws { try await store .insert(.uniqueItems) @@ -237,28 +241,28 @@ struct StoreTests { .remove(.purse) .run() - #expect(store.items.count == 2) - #expect(store.items.contains(.sweater)) - #expect(store.items.contains(.coat)) + XCTAssertEqual(store.items.count, 2) + XCTAssertTrue(store.items.contains(.sweater)) + XCTAssertTrue(store.items.contains(.coat)) try await store.insert(.uniqueItems) - #expect(store.items.count == 4) + XCTAssertEqual(store.items.count, 4) try await store .remove([.sweater, .coat]) .remove(.belt) .run() - #expect(store.items.count == 1) - #expect(store.items.contains(.purse)) + XCTAssertEqual(store.items.count, 1) + XCTAssertTrue(store.items.contains(.purse)) try await store .removeAll() .insert(.belt) .run() - #expect(store.items.count == 1) - #expect(store.items.contains(.belt)) + XCTAssertEqual(store.items.count, 1) + XCTAssertTrue(store.items.contains(.belt)) try await store .removeAll() @@ -266,85 +270,44 @@ struct StoreTests { .insert(.belt) .run() - #expect(store.items.count == 1) - #expect(store.items.contains(.belt)) + XCTAssertEqual(store.items.count, 1) + XCTAssertTrue(store.items.contains(.belt)) } - @Test("Test that chained operations don't execute unless explicitly run") - func testChainedOperationsDontExecuteUnlessRun() async throws { + @MainActor + func testChainingOperationsDontExecuteUnlessRun() async throws { let operation = try await store .insert(.coat) .insert([.purse, .belt]) - #expect(store.items.count == 0) - #expect(!store.items.contains(.purse)) - #expect(!store.items.contains(.belt)) - #expect(!store.items.contains(.coat)) + XCTAssertEqual(store.items.count, 0) + XCTAssertFalse(store.items.contains(.purse)) + XCTAssertFalse(store.items.contains(.belt)) + XCTAssertFalse(store.items.contains(.coat)) // Adding this line to get rid of the error about // `operation` being unused, given that's the point of the test. _ = operation } - @Test("Test the ability to observe an AsyncStream of Store.events by inserting one value at a time", .timeLimit(.minutes(1))) - func testAsyncStreamByInsertingSingleItems() async throws { - let populateStoreTask = Task { - var accumulatedValues: [BoutiqueItem] = [] - - for await event in store.events { - try store.validateStoreEvent(event: event) - - accumulatedValues += event.items - - if accumulatedValues.count == 4 { - #expect(accumulatedValues == [.coat, .sweater, .purse, .belt]) - return true - } - } - - return false - } - - #expect(store.items.isEmpty) - - Task { - let uniqueItems = [BoutiqueItem].uniqueItems - - try await store.insert(uniqueItems[0]) - try await store.insert(uniqueItems[1]) - try await store.insert(uniqueItems[2]) - try await store.insert(uniqueItems[3]) - } - - let populateStoreTaskCompleted = try await populateStoreTask.value - try #require(populateStoreTaskCompleted) - } - - @Test("Test the ability to observe an AsyncStream of Store.events by inserting an array of values", .timeLimit(.minutes(1))) - func testAsyncStreamByInsertingMultipleItems() async throws { - let populateStoreTask = Task { - var accumulatedValues: [BoutiqueItem] = [] - for await event in store.events { - try store.validateStoreEvent(event: event) - - accumulatedValues.append(contentsOf: event.items) + @MainActor + func testPublishedItemsSubscription() async throws { + let uniqueItems: [BoutiqueItem] = .uniqueItems + let expectation = XCTestExpectation(description: "uniqueItems is published and read") - if accumulatedValues.count == 4 { - #expect(accumulatedValues == [.coat, .sweater, .purse, .belt]) - return true - } - } + store.$items + .dropFirst() + .sink(receiveValue: { items in + XCTAssertEqual(items, uniqueItems) + expectation.fulfill() + }) + .store(in: &cancellables) - return false - } - - #expect(store.items.isEmpty) + XCTAssertTrue(store.items.isEmpty) - Task { - try await store.insert(.uniqueItems) - } - - let populateStoreTaskCompleted = try await populateStoreTask.value - try #require(populateStoreTaskCompleted) + // Sets items under the hood + try await store.insert(uniqueItems) + wait(for: [expectation], timeout: 1) } } + diff --git a/Tests/BoutiqueTests/StoredTests.swift b/Tests/BoutiqueTests/StoredTests.swift index 571e1e8..0626fb2 100644 --- a/Tests/BoutiqueTests/StoredTests.swift +++ b/Tests/BoutiqueTests/StoredTests.swift @@ -1,53 +1,64 @@ @testable import Boutique -import Testing +import Combine +import XCTest -@MainActor -@Suite("@Stored Tests", .serialized) -struct StoredTests { +extension Store where Item == BoutiqueItem { + static let boutiqueItemsStore = Store( + storage: SQLiteStorageEngine.default(appendingPath: "StoredTests") + ) +} + +final class StoredTests: XCTestCase { @Stored(in: .boutiqueItemsStore) private var items - init() async throws { + private var cancellables: Set = [] + + override func setUp() async throws { try await $items.removeAll() } - @Test("Test inserting a single item") + override func tearDown() { + cancellables.removeAll() + } + + @MainActor func testInsertingItem() async throws { try await $items.insert(.coat) - #expect(items.contains(.coat)) + XCTAssertTrue(items.contains(.coat)) try await $items.insert(.belt) - #expect(items.contains(.belt)) - #expect(items.count == 2) + XCTAssertTrue(items.contains(.belt)) + XCTAssertEqual(items.count, 2) } - @Test("Test inserting multiple items") - func testInsertingMultipleItems() async throws { + @MainActor + func testInsertingItems() async throws { try await $items.insert([.coat, .sweater, .sweater, .purse]) - #expect(items.contains(.coat)) - #expect(items.contains(.sweater)) - #expect(items.contains(.purse)) + XCTAssertTrue(items.contains(.coat)) + XCTAssertTrue(items.contains(.sweater)) + XCTAssertTrue(items.contains(.purse)) } - @Test("Test inserting duplicate items") + @MainActor func testInsertingDuplicateItems() async throws { - #expect(items.isEmpty) + XCTAssertTrue(items.isEmpty) try await $items.insert(.allItems) - #expect(items.count == 4) + XCTAssertEqual(items.count, 4) } - @Test("Test reading items") + @MainActor func testReadingItems() async throws { try await $items.insert(.allItems) - #expect(items[0] == .coat) - #expect(items[1] == .sweater) - #expect(items[2] == .purse) - #expect(items[3] == .belt) + XCTAssertEqual(items[0], .coat) + XCTAssertEqual(items[1], .sweater) + XCTAssertEqual(items[2], .purse) + XCTAssertEqual(items[3], .belt) - #expect(items.count == 4) + XCTAssertEqual(items.count, 4) } - @Test("Test reading items persisted in a Store") + @MainActor func testReadingPersistedItems() async throws { try await $items.insert(.allItems) @@ -57,42 +68,42 @@ struct StoredTests { cacheIdentifier: \.merchantID ) - #expect(newStore.items.count == 4) + XCTAssertEqual(newStore.items.count, 4) - #expect(newStore.items[0] == .coat) - #expect(newStore.items[1] == .sweater) - #expect(newStore.items[2] == .purse) - #expect(newStore.items[3] == .belt) + XCTAssertEqual(newStore.items[0], .coat) + XCTAssertEqual(newStore.items[1], .sweater) + XCTAssertEqual(newStore.items[2], .purse) + XCTAssertEqual(newStore.items[3], .belt) } - @Test("Test removing items") - func testRemovingSingleItems() async throws { + @MainActor + func testRemovingItems() async throws { try await $items.insert(.allItems) try await $items.remove(.coat) - #expect(!items.contains(.coat)) + XCTAssertFalse(items.contains(.coat)) - #expect(items.contains(.sweater)) - #expect(items.contains(.purse)) + XCTAssertTrue(items.contains(.sweater)) + XCTAssertTrue(items.contains(.purse)) try await $items.remove([.sweater, .purse]) - #expect(!items.contains(.sweater)) - #expect(!items.contains(.purse)) + XCTAssertFalse(items.contains(.sweater)) + XCTAssertFalse(items.contains(.purse)) } - @Test("Test removing all items") + @MainActor func testRemoveAll() async throws { try await $items.insert(.coat) - #expect(items.count == 1) + XCTAssertEqual(items.count, 1) try await $items.removeAll() try await $items.insert(.uniqueItems) - #expect(items.count == 4) + XCTAssertEqual(items.count, 4) try await $items.removeAll() - #expect(items.isEmpty) + XCTAssertTrue(items.isEmpty) } - @Test("Test chaining insert operations") + @MainActor func testChainingInsertOperations() async throws { try await $items.insert(.uniqueItems) @@ -102,11 +113,11 @@ struct StoredTests { .insert(.belt) .run() - #expect(items.count == 3) - #expect(items.contains(.sweater)) - #expect(items.contains(.purse)) - #expect(items.contains(.belt)) - #expect(!items.contains(.coat)) + XCTAssertEqual(items.count, 3) + XCTAssertTrue(items.contains(.sweater)) + XCTAssertTrue(items.contains(.purse)) + XCTAssertTrue(items.contains(.belt)) + XCTAssertFalse(items.contains(.coat)) try await $items.removeAll() @@ -117,10 +128,10 @@ struct StoredTests { .insert(.sweater) .run() - #expect(items.count == 2) - #expect(items.contains(.coat)) - #expect(items.contains(.sweater)) - #expect(!items.contains(.belt)) + XCTAssertEqual(items.count, 2) + XCTAssertTrue(items.contains(.coat)) + XCTAssertTrue(items.contains(.sweater)) + XCTAssertFalse(items.contains(.belt)) try await $items.removeAll() @@ -132,11 +143,11 @@ struct StoredTests { .insert([.sweater]) .run() - #expect(items.count == 2) - #expect(items.contains(.sweater)) - #expect(items.contains(.purse)) - #expect(!items.contains(.coat)) - #expect(!items.contains(.belt)) + XCTAssertEqual(items.count, 2) + XCTAssertTrue(items.contains(.sweater)) + XCTAssertTrue(items.contains(.purse)) + XCTAssertFalse(items.contains(.coat)) + XCTAssertFalse(items.contains(.belt)) try await $items.removeAll() @@ -149,11 +160,11 @@ struct StoredTests { .insert(.sweater) .run() - #expect(items.count == 2) - #expect(items.contains(.sweater)) - #expect(items.contains(.purse)) - #expect(!items.contains(.coat)) - #expect(!items.contains(.belt)) + XCTAssertEqual(items.count, 2) + XCTAssertTrue(items.contains(.sweater)) + XCTAssertTrue(items.contains(.purse)) + XCTAssertFalse(items.contains(.coat)) + XCTAssertFalse(items.contains(.belt)) try await $items.removeAll() @@ -162,10 +173,10 @@ struct StoredTests { .insert([.purse, .belt]) .run() - #expect(items.count == 3) - #expect(items.contains(.purse)) - #expect(items.contains(.belt)) - #expect(items.contains(.coat)) + XCTAssertEqual(items.count, 3) + XCTAssertTrue(items.contains(.purse)) + XCTAssertTrue(items.contains(.belt)) + XCTAssertTrue(items.contains(.coat)) try await $items.removeAll() @@ -175,10 +186,10 @@ struct StoredTests { .remove(.purse) .run() - #expect(items.count == 2) - #expect(!items.contains(.purse)) - #expect(items.contains(.belt)) - #expect(items.contains(.coat)) + XCTAssertEqual(items.count, 2) + XCTAssertFalse(items.contains(.purse)) + XCTAssertTrue(items.contains(.belt)) + XCTAssertTrue(items.contains(.coat)) try await $items.removeAll() @@ -189,10 +200,10 @@ struct StoredTests { .remove(.purse) .run() - #expect(items.count == 1) - #expect(!items.contains(.purse)) - #expect(items.contains(.belt)) - #expect(!items.contains(.coat)) + XCTAssertEqual(items.count, 1) + XCTAssertFalse(items.contains(.purse)) + XCTAssertTrue(items.contains(.belt)) + XCTAssertFalse(items.contains(.coat)) try await $items.removeAll() @@ -203,10 +214,10 @@ struct StoredTests { .removeAll() .run() - #expect(items.count == 0) - #expect(!items.contains(.purse)) - #expect(!items.contains(.belt)) - #expect(!items.contains(.coat)) + XCTAssertEqual(items.count, 0) + XCTAssertFalse(items.contains(.purse)) + XCTAssertFalse(items.contains(.belt)) + XCTAssertFalse(items.contains(.coat)) try await $items .insert([.coat]) @@ -214,13 +225,13 @@ struct StoredTests { .insert([.purse, .belt]) .run() - #expect(items.count == 2) - #expect(items.contains(.purse)) - #expect(items.contains(.belt)) - #expect(!items.contains(.coat)) + XCTAssertEqual(items.count, 2) + XCTAssertTrue(items.contains(.purse)) + XCTAssertTrue(items.contains(.belt)) + XCTAssertFalse(items.contains(.coat)) } - @Test("Test chaining remove operations") + @MainActor func testChainingRemoveOperations() async throws { try await $items .insert(.uniqueItems) @@ -228,28 +239,28 @@ struct StoredTests { .remove(.purse) .run() - #expect(items.count == 2) - #expect(items.contains(.sweater)) - #expect(items.contains(.coat)) + XCTAssertEqual(items.count, 2) + XCTAssertTrue(items.contains(.sweater)) + XCTAssertTrue(items.contains(.coat)) try await $items.insert(.uniqueItems) - #expect(items.count == 4) + XCTAssertEqual(items.count, 4) try await $items .remove([.sweater, .coat]) .remove(.belt) .run() - #expect(items.count == 1) - #expect(items.contains(.purse)) + XCTAssertEqual(items.count, 1) + XCTAssertTrue(items.contains(.purse)) try await $items .removeAll() .insert(.belt) .run() - #expect(items.count == 1) - #expect(items.contains(.belt)) + XCTAssertEqual(items.count, 1) + XCTAssertTrue(items.contains(.belt)) try await $items .removeAll() @@ -257,92 +268,43 @@ struct StoredTests { .insert(.belt) .run() - #expect(items.count == 1) - #expect(items.contains(.belt)) + XCTAssertEqual(items.count, 1) + XCTAssertTrue(items.contains(.belt)) } - @Test("Test that chained operations don't execute unless explicitly run") - func testChainedOperationsDontExecuteUnlessRun() async throws { + @MainActor + func testChainingOperationsDontExecuteUnlessRun() async throws { let operation = try await $items .insert(.coat) .insert([.purse, .belt]) - #expect(items.count == 0) - #expect(!items.contains(.purse)) - #expect(!items.contains(.belt)) - #expect(!items.contains(.coat)) + XCTAssertEqual(items.count, 0) + XCTAssertFalse(items.contains(.purse)) + XCTAssertFalse(items.contains(.belt)) + XCTAssertFalse(items.contains(.coat)) // Adding this line to get rid of the error about // `operation` being unused, given that's the point of the test. _ = operation } - @Test("Test the ability to observe an AsyncStream of Stored.events by inserting one value at a time", .timeLimit(.minutes(1))) - func testAsyncStreamByInsertingSingleItems() async throws { - let populateStoreTask = Task { - var accumulatedValues: [BoutiqueItem] = [] - - for await event in $items.events { - try $items.validateStoreEvent(event: event) - - accumulatedValues += event.items - - if accumulatedValues.count == 4 { - #expect(accumulatedValues == [.coat, .sweater, .purse, .belt]) - return true - } - } + @MainActor + func testPublishedItemsSubscription() async throws { + let uniqueItems = [BoutiqueItem].uniqueItems + let expectation = XCTestExpectation(description: "uniqueItems is published and read") - return false - } + $items.$items + .dropFirst() + .sink(receiveValue: { items in + XCTAssertEqual(items, uniqueItems) + expectation.fulfill() + }) + .store(in: &cancellables) - #expect(items.isEmpty) + XCTAssertTrue(items.isEmpty) - Task { - let uniqueItems = [BoutiqueItem].uniqueItems - - try await $items.insert(uniqueItems[0]) - try await $items.insert(uniqueItems[1]) - try await $items.insert(uniqueItems[2]) - try await $items.insert(uniqueItems[3]) - } - - let populateStoreTaskCompleted = try await populateStoreTask.value - try #require(populateStoreTaskCompleted) + // Sets items under the hood + try await $items.insert(uniqueItems) + wait(for: [expectation], timeout: 1) } - - @Test("Test the ability to observe an AsyncStream of Stored.values by inserting an array of values", .timeLimit(.minutes(1))) - func testAsyncStreamByInsertingMultipleItems() async throws { - let populateStoreTask = Task { - var accumulatedValues: [BoutiqueItem] = [] - - for await event in $items.events { - try $items.validateStoreEvent(event: event) - - accumulatedValues.append(contentsOf: event.items) - - if accumulatedValues.count == 4 { - #expect(accumulatedValues == [.coat, .sweater, .purse, .belt]) - return true - } - } - - return false - } - - #expect(items.isEmpty) - - Task { - try await $items.insert(.uniqueItems) - } - - let populateStoreTaskCompleted = try await populateStoreTask.value - try #require(populateStoreTaskCompleted) - } -} - -private extension Store where Item == BoutiqueItem { - static let boutiqueItemsStore = Store( - storage: SQLiteStorageEngine.default(appendingPath: "StoredTests") - ) } diff --git a/Tests/BoutiqueTests/StoredValueTests.swift b/Tests/BoutiqueTests/StoredValueTests.swift index 4fc9d50..ecfc280 100644 --- a/Tests/BoutiqueTests/StoredValueTests.swift +++ b/Tests/BoutiqueTests/StoredValueTests.swift @@ -1,10 +1,11 @@ import Boutique +import Combine import SwiftUI -import Testing +import XCTest + +final class StoredValueTests: XCTestCase { + private var cancellables: Set = [] -@MainActor -@Suite("@StoredValue Tests") -struct StoredValueTests { @StoredValue(key: "storedItem") private var storedItem = .coat @@ -23,7 +24,8 @@ struct StoredValueTests { @StoredValue(key: "storedBinding") private var storedBinding = BoutiqueItem.sweater - init() { + @MainActor + override func setUp() { self.$storedItem.reset() self.$storedBoolValue.reset() self.$storedNilValue.reset() @@ -32,123 +34,130 @@ struct StoredValueTests { self.$storedBinding.reset() } - @Test("Test that StoredValue operations work as expected") func testStoredValueOperations() async throws { - #expect(self.storedItem == .coat) + XCTAssertEqual(self.storedItem, .coat) + + await self.$storedItem.set(.belt) + XCTAssertEqual(self.storedItem, .belt) + + await self.$storedItem.reset() + XCTAssertEqual(self.storedItem, .coat) + + await self.$storedItem.set(.sweater) + XCTAssertEqual(self.storedItem, .sweater) + } + + @MainActor + func testStoredValueOnMainActorOperations() async throws { + XCTAssertEqual(self.storedItem, .coat) self.$storedItem.set(.belt) - #expect(self.storedItem == .belt) + XCTAssertEqual(self.storedItem, .belt) self.$storedItem.reset() - #expect(self.storedItem == .coat) + XCTAssertEqual(self.storedItem, .coat) self.$storedItem.set(.sweater) - #expect(self.storedItem == .sweater) + XCTAssertEqual(self.storedItem, .sweater) } - @Test("Test that a StoredValue can be nilled out") - func testStoredValueNilSupport() async throws { - #expect(self.storedNilValue == nil) + func testStoredNilValue() async throws { + XCTAssertEqual(self.storedNilValue, nil) - self.$storedNilValue.set(.belt) - #expect(self.storedNilValue == .belt) + await self.$storedNilValue.set(.belt) + XCTAssertEqual(self.storedNilValue, .belt) - self.$storedNilValue.reset() - #expect(self.storedNilValue == nil) + await self.$storedNilValue.reset() + XCTAssertEqual(self.storedNilValue, nil) - self.$storedNilValue.set(.sweater) - #expect(self.storedNilValue == .sweater) + await self.$storedNilValue.set(.sweater) + XCTAssertEqual(self.storedNilValue, .sweater) } - @Test("Test the StoredValue.toggle function") - func testStoredValueBoolToggle() async throws { - #expect(self.storedBoolValue == false) + func testStoredBoolValueToggle() async throws { + XCTAssertEqual(self.storedBoolValue, false) - self.$storedBoolValue.toggle() - #expect(self.storedBoolValue == true) + await self.$storedBoolValue.toggle() + XCTAssertEqual(self.storedBoolValue, true) - self.$storedBoolValue.set(false) - #expect(self.storedBoolValue == false) + await self.$storedBoolValue.set(false) + XCTAssertEqual(self.storedBoolValue, false) - self.$storedBoolValue.toggle() - #expect(self.storedBoolValue == true) + await self.$storedBoolValue.toggle() + XCTAssertEqual(self.storedBoolValue, true) } - @Test("Test the StoredValue.update function when StoredValue is a dictionary") - func testStoredValueDictionaryUpdate() async throws { - #expect(self.storedDictionaryValue == [:]) + func testStoredDictionaryValueUpdate() async throws { + XCTAssertEqual(self.storedDictionaryValue, [:]) - self.$storedDictionaryValue.update(key: BoutiqueItem.sweater.merchantID, value: .sweater) - #expect(self.storedDictionaryValue == [BoutiqueItem.sweater.merchantID : .sweater]) + await self.$storedDictionaryValue.update(key: BoutiqueItem.sweater.merchantID, value: .sweater) + XCTAssertEqual(self.storedDictionaryValue, [BoutiqueItem.sweater.merchantID : .sweater]) - self.$storedDictionaryValue.update(key: BoutiqueItem.belt.merchantID, value: nil) - #expect(self.storedDictionaryValue == [BoutiqueItem.sweater.merchantID : .sweater]) + await self.$storedDictionaryValue.update(key: BoutiqueItem.belt.merchantID, value: nil) + XCTAssertEqual(self.storedDictionaryValue, [BoutiqueItem.sweater.merchantID : .sweater]) - self.$storedDictionaryValue.update(key: BoutiqueItem.sweater.merchantID, value: nil) - #expect(self.storedDictionaryValue == [:]) + await self.$storedDictionaryValue.update(key: BoutiqueItem.sweater.merchantID, value: nil) + XCTAssertEqual(self.storedDictionaryValue, [:]) } - @Test("Test the StoredValue.append function when StoredValue is an array") - func testStoredValueArrayAppend() async throws { - #expect(self.storedArrayValue == []) + func testStoredArrayValueAppend() async throws { + XCTAssertEqual(self.storedArrayValue, []) - self.$storedArrayValue.append(.sweater) - #expect(self.storedArrayValue == [.sweater]) + await self.$storedArrayValue.append(.sweater) + XCTAssertEqual(self.storedArrayValue, [.sweater]) - self.$storedArrayValue.append(.belt) - #expect(self.storedArrayValue == [.sweater, .belt]) + await self.$storedArrayValue.append(.belt) + XCTAssertEqual(self.storedArrayValue, [.sweater, .belt]) } - @Test("Test the StoredValue.togglePresence function when StoredValue is an array") - func testStoredValueArrayTogglePresence() async throws { - #expect(self.storedArrayValue == []) + func testStoredArrayValueTogglePresence() async throws { + XCTAssertEqual(self.storedArrayValue, []) - self.$storedArrayValue.togglePresence(.sweater) - #expect(self.storedArrayValue == [.sweater]) + await self.$storedArrayValue.togglePresence(.sweater) + XCTAssertEqual(self.storedArrayValue, [.sweater]) - self.$storedArrayValue.togglePresence(.sweater) - #expect(self.storedArrayValue == []) + await self.$storedArrayValue.togglePresence(.sweater) + XCTAssertEqual(self.storedArrayValue, []) - self.$storedArrayValue.togglePresence(.sweater) - self.$storedArrayValue.togglePresence(.belt) - #expect(self.storedArrayValue == [.sweater, .belt]) + await self.$storedArrayValue.togglePresence(.sweater) + await self.$storedArrayValue.togglePresence(.belt) + XCTAssertEqual(self.storedArrayValue, [.sweater, .belt]) - self.$storedArrayValue.togglePresence(.belt) - #expect(self.storedArrayValue == [.sweater]) + await self.$storedArrayValue.togglePresence(.belt) + XCTAssertEqual(self.storedArrayValue, [.sweater]) } - @Test("Test StoredValue.binding") + @MainActor func testStoredBinding() async throws { // Using wrappedValue for our tests to work around the fact that Binding doesn't conform to Equatable - #expect(self.$storedBinding.binding.wrappedValue == Binding.constant(.sweater).wrappedValue) + XCTAssertEqual(self.$storedBinding.binding.wrappedValue, Binding.constant(.sweater).wrappedValue) self.$storedBinding.set(.belt) - #expect(self.$storedBinding.binding.wrappedValue == Binding.constant(.belt).wrappedValue) + XCTAssertEqual(self.$storedBinding.binding.wrappedValue, Binding.constant(.belt).wrappedValue) } - @Test("Test the ability to observe an AsyncStream of StoredValue.values", .timeLimit(.minutes(1))) - func testStoredValuesAsyncStream() async throws { - let populateStoredValueTask = Task { - var values: [BoutiqueItem] = [] - for await value in self.$storedItem.values { - values.append(value) + func testPublishedValueSubscription() async throws { + let expectation = XCTestExpectation(description: "@StoredValue publishes values correctly") + + var values: [BoutiqueItem] = [] + + self.$storedItem.publisher + .sink(receiveValue: { item in + values.append(item) + if values.count == 4 { - #expect(values == [.coat, .sweater, .purse, .belt]) - return true + XCTAssertEqual(values, [.coat, .purse, .sweater, .belt]) + expectation.fulfill() } - } - - return false - } + }) + .store(in: &cancellables) - Task { - self.$storedItem.set(.sweater) - self.$storedItem.set(.purse) - self.$storedItem.set(.belt) - } + await self.$storedItem.set(.purse) + await self.$storedItem.set(.sweater) + await self.$storedItem.set(.belt) - let populateStoredValueTaskCompleted = await populateStoredValueTask.value - try #require(populateStoredValueTaskCompleted) + await fulfillment(of: [expectation], timeout: 1) } } + diff --git a/docs/css/523.e9a069b0.css b/docs/css/523.e9a069b0.css new file mode 100644 index 0000000..1b2d801 --- /dev/null +++ b/docs/css/523.e9a069b0.css @@ -0,0 +1,9 @@ +/*! + * This source file is part of the Swift.org open source project + * + * Copyright (c) 2021 Apple Inc. and the Swift project authors + * Licensed under Apache License v2.0 with Runtime Library Exception + * + * See https://swift.org/LICENSE.txt for license information + * See https://swift.org/CONTRIBUTORS.txt for Swift project authors + */aside[data-v-3ccce809]{-moz-column-break-inside:avoid;break-inside:avoid;border-radius:var(--aside-border-radius,var(--border-radius,4px));border-style:var(--aside-border-style,solid);border-width:var(--aside-border-width,0 0 0 6px);padding:.9411764706rem;text-align:start}aside .label[data-v-3ccce809]{font-size:1rem;line-height:1.5294117647;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}aside .label+[data-v-3ccce809]{margin-top:var(--spacing-stacked-margin-small)}aside.deprecated[data-v-3ccce809]{background-color:var(--color-aside-deprecated-background);border-color:var(--color-aside-deprecated-border);box-shadow:0 0 0 0 var(--color-aside-deprecated-border) inset,0 0 0 0 var(--color-aside-deprecated-border)}aside.deprecated .label[data-v-3ccce809]{color:var(--color-aside-deprecated)}aside.experiment[data-v-3ccce809]{background-color:var(--color-aside-experiment-background);border-color:var(--color-aside-experiment-border);box-shadow:0 0 0 0 var(--color-aside-experiment-border) inset,0 0 0 0 var(--color-aside-experiment-border)}aside.experiment .label[data-v-3ccce809]{color:var(--color-aside-experiment)}aside.important[data-v-3ccce809]{background-color:var(--color-aside-important-background);border-color:var(--color-aside-important-border);box-shadow:0 0 0 0 var(--color-aside-important-border) inset,0 0 0 0 var(--color-aside-important-border)}aside.important .label[data-v-3ccce809]{color:var(--color-aside-important)}aside.note[data-v-3ccce809]{background-color:var(--color-aside-note-background);border-color:var(--color-aside-note-border);box-shadow:0 0 0 0 var(--color-aside-note-border) inset,0 0 0 0 var(--color-aside-note-border)}aside.note .label[data-v-3ccce809]{color:var(--color-aside-note)}aside.tip[data-v-3ccce809]{background-color:var(--color-aside-tip-background);border-color:var(--color-aside-tip-border);box-shadow:0 0 0 0 var(--color-aside-tip-border) inset,0 0 0 0 var(--color-aside-tip-border)}aside.tip .label[data-v-3ccce809]{color:var(--color-aside-tip)}aside.warning[data-v-3ccce809]{background-color:var(--color-aside-warning-background);border-color:var(--color-aside-warning-border);box-shadow:0 0 0 0 var(--color-aside-warning-border) inset,0 0 0 0 var(--color-aside-warning-border)}aside.warning .label[data-v-3ccce809]{color:var(--color-aside-warning)}code[data-v-08295b2f]:before{content:attr(data-before-code)}code[data-v-08295b2f]:after{content:attr(data-after-code)}code[data-v-08295b2f]:after,code[data-v-08295b2f]:before{display:block;position:absolute;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(0 0 99.9% 99.9%);clip-path:inset(0 0 99.9% 99.9%);overflow:hidden;height:1px;width:1px;padding:0;border:0}.swift-file-icon.file-icon[data-v-c01a6890]{height:1rem}.file-icon[data-v-7c381064]{position:relative;align-items:flex-end;height:24px;margin:0 .5rem 0 1rem}.filename[data-v-c8c40662]{color:var(--text,var(--colors-secondary-label,var(--color-secondary-label)));font-size:.9411764706rem;line-height:1.1875;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);margin-top:1rem}@media only screen and (max-width:735px){.filename[data-v-c8c40662]{font-size:.8235294118rem;line-height:1.4285714286;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);margin-top:0}}.filename>a[data-v-c8c40662],.filename>span[data-v-c8c40662]{display:flex;align-items:center;line-height:normal}a[data-v-c8c40662]{color:var(--url,var(--color-link))}.code-line-container[data-v-570d1ba0]{display:inline-block;width:100%;box-sizing:border-box}.code-number[data-v-570d1ba0]{display:inline-block;padding:0 1rem 0 8px;text-align:right;min-width:2em;color:#666;-webkit-user-select:none;-moz-user-select:none;user-select:none}.code-number[data-v-570d1ba0]:before{content:attr(data-line-number)}.highlighted[data-v-570d1ba0]{background:var(--line-highlight,var(--color-code-line-highlight));border-left:4px solid var(--color-code-line-highlight-border)}.highlighted .code-number[data-v-570d1ba0]{padding-left:4px}pre[data-v-570d1ba0]{padding:14px 0;display:flex;overflow:unset;-webkit-overflow-scrolling:touch;white-space:pre;word-wrap:normal;height:100%}@media only screen and (max-width:735px){pre[data-v-570d1ba0]{padding-top:.8235294118rem}}code[data-v-570d1ba0]{white-space:pre;word-wrap:normal;flex-grow:9999}.code-listing[data-v-570d1ba0],.container-general[data-v-570d1ba0]{display:flex}.code-listing[data-v-570d1ba0]{flex-direction:column;border-radius:var(--code-border-radius,var(--border-radius,4px));overflow:hidden;filter:blur(0)}.code-listing.single-line[data-v-570d1ba0]{border-radius:var(--border-radius,4px)}.container-general[data-v-570d1ba0]{overflow:auto}.container-general[data-v-570d1ba0],pre[data-v-570d1ba0]{flex-grow:1}.header-anchor[data-v-24fddf6a]{color:inherit;text-decoration:none;position:relative;padding-right:23px;display:inline-block}.header-anchor[data-v-24fddf6a]:after{position:absolute;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(0 0 99.9% 99.9%);clip-path:inset(0 0 99.9% 99.9%);overflow:hidden;height:1px;width:1px;padding:0;border:0;content:attr(data-after-text)}.header-anchor .icon[data-v-24fddf6a]{position:absolute;right:0;bottom:.2em;display:none;height:16px;margin-left:7px}.header-anchor:focus .icon[data-v-24fddf6a],.header-anchor:hover .icon[data-v-24fddf6a]{display:inline}code[data-v-05f4a5b7]{speak-punctuation:code}.container-general[data-v-25a17a0e]{display:flex;flex-flow:row wrap}.container-general .code-line[data-v-25a17a0e]{flex:1 0 auto}.code-line-container[data-v-25a17a0e]{width:100%;align-items:center;display:flex;border-left:4px solid transparent;counter-increment:linenumbers;padding-right:14px}.code-number[data-v-25a17a0e]{font-size:.7058823529rem;line-height:1.5;font-weight:400;font-family:var(--typography-html-font-mono,Menlo,monospace);padding:0 1rem 0 8px;text-align:right;min-width:2.01em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.code-number[data-v-25a17a0e]:before{content:counter(linenumbers)}.code-line[data-v-25a17a0e]{display:flex}pre[data-v-25a17a0e]{padding:14px 0;display:flex;flex-flow:row wrap;overflow:auto;-webkit-overflow-scrolling:touch;white-space:pre;word-wrap:normal}@media only screen and (max-width:735px){pre[data-v-25a17a0e]{padding-top:.8235294118rem}}.collapsible-code-listing[data-v-25a17a0e]{background:var(--background,var(--color-code-background));border-color:var(--colors-grid,var(--color-grid));color:var(--text,var(--color-code-plain));border-radius:var(--border-radius,4px);border-style:solid;border-width:1px;counter-reset:linenumbers;font-size:15px}.collapsible-code-listing.single-line[data-v-25a17a0e]{border-radius:var(--border-radius,4px)}.collapsible[data-v-25a17a0e]{background:var(--color-code-collapsible-background);color:var(--color-code-collapsible-text)}.collapsed[data-v-25a17a0e]:before{content:"⋯";display:inline-block;font-family:monospace;font-weight:700;height:100%;line-height:1;text-align:right;width:2.3rem}.collapsed .code-line-container[data-v-25a17a0e]{height:0;visibility:hidden}.row[data-v-be73599c]{box-sizing:border-box;display:flex;flex-flow:row wrap}.col[data-v-2ee3ad8b]{box-sizing:border-box;flex:none}.xlarge-1[data-v-2ee3ad8b]{flex-basis:8.3333333333%;max-width:8.3333333333%}.xlarge-2[data-v-2ee3ad8b]{flex-basis:16.6666666667%;max-width:16.6666666667%}.xlarge-3[data-v-2ee3ad8b]{flex-basis:25%;max-width:25%}.xlarge-4[data-v-2ee3ad8b]{flex-basis:33.3333333333%;max-width:33.3333333333%}.xlarge-5[data-v-2ee3ad8b]{flex-basis:41.6666666667%;max-width:41.6666666667%}.xlarge-6[data-v-2ee3ad8b]{flex-basis:50%;max-width:50%}.xlarge-7[data-v-2ee3ad8b]{flex-basis:58.3333333333%;max-width:58.3333333333%}.xlarge-8[data-v-2ee3ad8b]{flex-basis:66.6666666667%;max-width:66.6666666667%}.xlarge-9[data-v-2ee3ad8b]{flex-basis:75%;max-width:75%}.xlarge-10[data-v-2ee3ad8b]{flex-basis:83.3333333333%;max-width:83.3333333333%}.xlarge-11[data-v-2ee3ad8b]{flex-basis:91.6666666667%;max-width:91.6666666667%}.xlarge-12[data-v-2ee3ad8b]{flex-basis:100%;max-width:100%}.xlarge-centered[data-v-2ee3ad8b]{margin-left:auto;margin-right:auto}.xlarge-uncentered[data-v-2ee3ad8b]{margin-left:0;margin-right:0}.large-1[data-v-2ee3ad8b]{flex-basis:8.3333333333%;max-width:8.3333333333%}.large-2[data-v-2ee3ad8b]{flex-basis:16.6666666667%;max-width:16.6666666667%}.large-3[data-v-2ee3ad8b]{flex-basis:25%;max-width:25%}.large-4[data-v-2ee3ad8b]{flex-basis:33.3333333333%;max-width:33.3333333333%}.large-5[data-v-2ee3ad8b]{flex-basis:41.6666666667%;max-width:41.6666666667%}.large-6[data-v-2ee3ad8b]{flex-basis:50%;max-width:50%}.large-7[data-v-2ee3ad8b]{flex-basis:58.3333333333%;max-width:58.3333333333%}.large-8[data-v-2ee3ad8b]{flex-basis:66.6666666667%;max-width:66.6666666667%}.large-9[data-v-2ee3ad8b]{flex-basis:75%;max-width:75%}.large-10[data-v-2ee3ad8b]{flex-basis:83.3333333333%;max-width:83.3333333333%}.large-11[data-v-2ee3ad8b]{flex-basis:91.6666666667%;max-width:91.6666666667%}.large-12[data-v-2ee3ad8b]{flex-basis:100%;max-width:100%}.large-centered[data-v-2ee3ad8b]{margin-left:auto;margin-right:auto}.large-uncentered[data-v-2ee3ad8b]{margin-left:0;margin-right:0}@media only screen and (max-width:1250px){.medium-1[data-v-2ee3ad8b]{flex-basis:8.3333333333%;max-width:8.3333333333%}.medium-2[data-v-2ee3ad8b]{flex-basis:16.6666666667%;max-width:16.6666666667%}.medium-3[data-v-2ee3ad8b]{flex-basis:25%;max-width:25%}.medium-4[data-v-2ee3ad8b]{flex-basis:33.3333333333%;max-width:33.3333333333%}.medium-5[data-v-2ee3ad8b]{flex-basis:41.6666666667%;max-width:41.6666666667%}.medium-6[data-v-2ee3ad8b]{flex-basis:50%;max-width:50%}.medium-7[data-v-2ee3ad8b]{flex-basis:58.3333333333%;max-width:58.3333333333%}.medium-8[data-v-2ee3ad8b]{flex-basis:66.6666666667%;max-width:66.6666666667%}.medium-9[data-v-2ee3ad8b]{flex-basis:75%;max-width:75%}.medium-10[data-v-2ee3ad8b]{flex-basis:83.3333333333%;max-width:83.3333333333%}.medium-11[data-v-2ee3ad8b]{flex-basis:91.6666666667%;max-width:91.6666666667%}.medium-12[data-v-2ee3ad8b]{flex-basis:100%;max-width:100%}.medium-centered[data-v-2ee3ad8b]{margin-left:auto;margin-right:auto}.medium-uncentered[data-v-2ee3ad8b]{margin-left:0;margin-right:0}}@media only screen and (max-width:735px){.small-1[data-v-2ee3ad8b]{flex-basis:8.3333333333%;max-width:8.3333333333%}.small-2[data-v-2ee3ad8b]{flex-basis:16.6666666667%;max-width:16.6666666667%}.small-3[data-v-2ee3ad8b]{flex-basis:25%;max-width:25%}.small-4[data-v-2ee3ad8b]{flex-basis:33.3333333333%;max-width:33.3333333333%}.small-5[data-v-2ee3ad8b]{flex-basis:41.6666666667%;max-width:41.6666666667%}.small-6[data-v-2ee3ad8b]{flex-basis:50%;max-width:50%}.small-7[data-v-2ee3ad8b]{flex-basis:58.3333333333%;max-width:58.3333333333%}.small-8[data-v-2ee3ad8b]{flex-basis:66.6666666667%;max-width:66.6666666667%}.small-9[data-v-2ee3ad8b]{flex-basis:75%;max-width:75%}.small-10[data-v-2ee3ad8b]{flex-basis:83.3333333333%;max-width:83.3333333333%}.small-11[data-v-2ee3ad8b]{flex-basis:91.6666666667%;max-width:91.6666666667%}.small-12[data-v-2ee3ad8b]{flex-basis:100%;max-width:100%}.small-centered[data-v-2ee3ad8b]{margin-left:auto;margin-right:auto}.small-uncentered[data-v-2ee3ad8b]{margin-left:0;margin-right:0}}@media only screen and (max-width:320px){.xsmall-1[data-v-2ee3ad8b]{flex-basis:8.3333333333%;max-width:8.3333333333%}.xsmall-2[data-v-2ee3ad8b]{flex-basis:16.6666666667%;max-width:16.6666666667%}.xsmall-3[data-v-2ee3ad8b]{flex-basis:25%;max-width:25%}.xsmall-4[data-v-2ee3ad8b]{flex-basis:33.3333333333%;max-width:33.3333333333%}.xsmall-5[data-v-2ee3ad8b]{flex-basis:41.6666666667%;max-width:41.6666666667%}.xsmall-6[data-v-2ee3ad8b]{flex-basis:50%;max-width:50%}.xsmall-7[data-v-2ee3ad8b]{flex-basis:58.3333333333%;max-width:58.3333333333%}.xsmall-8[data-v-2ee3ad8b]{flex-basis:66.6666666667%;max-width:66.6666666667%}.xsmall-9[data-v-2ee3ad8b]{flex-basis:75%;max-width:75%}.xsmall-10[data-v-2ee3ad8b]{flex-basis:83.3333333333%;max-width:83.3333333333%}.xsmall-11[data-v-2ee3ad8b]{flex-basis:91.6666666667%;max-width:91.6666666667%}.xsmall-12[data-v-2ee3ad8b]{flex-basis:100%;max-width:100%}.xsmall-centered[data-v-2ee3ad8b]{margin-left:auto;margin-right:auto}.xsmall-uncentered[data-v-2ee3ad8b]{margin-left:0;margin-right:0}}.tabnav[data-v-5572fe1d]{margin:0 0 1.4705882353rem 0;display:flex}.tabnav--center[data-v-5572fe1d]{justify-content:center}.tabnav--end[data-v-5572fe1d]{justify-content:flex-end}.tabnav--vertical[data-v-5572fe1d]{flex-flow:column wrap}.tabnav--vertical .tabnav-items[data-v-5572fe1d]{flex-flow:column;overflow:hidden}.tabnav--vertical[data-v-5572fe1d] .tabnav-item{padding-left:0}.tabnav--vertical[data-v-5572fe1d] .tabnav-item .tabnav-link{padding-top:8px}.tabnav-items[data-v-5572fe1d]{display:flex;margin:0;text-align:center}.tabnav-item[data-v-6aa9882a]{border-bottom:1px solid;border-color:var(--colors-tabnav-item-border-color,var(--color-tabnav-item-border-color));display:flex;list-style:none;padding-left:1.7647058824rem;margin:0;outline:none}.tabnav-item[data-v-6aa9882a]:first-child{padding-left:0}.tabnav-item[data-v-6aa9882a]:nth-child(n+1){margin:0}.tabnav-link[data-v-6aa9882a]{color:var(--colors-secondary-label,var(--color-secondary-label));font-size:.8235294118rem;line-height:1;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);padding:6px 0;margin-top:4px;margin-bottom:4px;text-align:left;text-decoration:none;display:block;position:relative;z-index:0;width:100%}.tabnav-link[data-v-6aa9882a]:hover{text-decoration:none}.tabnav-link[data-v-6aa9882a]:focus{outline-offset:-1px}.tabnav-link[data-v-6aa9882a]:after{content:"";position:absolute;bottom:-5px;left:0;width:100%;border:1px solid transparent}.tabnav-link.active[data-v-6aa9882a]{color:var(--colors-text,var(--color-text));cursor:default;z-index:10}.tabnav-link.active[data-v-6aa9882a]:after{border-bottom-color:var(--colors-text,var(--color-text))}.controls[data-v-c84e62a6]{margin-top:5px;font-size:14px;display:flex;justify-content:flex-end}.controls a[data-v-c84e62a6]{color:var(--colors-text,var(--color-text));display:flex;align-items:center}.controls .control-icon[data-v-c84e62a6]{width:1.05em;margin-right:.3em}.caption[data-v-869c6f6e]{font-size:.8235294118rem;line-height:1.5;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);margin:0 0 var(--spacing-stacked-margin-large) 0}.caption.trailing[data-v-869c6f6e]{margin:var(--spacing-stacked-margin-large) 0 0 0;text-align:center}caption.trailing[data-v-869c6f6e]{caption-side:bottom}[data-v-869c6f6e] p{display:inline-block}[data-v-bf997940] img{max-width:100%}.table-wrapper[data-v-f3322390]{overflow:auto;-webkit-overflow-scrolling:touch}*+.table-wrapper[data-v-f3322390],.table-wrapper[data-v-f3322390]+*{margin-top:var(--spacing-stacked-margin-xlarge)}table[data-v-f3322390]{border-style:hidden}[data-v-f3322390] th{font-weight:600;word-break:keep-all;-webkit-hyphens:auto;hyphens:auto}[data-v-f3322390] td,[data-v-f3322390] th{border-color:var(--color-fill-gray-tertiary);border-style:solid;border-width:var(--table-border-width,1px 1px);padding:.5882352941rem}[data-v-f3322390] td.left-cell,[data-v-f3322390] th.left-cell{text-align:left}[data-v-f3322390] td.right-cell,[data-v-f3322390] th.right-cell{text-align:right}[data-v-f3322390] td.center-cell,[data-v-f3322390] th.center-cell{text-align:center}s[data-v-7fc51673]:before{content:attr(data-before-text)}s[data-v-7fc51673]:after{content:attr(data-after-text)}s[data-v-7fc51673]:after,s[data-v-7fc51673]:before{position:absolute;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(0 0 99.9% 99.9%);clip-path:inset(0 0 99.9% 99.9%);overflow:hidden;height:1px;width:1px;padding:0;border:0}small[data-v-77035f61]{font-size:.8235294118rem;line-height:1.2857142857;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-figure-gray)}.device-frame[data-v-c2eac128]{position:relative;width:var(--frame-width);aspect-ratio:var(--frame-aspect);max-width:100%;margin-left:auto;margin-right:auto;overflow:hidden}*+.device-frame[data-v-c2eac128],.device-frame[data-v-c2eac128]+*{margin-top:40px}.device[data-v-c2eac128]{background-image:var(--device-light-url);background-repeat:no-repeat;background-size:100%;width:100%;height:100%;position:relative;pointer-events:none}@media screen{[data-color-scheme=dark] .device[data-v-c2eac128]{background-image:var(--device-dark-url,var(--device-light-url))}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .device[data-v-c2eac128]{background-image:var(--device-dark-url,var(--device-light-url))}}.no-device .device[data-v-c2eac128]{display:none}.device-screen.with-device[data-v-c2eac128]{position:absolute;left:var(--screen-left);top:var(--screen-top);height:var(--screen-height);width:var(--screen-width);display:flex}.device-screen.with-device>[data-v-c2eac128]{flex:1}.device-screen.with-device[data-v-c2eac128] img{width:100%;height:100%;-o-object-fit:contain;object-fit:contain;-o-object-position:top;object-position:top;margin:0}.device-screen.with-device[data-v-c2eac128] video{-o-object-fit:contain;object-fit:contain;-o-object-position:top;object-position:top;width:100%;height:auto}.video-replay-container .control-button[data-v-7653dfd0]{display:flex;align-items:center;justify-content:center;cursor:pointer;margin-top:.5rem;-webkit-tap-highlight-color:rgba(0,0,0,0)}.video-replay-container .control-button svg.control-icon[data-v-7653dfd0]{height:12px;width:12px;margin-left:.3em}[data-v-2d8333c8] img,[data-v-2d8333c8] video{display:block;margin-left:auto;margin-right:auto;-o-object-fit:contain;object-fit:contain;max-width:100%}.asset[data-v-5e8ea0de]{margin-left:auto;margin-right:auto}*+.asset[data-v-5e8ea0de],.asset[data-v-5e8ea0de]+*{margin-top:var(--spacing-stacked-margin-xlarge)}[data-v-5e8ea0de] video{display:block;margin-left:auto;margin-right:auto;-o-object-fit:contain;object-fit:contain;max-width:100%}.column[data-v-0f654188]{grid-column:span var(--col-span);min-width:0}@media only screen and (max-width:735px){.column[data-v-0f654188]{grid-column:span 1}}.row[data-v-1bcb2d0f]{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;grid-gap:var(--col-gap,20px)}@media only screen and (max-width:735px){.row[data-v-1bcb2d0f]{grid-template-columns:1fr;grid-auto-flow:row}}.row.with-columns[data-v-1bcb2d0f]{--col-count:var(--col-count-large);grid-template-columns:repeat(var(--col-count),1fr);grid-auto-flow:row}@media only screen and (max-width:1250px){.row.with-columns[data-v-1bcb2d0f]{--col-count:var(--col-count-medium,var(--col-count-large))}}@media only screen and (max-width:735px){.row.with-columns[data-v-1bcb2d0f]{--col-count:var(--col-count-small)}}*+.TabNavigator[data-v-e671a734],*+.row[data-v-1bcb2d0f],.TabNavigator[data-v-e671a734]+*,.row[data-v-1bcb2d0f]+*{margin-top:var(--spacing-stacked-margin-xlarge)}.TabNavigator .tabnav[data-v-e671a734]{overflow:auto;white-space:nowrap}.TabNavigator .tabs-content-container[data-v-e671a734]{position:relative;overflow:hidden}.tabs--vertical[data-v-e671a734]{display:flex;flex-flow:row-reverse}@media only screen and (max-width:735px){.tabs--vertical[data-v-e671a734]{flex-flow:column-reverse}}.tabs--vertical .tabnav[data-v-e671a734]{width:30%;flex:0 0 auto;white-space:normal;margin:0}@media only screen and (max-width:735px){.tabs--vertical .tabnav[data-v-e671a734]{width:100%}}.tabs--vertical .tabs-content[data-v-e671a734]{flex:1 1 auto;min-width:0;padding-right:var(--spacing-stacked-margin-xlarge)}@media only screen and (max-width:735px){.tabs--vertical .tabs-content[data-v-e671a734]{padding-right:0;padding-bottom:var(--spacing-stacked-margin-large)}}.fade-enter-active[data-v-e671a734],.fade-leave-active[data-v-e671a734]{transition:opacity .2s ease-in-out}.fade-enter[data-v-e671a734],.fade-leave-to[data-v-e671a734]{opacity:0}.fade-leave-active[data-v-e671a734]{position:absolute;top:0;left:0;right:0}.tasklist[data-v-6a56a858]{--checkbox-width:1rem;--indent-width:calc(var(--checkbox-width)/2);--content-margin:var(--indent-width);list-style-type:none;margin-left:var(--indent-width)}p[data-v-6a56a858]{margin-left:var(--content-margin)}p[data-v-6a56a858]:only-child{--content-margin:calc(var(--checkbox-width) + var(--indent-width))}input[type=checkbox]+p[data-v-6a56a858]{display:inline-block}.button-cta[data-v-c9c81868]{background:var(--colors-button-light-background,var(--color-button-background));border-color:var(--color-button-border,currentcolor);border-radius:var(--button-border-radius,var(--border-radius,4px));border-style:var(--button-border-style,none);border-width:var(--button-border-width,medium);color:var(--colors-button-text,var(--color-button-text));cursor:pointer;min-width:1.7647058824rem;padding:.2352941176rem .8823529412rem;text-align:center;white-space:nowrap;display:inline-block;font-size:1rem;line-height:1.4705882353;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.button-cta[data-v-c9c81868]:active{background:var(--colors-button-light-backgroundActive,var(--color-button-background-active));outline:none}.button-cta[data-v-c9c81868]:hover:not([disabled]){background:var(--colors-button-light-backgroundHover,var(--color-button-background-hover));text-decoration:none}.button-cta[data-v-c9c81868]:disabled{opacity:.32;cursor:default}.fromkeyboard .button-cta[data-v-c9c81868]:focus{box-shadow:0 0 0 4px var(--color-focus-color);outline:none}.button-cta.is-dark[data-v-c9c81868]{background:var(--colors-button-dark-background,#06f)}.button-cta.is-dark[data-v-c9c81868]:active{background:var(--colors-button-dark-backgroundActive,var(--color-button-background-active))}.button-cta.is-dark[data-v-c9c81868]:hover:not([disabled]){background:var(--colors-button-dark-backgroundHover,var(--color-button-background-hover))}.card-cover-wrap.rounded[data-v-28b14a83]{border-radius:var(--border-radius,4px);overflow:hidden}.card-cover[data-v-28b14a83]{background-color:var(--color-card-background);display:block;height:var(--card-cover-height,180px)}.card-cover.fallback[data-v-28b14a83],.card-cover[data-v-28b14a83] img{width:100%;-o-object-fit:cover;object-fit:cover;-o-object-position:center;object-position:center;display:block;margin:0}.card-cover[data-v-28b14a83] img{height:100%}.card[data-v-1651529a]{overflow:hidden;display:block;transition:box-shadow,transform .16s ease-out;will-change:box-shadow,transform;backface-visibility:hidden;height:var(--card-height);border-radius:var(--border-radius,4px)}.card[data-v-1651529a]:hover{text-decoration:none}.card:hover .link[data-v-1651529a]{text-decoration:underline;text-underline-position:under}.card[data-v-1651529a]:hover{box-shadow:0 5px 10px var(--color-card-shadow);transform:scale(1.007)}@media(prefers-reduced-motion:reduce){.card[data-v-1651529a]:hover{box-shadow:none;transform:none}}.card.small[data-v-1651529a]{--card-height:408px;--card-details-height:139px;--card-cover-height:235px}@media only screen and (max-width:1250px){.card.small[data-v-1651529a]{--card-height:341px;--card-details-height:144px;--card-cover-height:163px}}.card.large[data-v-1651529a]{--card-height:556px;--card-details-height:163px;--card-cover-height:359px}@media only screen and (max-width:1250px){.card.large[data-v-1651529a]{--card-height:420px;--card-details-height:137px;--card-cover-height:249px}}.card.floating-style[data-v-1651529a]{--color-card-shadow:transparent;--card-height:auto;--card-details-height:auto}.details[data-v-1651529a]{background-color:var(--color-card-background);padding:17px;position:relative;height:var(--card-details-height);font-size:.8235294118rem;line-height:1.2857142857}.details[data-v-1651529a],.large .details[data-v-1651529a]{font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.large .details[data-v-1651529a]{font-size:1rem;line-height:1.4705882353}@media only screen and (max-width:1250px){.large .details[data-v-1651529a]{font-size:.8235294118rem;line-height:1.2857142857;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.floating-style .details[data-v-1651529a]{--color-card-background:transparent;padding:17px 0}.eyebrow[data-v-1651529a]{color:var(--color-card-eyebrow);display:block;margin-bottom:4px;font-size:.8235294118rem;line-height:1.2857142857}.eyebrow[data-v-1651529a],.large .eyebrow[data-v-1651529a]{font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.large .eyebrow[data-v-1651529a]{font-size:1rem;line-height:1.2352941176}@media only screen and (max-width:1250px){.large .eyebrow[data-v-1651529a]{font-size:.8235294118rem;line-height:1.2857142857;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.title[data-v-1651529a]{color:var(--color-card-content-text);font-size:1rem;line-height:1.2352941176;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:1250px){.title[data-v-1651529a]{font-size:.8235294118rem;line-height:1.2857142857;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){.title[data-v-1651529a]{font-size:1rem;line-height:1.2352941176;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.large .title[data-v-1651529a]{font-size:1.2352941176rem;line-height:1.1904761905;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:1250px){.large .title[data-v-1651529a]{font-size:1rem;line-height:1.2352941176;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.card-content[data-v-1651529a]{color:var(--color-card-content-text);margin-top:4px}.link[data-v-1651529a]{bottom:17px;display:flex;align-items:center;position:absolute}.link .link-icon[data-v-1651529a]{height:.6em;width:.6em;margin-left:.3em}.floating-style .link[data-v-1651529a]{bottom:unset;margin-top:var(--spacing-stacked-margin-large);position:relative}@media only screen and (max-width:735px){.card[data-v-1651529a]{margin-left:auto;margin-right:auto}.card+.card[data-v-1651529a]{margin-bottom:20px;margin-top:20px}.card.large[data-v-1651529a],.card.small[data-v-1651529a]{--card-height:auto;--card-details-height:auto;min-width:280px;max-width:300px;--card-cover-height:227px}.card.large .link[data-v-1651529a],.card.small .link[data-v-1651529a]{bottom:unset;margin-top:7px;position:relative}}.nav-menu-items[data-v-67c1c0a5]{display:flex;justify-content:flex-end}.nav--in-breakpoint-range .nav-menu-items[data-v-67c1c0a5]{display:block;opacity:0;padding:1rem 1.8823529412rem 1.6470588235rem 1.8823529412rem;transform:translate3d(0,-50px,0);transition:transform 1s cubic-bezier(.07,1.06,.27,.95) .5s,opacity .7s cubic-bezier(.07,1.06,.27,.95) .2s}.nav--is-open.nav--in-breakpoint-range .nav-menu-items[data-v-67c1c0a5]{opacity:1;transform:translateZ(0);transition-delay:.2s,.4s}.nav--in-breakpoint-range .nav-menu-items[data-v-67c1c0a5]:not(:only-child):not(:last-child){padding-bottom:0}.nav--in-breakpoint-range .nav-menu-items[data-v-67c1c0a5]:not(:only-child):last-child{padding-top:0}.TopicTypeIcon[data-v-0c843792]{width:1em;height:1em;flex:0 0 auto;color:var(--icon-color,var(--color-figure-gray-secondary))}.TopicTypeIcon[data-v-0c843792] picture{flex:1}.TopicTypeIcon svg[data-v-0c843792],.TopicTypeIcon[data-v-0c843792] img{display:block;width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.nav[data-v-c7b655d6]{position:sticky;top:0;width:100%;height:3.0588235294rem;z-index:9997;--nav-padding:1.2941176471rem;color:var(--color-nav-color)}@media print{.nav[data-v-c7b655d6]{position:relative}}@media only screen and (max-width:767px){.nav[data-v-c7b655d6]{min-width:320px;height:2.8235294118rem}}.theme-dark.nav[data-v-c7b655d6]{background:none;color:var(--color-nav-dark-color)}.nav__wrapper[data-v-c7b655d6]{position:absolute;top:0;left:0;width:100%;height:auto;min-height:100%;z-index:1}.nav__background[data-v-c7b655d6]{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1;transition:background-color 0s ease-in}.nav__background[data-v-c7b655d6]:after{background-color:var(--color-nav-keyline)}.nav--no-bg-transition .nav__background[data-v-c7b655d6]{transition:none!important}.nav--solid-background .nav__background[data-v-c7b655d6]{background-color:var(--color-nav-solid-background);-webkit-backdrop-filter:none;backdrop-filter:none}.nav--is-open.nav--solid-background .nav__background[data-v-c7b655d6],.nav--is-sticking.nav--solid-background .nav__background[data-v-c7b655d6]{background-color:var(--color-nav-solid-background)}.nav--is-open.theme-dark.nav--solid-background .nav__background[data-v-c7b655d6],.nav--is-sticking.theme-dark.nav--solid-background .nav__background[data-v-c7b655d6],.theme-dark.nav--solid-background .nav__background[data-v-c7b655d6]{background-color:var(--color-nav-dark-solid-background)}.nav--in-breakpoint-range .nav__background[data-v-c7b655d6]{min-height:2.8235294118rem;transition:background-color 0s ease .7s}.nav--is-sticking .nav__background[data-v-c7b655d6]{background-color:var(--color-nav-expanded);max-height:none;transition:background-color 0s ease;transition-property:background-color,-webkit-backdrop-filter;transition-property:background-color,backdrop-filter;transition-property:background-color,backdrop-filter,-webkit-backdrop-filter}.nav--is-sticking .nav__background[data-v-c7b655d6]:after{background-color:var(--color-nav-sticking-expanded-keyline)}@supports((-webkit-backdrop-filter:initial) or (backdrop-filter:initial)){.nav--is-sticking .nav__background[data-v-c7b655d6]{-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px);background-color:var(--color-nav-uiblur-stuck)}}.theme-dark.nav--is-sticking .nav__background[data-v-c7b655d6]{background-color:var(--color-nav-dark-stuck)}@supports((-webkit-backdrop-filter:initial) or (backdrop-filter:initial)){.theme-dark.nav--is-sticking .nav__background[data-v-c7b655d6]{background-color:var(--color-nav-dark-uiblur-stuck)}}.nav--is-open .nav__background[data-v-c7b655d6]{background-color:var(--color-nav-expanded);max-height:none;transition:background-color 0s ease;transition-property:background-color,-webkit-backdrop-filter;transition-property:background-color,backdrop-filter;transition-property:background-color,backdrop-filter,-webkit-backdrop-filter}.nav--is-open .nav__background[data-v-c7b655d6]:after{background-color:var(--color-nav-sticking-expanded-keyline)}@supports((-webkit-backdrop-filter:initial) or (backdrop-filter:initial)){.nav--is-open .nav__background[data-v-c7b655d6]{-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px);background-color:var(--color-nav-uiblur-expanded)}}.theme-dark.nav--is-open .nav__background[data-v-c7b655d6]{background-color:var(--color-nav-dark-expanded)}@supports((-webkit-backdrop-filter:initial) or (backdrop-filter:initial)){.theme-dark.nav--is-open .nav__background[data-v-c7b655d6]{background-color:var(--color-nav-dark-uiblur-expanded)}}.theme-dark .nav__background[data-v-c7b655d6]:after{background-color:var(--color-nav-dark-keyline)}.nav--is-open.theme-dark .nav__background[data-v-c7b655d6]:after,.nav--is-sticking.theme-dark .nav__background[data-v-c7b655d6]:after{background-color:var(--color-nav-dark-sticking-expanded-keyline)}.nav__background[data-v-c7b655d6]:after{content:"";display:block;position:absolute;top:100%;left:50%;transform:translateX(-50%);width:980px;height:1px;z-index:1}@media only screen and (max-width:1023px){.nav__background[data-v-c7b655d6]:after{width:100%}}.nav--noborder .nav__background[data-v-c7b655d6]:after{display:none}.nav--is-sticking.nav--noborder .nav__background[data-v-c7b655d6]:after{display:block}.nav--fullwidth-border .nav__background[data-v-c7b655d6]:after,.nav--is-open .nav__background[data-v-c7b655d6]:after,.nav--is-sticking .nav__background[data-v-c7b655d6]:after,.nav--solid-background .nav__background[data-v-c7b655d6]:after{width:100%}.nav-overlay[data-v-c7b655d6]{position:fixed;left:0;right:0;top:0;display:block;opacity:0}.nav--is-open .nav-overlay[data-v-c7b655d6]{background-color:rgba(51,51,51,.4);transition:opacity .7s cubic-bezier(.07,1.06,.27,.95) .2s;bottom:0;opacity:1}.nav-wrapper[data-v-c7b655d6]{position:absolute;top:0;left:0;width:100%;height:auto;min-height:100%;z-index:1}.pre-title[data-v-c7b655d6]{display:flex;overflow:hidden;padding-left:1.2941176471rem;margin-left:-1.2941176471rem}.pre-title[data-v-c7b655d6]:empty{display:none}.nav--in-breakpoint-range .pre-title[data-v-c7b655d6]{overflow:visible;padding:0;margin-left:0}.nav-content[data-v-c7b655d6]{display:flex;padding:0 var(--nav-padding);max-width:980px;margin:0 auto;position:relative;z-index:2;justify-content:space-between}.nav--is-wide-format .nav-content[data-v-c7b655d6]{box-sizing:border-box;max-width:1920px;margin-left:auto;margin-right:auto}@supports(padding:calc(max(0px))){.nav-content[data-v-c7b655d6]{padding-left:max(var(--nav-padding),env(safe-area-inset-left));padding-right:max(var(--nav-padding),env(safe-area-inset-right))}}@media only screen and (max-width:767px){.nav-content[data-v-c7b655d6]{padding:0 0 0 .9411764706rem}}.nav--in-breakpoint-range .nav-content[data-v-c7b655d6]{display:grid;grid-template-columns:auto 1fr auto;grid-auto-rows:minmax(min-content,max-content);grid-template-areas:"pre-title title actions" "menu menu menu"}.nav-menu[data-v-c7b655d6]{font-size:.7058823529rem;line-height:1;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);flex:1 1 auto;display:flex;min-width:0}@media only screen and (max-width:767px){.nav-menu[data-v-c7b655d6]{font-size:.8235294118rem;line-height:1;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.nav--in-breakpoint-range .nav-menu[data-v-c7b655d6]{font-size:.8235294118rem;line-height:1;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);grid-area:menu}.nav-menu-tray[data-v-c7b655d6]{width:100%;max-width:100%;align-items:center;display:flex;justify-content:space-between}.nav--in-breakpoint-range .nav-menu-tray[data-v-c7b655d6]{display:block;overflow:hidden;pointer-events:none;visibility:hidden;max-height:0;transition:max-height .4s ease-in 0s,visibility 0s linear 1s}.nav--is-open.nav--in-breakpoint-range .nav-menu-tray[data-v-c7b655d6]{max-height:calc(100vh - 5.64706rem);overflow-y:auto;-webkit-overflow-scrolling:touch;pointer-events:auto;visibility:visible;transition-delay:.2s,0s}.nav--is-transitioning.nav--is-open.nav--in-breakpoint-range .nav-menu-tray[data-v-c7b655d6]{overflow-y:hidden}.nav--is-sticking.nav--is-open.nav--in-breakpoint-range .nav-menu-tray[data-v-c7b655d6]{max-height:calc(100vh - 2.82353rem)}.nav-actions[data-v-c7b655d6]{display:flex;align-items:center}.nav--in-breakpoint-range .nav-actions[data-v-c7b655d6]{grid-area:actions;justify-content:flex-end}@media only screen and (max-width:767px){.nav-actions[data-v-c7b655d6]{padding-right:.9411764706rem}}.nav--in-breakpoint-range .pre-title+.nav-title[data-v-c7b655d6]{grid-area:title}.nav--is-wide-format.nav--in-breakpoint-range .pre-title+.nav-title[data-v-c7b655d6]{width:100%;justify-content:center}.nav-title[data-v-c7b655d6]{height:3.0588235294rem;font-size:1.1176470588rem;line-height:1.4210526316;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);cursor:default;display:flex;align-items:center;white-space:nowrap;box-sizing:border-box}@media only screen and (max-width:767px){.nav-title[data-v-c7b655d6]{padding-top:0;height:2.8235294118rem;width:90%}}.nav-title[data-v-c7b655d6] span{height:100%;line-height:normal}.nav-title a[data-v-c7b655d6]{display:inline-block;letter-spacing:inherit;line-height:normal;margin:0;text-decoration:none;white-space:nowrap}.nav-title a[data-v-c7b655d6]:hover{text-decoration:none}@media only screen and (max-width:767px){.nav-title a[data-v-c7b655d6]{display:flex}}.nav-title a[data-v-c7b655d6],.nav-title[data-v-c7b655d6]{color:var(--color-figure-gray);transition:color 0s ease-in}.nav--is-open.theme-dark .nav-title a[data-v-c7b655d6],.nav--is-open.theme-dark .nav-title[data-v-c7b655d6],.nav--is-sticking.theme-dark .nav-title a[data-v-c7b655d6],.nav--is-sticking.theme-dark .nav-title[data-v-c7b655d6],.theme-dark .nav-title a[data-v-c7b655d6],.theme-dark .nav-title[data-v-c7b655d6]{color:var(--color-nav-dark-link-color)}.nav-ax-toggle[data-v-c7b655d6]{display:none;position:absolute;top:0;left:0;width:1px;height:1px;z-index:10}.nav-ax-toggle[data-v-c7b655d6]:focus{outline-offset:-6px;width:100%;height:100%}.nav--in-breakpoint-range .nav-ax-toggle[data-v-c7b655d6]{display:block}.nav-menucta[data-v-c7b655d6]{cursor:pointer;display:none;align-items:center;overflow:hidden;width:1.1764705882rem;-webkit-tap-highlight-color:rgba(0,0,0,0);height:2.8235294118rem}.nav--in-breakpoint-range .nav-menucta[data-v-c7b655d6]{display:flex}.nav-menucta-chevron[data-v-c7b655d6]{display:block;position:relative;width:100%;height:.7058823529rem;transition:transform .3s linear}.nav-menucta-chevron[data-v-c7b655d6]:after,.nav-menucta-chevron[data-v-c7b655d6]:before{content:"";display:block;position:absolute;top:.5882352941rem;width:.7058823529rem;height:.0588235294rem;transition:transform .3s linear;background:var(--color-figure-gray)}.nav-menucta-chevron[data-v-c7b655d6]:before{right:50%;border-radius:.5px 0 0 .5px}.nav-menucta-chevron[data-v-c7b655d6]:after{left:50%;border-radius:0 .5px .5px 0}.nav-menucta-chevron[data-v-c7b655d6]:before{transform-origin:100% 100%;transform:rotate(40deg) scaleY(1.5)}.nav-menucta-chevron[data-v-c7b655d6]:after{transform-origin:0 100%;transform:rotate(-40deg) scaleY(1.5)}.nav--is-open .nav-menucta-chevron[data-v-c7b655d6]{transform:scaleY(-1)}.theme-dark .nav-menucta-chevron[data-v-c7b655d6]:after,.theme-dark .nav-menucta-chevron[data-v-c7b655d6]:before{background:var(--color-nav-dark-link-color)}[data-v-c7b655d6] .nav-menu-link{color:var(--color-nav-link-color)}[data-v-c7b655d6] .nav-menu-link:hover{color:var(--color-nav-link-color-hover);text-decoration:none}.theme-dark[data-v-c7b655d6] .nav-menu-link{color:var(--color-nav-dark-link-color)}.theme-dark[data-v-c7b655d6] .nav-menu-link:hover{color:var(--color-nav-dark-link-color-hover)}[data-v-c7b655d6] .nav-menu-link.current{color:var(--color-nav-current-link);cursor:default}[data-v-c7b655d6] .nav-menu-link.current:hover{color:var(--color-nav-current-link)}.theme-dark[data-v-c7b655d6] .nav-menu-link.current,.theme-dark[data-v-c7b655d6] .nav-menu-link.current:hover{color:var(--color-nav-dark-current-link)}.reference-card-grid-item[data-v-87dd3302]{--card-cover-height:auto}.reference-card-grid-item.card.large[data-v-87dd3302]{--card-cover-height:auto;min-width:0;max-width:none}.reference-card-grid-item[data-v-87dd3302] .card-cover{aspect-ratio:16/9}.reference-card-grid-item[data-v-87dd3302] .card-cover-wrap{border:1px solid var(--color-link-block-card-border)}.reference-card-grid-item__image[data-v-87dd3302]{display:flex;align-items:center;justify-content:center;font-size:80px;background-color:var(--color-fill-gray-quaternary)}.reference-card-grid-item__icon[data-v-87dd3302]{margin:0;display:flex;justify-content:center}.reference-card-grid-item__icon[data-v-87dd3302] .icon-inline{flex:1 1 auto}.nav-menu-item[data-v-58ee2996]{margin-left:1.4117647059rem;list-style:none;min-width:0}.nav--in-breakpoint-range .nav-menu-item[data-v-58ee2996]{margin-left:0;width:100%;min-height:2.4705882353rem}.nav--in-breakpoint-range .nav-menu-item[data-v-58ee2996]:first-child .nav-menu-link{border-top:0}.nav--in-breakpoint-range .nav-menu-item--animated[data-v-58ee2996]{opacity:0;transform:none;transition:.5s ease;transition-property:transform,opacity}.nav--is-open.nav--in-breakpoint-range .nav-menu-item--animated[data-v-58ee2996]{opacity:1;transform:translateZ(0);transition-delay:0s}.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-58ee2996]:first-child,.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(2),.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(3),.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(4),.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(5),.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(6),.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(7),.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-58ee2996]:first-child,.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(2),.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(3),.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(4),.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(5),.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(6),.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(7),.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-58ee2996]:first-child,.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(2),.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(3),.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(4),.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(5),.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(6),.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(7),.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-58ee2996]:first-child,.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(2),.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(3),.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(4),.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(5),.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(6),.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(7),.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-58ee2996]:first-child,.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(2),.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(3),.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(4),.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(5),.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(6),.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(7),.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-58ee2996]:first-child,.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(2),.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(3),.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(4),.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(5),.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(6),.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(7),.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-58ee2996]:first-child,.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(2),.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(3),.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(4),.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(5),.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(6),.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(7),.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-58ee2996]:first-child,.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(2),.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(3),.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(4),.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(5),.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(6),.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(7),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-58ee2996]:first-child,.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(2),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(3),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(4),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(5),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(6),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(7),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-58ee2996]:first-child,.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(2),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(3),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(4),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(5),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(6),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(7),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-58ee2996]:first-child,.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(2),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(3),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(4),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(5),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(6),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(7),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-58ee2996]:first-child,.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(2),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(3),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(4),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(5),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(6),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(7),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-58ee2996]:first-child,.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(2),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(3),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(4),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(5),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(6),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(7),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-58ee2996]:first-child,.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(2),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(3),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(4),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(5),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(6),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(7),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-58ee2996]:first-child,.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(2),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(3),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(4),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(5),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(6),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(7),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-58ee2996]:first-child,.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(2),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(3),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(4),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(5),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(6),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-58ee2996]:nth-child(7){transition-delay:0s}.links-block[data-v-4e94ea62]+*{margin-top:var(--spacing-stacked-margin-xlarge)}.topic-link-block[data-v-4e94ea62]{margin-top:15px} \ No newline at end of file diff --git a/docs/css/675.40c3bcb2.css b/docs/css/675.40c3bcb2.css new file mode 100644 index 0000000..9910395 --- /dev/null +++ b/docs/css/675.40c3bcb2.css @@ -0,0 +1,9 @@ +/*! + * This source file is part of the Swift.org open source project + * + * Copyright (c) 2021 Apple Inc. and the Swift project authors + * Licensed under Apache License v2.0 with Runtime Library Exception + * + * See https://swift.org/LICENSE.txt for license information + * See https://swift.org/CONTRIBUTORS.txt for Swift project authors + */.badge[data-v-8d6893ae]{--badge-color:var(--color-badge-default);--badge-dark-color:var(--color-badge-dark-default);font-size:.7058823529rem;line-height:1.3333333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);display:inline-block;padding:2px 10px;white-space:nowrap;background:none;border-radius:var(--badge-border-radius,calc(var(--border-radius, 4px) - 1px));border-style:var(--badge-border-style,solid);border-width:var(--badge-border-width,1px);margin-left:10px;color:var(--badge-color)}.theme-dark .badge[data-v-8d6893ae]{--badge-color:var(--badge-dark-color)}.badge-deprecated[data-v-8d6893ae]{--badge-color:var(--color-badge-deprecated);--badge-dark-color:var(--color-badge-dark-deprecated)}.badge-beta[data-v-8d6893ae]{--badge-color:var(--color-badge-beta);--badge-dark-color:var(--color-badge-dark-beta)}[data-v-3a32ffd0] .code-listing{background:var(--background,var(--color-code-background));color:var(--text,var(--color-code-plain));border-color:var(--colors-grid,var(--color-grid));border-width:var(--code-border-width,1px);border-style:var(--code-border-style,solid)}[data-v-3a32ffd0] .code-listing pre{padding:var(--code-block-style-elements-padding)}[data-v-3a32ffd0] .code-listing pre>code{font-size:.8823529412rem;line-height:1.6666666667;font-weight:400;font-family:var(--typography-html-font-mono,Menlo,monospace)}[data-v-3a32ffd0] *+.code-listing,[data-v-3a32ffd0] *+.endpoint-example,[data-v-3a32ffd0] *+.inline-image-container,[data-v-3a32ffd0] *+aside,[data-v-3a32ffd0] *+figure,[data-v-3a32ffd0] .code-listing+*,[data-v-3a32ffd0] .endpoint-example+*,[data-v-3a32ffd0] .inline-image-container+*,[data-v-3a32ffd0] aside+*,[data-v-3a32ffd0] figure+*{margin-top:var(--spacing-stacked-margin-xlarge)}[data-v-3a32ffd0] *+dl,[data-v-3a32ffd0] dl+*{margin-top:var(--spacing-stacked-margin-large)}[data-v-3a32ffd0] img{display:block;margin:auto;max-width:100%}[data-v-3a32ffd0] ol,[data-v-3a32ffd0] ol li:not(:first-child),[data-v-3a32ffd0] ul,[data-v-3a32ffd0] ul li:not(:first-child){margin-top:var(--spacing-stacked-margin-large)}@media only screen and (max-width:735px){[data-v-3a32ffd0] ol,[data-v-3a32ffd0] ul{margin-left:1.25rem}}[data-v-3a32ffd0] dt:not(:first-child){margin-top:var(--spacing-stacked-margin-large)}[data-v-3a32ffd0] dd{margin-left:2em}.topic-icon-wrapper[data-v-44dade98]{display:flex;align-items:center;justify-content:center;height:1.4705882353rem;flex:0 0 1.294rem;width:1.294rem;margin-right:1rem}.topic-icon[data-v-44dade98]{height:.8823529412rem;transform:scale(1);-webkit-transform:scale(1);overflow:visible}.topic-icon[data-v-44dade98] img{margin:0;display:block;width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.topic-icon.curly-brackets-icon[data-v-44dade98]{height:1rem}.token-method[data-v-3fd63d6c]{font-weight:700}.token-keyword[data-v-3fd63d6c]{color:var(--syntax-keyword,var(--color-syntax-keywords))}.token-number[data-v-3fd63d6c]{color:var(--syntax-number,var(--color-syntax-numbers))}.token-string[data-v-3fd63d6c]{color:var(--syntax-string,var(--color-syntax-strings))}.attribute-link[data-v-3fd63d6c],.token-attribute[data-v-3fd63d6c]{color:var(--syntax-attribute,var(--color-syntax-keywords))}.token-internalParam[data-v-3fd63d6c]{color:var(--color-syntax-param-internal-name)}.type-identifier-link[data-v-3fd63d6c]{color:var(--syntax-type,var(--color-syntax-other-type-names))}.token-removed[data-v-3fd63d6c]{background-color:var(--color-highlight-red)}.token-added[data-v-3fd63d6c]{background-color:var(--color-highlight-green)}.decorator[data-v-06ec7395],.label[data-v-06ec7395]{color:var(--colors-secondary-label,var(--color-secondary-label))}.label[data-v-06ec7395]{font-size:1rem;line-height:1.4705882353;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.empty-token[data-v-06ec7395]{font-size:0}.empty-token[data-v-06ec7395]:after{content:" ";font-size:1rem}.conditional-constraints[data-v-4c6f3ed1] code{color:var(--colors-secondary-label,var(--color-secondary-label))}.abstract[data-v-63be6b46],.link-block[data-v-63be6b46] .badge{margin-left:2.294rem}.link-block .badge+.badge[data-v-63be6b46]{margin-left:1rem}.link[data-v-63be6b46]{display:flex}.link-block .badge[data-v-63be6b46]{margin-top:.5rem}.link-block.has-inline-element[data-v-63be6b46]{display:flex;align-items:flex-start;flex-flow:row wrap}.link-block.has-inline-element .badge[data-v-63be6b46]{margin-left:1rem;margin-top:0}.link-block .has-adjacent-elements[data-v-63be6b46]{padding-top:5px;padding-bottom:5px;display:inline-flex}.link-block[data-v-63be6b46],.link[data-v-63be6b46]{box-sizing:inherit}.link-block.changed[data-v-63be6b46],.link.changed[data-v-63be6b46]{padding-right:1rem;padding-left:2.1764705882rem;padding-top:8px;padding-bottom:8px;display:inline-flex;width:100%;box-sizing:border-box}.link-block.changed.changed[data-v-63be6b46],.link.changed.changed[data-v-63be6b46]{padding-right:1rem}@media only screen and (max-width:735px){.link-block.changed[data-v-63be6b46],.link.changed[data-v-63be6b46]{padding-left:0;padding-right:0}.link-block.changed.changed[data-v-63be6b46],.link.changed.changed[data-v-63be6b46]{padding-right:17px;padding-left:2.1764705882rem}.link-block.changed[data-v-63be6b46],.link.changed[data-v-63be6b46]{padding-left:0;padding-right:0}}.abstract .topic-required[data-v-63be6b46]:not(:first-child){margin-top:4px}.topic-required[data-v-63be6b46]{font-size:.8em}.deprecated[data-v-63be6b46]{text-decoration:line-through}.conditional-constraints[data-v-63be6b46]{font-size:.8235294118rem;margin-top:4px} \ No newline at end of file diff --git a/docs/css/documentation-topic.3bca6578.css b/docs/css/documentation-topic.3bca6578.css deleted file mode 100644 index 3b8635a..0000000 --- a/docs/css/documentation-topic.3bca6578.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * This source file is part of the Swift.org open source project - * - * Copyright (c) 2021 Apple Inc. and the Swift project authors - * Licensed under Apache License v2.0 with Runtime Library Exception - * - * See https://swift.org/LICENSE.txt for license information - * See https://swift.org/CONTRIBUTORS.txt for Swift project authors - */.betainfo[data-v-fe7602da]{font-size:.94118rem;padding:3rem 0;background-color:var(--color-fill-secondary)}.full-width-container .betainfo-container[data-v-fe7602da]{max-width:920px;margin-left:auto;margin-right:auto;padding-left:80px;padding-right:80px;box-sizing:border-box}@media only screen and (min-width:1251px){.full-width-container .betainfo-container[data-v-fe7602da]{box-sizing:unset;padding-left:120px;padding-right:120px;margin-left:0}}@media only screen and (max-width:735px){.full-width-container .betainfo-container[data-v-fe7602da]{width:auto;padding-left:20px;padding-right:20px}}.static-width-container .betainfo-container[data-v-fe7602da]{margin-left:auto;margin-right:auto;width:980px}@media only screen and (max-width:1250px){.static-width-container .betainfo-container[data-v-fe7602da]{width:692px}}@media only screen and (max-width:735px){.static-width-container .betainfo-container[data-v-fe7602da]{width:87.5%}}.betainfo-label[data-v-fe7602da]{font-weight:600;font-size:.94118rem}.betainfo-content[data-v-fe7602da] p{margin-bottom:10px}.contenttable+.betainfo[data-v-fe7602da]{background-color:var(--color-fill)}.summary-section[data-v-3aa6f694]:last-of-type{margin-right:0}@media only screen and (max-width:735px){.summary-section[data-v-3aa6f694]{margin-right:0}}.title[data-v-6796f6ea]{color:#fff;font-size:.82353rem;margin-right:.5rem;text-rendering:optimizeLegibility}.documentation-hero--disabled .title[data-v-6796f6ea]{color:var(--colors-text,var(--color-text))}.language[data-v-0de98d61]{padding-bottom:10px;justify-content:flex-end}.language-list[data-v-0de98d61],.language[data-v-0de98d61]{font-size:.82353rem;line-height:1.42857;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;margin-top:0;display:flex;align-items:center}.language-option.swift[data-v-0de98d61]{padding-right:10px;border-right:1px solid var(--color-fill-gray-tertiary)}.language-option.objc[data-v-0de98d61]{padding-left:10px}.language-option.active[data-v-0de98d61],.language-option.router-link-exact-active[data-v-0de98d61]{color:#ccc}.documentation-hero--disabled .language-option.active[data-v-0de98d61],.documentation-hero--disabled .language-option.router-link-exact-active[data-v-0de98d61]{color:var(--colors-secondary-label,var(--color-secondary-label))}.NavigatorLeafIcon[data-v-031bfabc]{width:1em;height:1em;margin-right:7px;flex:0 0 auto;color:var(--color-figure-gray-secondary)}.NavigatorLeafIcon svg[data-v-031bfabc]{width:100%;height:100%}.documentation-hero[data-v-14076498]{background:#000;color:#fff;overflow:hidden;text-align:left;position:relative}.documentation-hero[data-v-14076498]:before{content:"";background:#2a2a2a;position:absolute;width:100%;left:0;top:-50%;height:150%;right:0}.documentation-hero[data-v-14076498]:after{background:transparent;opacity:.7;width:100%;position:absolute;content:"";height:100%;left:0;top:0}.documentation-hero .icon[data-v-14076498]{position:absolute;margin-top:10px;margin-right:25px;right:0;width:250px;height:calc(100% - 20px);box-sizing:border-box}@media only screen and (max-width:735px){.documentation-hero .icon[data-v-14076498]{display:none}}.documentation-hero .background-icon[data-v-14076498]{color:#161616;display:block;width:250px;height:auto;opacity:1;position:absolute;top:50%;left:0;transform:translateY(-50%);max-height:100%}.documentation-hero .background-icon[data-v-14076498] svg{width:100%;height:100%}.documentation-hero__content[data-v-14076498]{padding-top:2.35294rem;padding-bottom:40px;position:relative;z-index:1}.full-width-container .documentation-hero__content[data-v-14076498]{max-width:920px;margin-left:auto;margin-right:auto;padding-left:80px;padding-right:80px;box-sizing:border-box}@media only screen and (min-width:1251px){.full-width-container .documentation-hero__content[data-v-14076498]{box-sizing:unset;padding-left:120px;padding-right:120px;margin-left:0}}@media only screen and (max-width:735px){.full-width-container .documentation-hero__content[data-v-14076498]{width:auto;padding-left:20px;padding-right:20px}}.static-width-container .documentation-hero__content[data-v-14076498]{margin-left:auto;margin-right:auto;width:980px}@media only screen and (max-width:1250px){.static-width-container .documentation-hero__content[data-v-14076498]{width:692px}}@media only screen and (max-width:735px){.static-width-container .documentation-hero__content[data-v-14076498]{width:87.5%}}.documentation-hero__above-content[data-v-14076498]{position:relative;z-index:1}.documentation-hero--disabled[data-v-14076498]{background:none;color:var(--colors-text,var(--color-text))}.documentation-hero--disabled[data-v-14076498]:after,.documentation-hero--disabled[data-v-14076498]:before{content:none}.short-hero[data-v-14076498]{padding-top:3.52941rem;padding-bottom:3.52941rem}.extra-bottom-padding[data-v-14076498]{padding-bottom:3.82353rem}.theme-dark[data-v-14076498] a:not(.button-cta){color:#09f}[data-v-002affcc] .code-listing{background:var(--background,var(--color-code-background));color:var(--text,var(--color-code-plain));border-color:var(--colors-grid,var(--color-grid));border-width:1px;border-style:solid}[data-v-002affcc]+.code-listing,[data-v-002affcc] .code-listing+*{margin-top:1.6em}[data-v-002affcc] .code-listing pre{padding:8px 14px;padding-right:0}[data-v-002affcc] .code-listing pre>code{font-size:.88235rem;line-height:1.66667;font-weight:400;font-family:Menlo,monospace}[data-v-002affcc] *+aside,[data-v-002affcc] *+figure,[data-v-002affcc]+.endpoint-example,[data-v-002affcc] .endpoint-example+*,[data-v-002affcc] aside+*,[data-v-002affcc] figure+*{margin-top:1.6em}[data-v-002affcc] img{display:block;margin:1.6em auto;max-width:100%}[data-v-002affcc] ol,[data-v-002affcc] ul{margin-top:.8em;margin-left:2rem}[data-v-002affcc] ol li:not(:first-child),[data-v-002affcc] ul li:not(:first-child){margin-top:.8em}@media only screen and (max-width:735px){[data-v-002affcc] ol,[data-v-002affcc] ul{margin-left:1.25rem}}[data-v-002affcc]+dl,[data-v-002affcc] dl+*,[data-v-002affcc] dt:not(:first-child){margin-top:.8em}[data-v-002affcc] dd{margin-left:2em}.abstract[data-v-702ec04e]{font-size:1.23529rem;line-height:1.38095;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}@media only screen and (max-width:735px){.abstract[data-v-702ec04e]{font-size:1.11765rem;line-height:1.42105;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}[data-v-702ec04e] p:last-child{margin-bottom:0}.container[data-v-5a07ba83]{padding-bottom:40px}.full-width-container .container[data-v-5a07ba83]{max-width:920px;margin-left:auto;margin-right:auto;padding-left:80px;padding-right:80px;box-sizing:border-box}@media only screen and (min-width:1251px){.full-width-container .container[data-v-5a07ba83]{box-sizing:unset;padding-left:120px;padding-right:120px;margin-left:0}}@media only screen and (max-width:735px){.full-width-container .container[data-v-5a07ba83]{width:auto;padding-left:20px;padding-right:20px}}.static-width-container .container[data-v-5a07ba83]{margin-left:auto;margin-right:auto;width:980px}@media only screen and (max-width:1250px){.static-width-container .container[data-v-5a07ba83]{width:692px}}@media only screen and (max-width:735px){.static-width-container .container[data-v-5a07ba83]{width:87.5%}}.title[data-v-5a07ba83]{font-size:1.88235rem;line-height:1.125;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;padding-top:40px;border-top-color:var(--color-grid);border-top-style:solid;border-top-width:1px}@media only screen and (max-width:1250px){.title[data-v-5a07ba83]{font-size:1.64706rem;line-height:1.14286;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (max-width:735px){.title[data-v-5a07ba83]{font-size:1.41176rem;line-height:1.16667;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.title+.contenttable-section[data-v-627ab5f4]{margin-top:0}.contenttable-section[data-v-627ab5f4]{align-items:baseline;padding-top:2.353rem}.contenttable-section[data-v-627ab5f4]:last-child{margin-bottom:0}[data-v-627ab5f4] .title{font-size:1.41176rem;line-height:1.16667;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}@media only screen and (max-width:1250px){[data-v-627ab5f4] .title{font-size:1.23529rem;line-height:1.19048;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (max-width:735px){.contenttable-section[data-v-627ab5f4]{align-items:unset;border-top:none;display:inherit;margin:0}.section-content[data-v-627ab5f4],.section-title[data-v-627ab5f4]{padding:0}[data-v-627ab5f4] .title{margin:0 0 2.353rem 0;padding-bottom:.5rem}}.badge[data-v-5a8ba4e0]{--badge-color:var(--color-badge-default);--badge-dark-color:var(--color-badge-dark-default);font-size:.70588rem;line-height:1.33333;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;display:inline-block;padding:2px 10px;white-space:nowrap;background:none;border-radius:3px;margin-left:10px;border:1px solid var(--badge-color);color:var(--badge-color)}.theme-dark .badge[data-v-5a8ba4e0]{--badge-color:var(--badge-dark-color)}.badge-deprecated[data-v-5a8ba4e0]{--badge-color:var(--color-badge-deprecated);--badge-dark-color:var(--color-badge-dark-deprecated)}.badge-beta[data-v-5a8ba4e0]{--badge-color:var(--color-badge-beta);--badge-dark-color:var(--color-badge-dark-beta)}.topic-icon-wrapper[data-v-4d1e7968]{display:flex;align-items:center;justify-content:center;height:1.47059rem;flex:0 0 1.294rem;width:1.294rem;margin-right:1rem}.topic-icon[data-v-4d1e7968]{height:.88235rem;transform:scale(1);-webkit-transform:scale(1);overflow:visible}.topic-icon.curly-brackets-icon[data-v-4d1e7968]{height:1rem}.token-method[data-v-5caf1b5b]{font-weight:700}.token-keyword[data-v-5caf1b5b]{color:var(--syntax-keyword,var(--color-syntax-keywords))}.token-number[data-v-5caf1b5b]{color:var(--syntax-number,var(--color-syntax-numbers))}.token-string[data-v-5caf1b5b]{color:var(--syntax-string,var(--color-syntax-strings))}.token-attribute[data-v-5caf1b5b]{color:var(--syntax-attribute,var(--color-syntax-keywords))}.token-internalParam[data-v-5caf1b5b]{color:var(--color-syntax-param-internal-name)}.type-identifier-link[data-v-5caf1b5b]{color:var(--syntax-type,var(--color-syntax-other-type-names))}.token-removed[data-v-5caf1b5b]{background-color:var(--color-highlight-red)}.token-added[data-v-5caf1b5b]{background-color:var(--color-highlight-green)}.decorator[data-v-06ec7395],.label[data-v-06ec7395]{color:var(--colors-secondary-label,var(--color-secondary-label))}.label[data-v-06ec7395]{font-size:1rem;line-height:1.47059;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.empty-token[data-v-06ec7395]{font-size:0}.empty-token[data-v-06ec7395]:after{content:"\00a0";font-size:1rem}.conditional-constraints[data-v-1548fd90] code{color:var(--colors-secondary-label,var(--color-secondary-label))}.abstract[data-v-3152d122],.link-block[data-v-3152d122] .badge{margin-left:2.294rem}.link-block .badge+.badge[data-v-3152d122]{margin-left:1rem}.link[data-v-3152d122]{display:flex}.link-block .badge[data-v-3152d122]{margin-top:.5rem}.link-block.has-inline-element[data-v-3152d122]{display:flex;align-items:flex-start;flex-flow:row wrap}.link-block.has-inline-element .badge[data-v-3152d122]{margin-left:1rem;margin-top:0}.link-block .has-adjacent-elements[data-v-3152d122]{padding-top:5px;padding-bottom:5px;display:inline-flex}.link-block[data-v-3152d122],.link[data-v-3152d122]{box-sizing:inherit}.link-block.changed[data-v-3152d122],.link.changed[data-v-3152d122]{padding-right:1rem;padding-left:2.17647rem;padding-top:8px;padding-bottom:8px;display:inline-flex;width:100%;box-sizing:border-box}.link-block.changed.changed[data-v-3152d122],.link.changed.changed[data-v-3152d122]{padding-right:1rem}@media only screen and (max-width:735px){.link-block.changed[data-v-3152d122],.link.changed[data-v-3152d122]{padding-left:0;padding-right:0}.link-block.changed.changed[data-v-3152d122],.link.changed.changed[data-v-3152d122]{padding-right:17px;padding-left:2.17647rem}}@media only screen and (max-width:735px){.link-block.changed[data-v-3152d122],.link.changed[data-v-3152d122]{padding-left:0;padding-right:0}}.abstract .topic-required[data-v-3152d122]:not(:first-child){margin-top:4px}.topic-required[data-v-3152d122]{font-size:.8em}.deprecated[data-v-3152d122]{text-decoration:line-through}.conditional-constraints[data-v-3152d122]{font-size:.82353rem;margin-top:4px}.section-content>.content[data-v-eb97add6],.topic[data-v-eb97add6]{margin-top:15px}.datalist dd{padding-left:2rem}.datalist dt{font-weight:600;padding-left:1rem;padding-top:1.64706rem}.datalist dt:first-of-type{padding-top:0}.source[data-v-e2e09a16]{background:var(--background,var(--color-code-background));border-color:var(--color-grid);color:var(--text,var(--color-code-plain));border-radius:4px;border-style:solid;border-width:1px;padding:8px 14px;speak:literal-punctuation;line-height:25px}.source.has-multiple-lines[data-v-e2e09a16]{border-radius:4px}.source>code[data-v-e2e09a16]{font-size:.88235rem;line-height:1.66667;font-weight:400;font-family:Menlo,monospace;display:block}.platforms[data-v-c5ecdd3e]{font-size:.82353rem;line-height:1.42857;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;margin-bottom:.45rem;margin-top:1.6em}.changed .platforms[data-v-c5ecdd3e]{padding-left:.588rem}.platforms[data-v-c5ecdd3e]:first-of-type{margin-top:1rem}.source[data-v-c5ecdd3e]{margin:14px 0}.platforms+.source[data-v-c5ecdd3e]{margin:0}.changed.declaration-group[data-v-c5ecdd3e]{background:var(--background,var(--color-code-background))}.changed .source[data-v-c5ecdd3e]{background:none;border:none;margin-top:0;margin-bottom:0;margin-left:2.17647rem;padding-left:0}.declaration-diff[data-v-b3e21c4a]{background:var(--background,var(--color-code-background))}.declaration-diff-version[data-v-b3e21c4a]{padding-left:.588rem;padding-left:2.17647rem;font-size:1rem;line-height:1.52941;font-weight:600;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--color-figure-gray-secondary);margin:0}.declaration-diff-current[data-v-b3e21c4a]{padding-top:8px;padding-bottom:5px}.declaration-diff-previous[data-v-b3e21c4a]{padding-top:5px;padding-bottom:8px;background-color:var(--color-changes-modified-previous-background);border-radius:0 0 4px 4px;position:relative}.conditional-constraints[data-v-e39c4ee4]{margin:1.17647rem 0 3rem 0}.type[data-v-791bac44]:first-letter{text-transform:capitalize}.detail-type[data-v-61ef551b]{font-weight:600;padding-left:1rem;padding-top:1.64706rem}.detail-type[data-v-61ef551b]:first-child{padding-top:0}@media only screen and (max-width:735px){.detail-type[data-v-61ef551b]{padding-left:0}}.detail-content[data-v-61ef551b]{padding-left:2rem}@media only screen and (max-width:735px){.detail-content[data-v-61ef551b]{padding-left:0}}.param-name[data-v-7bb7c035]{font-weight:600;padding-left:1rem;padding-top:1.64706rem}.param-name[data-v-7bb7c035]:first-child{padding-top:0}@media only screen and (max-width:735px){.param-name[data-v-7bb7c035]{padding-left:0}}.param-content[data-v-7bb7c035]{padding-left:2rem}@media only screen and (max-width:735px){.param-content[data-v-7bb7c035]{padding-left:0}}.param-content[data-v-7bb7c035] dt{font-weight:600}.param-content[data-v-7bb7c035] dd{margin-left:1em}.parameters-table[data-v-2d54624a] .change-added,.parameters-table[data-v-2d54624a] .change-removed{display:inline-block;max-width:100%}.parameters-table[data-v-2d54624a] .change-removed,.parameters-table[data-v-2d54624a] .token-removed{text-decoration:line-through}.param[data-v-2d54624a]{font-size:.88235rem;box-sizing:border-box}.param.changed[data-v-2d54624a]{display:flex;flex-flow:row wrap;padding-right:1rem;padding-left:2.17647rem;padding-top:8px;padding-bottom:8px;display:inline-flex;width:100%;box-sizing:border-box}.param.changed.changed[data-v-2d54624a]{padding-right:1rem}@media only screen and (max-width:735px){.param.changed[data-v-2d54624a]{padding-left:0;padding-right:0}.param.changed.changed[data-v-2d54624a]{padding-right:17px;padding-left:2.17647rem}}@media only screen and (max-width:735px){.param.changed[data-v-2d54624a]{padding-left:0;padding-right:0}}.param.changed+.param.changed[data-v-2d54624a]{margin-top:.82353rem}.changed .param-content[data-v-2d54624a],.changed .param-symbol[data-v-2d54624a]{padding-top:2px;padding-bottom:2px}@media only screen and (max-width:735px){.changed .param-content[data-v-2d54624a]{padding-top:0}.changed .param-symbol[data-v-2d54624a]{padding-bottom:0}}.param-symbol[data-v-2d54624a]{text-align:right}@media only screen and (max-width:735px){.param-symbol[data-v-2d54624a]{text-align:left}}.param-symbol[data-v-2d54624a] .type-identifier-link{color:var(--color-link)}.param+.param[data-v-2d54624a]{margin-top:1.64706rem}.param+.param[data-v-2d54624a]:first-child{margin-top:0}.param-content[data-v-2d54624a]{padding-left:1rem;padding-left:2.17647rem}@media only screen and (max-width:735px){.param-content[data-v-2d54624a]{padding-left:0;padding-right:0}}.property-metadata[data-v-8590589e]{color:var(--color-figure-gray-secondary)}.property-text{font-weight:700}.property-metadata[data-v-0a648a1e]{color:var(--color-figure-gray-secondary)}.property-name[data-v-1b54be82]{font-weight:700}.property-name.deprecated[data-v-1b54be82]{text-decoration:line-through}.property-deprecated[data-v-1b54be82]{margin-left:0}.content[data-v-1b54be82],.content[data-v-1b54be82] p:first-child{display:inline}.response-mimetype[data-v-2faa6020]{color:var(--color-figure-gray-secondary)}.part-name[data-v-1b311f59]{font-weight:700}.content[data-v-1b311f59],.content[data-v-1b311f59] p:first-child{display:inline}.param-name[data-v-5accae2c]{font-weight:700}.param-name.deprecated[data-v-5accae2c]{text-decoration:line-through}.param-deprecated[data-v-5accae2c]{margin-left:0}.content[data-v-5accae2c],.content[data-v-5accae2c] p:first-child{display:inline}.response-name[data-v-57796e8c],.response-reason[data-v-57796e8c]{font-weight:700}@media only screen and (max-width:735px){.response-reason[data-v-57796e8c]{display:none}}.response-name>code>.reason[data-v-57796e8c]{display:none}@media only screen and (max-width:735px){.response-name>code>.reason[data-v-57796e8c]{display:initial}}[data-v-0e405a2d] h2{font-size:1.88235rem;line-height:1.125;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}@media only screen and (max-width:1250px){[data-v-0e405a2d] h2{font-size:1.64706rem;line-height:1.14286;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (max-width:735px){[data-v-0e405a2d] h2{font-size:1.41176rem;line-height:1.16667;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.primary-content.with-border[data-v-0e405a2d]:before{border-top-color:var(--colors-grid,var(--color-grid));border-top-style:solid;border-top-width:1px;content:"";display:block}.primary-content[data-v-0e405a2d]>*{margin-bottom:40px;margin-top:40px}.primary-content[data-v-0e405a2d]>:first-child{margin-top:2.353rem}.relationships-list[data-v-6497632e]{list-style:none}.relationships-list.column[data-v-6497632e]{margin-left:0;margin-top:15px}.relationships-list.inline[data-v-6497632e]{display:flex;flex-direction:row;flex-wrap:wrap;margin-top:15px;margin-left:0}.relationships-list.inline li[data-v-6497632e]:not(:last-child):after{content:",\00a0"}.relationships-list.changed[data-v-6497632e]{padding-right:1rem;padding-left:2.17647rem;padding-top:8px;padding-bottom:8px;display:inline-flex;width:100%;box-sizing:border-box}.relationships-list.changed.changed[data-v-6497632e]{padding-right:1rem}@media only screen and (max-width:735px){.relationships-list.changed[data-v-6497632e]{padding-left:0;padding-right:0}.relationships-list.changed.changed[data-v-6497632e]{padding-right:17px;padding-left:2.17647rem}}@media only screen and (max-width:735px){.relationships-list.changed[data-v-6497632e]{padding-left:0;padding-right:0}}.relationships-list.changed[data-v-6497632e]:after{margin-top:.61765rem}.relationships-list.changed.column[data-v-6497632e]{display:block;box-sizing:border-box}.relationships-item[data-v-6497632e],.relationships-list[data-v-6497632e]{box-sizing:inherit}.conditional-constraints[data-v-6497632e]{font-size:.82353rem;margin:.17647rem 0 .58824rem 1.17647rem}.availability[data-v-4df209be]{display:flex;flex-flow:row wrap;gap:10px;margin-top:20px}.badge[data-v-4df209be]{margin:0}.technology[data-v-4df209be]{display:inline-flex;align-items:center}.tech-icon[data-v-4df209be]{height:12px;padding-right:5px;fill:var(--badge-color)}.theme-dark .tech-icon[data-v-4df209be]{fill:var(--badge-color)}.beta[data-v-4df209be]{color:var(--color-badge-beta)}.theme-dark .beta[data-v-4df209be]{color:var(--color-badge-dark-beta)}.deprecated[data-v-4df209be]{color:var(--color-badge-deprecated)}.theme-dark .deprecated[data-v-4df209be]{color:var(--color-badge-dark-deprecated)}.changed[data-v-4df209be]{padding-left:26px}.changed[data-v-4df209be]:after{content:none}.changed[data-v-4df209be]:before{background-image:url(../img/modified-icon.f496e73d.svg);background-repeat:no-repeat;bottom:0;content:" ";margin:auto;margin-right:8px;position:absolute;top:0;width:16px;height:16px;left:5px}@media screen{[data-color-scheme=dark] .changed[data-v-4df209be]:before{background-image:url(../img/modified-icon.f496e73d.svg)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .changed[data-v-4df209be]:before{background-image:url(../img/modified-icon.f496e73d.svg)}}.theme-dark .changed[data-v-4df209be]:before{background-image:url(../img/modified-icon.f496e73d.svg)}.changed-added[data-v-4df209be]{border-color:var(--color-changes-added)}.changed-added[data-v-4df209be]:before{background-image:url(../img/added-icon.d6f7e47d.svg)}@media screen{[data-color-scheme=dark] .changed-added[data-v-4df209be]:before{background-image:url(../img/added-icon.d6f7e47d.svg)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .changed-added[data-v-4df209be]:before{background-image:url(../img/added-icon.d6f7e47d.svg)}}.theme-dark .changed-added[data-v-4df209be]:before{background-image:url(../img/added-icon.d6f7e47d.svg)}.changed-deprecated[data-v-4df209be]{border-color:var(--color-changes-deprecated)}.changed-deprecated[data-v-4df209be]:before{background-image:url(../img/deprecated-icon.015b4f17.svg)}@media screen{[data-color-scheme=dark] .changed-deprecated[data-v-4df209be]:before{background-image:url(../img/deprecated-icon.015b4f17.svg)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .changed-deprecated[data-v-4df209be]:before{background-image:url(../img/deprecated-icon.015b4f17.svg)}}.theme-dark .changed-deprecated[data-v-4df209be]:before{background-image:url(../img/deprecated-icon.015b4f17.svg)}.changed-modified[data-v-4df209be]{border-color:var(--color-changes-modified)}.eyebrow[data-v-2e777455]{font-size:1.23529rem;line-height:1.19048;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:#ccc;display:block;margin-bottom:1.17647rem}@media only screen and (max-width:735px){.eyebrow[data-v-2e777455]{font-size:1.11765rem;line-height:1.21053;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.documentation-hero--disabled .eyebrow[data-v-2e777455]{color:var(--colors-secondary-label,var(--color-secondary-label))}.title[data-v-2e777455]{font-size:2.35294rem;line-height:1.1;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:#fff;margin-bottom:.70588rem}@media only screen and (max-width:1250px){.title[data-v-2e777455]{font-size:1.88235rem;line-height:1.125;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (max-width:735px){.title[data-v-2e777455]{font-size:1.64706rem;line-height:1.14286;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.documentation-hero--disabled .title[data-v-2e777455]{color:var(--colors-header-text,var(--color-header-text))}small[data-v-2e777455]{font-size:1.41176rem;line-height:1.16667;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;padding-left:10px}@media only screen and (max-width:1250px){small[data-v-2e777455]{font-size:1.23529rem;line-height:1.19048;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}small[data-v-2e777455]:before{content:attr(data-tag-name)}small.Beta[data-v-2e777455]{color:var(--color-badge-beta)}.theme-dark small.Beta[data-v-2e777455]{color:var(--color-badge-dark-beta)}small.Deprecated[data-v-2e777455]{color:var(--color-badge-deprecated)}.theme-dark small.Deprecated[data-v-2e777455]{color:var(--color-badge-dark-deprecated)}.doc-topic[data-v-a877f03c]{display:flex;flex-direction:column;height:100%}#main[data-v-a877f03c]{outline-style:none;height:100%}@media only screen and (min-width:1920px){.full-width-container #main[data-v-a877f03c]{border-right:1px solid var(--color-grid)}}.container[data-v-a877f03c]{outline-style:none}.full-width-container .container[data-v-a877f03c]{max-width:920px;margin-left:auto;margin-right:auto;padding-left:80px;padding-right:80px;box-sizing:border-box}@media only screen and (min-width:1251px){.full-width-container .container[data-v-a877f03c]{box-sizing:unset;padding-left:120px;padding-right:120px;margin-left:0}}@media only screen and (max-width:735px){.full-width-container .container[data-v-a877f03c]{width:auto;padding-left:20px;padding-right:20px}}.static-width-container .container[data-v-a877f03c]{margin-left:auto;margin-right:auto;width:980px}@media only screen and (max-width:1250px){.static-width-container .container[data-v-a877f03c]{width:692px}}@media only screen and (max-width:735px){.static-width-container .container[data-v-a877f03c]{width:87.5%}}.description[data-v-a877f03c]{margin-bottom:2.353rem}.description[data-v-a877f03c]:empty{display:none}.description.after-enhanced-hero[data-v-a877f03c]{margin-top:2.353rem}.description[data-v-a877f03c] .content+*{margin-top:.8em}[data-v-a877f03c] .documentation-hero+.contenttable .container>.title{border-top:none}.sample-download[data-v-a877f03c]{margin-top:20px}[data-v-a877f03c] h3{font-size:1.64706rem;line-height:1.14286;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}@media only screen and (max-width:1250px){[data-v-a877f03c] h3{font-size:1.41176rem;line-height:1.16667;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (max-width:735px){[data-v-a877f03c] h3{font-size:1.23529rem;line-height:1.19048;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}[data-v-a877f03c] h4{font-size:1.41176rem;line-height:1.16667;font-weight:600;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}@media only screen and (max-width:1250px){[data-v-a877f03c] h4{font-size:1.23529rem;line-height:1.19048;font-weight:600;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}[data-v-a877f03c] h5{font-size:1.29412rem;line-height:1.18182;font-weight:600;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}@media only screen and (max-width:1250px){[data-v-a877f03c] h5{font-size:1.17647rem;line-height:1.2;font-weight:600;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (max-width:735px){[data-v-a877f03c] h5{font-size:1.05882rem;line-height:1.44444;font-weight:600;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}[data-v-a877f03c] h6{font-size:1rem;line-height:1.47059;font-weight:600;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.adjustable-sidebar-width[data-v-453b0e76]{display:flex}@media only screen and (max-width:1023px){.adjustable-sidebar-width[data-v-453b0e76]{display:block;position:relative}}.sidebar[data-v-453b0e76]{position:relative}@media only screen and (max-width:1023px){.sidebar[data-v-453b0e76]{position:static}}.aside[data-v-453b0e76]{width:250px;position:relative;height:100%;max-width:100vw}.aside.no-transition[data-v-453b0e76]{transition:none!important}@media only screen and (max-width:1023px){.aside[data-v-453b0e76]{width:100%!important;overflow:hidden;min-width:0;max-width:100%;height:calc(var(--app-height) - var(--top-offset-mobile));position:fixed;top:var(--top-offset-mobile);bottom:0;z-index:9997;transform:translateX(-100%);transition:transform .15s ease-in}.aside[data-v-453b0e76] .aside-animated-child{opacity:0}.aside.force-open[data-v-453b0e76]{transform:translateX(0)}.aside.force-open[data-v-453b0e76] .aside-animated-child{--index:0;opacity:1;transition:opacity .15s linear;transition-delay:calc(var(--index)*0.15s + .15s)}.aside.has-mobile-top-offset[data-v-453b0e76]{border-top:1px solid var(--color-fill-gray-tertiary)}}.content[data-v-453b0e76]{display:flex;flex-flow:column;min-width:0;flex:1 1 auto;height:100%}.resize-handle[data-v-453b0e76]{position:absolute;cursor:col-resize;top:0;bottom:0;right:0;width:5px;height:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:1;transition:background-color .15s;transform:translateX(50%)}@media only screen and (max-width:1023px){.resize-handle[data-v-453b0e76]{display:none}}.resize-handle[data-v-453b0e76]:hover{background:var(--color-fill-gray-tertiary)}.navigator-card-inner[data-v-7a09780d]{--nav-card-inner-vertical-offset:0px;position:sticky;top:var(--nav-height);height:calc(var(--app-height) - var(--nav-height) - var(--nav-card-inner-vertical-offset));display:flex;flex-flow:column}@media only screen and (max-width:1023px){.navigator-card-inner[data-v-7a09780d]{position:static;height:100%}}.highlight[data-v-d75876e2]{display:inline}.highlight[data-v-d75876e2] .match{font-weight:600;background:var(--color-fill-light-blue-secondary)}.navigator-card-item[data-v-6fb0778e]{height:32px;display:flex;align-items:center}.fromkeyboard .navigator-card-item[data-v-6fb0778e]:focus-within{margin:5px;height:22px;outline:4px solid var(--color-focus-color);outline-offset:1px}.fromkeyboard .navigator-card-item:focus-within .depth-spacer[data-v-6fb0778e]{margin-left:-5px}.depth-spacer[data-v-6fb0778e]{width:calc(var(--nesting-index)*15px + 25px);height:32px;position:relative;flex:0 0 auto}.fromkeyboard .depth-spacer[data-v-6fb0778e]:focus{margin:-5px}.head-wrapper[data-v-6fb0778e]{padding:0 20px 0 10px;position:relative;display:flex;align-items:center;flex:1;min-width:0;height:100%}@supports (padding:max(0px)){.head-wrapper[data-v-6fb0778e]{padding-left:max(10px,env(safe-area-inset-left));padding-right:max(20px,env(safe-area-inset-right))}}.head-wrapper.active[data-v-6fb0778e]{background:var(--color-fill-gray-quaternary)}.head-wrapper.is-group .leaf-link[data-v-6fb0778e]{color:var(--color-figure-gray-secondary);font-weight:600}.head-wrapper.is-group .leaf-link[data-v-6fb0778e]:after{display:none}.hover .head-wrapper[data-v-6fb0778e]:not(.is-group){background:var(--color-navigator-item-hover)}.head-wrapper .navigator-icon[data-v-6fb0778e]{display:flex;flex:0 0 auto}.head-wrapper .navigator-icon.changed[data-v-6fb0778e]{border:none;width:1em;height:1em;margin-right:7px;z-index:0}.head-wrapper .navigator-icon.changed[data-v-6fb0778e]:after{top:50%;left:50%;right:auto;bottom:auto;transform:translate(-50%,-50%);background-image:url(../img/modified-icon.f496e73d.svg);margin:0}@media screen{[data-color-scheme=dark] .head-wrapper .navigator-icon.changed[data-v-6fb0778e]:after{background-image:url(../img/modified-icon.f496e73d.svg)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .head-wrapper .navigator-icon.changed[data-v-6fb0778e]:after{background-image:url(../img/modified-icon.f496e73d.svg)}}.head-wrapper .navigator-icon.changed-added[data-v-6fb0778e]:after{background-image:url(../img/added-icon.d6f7e47d.svg)}@media screen{[data-color-scheme=dark] .head-wrapper .navigator-icon.changed-added[data-v-6fb0778e]:after{background-image:url(../img/added-icon.d6f7e47d.svg)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .head-wrapper .navigator-icon.changed-added[data-v-6fb0778e]:after{background-image:url(../img/added-icon.d6f7e47d.svg)}}.head-wrapper .navigator-icon.changed-deprecated[data-v-6fb0778e]:after{background-image:url(../img/deprecated-icon.015b4f17.svg)}@media screen{[data-color-scheme=dark] .head-wrapper .navigator-icon.changed-deprecated[data-v-6fb0778e]:after{background-image:url(../img/deprecated-icon.015b4f17.svg)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .head-wrapper .navigator-icon.changed-deprecated[data-v-6fb0778e]:after{background-image:url(../img/deprecated-icon.015b4f17.svg)}}.head-wrapper .leaf-link[data-v-6fb0778e]{color:var(--color-figure-gray);text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:100%;display:inline;vertical-align:middle;font-size:.82353rem;line-height:1.28571;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.fromkeyboard .head-wrapper .leaf-link[data-v-6fb0778e]:focus{outline:none}.head-wrapper .leaf-link[data-v-6fb0778e]:hover{text-decoration:none}.head-wrapper .leaf-link.bolded[data-v-6fb0778e]{font-weight:600}.head-wrapper .leaf-link[data-v-6fb0778e]:after{content:"";position:absolute;top:0;left:0;right:0;bottom:0}.extended-content[data-v-6fb0778e]{font-size:.82353rem;line-height:1.42857;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--color-figure-gray-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tree-toggle[data-v-6fb0778e]{overflow:hidden;position:absolute;width:100%;height:100%;padding-right:5px;box-sizing:border-box;z-index:1;display:flex;align-items:center;justify-content:flex-end}.title-container[data-v-6fb0778e]{min-width:0;display:flex;align-items:center}.chevron[data-v-6fb0778e]{width:10px}.chevron.animating[data-v-6fb0778e]{transition:transform .15s ease-in}.chevron.rotate[data-v-6fb0778e]{transform:rotate(90deg)}.tag[data-v-3b809bfa]{display:inline-block;padding-right:.58824rem}.tag[data-v-3b809bfa]:focus{outline:none}.tag button[data-v-3b809bfa]{color:var(--color-figure-gray);background-color:var(--color-fill-tertiary);font-size:.82353rem;line-height:1.28571;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;border-radius:.82353rem;padding:.23529rem .58824rem;white-space:nowrap;border:1px solid transparent}@media (hover:hover){.tag button[data-v-3b809bfa]:hover{transition:background-color .2s,color .2s;background-color:var(--color-fill-blue);color:#fff}}.tag button[data-v-3b809bfa]:focus:active{background-color:var(--color-fill-blue);color:#fff}.fromkeyboard .tag button[data-v-3b809bfa]:focus,.tag button.focus[data-v-3b809bfa],.tag button[data-v-3b809bfa]:focus{box-shadow:0 0 0 4px var(--color-focus-color);outline:none;border-color:var(--color-focus-border-color)}.tags[data-v-4b231516]{position:relative;margin:0;list-style:none;box-sizing:border-box;transition:padding-right .8s,padding-bottom .8s,max-height 1s,opacity 1s;padding:0}.tags .scroll-wrapper[data-v-4b231516]{overflow-x:auto;overflow-y:hidden;-ms-overflow-style:none;scrollbar-color:var(--color-figure-gray-tertiary) transparent;scrollbar-width:thin}.tags .scroll-wrapper[data-v-4b231516]::-webkit-scrollbar{height:0}@supports not ((-webkit-touch-callout:none) or (scrollbar-width:none) or (-ms-overflow-style:none)){.tags .scroll-wrapper.scrolling[data-v-4b231516]{--scrollbar-height:11px;padding-top:var(--scrollbar-height);height:calc(var(--scroll-target-height) - var(--scrollbar-height));display:flex;align-items:center}}.tags .scroll-wrapper.scrolling[data-v-4b231516]::-webkit-scrollbar{height:11px}.tags .scroll-wrapper.scrolling[data-v-4b231516]::-webkit-scrollbar-thumb{border-radius:10px;background-color:var(--color-figure-gray-tertiary);border:2px solid transparent;background-clip:padding-box}.tags .scroll-wrapper.scrolling[data-v-4b231516]::-webkit-scrollbar-track-piece:end{margin-right:8px}.tags .scroll-wrapper.scrolling[data-v-4b231516]::-webkit-scrollbar-track-piece:start{margin-left:8px}.tags ul[data-v-4b231516]{margin:0;padding:0;display:flex}.filter[data-v-3b91e60a]{--input-vertical-padding:.76471rem;--input-height:1.64706rem;--input-border-color:var(--color-fill-gray-secondary);--input-text:var(--color-fill-gray-secondary);position:relative;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0);border-radius:5px}.fromkeyboard .filter[data-v-3b91e60a]:focus{outline:none}.filter__top-wrapper[data-v-3b91e60a]{display:flex}.filter__filter-button[data-v-3b91e60a]{position:relative;margin-left:.58824rem;z-index:1;cursor:text;margin-right:.17647rem}@media only screen and (max-width:735px){.filter__filter-button[data-v-3b91e60a]{margin-right:.41176rem}}.filter__filter-button .svg-icon[data-v-3b91e60a]{fill:var(--input-text);display:block;height:21px}.filter__filter-button.blue[data-v-3b91e60a]>*{fill:var(--color-figure-blue);color:var(--color-figure-blue)}.filter.focus .filter__wrapper[data-v-3b91e60a]{box-shadow:0 0 0 3pt var(--color-focus-color);--input-border-color:var(--color-fill-blue)}.filter__wrapper[data-v-3b91e60a]{border:1px solid var(--input-border-color);background:var(--color-fill);border-radius:4px}.filter__wrapper--reversed[data-v-3b91e60a]{display:flex;flex-direction:column-reverse}.filter__suggested-tags[data-v-3b91e60a]{border-top:1px solid var(--color-fill-gray-tertiary);z-index:1;overflow:hidden}.filter__suggested-tags[data-v-3b91e60a] ul{padding:var(--input-vertical-padding) .52941rem;border:1px solid transparent;border-bottom-left-radius:3px;border-bottom-right-radius:3px}.fromkeyboard .filter__suggested-tags[data-v-3b91e60a] ul:focus{outline:none;box-shadow:0 0 0 5px var(--color-focus-color)}.filter__wrapper--reversed .filter__suggested-tags[data-v-3b91e60a]{border-bottom:1px solid var(--color-fill-gray-tertiary);border-top:none}.filter__selected-tags[data-v-3b91e60a]{z-index:1;padding-left:4px;margin:-4px 0}@media only screen and (max-width:735px){.filter__selected-tags[data-v-3b91e60a]{padding-left:0}}.filter__selected-tags[data-v-3b91e60a] ul{padding:4px}@media only screen and (max-width:735px){.filter__selected-tags[data-v-3b91e60a] ul{padding-right:.41176rem}}.filter__selected-tags[data-v-3b91e60a] ul .tag:last-child{padding-right:0}.filter__delete-button[data-v-3b91e60a]{position:relative;margin:0;z-index:1;border-radius:100%}.fromkeyboard .filter__delete-button[data-v-3b91e60a]:focus{box-shadow:0 0 0 4px var(--color-focus-color);outline:none}.filter__delete-button .clear-rounded-icon[data-v-3b91e60a]{height:.94118rem;width:.94118rem;fill:var(--input-text);display:block}.filter__delete-button-wrapper[data-v-3b91e60a]{display:flex;align-items:center;padding:0 10px;border-top-right-radius:4px;border-bottom-right-radius:4px}.filter__input-label[data-v-3b91e60a]{position:relative;flex-grow:1;height:var(--input-height);padding:var(--input-vertical-padding) 0}.filter__input-label[data-v-3b91e60a]:after{content:attr(data-value);visibility:hidden;width:auto;white-space:nowrap;min-width:130px;display:block;text-indent:.41176rem}@media only screen and (max-width:735px){.filter__input-label[data-v-3b91e60a]:after{text-indent:.17647rem}}.filter__input-box-wrapper[data-v-3b91e60a]{overflow-y:hidden;-ms-overflow-style:none;scrollbar-color:var(--color-figure-gray-tertiary) transparent;scrollbar-width:thin;display:flex;overflow-x:auto;align-items:center;cursor:text;flex:1}.filter__input-box-wrapper[data-v-3b91e60a]::-webkit-scrollbar{height:0}@supports not ((-webkit-touch-callout:none) or (scrollbar-width:none) or (-ms-overflow-style:none)){.filter__input-box-wrapper.scrolling[data-v-3b91e60a]{--scrollbar-height:11px;padding-top:var(--scrollbar-height);height:calc(var(--scroll-target-height) - var(--scrollbar-height));display:flex;align-items:center}}.filter__input-box-wrapper.scrolling[data-v-3b91e60a]::-webkit-scrollbar{height:11px}.filter__input-box-wrapper.scrolling[data-v-3b91e60a]::-webkit-scrollbar-thumb{border-radius:10px;background-color:var(--color-figure-gray-tertiary);border:2px solid transparent;background-clip:padding-box}.filter__input-box-wrapper.scrolling[data-v-3b91e60a]::-webkit-scrollbar-track-piece:end{margin-right:8px}.filter__input-box-wrapper.scrolling[data-v-3b91e60a]::-webkit-scrollbar-track-piece:start{margin-left:8px}.filter__input[data-v-3b91e60a]{font-size:1.23529rem;line-height:1.38095;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--color-text);height:var(--input-height);border:none;width:100%;position:absolute;background:transparent;z-index:1;text-indent:.41176rem}@media only screen and (max-width:735px){.filter__input[data-v-3b91e60a]{font-size:1.11765rem;line-height:1.42105;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;text-indent:.17647rem}}.filter__input[data-v-3b91e60a]:focus{outline:none}.filter__input[placeholder][data-v-3b91e60a]::-moz-placeholder{color:var(--input-text);opacity:1}.filter__input[placeholder][data-v-3b91e60a]::placeholder{color:var(--input-text);opacity:1}.filter__input[placeholder][data-v-3b91e60a]:-ms-input-placeholder{color:var(--input-text)}.filter__input[placeholder][data-v-3b91e60a]::-ms-input-placeholder{color:var(--input-text)}.vue-recycle-scroller{position:relative}.vue-recycle-scroller.direction-vertical:not(.page-mode){overflow-y:auto}.vue-recycle-scroller.direction-horizontal:not(.page-mode){overflow-x:auto}.vue-recycle-scroller.direction-horizontal{display:-webkit-box;display:-ms-flexbox;display:flex}.vue-recycle-scroller__slot{-webkit-box-flex:1;-ms-flex:auto 0 0px;flex:auto 0 0}.vue-recycle-scroller__item-wrapper{-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;position:relative}.vue-recycle-scroller.ready .vue-recycle-scroller__item-view{position:absolute;top:0;left:0;will-change:transform}.vue-recycle-scroller.direction-vertical .vue-recycle-scroller__item-wrapper{width:100%}.vue-recycle-scroller.direction-horizontal .vue-recycle-scroller__item-wrapper{height:100%}.vue-recycle-scroller.ready.direction-vertical .vue-recycle-scroller__item-view{width:100%}.vue-recycle-scroller.ready.direction-horizontal .vue-recycle-scroller__item-view{height:100%}.resize-observer[data-v-b329ee4c]{border:none;background-color:transparent;opacity:0}.resize-observer[data-v-b329ee4c],.resize-observer[data-v-b329ee4c] object{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%;pointer-events:none;display:block;overflow:hidden}.navigator-card[data-v-d21551d4]{--card-vertical-spacing:8px;display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.navigator-card .navigator-card-full-height[data-v-d21551d4]{height:100%}.navigator-card .navigator-card-inner[data-v-d21551d4]{--nav-card-inner-vertical-offset:71px}.navigator-card .head-wrapper[data-v-d21551d4]{position:relative}.navigator-card .navigator-head[data-v-d21551d4]{padding:10px 20px;background:var(--color-fill-secondary);border-bottom:1px solid var(--color-grid);display:flex;align-items:center;box-sizing:border-box}.navigator-card .navigator-head .badge[data-v-d21551d4]{margin-top:0}.navigator-card .navigator-head.router-link-exact-active[data-v-d21551d4]{background:var(--color-fill-tertiary)}.navigator-card .navigator-head.router-link-exact-active .card-link[data-v-d21551d4]{font-weight:700}.navigator-card .navigator-head[data-v-d21551d4]:hover{background:var(--color-navigator-item-hover);text-decoration:none}@media only screen and (max-width:1023px){.navigator-card .navigator-head[data-v-d21551d4]{justify-content:center;height:3.05882rem;padding:14px 20px}}@media only screen and (max-width:767px){.navigator-card .navigator-head[data-v-d21551d4]{height:2.82353rem;padding:12px 20px}}@supports (padding:max(0px)){.navigator-card .navigator-head[data-v-d21551d4]{padding-left:max(20px,env(safe-area-inset-left));padding-right:max(20px,env(safe-area-inset-right))}}.navigator-card .card-icon[data-v-d21551d4]{width:19px;height:19px}.no-items-wrapper[data-v-d21551d4]{color:var(--color-figure-gray-tertiary);font-size:.82353rem;line-height:1.42857;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;padding:var(--card-vertical-spacing) 20px}.close-card-mobile[data-v-d21551d4]{display:none;position:absolute;z-index:1;color:var(--color-link);align-items:center;justify-content:center}@media only screen and (max-width:1023px){.close-card-mobile[data-v-d21551d4]{display:flex;left:0;height:100%;padding-left:1.29412rem;padding-right:1.29412rem}@supports (padding:max(0px)){.close-card-mobile[data-v-d21551d4]{padding-left:max(1.29412rem,env(safe-area-inset-left))}}}@media only screen and (max-width:767px){.close-card-mobile[data-v-d21551d4]{padding-left:.94118rem;padding-right:.94118rem}}.close-card-mobile .close-icon[data-v-d21551d4]{width:19px;height:19px}.card-body[data-v-d21551d4]{padding-right:0;flex:1 1 auto;min-height:0}@media only screen and (max-width:1023px){.card-body[data-v-d21551d4]{--card-vertical-spacing:0px;padding-top:71px}}.card-link[data-v-d21551d4]{color:var(--color-text);font-size:.82353rem;line-height:1.42857;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:600}.navigator-filter[data-v-d21551d4]{box-sizing:border-box;padding:15px 30px;border-top:1px solid var(--color-grid);height:71px;display:flex;align-items:flex-end}@supports (padding:max(0px)){.navigator-filter[data-v-d21551d4]{padding-left:max(30px,env(safe-area-inset-left));padding-right:max(30px,env(safe-area-inset-right))}}@media only screen and (max-width:1023px){.navigator-filter[data-v-d21551d4]{border:none;padding:10px 20px;align-items:flex-start;height:62px}@supports (padding:max(0px)){.navigator-filter[data-v-d21551d4]{padding-left:max(20px,env(safe-area-inset-left));padding-right:max(20px,env(safe-area-inset-right))}}}.navigator-filter .input-wrapper[data-v-d21551d4]{position:relative;flex:1;min-width:0}.navigator-filter .filter-component[data-v-d21551d4]{--input-vertical-padding:10px;--input-height:20px;--input-border-color:var(--color-grid);--input-text:var(--color-figure-gray-secondary)}.navigator-filter .filter-component[data-v-d21551d4] .filter__input{font-size:1rem;line-height:1.47059;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.scroller[data-v-d21551d4]{height:100%;box-sizing:border-box;padding:var(--card-vertical-spacing) 0;padding-bottom:calc(var(--top-offset, 0px) + var(--card-vertical-spacing));transition:padding-bottom .15s ease-in}@media only screen and (max-width:1023px){.scroller[data-v-d21551d4]{padding-bottom:10em}}.scroller[data-v-d21551d4] .vue-recycle-scroller__item-wrapper{transform:translateZ(0)}.filter-wrapper[data-v-d21551d4]{position:sticky;bottom:0;background:var(--color-fill)}@media only screen and (max-width:1023px){.filter-wrapper[data-v-d21551d4]{position:absolute;top:3.05882rem;bottom:auto;width:100%}}@media only screen and (max-width:767px){.filter-wrapper[data-v-d21551d4]{top:2.82353rem}}@-webkit-keyframes fadeout-data-v-60936b56{0%{opacity:1}to{opacity:0}}@keyframes fadeout-data-v-60936b56{0%{opacity:1}to{opacity:0}}path[data-v-60936b56]{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:fadeout-data-v-60936b56;animation-name:fadeout-data-v-60936b56;fill:currentColor}path[data-v-60936b56]:first-of-type{-webkit-animation-delay:0ms;animation-delay:0ms}path[data-v-60936b56]:nth-of-type(2){-webkit-animation-delay:-125ms;animation-delay:-125ms}path[data-v-60936b56]:nth-of-type(3){-webkit-animation-delay:-.25s;animation-delay:-.25s}path[data-v-60936b56]:nth-of-type(4){-webkit-animation-delay:-375ms;animation-delay:-375ms}path[data-v-60936b56]:nth-of-type(5){-webkit-animation-delay:-.5s;animation-delay:-.5s}path[data-v-60936b56]:nth-of-type(6){-webkit-animation-delay:-625ms;animation-delay:-625ms}path[data-v-60936b56]:nth-of-type(7){-webkit-animation-delay:-.75s;animation-delay:-.75s}path[data-v-60936b56]:nth-of-type(8){-webkit-animation-delay:-875ms;animation-delay:-875ms}.navigator[data-v-0ea7ca2b]{--nav-height:3.05882rem;height:100%;display:flex;flex-flow:column}@media only screen and (min-width:1920px){.navigator[data-v-0ea7ca2b]{border-left:1px solid var(--color-grid)}}@media only screen and (max-width:1023px){.navigator[data-v-0ea7ca2b]{position:static;transition:none}}.loading-placeholder[data-v-0ea7ca2b]{align-items:center;color:var(--color-figure-gray-secondary);justify-content:center}.loading-spinner[data-v-0ea7ca2b]{--spinner-size:40px;--spinner-delay:1s;height:var(--spinner-size);width:var(--spinner-size)}.loading-spinner.delay-visibility-enter-active[data-v-0ea7ca2b]{transition:visibility var(--spinner-delay);visibility:hidden}.hierarchy-collapsed-items[data-v-74906830]{position:relative;display:inline-flex;align-items:center;margin-left:.17647rem}.hierarchy-collapsed-items .hierarchy-item-icon[data-v-74906830]{width:9px;height:15px;margin-right:.17647rem;display:flex;justify-content:center;font-size:1em;align-self:baseline}.nav--in-breakpoint-range .hierarchy-collapsed-items[data-v-74906830]{display:none}.hierarchy-collapsed-items .toggle[data-v-74906830]{background:var(--color-nav-hierarchy-collapse-background);border-color:var(--color-nav-hierarchy-collapse-borders);border-radius:4px;border-style:solid;border-width:0;font-weight:600;height:1.11765rem;text-align:center;width:2.11765rem;display:flex;align-items:center;justify-content:center}.theme-dark .hierarchy-collapsed-items .toggle[data-v-74906830]{background:var(--color-nav-dark-hierarchy-collapse-background)}.hierarchy-collapsed-items .toggle.focused[data-v-74906830],.hierarchy-collapsed-items .toggle[data-v-74906830]:active,.hierarchy-collapsed-items .toggle[data-v-74906830]:focus{box-shadow:0 0 0 4px var(--color-focus-color);outline:none}.indicator[data-v-74906830]{width:1em;height:1em;display:flex;align-items:center}.indicator .toggle-icon[data-v-74906830]{width:100%}.dropdown[data-v-74906830]{background:var(--color-nav-hierarchy-collapse-background);border-color:var(--color-nav-hierarchy-collapse-borders);border-radius:4px;border-style:solid;box-shadow:0 1px 4px -1px var(--color-figure-gray-secondary);border-width:0;padding:0 .5rem;position:absolute;z-index:42;top:calc(100% + .41176rem)}.theme-dark .dropdown[data-v-74906830]{background:var(--color-nav-dark-hierarchy-collapse-background);border-color:var(--color-nav-dark-hierarchy-collapse-borders)}.dropdown.collapsed[data-v-74906830]{opacity:0;transform:translate3d(0,-.41176rem,0);transition:opacity .25s ease,transform .25s ease,visibility 0s linear .25s;visibility:hidden}.dropdown[data-v-74906830]:not(.collapsed){opacity:1;transform:none;transition:opacity .25s ease,transform .25s ease,visibility 0s linear 0s;visibility:visible}.nav--in-breakpoint-range .dropdown[data-v-74906830]:not(.collapsed){display:none}.dropdown[data-v-74906830]:before{border-bottom-color:var(--color-nav-hierarchy-collapse-background);border-bottom-style:solid;border-bottom-width:.5rem;border-left-color:transparent;border-left-style:solid;border-left-width:.5rem;border-right-color:transparent;border-right-style:solid;border-right-width:.5rem;content:"";left:1.26471rem;position:absolute;top:-.44118rem}.theme-dark .dropdown[data-v-74906830]:before{border-bottom-color:var(--color-nav-dark-hierarchy-collapse-background)}.dropdown-item[data-v-74906830]{border-top-color:var(--color-nav-hierarchy-collapse-borders);border-top-style:solid;border-top-width:1px}.theme-dark .dropdown-item[data-v-74906830]{border-top-color:var(--color-nav-dark-hierarchy-collapse-borders)}.dropdown-item[data-v-74906830]:first-child{border-top:none}.nav-menu-link[data-v-74906830]{max-width:57.64706rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;padding:.75rem 1rem}.hierarchy-item[data-v-382bf39e]{display:flex;align-items:center;margin-left:.17647rem}.hierarchy-item[data-v-382bf39e] .hierarchy-item-icon{width:9px;height:15px;margin-right:.17647rem;display:flex;justify-content:center;font-size:1em;align-self:baseline}.nav--in-breakpoint-range .hierarchy-item[data-v-382bf39e] .hierarchy-item-icon{display:none}.nav--in-breakpoint-range .hierarchy-item[data-v-382bf39e]{border-top:1px solid var(--color-nav-hierarchy-item-borders);display:flex;align-items:center}.theme-dark.nav--in-breakpoint-range .hierarchy-item[data-v-382bf39e]{border-top-color:var(--color-nav-dark-hierarchy-item-borders)}.nav--in-breakpoint-range .hierarchy-item[data-v-382bf39e]:first-of-type{border-top:none}.hierarchy-item.collapsed[data-v-382bf39e]{display:none}.nav--in-breakpoint-range .hierarchy-item.collapsed[data-v-382bf39e]{display:inline-block}.item[data-v-382bf39e]{display:inline-block;vertical-align:middle}.nav--in-breakpoint-range .item[data-v-382bf39e]{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;height:100%;line-height:2.47059rem}@media only screen and (min-width:768px){.hierarchy-item:first-child:last-child .item[data-v-382bf39e],.hierarchy-item:first-child:last-child~.hierarchy-item .item[data-v-382bf39e]{max-width:45rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.has-badge .hierarchy-item:first-child:last-child .item[data-v-382bf39e],.has-badge .hierarchy-item:first-child:last-child~.hierarchy-item .item[data-v-382bf39e],.hierarchy-item:first-child:nth-last-child(2) .item[data-v-382bf39e],.hierarchy-item:first-child:nth-last-child(2)~.hierarchy-item .item[data-v-382bf39e]{max-width:36rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.has-badge .hierarchy-item:first-child:nth-last-child(2) .item[data-v-382bf39e],.has-badge .hierarchy-item:first-child:nth-last-child(2)~.hierarchy-item .item[data-v-382bf39e]{max-width:28.8rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hierarchy-item:first-child:nth-last-child(3) .item[data-v-382bf39e],.hierarchy-item:first-child:nth-last-child(3)~.hierarchy-item .item[data-v-382bf39e]{max-width:27rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.has-badge .hierarchy-item:first-child:nth-last-child(3) .item[data-v-382bf39e],.has-badge .hierarchy-item:first-child:nth-last-child(3)~.hierarchy-item .item[data-v-382bf39e]{max-width:21.6rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hierarchy-item:first-child:nth-last-child(4) .item[data-v-382bf39e],.hierarchy-item:first-child:nth-last-child(4)~.hierarchy-item .item[data-v-382bf39e]{max-width:18rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.has-badge .hierarchy-item:first-child:nth-last-child(4) .item[data-v-382bf39e],.has-badge .hierarchy-item:first-child:nth-last-child(4)~.hierarchy-item .item[data-v-382bf39e]{max-width:14.4rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hierarchy-item:first-child:nth-last-child(5) .item[data-v-382bf39e],.hierarchy-item:first-child:nth-last-child(5)~.hierarchy-item .item[data-v-382bf39e]{max-width:9rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.has-badge .hierarchy-item:first-child:nth-last-child(5) .item[data-v-382bf39e],.has-badge .hierarchy-item:first-child:nth-last-child(5)~.hierarchy-item .item[data-v-382bf39e]{max-width:7.2rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hierarchy-collapsed-items~.hierarchy-item .item[data-v-382bf39e]{max-width:10.8rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hierarchy-collapsed-items~.hierarchy-item:last-child .item[data-v-382bf39e]{max-width:none}.has-badge .hierarchy-collapsed-items~.hierarchy-item .item[data-v-382bf39e]{max-width:8.64rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}.hierarchy[data-v-30132cb0]{justify-content:flex-start;min-width:0;margin-right:80px}.nav--in-breakpoint-range .hierarchy[data-v-30132cb0]{margin-right:0}.hierarchy .root-hierarchy .item[data-v-30132cb0]{max-width:10rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nav-menu-setting-label[data-v-126c8e14]{margin-right:.35294rem;white-space:nowrap}.language-dropdown[data-v-126c8e14]{-webkit-text-size-adjust:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;background-color:transparent;box-sizing:inherit;padding:0 11px 0 4px;margin-left:-4px;font-size:.82353rem;line-height:1.28571;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;cursor:pointer;position:relative;z-index:1}@media only screen and (max-width:1023px){.language-dropdown[data-v-126c8e14]{font-size:.82353rem;line-height:1.5;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.language-dropdown[data-v-126c8e14]:focus{outline:none}.fromkeyboard .language-dropdown[data-v-126c8e14]:focus{outline:4px solid var(--color-focus-color);outline-offset:1px}.language-sizer[data-v-126c8e14]{position:absolute;opacity:0;pointer-events:none;padding:0}.language-toggle-container[data-v-126c8e14]{display:flex;align-items:center;padding-right:.17647rem;position:relative}.nav--in-breakpoint-range .language-toggle-container[data-v-126c8e14]{display:none}.language-toggle-container .toggle-icon[data-v-126c8e14]{width:.6em;height:.6em;position:absolute;right:7px}.language-toggle-label[data-v-126c8e14]{margin-right:2px}.language-toggle.nav-menu-toggle-label[data-v-126c8e14]{margin-right:6px}.language-list[data-v-126c8e14]{display:inline-block;margin-top:0}.language-list-container[data-v-126c8e14]{display:none}.language-list-item[data-v-126c8e14],.nav--in-breakpoint-range .language-list-container[data-v-126c8e14]{display:inline-block}.language-list-item[data-v-126c8e14]:not(:first-child){border-left:1px solid #424242;margin-left:6px;padding-left:6px}[data-v-cbd98416] .nav-menu{line-height:1.5;padding-top:0}[data-v-cbd98416] .nav-menu,[data-v-cbd98416] .nav-menu-settings{font-size:.82353rem;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}[data-v-cbd98416] .nav-menu-settings{line-height:1.28571}@media only screen and (max-width:1023px){[data-v-cbd98416] .nav-menu-settings{font-size:.82353rem;line-height:1.5;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (min-width:1024px){[data-v-cbd98416] .nav-menu-settings{margin-left:.58824rem}}.nav--in-breakpoint-range[data-v-cbd98416] .nav-menu-settings:not([data-previous-menu-children-count="0"]) .nav-menu-setting:first-child{border-top:1px solid #b0b0b0;display:flex;align-items:center}[data-v-cbd98416] .nav-menu-settings .nav-menu-setting{display:flex;align-items:center;color:var(--color-nav-current-link);margin-left:0}[data-v-cbd98416] .nav-menu-settings .nav-menu-setting:first-child:not(:only-child){margin-right:.58824rem}.nav--in-breakpoint-range[data-v-cbd98416] .nav-menu-settings .nav-menu-setting:first-child:not(:only-child){margin-right:0}.theme-dark[data-v-cbd98416] .nav-menu-settings .nav-menu-setting{color:var(--color-nav-dark-current-link)}.nav--in-breakpoint-range[data-v-cbd98416] .nav-menu-settings .nav-menu-setting:not(:first-child){border-top:1px solid #424242}.documentation-nav[data-v-cbd98416] .nav-title{font-size:.82353rem;line-height:1.5;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}@media only screen and (max-width:1023px){.documentation-nav[data-v-cbd98416] .nav-title{padding-top:0}}.documentation-nav[data-v-cbd98416] .nav-title .nav-title-link.inactive{height:auto;color:var(--color-figure-gray-secondary-alt)}.theme-dark.documentation-nav .nav-title .nav-title-link.inactive[data-v-cbd98416]{color:#b0b0b0}.sidenav-toggle[data-v-cbd98416]{margin-left:-14px;margin-right:-14px;padding-left:14px;padding-right:14px}.sidenav-toggle .sidenav-icon[data-v-cbd98416]{display:flex;width:19px;height:19px}.doc-topic-view[data-v-6c414c34]{--delay:1s;display:flex;flex-flow:column;background:var(--colors-text-background,var(--color-text-background))}.doc-topic-view .delay-hiding-leave-active[data-v-6c414c34]{transition:display var(--delay)}.doc-topic-aside[data-v-6c414c34]{height:100%;box-sizing:border-box;border-right:1px solid var(--color-grid)}@media only screen and (max-width:1023px){.doc-topic-aside[data-v-6c414c34]{background:var(--color-fill);border-right:none}.animating .doc-topic-aside[data-v-6c414c34]{border-right:1px solid var(--color-grid)}}.topic-wrapper[data-v-6c414c34]{flex:1 1 auto;width:100%}.full-width-container[data-v-6c414c34]{max-width:1920px;margin-left:auto;margin-right:auto} \ No newline at end of file diff --git a/docs/css/documentation-topic.b186e79f.css b/docs/css/documentation-topic.b186e79f.css new file mode 100644 index 0000000..118f436 --- /dev/null +++ b/docs/css/documentation-topic.b186e79f.css @@ -0,0 +1,9 @@ +/*! + * This source file is part of the Swift.org open source project + * + * Copyright (c) 2021 Apple Inc. and the Swift project authors + * Licensed under Apache License v2.0 with Runtime Library Exception + * + * See https://swift.org/LICENSE.txt for license information + * See https://swift.org/CONTRIBUTORS.txt for Swift project authors + */.betainfo[data-v-ba3b3cc0]{font-size:.9411764706rem;padding:3rem 0;background-color:var(--color-fill-secondary)}.full-width-container .betainfo-container[data-v-ba3b3cc0]{max-width:820px;margin-left:auto;margin-right:auto;padding-left:80px;padding-right:80px;box-sizing:border-box}@media print{.full-width-container .betainfo-container[data-v-ba3b3cc0]{padding-left:20px;padding-right:20px;max-width:none}}@media only screen and (min-width:1251px){.full-width-container .betainfo-container[data-v-ba3b3cc0]{max-width:980px}}@media only screen and (min-width:1500px){.full-width-container .betainfo-container[data-v-ba3b3cc0]{max-width:1080px}}@media only screen and (max-width:735px){.full-width-container .betainfo-container[data-v-ba3b3cc0]{width:auto;padding-left:20px;padding-right:20px}}.static-width-container .betainfo-container[data-v-ba3b3cc0]{margin-left:auto;margin-right:auto;width:980px}@media only screen and (max-width:1250px){.static-width-container .betainfo-container[data-v-ba3b3cc0]{width:692px}}@media only screen and (max-width:735px){.static-width-container .betainfo-container[data-v-ba3b3cc0]{width:87.5%}}@media only screen and (max-width:320px){.static-width-container .betainfo-container[data-v-ba3b3cc0]{width:215px}}.betainfo-label[data-v-ba3b3cc0]{font-weight:600;font-size:.9411764706rem}.betainfo-content[data-v-ba3b3cc0] p{margin-bottom:10px}.summary-section[data-v-3aa6f694]:last-of-type{margin-right:0}@media only screen and (max-width:735px){.summary-section[data-v-3aa6f694]{margin-right:0}}.title[data-v-6796f6ea]{color:#fff;font-size:.8235294118rem;margin-right:.5rem;text-rendering:optimizeLegibility}.documentation-hero--disabled .title[data-v-6796f6ea]{color:var(--colors-text,var(--color-text))}.language[data-v-1a36493d]{padding-bottom:10px;justify-content:flex-end}.language-list[data-v-1a36493d],.language[data-v-1a36493d]{font-size:.8235294118rem;line-height:1.4285714286;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);margin-top:0;display:flex;align-items:center}.language-option.swift[data-v-1a36493d]{padding-right:10px;border-right:1px solid var(--color-fill-gray-tertiary)}.language-option.objc[data-v-1a36493d]{padding-left:10px}.language-option.active[data-v-1a36493d],.language-option.router-link-exact-active[data-v-1a36493d]{color:#ccc}.documentation-hero--disabled .language-option.active[data-v-1a36493d],.documentation-hero--disabled .language-option.router-link-exact-active[data-v-1a36493d]{color:var(--colors-secondary-label,var(--color-secondary-label))}.view-more-link[data-v-3f54e653]{font-size:.8235294118rem;line-height:1.2857142857;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);display:flex;flex-flow:row-reverse;margin-bottom:1.3rem}.documentation-hero[data-v-0a9cf53e]{background:#000;color:var(--color-documentation-intro-figure,#fff);overflow:hidden;text-align:left;position:relative;padding-right:var(--doc-hero-right-offset)}.documentation-hero[data-v-0a9cf53e]:before{content:"";background:var(--standard-accent-color,var(--color-documentation-intro-fill,#2a2a2a));position:absolute;width:100%;left:0;top:-50%;height:150%;right:0}.documentation-hero[data-v-0a9cf53e]:after{background:transparent;opacity:.7;width:100%;position:absolute;content:"";height:100%;left:0;top:0}.documentation-hero .icon[data-v-0a9cf53e]{position:absolute;margin-top:10px;margin-right:25px;right:0;width:250px;height:calc(100% - 20px);box-sizing:border-box}@media only screen and (max-width:735px){.documentation-hero .icon[data-v-0a9cf53e]{display:none}}.documentation-hero .background-icon[data-v-0a9cf53e]{color:var(--color-documentation-intro-accent,#161616);display:block;width:250px;height:auto;opacity:1;position:absolute;top:50%;left:0;transform:translateY(-50%);max-height:100%}.documentation-hero .background-icon[data-v-0a9cf53e] img,.documentation-hero .background-icon[data-v-0a9cf53e] svg{width:100%;height:100%}.documentation-hero__content[data-v-0a9cf53e]:not(.minimized-hero){padding-top:2.3529411765rem;padding-bottom:40px;position:relative;z-index:1}.full-width-container .documentation-hero__content[data-v-0a9cf53e]:not(.minimized-hero){max-width:820px;margin-left:auto;margin-right:auto;padding-left:80px;padding-right:80px;box-sizing:border-box}@media print{.full-width-container .documentation-hero__content[data-v-0a9cf53e]:not(.minimized-hero){padding-left:20px;padding-right:20px;max-width:none}}@media only screen and (min-width:1251px){.full-width-container .documentation-hero__content[data-v-0a9cf53e]:not(.minimized-hero){max-width:980px}}@media only screen and (min-width:1500px){.full-width-container .documentation-hero__content[data-v-0a9cf53e]:not(.minimized-hero){max-width:1080px}}@media only screen and (max-width:735px){.full-width-container .documentation-hero__content[data-v-0a9cf53e]:not(.minimized-hero){width:auto;padding-left:20px;padding-right:20px}}.static-width-container .documentation-hero__content[data-v-0a9cf53e]:not(.minimized-hero){margin-left:auto;margin-right:auto;width:980px}@media only screen and (max-width:1250px){.static-width-container .documentation-hero__content[data-v-0a9cf53e]:not(.minimized-hero){width:692px}}@media only screen and (max-width:735px){.static-width-container .documentation-hero__content[data-v-0a9cf53e]:not(.minimized-hero){width:87.5%}}@media only screen and (max-width:320px){.static-width-container .documentation-hero__content[data-v-0a9cf53e]:not(.minimized-hero){width:215px}}.documentation-hero .minimized-hero[data-v-0a9cf53e]{padding:1.3em 1.4em;position:relative;z-index:1}.documentation-hero__above-content[data-v-0a9cf53e]{position:relative;z-index:1}.documentation-hero--disabled[data-v-0a9cf53e]{background:none;color:var(--colors-text,var(--color-text))}.documentation-hero--disabled[data-v-0a9cf53e]:after,.documentation-hero--disabled[data-v-0a9cf53e]:before{content:none}.short-hero[data-v-0a9cf53e]{padding-top:3.5294117647rem;padding-bottom:3.5294117647rem}.extra-bottom-padding[data-v-0a9cf53e]{padding-bottom:3.8235294118rem}.theme-dark[data-v-0a9cf53e] a:not(.button-cta){color:#09f}ul[data-v-068842ec]{list-style-type:none;margin:0}ul li:first-child .base-link[data-v-068842ec]{margin-top:0}.parent-item .base-link[data-v-068842ec]{font-weight:700}.base-link[data-v-068842ec]{color:var(--color-figure-gray-secondary);font-size:.8235294118rem;line-height:1.2857142857;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);display:inline-block;margin:5px 0;transition:color .15s ease-in;max-width:100%}.active .base-link[data-v-068842ec]{color:var(--color-text)}[data-v-3a32ffd0] .code-listing{background:var(--background,var(--color-code-background));color:var(--text,var(--color-code-plain));border-color:var(--colors-grid,var(--color-grid));border-width:var(--code-border-width,1px);border-style:var(--code-border-style,solid)}[data-v-3a32ffd0] .code-listing pre{padding:var(--code-block-style-elements-padding)}[data-v-3a32ffd0] .code-listing pre>code{font-size:.8823529412rem;line-height:1.6666666667;font-weight:400;font-family:var(--typography-html-font-mono,Menlo,monospace)}[data-v-3a32ffd0] *+.code-listing,[data-v-3a32ffd0] *+.endpoint-example,[data-v-3a32ffd0] *+.inline-image-container,[data-v-3a32ffd0] *+aside,[data-v-3a32ffd0] *+figure,[data-v-3a32ffd0] .code-listing+*,[data-v-3a32ffd0] .endpoint-example+*,[data-v-3a32ffd0] .inline-image-container+*,[data-v-3a32ffd0] aside+*,[data-v-3a32ffd0] figure+*{margin-top:var(--spacing-stacked-margin-xlarge)}[data-v-3a32ffd0] *+dl,[data-v-3a32ffd0] dl+*{margin-top:var(--spacing-stacked-margin-large)}[data-v-3a32ffd0] img{display:block;margin:auto;max-width:100%}[data-v-3a32ffd0] ol,[data-v-3a32ffd0] ol li:not(:first-child),[data-v-3a32ffd0] ul,[data-v-3a32ffd0] ul li:not(:first-child){margin-top:var(--spacing-stacked-margin-large)}@media only screen and (max-width:735px){[data-v-3a32ffd0] ol,[data-v-3a32ffd0] ul{margin-left:1.25rem}}[data-v-3a32ffd0] dt:not(:first-child){margin-top:var(--spacing-stacked-margin-large)}[data-v-3a32ffd0] dd{margin-left:2em}.conditional-constraints[data-v-4c6f3ed1] code{color:var(--colors-secondary-label,var(--color-secondary-label))}.token-method[data-v-3fd63d6c]{font-weight:700}.token-keyword[data-v-3fd63d6c]{color:var(--syntax-keyword,var(--color-syntax-keywords))}.token-number[data-v-3fd63d6c]{color:var(--syntax-number,var(--color-syntax-numbers))}.token-string[data-v-3fd63d6c]{color:var(--syntax-string,var(--color-syntax-strings))}.attribute-link[data-v-3fd63d6c],.token-attribute[data-v-3fd63d6c]{color:var(--syntax-attribute,var(--color-syntax-keywords))}.token-internalParam[data-v-3fd63d6c]{color:var(--color-syntax-param-internal-name)}.type-identifier-link[data-v-3fd63d6c]{color:var(--syntax-type,var(--color-syntax-other-type-names))}.token-removed[data-v-3fd63d6c]{background-color:var(--color-highlight-red)}.token-added[data-v-3fd63d6c]{background-color:var(--color-highlight-green)}.source[data-v-d22a3f50]{background:var(--background,var(--color-code-background));border-color:var(--color-grid);color:var(--text,var(--color-code-plain));border-style:solid;border-width:1px;padding:var(--code-block-style-elements-padding);speak:literal-punctuation;line-height:25px;filter:blur(0)}.source.displays-multiple-lines[data-v-d22a3f50],.source[data-v-d22a3f50]{border-radius:var(--border-radius,4px)}.source>code[data-v-d22a3f50]{font-size:.8823529412rem;line-height:1.6666666667;font-weight:400;font-family:var(--typography-html-font-mono,Menlo,monospace);display:block}.platforms[data-v-4f51d8d2]{font-size:.8235294118rem;line-height:1.4285714286;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);margin-bottom:.45rem;margin-top:var(--spacing-stacked-margin-xlarge)}.changed .platforms[data-v-4f51d8d2]{padding-left:.588rem}.platforms[data-v-4f51d8d2]:first-of-type{margin-top:1rem}.source[data-v-4f51d8d2]{margin:var(--declaration-code-listing-margin)}.platforms+.source[data-v-4f51d8d2]{margin:0}.changed.declaration-group[data-v-4f51d8d2]{background:var(--background,var(--color-code-background))}.changed .source[data-v-4f51d8d2]{background:none;border:none;margin-top:0;margin-bottom:0;margin-left:2.1764705882rem;padding-left:0}.declaration-diff[data-v-b3e21c4a]{background:var(--background,var(--color-code-background))}.declaration-diff-version[data-v-b3e21c4a]{padding-left:.588rem;padding-left:2.1764705882rem;font-size:1rem;line-height:1.5294117647;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-figure-gray-secondary);margin:0}.declaration-diff-current[data-v-b3e21c4a]{padding-top:8px;padding-bottom:5px}.declaration-diff-previous[data-v-b3e21c4a]{padding-top:5px;padding-bottom:8px;background-color:var(--color-changes-modified-previous-background);border-radius:0 0 var(--border-radius,4px) var(--border-radius,4px);position:relative}.declaration-source-link[data-v-5863919c]{font-size:.8235294118rem;line-height:1.2857142857;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);display:flex;align-items:center;margin-top:var(--declaration-source-link-margin,var(--spacing-stacked-margin-large))}.declaration-icon[data-v-5863919c]{width:1em;margin-right:5px}.conditional-constraints[data-v-2ab6251b]{margin-top:var(--declaration-conditional-constraints-margin,20px)}.abstract[data-v-cdcaacd2]{font-size:1.2352941176rem;line-height:1.380952381;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:735px){.abstract[data-v-cdcaacd2]{font-size:1.1176470588rem;line-height:1.4210526316;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}[data-v-cdcaacd2] p:last-child{margin-bottom:0}.container[data-v-6e075935]{padding-bottom:40px}.full-width-container .container[data-v-6e075935]{max-width:820px;margin-left:auto;margin-right:auto;padding-left:80px;padding-right:80px;box-sizing:border-box}@media print{.full-width-container .container[data-v-6e075935]{padding-left:20px;padding-right:20px;max-width:none}}@media only screen and (min-width:1251px){.full-width-container .container[data-v-6e075935]{max-width:980px}}@media only screen and (min-width:1500px){.full-width-container .container[data-v-6e075935]{max-width:1080px}}@media only screen and (max-width:735px){.full-width-container .container[data-v-6e075935]{width:auto;padding-left:20px;padding-right:20px}}.static-width-container .container[data-v-6e075935]{margin-left:auto;margin-right:auto;width:980px}@media only screen and (max-width:1250px){.static-width-container .container[data-v-6e075935]{width:692px}}@media only screen and (max-width:735px){.static-width-container .container[data-v-6e075935]{width:87.5%}}@media only screen and (max-width:320px){.static-width-container .container[data-v-6e075935]{width:215px}}.title[data-v-6e075935]{font-size:1.8823529412rem;line-height:1.125;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);padding-top:40px;border-top-color:var(--color-grid);border-top-style:solid;border-top-width:var(--content-table-title-border-width,1px)}@media only screen and (max-width:1250px){.title[data-v-6e075935]{font-size:1.6470588235rem;line-height:1.1428571429;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){.title[data-v-6e075935]{font-size:1.4117647059rem;line-height:1.1666666667;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.title+.contenttable-section[data-v-1b0546d9]{margin-top:0}.contenttable-section[data-v-1b0546d9]{align-items:baseline;padding-top:2.353rem}.contenttable-section[data-v-1b0546d9]:last-child{margin-bottom:0}[data-v-1b0546d9] .contenttable-title{font-size:1.4117647059rem;line-height:1.1666666667;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:1250px){[data-v-1b0546d9] .contenttable-title{font-size:1.2352941176rem;line-height:1.1904761905;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){.contenttable-section[data-v-1b0546d9]{align-items:unset;border-top:none;display:inherit;margin:0}.section-content[data-v-1b0546d9],.section-title[data-v-1b0546d9]{padding:0}[data-v-1b0546d9] .contenttable-title{margin:0 0 2.353rem 0;padding-bottom:.5rem}}.badge[data-v-8d6893ae]{--badge-color:var(--color-badge-default);--badge-dark-color:var(--color-badge-dark-default);font-size:.7058823529rem;line-height:1.3333333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);display:inline-block;padding:2px 10px;white-space:nowrap;background:none;border-radius:var(--badge-border-radius,calc(var(--border-radius, 4px) - 1px));border-style:var(--badge-border-style,solid);border-width:var(--badge-border-width,1px);margin-left:10px;color:var(--badge-color)}.theme-dark .badge[data-v-8d6893ae]{--badge-color:var(--badge-dark-color)}.badge-deprecated[data-v-8d6893ae]{--badge-color:var(--color-badge-deprecated);--badge-dark-color:var(--color-badge-dark-deprecated)}.badge-beta[data-v-8d6893ae]{--badge-color:var(--color-badge-beta);--badge-dark-color:var(--color-badge-dark-beta)}.topic-icon-wrapper[data-v-44dade98]{display:flex;align-items:center;justify-content:center;height:1.4705882353rem;flex:0 0 1.294rem;width:1.294rem;margin-right:1rem}.topic-icon[data-v-44dade98]{height:.8823529412rem;transform:scale(1);-webkit-transform:scale(1);overflow:visible}.topic-icon[data-v-44dade98] img{margin:0;display:block;width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.topic-icon.curly-brackets-icon[data-v-44dade98]{height:1rem}.decorator[data-v-06ec7395],.label[data-v-06ec7395]{color:var(--colors-secondary-label,var(--color-secondary-label))}.label[data-v-06ec7395]{font-size:1rem;line-height:1.4705882353;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.empty-token[data-v-06ec7395]{font-size:0}.empty-token[data-v-06ec7395]:after{content:" ";font-size:1rem}.abstract[data-v-63be6b46],.link-block[data-v-63be6b46] .badge{margin-left:2.294rem}.link-block .badge+.badge[data-v-63be6b46]{margin-left:1rem}.link[data-v-63be6b46]{display:flex}.link-block .badge[data-v-63be6b46]{margin-top:.5rem}.link-block.has-inline-element[data-v-63be6b46]{display:flex;align-items:flex-start;flex-flow:row wrap}.link-block.has-inline-element .badge[data-v-63be6b46]{margin-left:1rem;margin-top:0}.link-block .has-adjacent-elements[data-v-63be6b46]{padding-top:5px;padding-bottom:5px;display:inline-flex}.link-block[data-v-63be6b46],.link[data-v-63be6b46]{box-sizing:inherit}.link-block.changed[data-v-63be6b46],.link.changed[data-v-63be6b46]{padding-right:1rem;padding-left:2.1764705882rem;padding-top:8px;padding-bottom:8px;display:inline-flex;width:100%;box-sizing:border-box}.link-block.changed.changed[data-v-63be6b46],.link.changed.changed[data-v-63be6b46]{padding-right:1rem}@media only screen and (max-width:735px){.link-block.changed[data-v-63be6b46],.link.changed[data-v-63be6b46]{padding-left:0;padding-right:0}.link-block.changed.changed[data-v-63be6b46],.link.changed.changed[data-v-63be6b46]{padding-right:17px;padding-left:2.1764705882rem}.link-block.changed[data-v-63be6b46],.link.changed[data-v-63be6b46]{padding-left:0;padding-right:0}}.abstract .topic-required[data-v-63be6b46]:not(:first-child){margin-top:4px}.topic-required[data-v-63be6b46]{font-size:.8em}.deprecated[data-v-63be6b46]{text-decoration:line-through}.conditional-constraints[data-v-63be6b46]{font-size:.8235294118rem;margin-top:4px}.section-content>.content[data-v-1c2724f5],.topic[data-v-1c2724f5]{margin-top:15px}.no-title .section-content>.content[data-v-1c2724f5]:first-child,.no-title .topic[data-v-1c2724f5]:first-child{margin-top:0}.datalist dd{padding-left:2rem}.datalist dt{font-weight:600;padding-left:1rem;padding-top:var(--spacing-param)}.datalist dt:first-of-type{padding-top:0}.type[data-v-791bac44]:first-letter{text-transform:capitalize}.detail-type[data-v-d66cd00c]{font-weight:600;padding-left:1rem;padding-top:var(--spacing-param)}.detail-type[data-v-d66cd00c]:first-child{padding-top:0}@media only screen and (max-width:735px){.detail-type[data-v-d66cd00c]{padding-left:0}}.detail-content[data-v-d66cd00c]{padding-left:2rem}@media only screen and (max-width:735px){.detail-content[data-v-d66cd00c]{padding-left:0}}.param-name[data-v-5ef1227e]{font-weight:600;padding-left:1rem;padding-top:var(--spacing-param)}.param-name[data-v-5ef1227e]:first-child{padding-top:0}@media only screen and (max-width:735px){.param-name[data-v-5ef1227e]{padding-left:0}}.param-content[data-v-5ef1227e]{padding-left:2rem}@media only screen and (max-width:735px){.param-content[data-v-5ef1227e]{padding-left:0}}.param-content[data-v-5ef1227e] dt{font-weight:600}.param-content[data-v-5ef1227e] dd{margin-left:1em}.parameters-table[data-v-eee7e94e] .change-added,.parameters-table[data-v-eee7e94e] .change-removed{display:inline-block;max-width:100%}.parameters-table[data-v-eee7e94e] .change-removed,.parameters-table[data-v-eee7e94e] .token-removed{text-decoration:line-through}.param[data-v-eee7e94e]{font-size:.8823529412rem;box-sizing:border-box}.param.changed[data-v-eee7e94e]{display:flex;flex-flow:row wrap;padding-right:1rem;padding-left:2.1764705882rem;padding-top:8px;padding-bottom:8px;display:inline-flex;width:100%;box-sizing:border-box}.param.changed.changed[data-v-eee7e94e]{padding-right:1rem}@media only screen and (max-width:735px){.param.changed[data-v-eee7e94e]{padding-left:0;padding-right:0}.param.changed.changed[data-v-eee7e94e]{padding-right:17px;padding-left:2.1764705882rem}.param.changed[data-v-eee7e94e]{padding-left:0;padding-right:0}}.param.changed.changed[data-v-eee7e94e]{padding-left:0;padding-right:0}.param.changed+.param.changed[data-v-eee7e94e]{margin-top:calc(var(--spacing-param)/2)}.changed .param-content[data-v-eee7e94e],.changed .param-symbol[data-v-eee7e94e]{padding-top:2px;padding-bottom:2px}@media only screen and (max-width:735px){.changed .param-content[data-v-eee7e94e]{padding-top:0}.changed .param-symbol[data-v-eee7e94e]{padding-bottom:0}}.param-symbol[data-v-eee7e94e]{text-align:right}.changed .param-symbol[data-v-eee7e94e]{padding-left:2.1764705882rem}@media only screen and (max-width:735px){.param-symbol[data-v-eee7e94e]{text-align:left}.changed .param-symbol[data-v-eee7e94e]{padding-left:0}}.param-symbol[data-v-eee7e94e] .type-identifier-link{color:var(--color-link)}.param+.param[data-v-eee7e94e]{margin-top:var(--spacing-param)}.param+.param[data-v-eee7e94e]:first-child{margin-top:0}.param-content[data-v-eee7e94e]{padding-left:1rem;padding-left:2.1764705882rem}.changed .param-content[data-v-eee7e94e]{padding-right:1rem}@media only screen and (max-width:735px){.param-content[data-v-eee7e94e]{padding-left:0;padding-right:0}}.property-metadata[data-v-f911f232]{color:var(--color-figure-gray-secondary)}.property-text{font-weight:700}.property-metadata[data-v-549ed0a8]{color:var(--color-figure-gray-secondary)}.property-name[data-v-39899ccf]{font-weight:700}.property-name.deprecated[data-v-39899ccf]{text-decoration:line-through}.property-deprecated[data-v-39899ccf]{margin-left:0}.content[data-v-39899ccf],.content[data-v-39899ccf] p:first-child{display:inline}.response-mimetype[data-v-18890a0f]{color:var(--color-figure-gray-secondary)}.part-name[data-v-68facc94]{font-weight:700}.content[data-v-68facc94],.content[data-v-68facc94] p:first-child{display:inline}.param-name[data-v-0d9b752e]{font-weight:700}.param-name.deprecated[data-v-0d9b752e]{text-decoration:line-through}.param-deprecated[data-v-0d9b752e]{margin-left:0}.content[data-v-0d9b752e],.content[data-v-0d9b752e] p:first-child{display:inline}.response-name[data-v-ee5b05cc],.response-reason[data-v-ee5b05cc]{font-weight:700}@media only screen and (max-width:735px){.response-reason[data-v-ee5b05cc]{display:none}}.response-name>code>.reason[data-v-ee5b05cc]{display:none}@media only screen and (max-width:735px){.response-name>code>.reason[data-v-ee5b05cc]{display:initial}}.primary-content.with-border[data-v-56ef0742]:before{border-top-color:var(--colors-grid,var(--color-grid));border-top-style:solid;border-top-width:1px;content:"";display:block}.primary-content[data-v-56ef0742]>*{margin-bottom:40px;margin-top:40px}.primary-content[data-v-56ef0742]>:first-child{margin-top:2.353rem}.relationships-list[data-v-ba5cad92]{list-style:none}.relationships-list.column[data-v-ba5cad92]{margin-left:0;margin-top:15px}.relationships-list.inline[data-v-ba5cad92]{display:flex;flex-direction:row;flex-wrap:wrap;margin-top:15px;margin-left:0}.relationships-list.inline li[data-v-ba5cad92]:not(:last-child):after{content:", "}.relationships-list.changed[data-v-ba5cad92]{padding-right:1rem;padding-left:2.1764705882rem;padding-top:8px;padding-bottom:8px;display:inline-flex;width:100%;box-sizing:border-box}.relationships-list.changed.changed[data-v-ba5cad92]{padding-right:1rem}@media only screen and (max-width:735px){.relationships-list.changed[data-v-ba5cad92]{padding-left:0;padding-right:0}.relationships-list.changed.changed[data-v-ba5cad92]{padding-right:17px;padding-left:2.1764705882rem}.relationships-list.changed[data-v-ba5cad92]{padding-left:0;padding-right:0}}.relationships-list.changed[data-v-ba5cad92]:after{margin-top:.6176470588rem}.relationships-list.changed.column[data-v-ba5cad92]{display:block;box-sizing:border-box}.relationships-item[data-v-ba5cad92],.relationships-list[data-v-ba5cad92]{box-sizing:inherit}.conditional-constraints[data-v-ba5cad92]{font-size:.8235294118rem;margin:.1764705882rem 0 .5882352941rem 1.1764705882rem}.availability[data-v-602d8130]{display:flex;flex-flow:row wrap;gap:10px;margin-top:25px}.badge[data-v-602d8130]{margin:0}.technology[data-v-602d8130]{display:inline-flex;align-items:center}.tech-icon[data-v-602d8130]{height:12px;padding-right:5px;fill:var(--badge-color)}.theme-dark .tech-icon[data-v-602d8130]{fill:var(--badge-color)}.beta[data-v-602d8130]{color:var(--color-badge-beta)}.theme-dark .beta[data-v-602d8130]{color:var(--color-badge-dark-beta)}.deprecated[data-v-602d8130]{color:var(--color-badge-deprecated)}.theme-dark .deprecated[data-v-602d8130]{color:var(--color-badge-dark-deprecated)}.changed[data-v-602d8130]{padding-left:26px}.changed[data-v-602d8130]:after{content:none}.changed[data-v-602d8130]:before{background-image:url(../img/modified-icon.efb2697d.svg);background-repeat:no-repeat;bottom:0;content:" ";margin:auto;margin-right:8px;position:absolute;top:0;width:16px;height:16px;left:5px}@media screen{[data-color-scheme=dark] .changed[data-v-602d8130]:before{background-image:url(../img/modified-icon.efb2697d.svg)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .changed[data-v-602d8130]:before{background-image:url(../img/modified-icon.efb2697d.svg)}}.theme-dark .changed[data-v-602d8130]:before{background-image:url(../img/modified-icon.efb2697d.svg)}.changed-added[data-v-602d8130]{border-color:var(--color-changes-added)}.changed-added[data-v-602d8130]:before{background-image:url(../img/added-icon.832a5d2c.svg)}@media screen{[data-color-scheme=dark] .changed-added[data-v-602d8130]:before{background-image:url(../img/added-icon.832a5d2c.svg)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .changed-added[data-v-602d8130]:before{background-image:url(../img/added-icon.832a5d2c.svg)}}.theme-dark .changed-added[data-v-602d8130]:before{background-image:url(../img/added-icon.832a5d2c.svg)}.changed-deprecated[data-v-602d8130]{border-color:var(--color-changes-deprecated)}.changed-deprecated[data-v-602d8130]:before{background-image:url(../img/deprecated-icon.7bf1740a.svg)}@media screen{[data-color-scheme=dark] .changed-deprecated[data-v-602d8130]:before{background-image:url(../img/deprecated-icon.7bf1740a.svg)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .changed-deprecated[data-v-602d8130]:before{background-image:url(../img/deprecated-icon.7bf1740a.svg)}}.theme-dark .changed-deprecated[data-v-602d8130]:before{background-image:url(../img/deprecated-icon.7bf1740a.svg)}.changed-modified[data-v-602d8130]{border-color:var(--color-changes-modified)}.eyebrow[data-v-4492c658]{font-size:1.2352941176rem;line-height:1.1904761905;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-documentation-intro-eyebrow,#ccc);display:block;margin-bottom:1.1764705882rem}@media only screen and (max-width:735px){.eyebrow[data-v-4492c658]{font-size:1.1176470588rem;line-height:1.2105263158;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.documentation-hero--disabled .eyebrow[data-v-4492c658]{color:var(--colors-secondary-label,var(--color-secondary-label))}.title[data-v-4492c658]{font-size:2.3529411765rem;line-height:1.1;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-documentation-intro-title,#fff);margin-bottom:.7058823529rem}@media only screen and (max-width:1250px){.title[data-v-4492c658]{font-size:1.8823529412rem;line-height:1.125;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){.title[data-v-4492c658]{font-size:1.6470588235rem;line-height:1.1428571429;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.documentation-hero--disabled .title[data-v-4492c658]{color:var(--colors-header-text,var(--color-header-text))}small[data-v-4492c658]{font-size:1.4117647059rem;line-height:1.1666666667;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);padding-left:10px}@media only screen and (max-width:1250px){small[data-v-4492c658]{font-size:1.2352941176rem;line-height:1.1904761905;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}small[data-v-4492c658]:before{content:attr(data-tag-name)}small.Beta[data-v-4492c658]{color:var(--color-badge-beta)}.theme-dark small.Beta[data-v-4492c658]{color:var(--color-badge-dark-beta)}small.Deprecated[data-v-4492c658]{color:var(--color-badge-deprecated)}.theme-dark small.Deprecated[data-v-4492c658]{color:var(--color-badge-dark-deprecated)}.OnThisPageStickyContainer[data-v-39ac6ed0]{margin-top:2.353rem;position:sticky;top:3.8235294118rem;align-self:flex-start;flex:0 0 auto;width:192px;padding-right:1.2941176471rem;box-sizing:border-box;padding-bottom:var(--spacing-stacked-margin-small);max-height:calc(100vh - 3.82353rem);overflow:auto}@media print{.OnThisPageStickyContainer[data-v-39ac6ed0]{display:none}}@media only screen and (max-width:735px){.OnThisPageStickyContainer[data-v-39ac6ed0]{display:none}}.doc-topic[data-v-2ff03362]{display:flex;flex-direction:column;height:100%}.doc-topic.with-on-this-page[data-v-2ff03362]{--doc-hero-right-offset:192px}#main[data-v-2ff03362]{outline-style:none;height:100%}[data-v-2ff03362] .minimized-title{margin-bottom:.833rem}[data-v-2ff03362] .minimized-title .title{font-size:1.416rem;font-weight:700}[data-v-2ff03362] .minimized-title small{font-size:1rem;padding-left:.416rem}.minimized-abstract[data-v-2ff03362]{font-size:1rem;line-height:1.4705882353;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.container[data-v-2ff03362]:not(.minimized-container){outline-style:none}.full-width-container .container[data-v-2ff03362]:not(.minimized-container){max-width:820px;margin-left:auto;margin-right:auto;padding-left:80px;padding-right:80px;box-sizing:border-box}@media print{.full-width-container .container[data-v-2ff03362]:not(.minimized-container){padding-left:20px;padding-right:20px;max-width:none}}@media only screen and (min-width:1251px){.full-width-container .container[data-v-2ff03362]:not(.minimized-container){max-width:980px}}@media only screen and (min-width:1500px){.full-width-container .container[data-v-2ff03362]:not(.minimized-container){max-width:1080px}}@media only screen and (max-width:735px){.full-width-container .container[data-v-2ff03362]:not(.minimized-container){width:auto;padding-left:20px;padding-right:20px}}.static-width-container .container[data-v-2ff03362]:not(.minimized-container){margin-left:auto;margin-right:auto;width:980px}@media only screen and (max-width:1250px){.static-width-container .container[data-v-2ff03362]:not(.minimized-container){width:692px}}@media only screen and (max-width:735px){.static-width-container .container[data-v-2ff03362]:not(.minimized-container){width:87.5%}}@media only screen and (max-width:320px){.static-width-container .container[data-v-2ff03362]:not(.minimized-container){width:215px}}[data-v-2ff03362] .minimized-container{outline-style:none;--spacing-stacked-margin-large:0.667em;--spacing-stacked-margin-xlarge:1em;--declaration-code-listing-margin:1em 0 0 0;--declaration-conditional-constraints-margin:1em;--declaration-source-link-margin:0.833em;--code-block-style-elements-padding:7px 12px;--spacing-param:var(--spacing-stacked-margin-large);--aside-border-radius:6px;--code-border-radius:6px}[data-v-2ff03362] .minimized-container .description{margin-bottom:1.5em}[data-v-2ff03362] .minimized-container>.primary-content>*{margin-top:1.5em;margin-bottom:1.5em}[data-v-2ff03362] .minimized-container .description{margin-top:0}[data-v-2ff03362] .minimized-container h1,[data-v-2ff03362] .minimized-container h2,[data-v-2ff03362] .minimized-container h3,[data-v-2ff03362] .minimized-container h4,[data-v-2ff03362] .minimized-container h5,[data-v-2ff03362] .minimized-container h6{font-size:1rem;font-weight:700}[data-v-2ff03362] .minimized-container h2{font-size:1.083rem}[data-v-2ff03362] .minimized-container h1{font-size:1.416rem}[data-v-2ff03362] .minimized-container aside{padding:.667rem 1rem}[data-v-2ff03362] .minimized-container .single-line,[data-v-2ff03362] .minimized-container .source{border-radius:var(--code-border-radius)}.description[data-v-2ff03362]{margin-bottom:2.353rem}.description[data-v-2ff03362]:empty{display:none}.description.after-enhanced-hero[data-v-2ff03362]{margin-top:2.353rem}.description[data-v-2ff03362] .content+*{margin-top:var(--spacing-stacked-margin-large)}.full-width-container .doc-content .minimized-container[data-v-2ff03362]{padding-left:1.4rem;padding-right:1.4rem}[data-v-2ff03362] .no-primary-content{--content-table-title-border-width:0px}.sample-download[data-v-2ff03362]{margin-top:20px}.declarations-container[data-v-2ff03362]{margin-top:30px}.declarations-container.minimized-container[data-v-2ff03362]{margin-top:0}[data-v-2ff03362] h1{font-size:2.3529411765rem;line-height:1.1;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:1250px){[data-v-2ff03362] h1{font-size:1.8823529412rem;line-height:1.125;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){[data-v-2ff03362] h1{font-size:1.6470588235rem;line-height:1.1428571429;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}[data-v-2ff03362] h2{font-size:1.8823529412rem;line-height:1.125;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:1250px){[data-v-2ff03362] h2{font-size:1.6470588235rem;line-height:1.1428571429;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){[data-v-2ff03362] h2{font-size:1.4117647059rem;line-height:1.1666666667;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}[data-v-2ff03362] h3{font-size:1.6470588235rem;line-height:1.1428571429;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:1250px){[data-v-2ff03362] h3{font-size:1.4117647059rem;line-height:1.1666666667;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){[data-v-2ff03362] h3{font-size:1.2352941176rem;line-height:1.1904761905;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}[data-v-2ff03362] h4{font-size:1.4117647059rem;line-height:1.1666666667;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:1250px){[data-v-2ff03362] h4{font-size:1.2352941176rem;line-height:1.1904761905;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}[data-v-2ff03362] h5{font-size:1.2941176471rem;line-height:1.1818181818;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:1250px){[data-v-2ff03362] h5{font-size:1.1764705882rem;line-height:1.2;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){[data-v-2ff03362] h5{font-size:1.0588235294rem;line-height:1.4444444444;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}[data-v-2ff03362] h6{font-size:1rem;line-height:1.4705882353;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.doc-content-wrapper[data-v-2ff03362]{display:flex;justify-content:center}.doc-content-wrapper .doc-content[data-v-2ff03362]{min-width:0;width:100%}.with-on-this-page .doc-content-wrapper .doc-content[data-v-2ff03362]{max-width:820px}@media only screen and (min-width:1251px){.with-on-this-page .doc-content-wrapper .doc-content[data-v-2ff03362]{max-width:980px}}@media only screen and (min-width:1500px){.with-on-this-page .doc-content-wrapper .doc-content[data-v-2ff03362]{max-width:1080px}}.quick-navigation-open[data-v-53faf852]{display:flex;align-items:center;justify-content:center;width:16px;border:1px solid var(--color-grid);height:100%;border-radius:var(--border-radius,4px);transition:background-color .15s;box-sizing:border-box}.quick-navigation-open[data-v-53faf852]:hover{background-color:var(--color-fill-tertiary)}@media only screen and (max-width:1023px){.quick-navigation-open[data-v-53faf852]{display:none}}.fromkeyboard .quick-navigation-open[data-v-53faf852]:focus{box-shadow:0 0 0 4px var(--color-focus-color);outline:none;border-color:var(--color-focus-border-color)}.tag[data-v-7e76f326]{display:inline-block;padding-right:.5882352941rem}.tag[data-v-7e76f326]:focus{outline:none}.tag button[data-v-7e76f326]{color:var(--color-figure-gray);background-color:var(--color-fill-tertiary);font-size:.8235294118rem;line-height:1.2857142857;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);border-radius:.8235294118rem;padding:.2352941176rem .5882352941rem;white-space:nowrap;border:1px solid transparent}@media(hover:hover){.tag button[data-v-7e76f326]:hover{transition:background-color .2s,color .2s;background-color:var(--color-fill-blue);color:#fff}}.tag button[data-v-7e76f326]:focus:active{background-color:var(--color-fill-blue);color:#fff}.fromkeyboard .tag button[data-v-7e76f326]:focus,.tag button.focus[data-v-7e76f326],.tag button[data-v-7e76f326]:focus{box-shadow:0 0 0 4px var(--color-focus-color);outline:none;border-color:var(--color-focus-border-color)}.tags[data-v-1f2bd813]{position:relative;margin:0;list-style:none;box-sizing:border-box;transition:padding-right .8s,padding-bottom .8s,max-height 1s,opacity 1s;padding:0}.tags .scroll-wrapper[data-v-1f2bd813]{overflow-x:auto;overflow-y:hidden;-ms-overflow-style:none;scrollbar-color:var(--color-figure-gray-tertiary) transparent;scrollbar-width:thin}.tags .scroll-wrapper[data-v-1f2bd813]::-webkit-scrollbar{height:0}@supports not ((-webkit-touch-callout:none) or (scrollbar-width:none) or (-ms-overflow-style:none)){.tags .scroll-wrapper.scrolling[data-v-1f2bd813]{--scrollbar-height:11px;padding-top:var(--scrollbar-height);height:calc(var(--scroll-target-height) - var(--scrollbar-height));display:flex;align-items:center}}.tags .scroll-wrapper.scrolling[data-v-1f2bd813]::-webkit-scrollbar{height:11px}.tags .scroll-wrapper.scrolling[data-v-1f2bd813]::-webkit-scrollbar-thumb{border-radius:10px;background-color:var(--color-figure-gray-tertiary);border:2px solid transparent;background-clip:padding-box}.tags .scroll-wrapper.scrolling[data-v-1f2bd813]::-webkit-scrollbar-track-piece:end{margin-right:8px}.tags .scroll-wrapper.scrolling[data-v-1f2bd813]::-webkit-scrollbar-track-piece:start{margin-left:8px}.tags ul[data-v-1f2bd813]{margin:0;padding:0;display:flex}.filter[data-v-7a79f6ea]{--input-vertical-padding:0.7647058824rem;--input-horizontal-spacing:0.5882352941rem;--input-height:1.6470588235rem;--input-border-color:var(--color-fill-gray-secondary);--input-text:var(--color-fill-gray-secondary);position:relative;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0);border-radius:calc(var(--border-radius, 4px) + 1px)}.fromkeyboard .filter[data-v-7a79f6ea]:focus{outline:none}.filter__top-wrapper[data-v-7a79f6ea]{display:flex}.filter__filter-button[data-v-7a79f6ea]{position:relative;z-index:1;cursor:text;margin-left:var(--input-horizontal-spacing);margin-right:.1764705882rem}@media only screen and (max-width:735px){.filter__filter-button[data-v-7a79f6ea]{margin-right:.4117647059rem}}.filter__filter-button .svg-icon[data-v-7a79f6ea]{fill:var(--input-text);display:block;height:21px}.filter__filter-button.blue[data-v-7a79f6ea]>*{fill:var(--color-figure-blue);color:var(--color-figure-blue)}.filter.focus .filter__wrapper[data-v-7a79f6ea]{box-shadow:0 0 0 3pt var(--color-focus-color);--input-border-color:var(--color-fill-blue)}.filter__wrapper[data-v-7a79f6ea]{border:1px solid var(--input-border-color);background:var(--color-fill);border-radius:var(--border-radius,4px)}.filter__wrapper--reversed[data-v-7a79f6ea]{display:flex;flex-direction:column-reverse}.filter__wrapper--no-border-style[data-v-7a79f6ea]{border:none}.filter__suggested-tags[data-v-7a79f6ea]{border-top:1px solid var(--color-fill-gray-tertiary);z-index:1;overflow:hidden}.filter__suggested-tags[data-v-7a79f6ea] ul{padding:var(--input-vertical-padding) .5294117647rem;border:1px solid transparent;border-bottom-left-radius:calc(var(--border-radius, 4px) - 1px);border-bottom-right-radius:calc(var(--border-radius, 4px) - 1px)}.fromkeyboard .filter__suggested-tags[data-v-7a79f6ea] ul:focus{outline:none;box-shadow:0 0 0 5px var(--color-focus-color)}.filter__wrapper--reversed .filter__suggested-tags[data-v-7a79f6ea]{border-bottom:1px solid var(--color-fill-gray-tertiary);border-top:none}.filter__selected-tags[data-v-7a79f6ea]{z-index:1;padding-left:4px;margin:-4px 0}@media only screen and (max-width:735px){.filter__selected-tags[data-v-7a79f6ea]{padding-left:0}}.filter__selected-tags[data-v-7a79f6ea] ul{padding:4px}@media only screen and (max-width:735px){.filter__selected-tags[data-v-7a79f6ea] ul{padding-right:.4117647059rem}}.filter__selected-tags[data-v-7a79f6ea] ul .tag:last-child{padding-right:0}.filter__delete-button[data-v-7a79f6ea]{position:relative;margin:0;z-index:1;border-radius:100%}.fromkeyboard .filter__delete-button[data-v-7a79f6ea]:focus{box-shadow:0 0 0 4px var(--color-focus-color);outline:none}.filter__delete-button .clear-rounded-icon[data-v-7a79f6ea]{height:.7058823529rem;width:.7058823529rem;fill:var(--input-text);display:block}.filter__delete-button-wrapper[data-v-7a79f6ea]{display:flex;align-items:center;padding-right:var(--input-horizontal-spacing);padding-left:.1764705882rem;border-top-right-radius:var(--border-radius,4px);border-bottom-right-radius:var(--border-radius,4px)}.filter__input-label[data-v-7a79f6ea]{position:relative;flex-grow:1;height:var(--input-height);padding:var(--input-vertical-padding) 0}.filter__input-label[data-v-7a79f6ea]:after{content:attr(data-value);visibility:hidden;width:auto;white-space:nowrap;min-width:130px;display:block;text-indent:.4117647059rem}@media only screen and (max-width:735px){.filter__input-label[data-v-7a79f6ea]:after{text-indent:.1764705882rem}}.filter__input-box-wrapper[data-v-7a79f6ea]{overflow-y:hidden;-ms-overflow-style:none;scrollbar-color:var(--color-figure-gray-tertiary) transparent;scrollbar-width:thin;display:flex;overflow-x:auto;align-items:center;cursor:text;flex:1}.filter__input-box-wrapper[data-v-7a79f6ea]::-webkit-scrollbar{height:0}@supports not ((-webkit-touch-callout:none) or (scrollbar-width:none) or (-ms-overflow-style:none)){.filter__input-box-wrapper.scrolling[data-v-7a79f6ea]{--scrollbar-height:11px;padding-top:var(--scrollbar-height);height:calc(var(--scroll-target-height) - var(--scrollbar-height));display:flex;align-items:center}}.filter__input-box-wrapper.scrolling[data-v-7a79f6ea]::-webkit-scrollbar{height:11px}.filter__input-box-wrapper.scrolling[data-v-7a79f6ea]::-webkit-scrollbar-thumb{border-radius:10px;background-color:var(--color-figure-gray-tertiary);border:2px solid transparent;background-clip:padding-box}.filter__input-box-wrapper.scrolling[data-v-7a79f6ea]::-webkit-scrollbar-track-piece:end{margin-right:8px}.filter__input-box-wrapper.scrolling[data-v-7a79f6ea]::-webkit-scrollbar-track-piece:start{margin-left:8px}.filter__input[data-v-7a79f6ea]{font-size:1.2352941176rem;line-height:1.380952381;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-text);height:var(--input-height);border:none;width:100%;position:absolute;background:transparent;z-index:1;text-indent:.4117647059rem}@media only screen and (max-width:735px){.filter__input[data-v-7a79f6ea]{font-size:1.1176470588rem;line-height:1.4210526316;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);text-indent:.1764705882rem}}.filter__input[data-v-7a79f6ea]:focus{outline:none}.filter__input[placeholder][data-v-7a79f6ea]::-moz-placeholder{color:var(--input-text);opacity:1}.filter__input[placeholder][data-v-7a79f6ea]::placeholder{color:var(--input-text);opacity:1}.filter__input[placeholder][data-v-7a79f6ea]:-ms-input-placeholder{color:var(--input-text)}.filter__input[placeholder][data-v-7a79f6ea]::-ms-input-placeholder{color:var(--input-text)}.generic-modal[data-v-795f7b59]{position:fixed;top:0;left:0;right:0;bottom:0;margin:0;z-index:11000;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;background:none;overflow:auto}.modal-fullscreen[data-v-795f7b59]{align-items:stretch}.modal-fullscreen .container[data-v-795f7b59]{margin:0;flex:1;width:100%;height:100%;padding-top:env(safe-area-inset-top);padding-right:env(safe-area-inset-right);padding-bottom:env(safe-area-inset-bottom);padding-left:env(safe-area-inset-left)}.modal-standard[data-v-795f7b59]{padding:20px}.modal-standard .container[data-v-795f7b59]{padding:60px;border-radius:var(--border-radius,4px)}@media screen{[data-color-scheme=dark] .modal-standard .container[data-v-795f7b59]{background:#1d1d1f}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .modal-standard .container[data-v-795f7b59]{background:#1d1d1f}}@media only screen and (max-width:735px){.modal-standard[data-v-795f7b59]{padding:0;align-items:stretch}.modal-standard .container[data-v-795f7b59]{margin:20px 0 0;padding:50px 30px;flex:1;width:100%;border-bottom-left-radius:0;border-bottom-right-radius:0}}.backdrop[data-v-795f7b59]{overflow:auto;background:var(--backdrop-background,rgba(0,0,0,.4));-webkit-overflow-scrolling:touch;width:100%;height:100%;position:fixed}.container[data-v-795f7b59]{margin-left:auto;margin-right:auto;width:980px;background:var(--colors-generic-modal-background,var(--color-generic-modal-background));z-index:1;position:relative;overflow:auto;max-width:100%}@media only screen and (max-width:1250px){.container[data-v-795f7b59]{width:692px}}@media only screen and (max-width:735px){.container[data-v-795f7b59]{width:87.5%}}@media only screen and (max-width:320px){.container[data-v-795f7b59]{width:215px}}.close[data-v-795f7b59]{position:absolute;z-index:9999;top:22px;left:22px;width:17px;height:17px;color:#666;cursor:pointer;background:none;border:0;display:flex;align-items:center}.close .close-icon[data-v-795f7b59]{fill:currentColor;width:100%;height:100%}.theme-dark .container[data-v-795f7b59]{background:#000}.theme-dark .container .close[data-v-795f7b59]{color:#b0b0b0}.theme-code .container[data-v-795f7b59]{background-color:var(--code-background,var(--color-code-background))}.highlight[data-v-4a2ce75d]{display:inline}.highlight[data-v-4a2ce75d] .match{font-weight:600;background:var(--color-fill-light-blue-secondary)}@media only screen and (max-width:735px){.preview[data-v-779b8b01]{display:none}}.unavailable[data-v-779b8b01]{align-items:center;display:flex;height:100%;justify-content:center}.loading[data-v-779b8b01]{padding:20px}.loading-row[data-v-779b8b01]{animation:pulse 2.5s ease;animation-delay:calc(1s + .3s*var(--index));animation-fill-mode:forwards;animation-iteration-count:infinite;background-color:var(--color-fill-gray-tertiary);border-radius:4px;height:12px;margin:20px 0;opacity:0}.loading-row[data-v-779b8b01]:first-of-type{margin-top:0}.loading-row[data-v-779b8b01]:last-of-type{margin-bottom:0}.quick-navigation[data-v-479a2da8]{--input-border-color:var(--color-grid)}.quick-navigation input[type=text][data-v-479a2da8]{font-size:1.2352941176rem;line-height:1.380952381;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:735px){.quick-navigation input[type=text][data-v-479a2da8]{font-size:1.1176470588rem;line-height:1.4210526316;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.quick-navigation__filter[data-v-479a2da8]{--input-horizontal-spacing:0.8823529412rem}.quick-navigation[data-v-479a2da8] .filter__wrapper{background-color:var(--color-fill-secondary)}.quick-navigation__container[data-v-479a2da8]{background-color:var(--color-fill-secondary);border:solid 1px var(--input-border-color);border-radius:var(--border-radius,4px);margin:0 .9411764706rem}.quick-navigation__container>[data-v-479a2da8]{--input-text:var(--color-figure-gray-secondary)}.quick-navigation__container.focus[data-v-479a2da8]{box-shadow:0 0 0 4px var(--color-focus-color);outline:none;border-color:var(--color-focus-border-color)}.quick-navigation__magnifier-icon-container[data-v-479a2da8]{width:1rem}.quick-navigation__magnifier-icon-container>[data-v-479a2da8]{width:100%}.quick-navigation__magnifier-icon-container.blue .magnifier-icon[data-v-479a2da8]{fill:var(--color-figure-blue);color:var(--color-figure-blue)}.quick-navigation__match-list[data-v-479a2da8]{display:flex;max-height:26.4705882353rem;height:0}.quick-navigation__match-list>[data-v-479a2da8]{min-width:0}.quick-navigation__match-list.active[data-v-479a2da8]{height:auto;border-top:1px solid var(--input-border-color)}.quick-navigation__match-list .no-results[data-v-479a2da8]{margin:.8823529412rem auto;width:-moz-fit-content;width:fit-content}.quick-navigation__refs[data-v-479a2da8]{flex:1;overflow:auto}.quick-navigation__preview[data-v-479a2da8]{border-left:1px solid var(--color-grid);flex:0 0 61.8%;overflow:auto;position:sticky;top:0}.quick-navigation__reference[data-v-479a2da8]{display:block;padding:.5882352941rem .8823529412rem}.quick-navigation__reference[data-v-479a2da8]:hover{text-decoration:none;background-color:var(--color-navigator-item-hover)}.quick-navigation__reference[data-v-479a2da8]:focus{margin:0 .2941176471rem;padding:.5882352941rem .5882352941rem;background-color:var(--color-navigator-item-hover)}.quick-navigation__symbol-match[data-v-479a2da8]{display:flex;height:2.3529411765rem;color:var(--color-figure-gray)}.quick-navigation__symbol-match .symbol-info[data-v-479a2da8]{margin:auto;width:100%}.quick-navigation__symbol-match .symbol-info .navigator-icon[data-v-479a2da8]{margin-right:.5882352941rem}.quick-navigation__symbol-match .symbol-info .symbol-name[data-v-479a2da8]{display:flex}.quick-navigation__symbol-match .symbol-info .symbol-name .symbol-title[data-v-479a2da8]{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.quick-navigation__symbol-match .symbol-info .symbol-path[data-v-479a2da8]{font-size:.8235294118rem;line-height:1.2857142857;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-figure-gray-secondary);display:flex;margin-left:1.5882352941rem;overflow:hidden;white-space:nowrap}.quick-navigation__symbol-match .symbol-info .symbol-path .parent-path[data-v-479a2da8]{padding-right:.2941176471rem}@media print{.sidebar[data-v-5cd50784]{display:none}}.adjustable-sidebar-width[data-v-5cd50784]{display:flex}@media only screen and (max-width:1023px){.adjustable-sidebar-width[data-v-5cd50784]{display:block;position:relative}}.adjustable-sidebar-width.dragging[data-v-5cd50784] *{cursor:col-resize!important}.adjustable-sidebar-width.sidebar-hidden.dragging[data-v-5cd50784] *{cursor:e-resize!important}.sidebar[data-v-5cd50784]{position:relative}@media only screen and (max-width:1023px){.sidebar[data-v-5cd50784]{position:static}}.aside[data-v-5cd50784]{width:250px;position:relative;height:100%;max-width:100vw}.aside.no-transition[data-v-5cd50784]{transition:none!important}@media only screen and (min-width:1024px){.aside[data-v-5cd50784]{transition:width .3s ease-in,visibility 0s linear var(--visibility-transition-time,0s)}.aside.dragging[data-v-5cd50784]:not(.is-opening-on-large):not(.hide-on-large){transition:none}.aside.hide-on-large[data-v-5cd50784]{width:0!important;visibility:hidden;pointer-events:none;--visibility-transition-time:0.3s}}@media only screen and (max-width:1023px){.aside[data-v-5cd50784]{width:100%!important;overflow:hidden;min-width:0;max-width:100%;height:calc(var(--app-height) - var(--top-offset-mobile));position:fixed;top:var(--top-offset-mobile);bottom:0;z-index:9998;transform:translateX(-100%);transition:transform .15s ease-in;left:0}.aside[data-v-5cd50784] .aside-animated-child{opacity:0}.aside.show-on-mobile[data-v-5cd50784]{transform:translateX(0)}.aside.show-on-mobile[data-v-5cd50784] .aside-animated-child{--index:0;opacity:1;transition:opacity .15s linear;transition-delay:calc(var(--index)*.15s + .15s)}.aside.has-mobile-top-offset[data-v-5cd50784]{border-top:1px solid var(--color-fill-gray-tertiary)}}.content[data-v-5cd50784]{display:flex;flex-flow:column;min-width:0;flex:1 1 auto;height:100%}.resize-handle[data-v-5cd50784]{position:absolute;cursor:col-resize;top:0;bottom:0;right:0;width:5px;height:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:1;transition:background-color .15s;transform:translateX(50%)}@media only screen and (max-width:1023px){.resize-handle[data-v-5cd50784]{display:none}}.resize-handle[data-v-5cd50784]:hover{background:var(--color-fill-gray-tertiary)}.navigator-card-item[data-v-41ab423b]{--nav-head-wrapper-left-space:10px;--nav-head-wrapper-right-space:20px;--head-wrapper-vertical-space:5px;--nav-depth-spacer:25px;--nesting-index:0;display:flex;align-items:stretch;min-height:32px;box-sizing:border-box}.fromkeyboard .navigator-card-item[data-v-41ab423b]:focus-within{outline:4px solid var(--color-focus-color);outline-offset:-4px}.fromkeyboard .navigator-card-item[data-v-41ab423b]:focus-within:not(.is-group){background:var(--color-navigator-item-hover)}.navigator-card-item.active[data-v-41ab423b]{background:var(--color-fill-gray-quaternary)}.hover .navigator-card-item[data-v-41ab423b]:not(.is-group){background:var(--color-navigator-item-hover)}.depth-spacer[data-v-41ab423b]{width:calc(var(--nesting-index)*15px + var(--nav-depth-spacer));height:100%;position:relative;flex:0 0 auto}.title-container[data-v-41ab423b]{width:100%;min-width:0;display:flex;align-items:center}.navigator-icon-wrapper[data-v-41ab423b]{margin-right:7px}.head-wrapper[data-v-41ab423b]{padding:var(--head-wrapper-vertical-space) var(--nav-head-wrapper-right-space) var(--head-wrapper-vertical-space) var(--nav-head-wrapper-left-space);position:relative;display:flex;align-items:center;flex:1;min-width:0}@supports(padding:max(0px)){.head-wrapper[data-v-41ab423b]{padding-left:max(var(--nav-head-wrapper-left-space),env(safe-area-inset-left));padding-right:max(var(--nav-head-wrapper-right-space),env(safe-area-inset-right))}}.highlight[data-v-7b81ca08]{display:inline}.highlight[data-v-7b81ca08] .match{font-weight:600;background:var(--color-fill-light-blue-secondary)}.is-group .leaf-link[data-v-c780f74c]{color:var(--color-figure-gray-secondary);font-weight:600}.is-group .leaf-link[data-v-c780f74c]:after{display:none}.navigator-icon[data-v-c780f74c]{display:flex;flex:0 0 auto}.navigator-icon.changed[data-v-c780f74c]{border:none;width:1em;height:1em;z-index:0}.navigator-icon.changed[data-v-c780f74c]:after{top:50%;left:50%;right:auto;bottom:auto;transform:translate(-50%,-50%);background-image:url(../img/modified-icon.efb2697d.svg);margin:0}@media screen{[data-color-scheme=dark] .navigator-icon.changed[data-v-c780f74c]:after{background-image:url(../img/modified-icon.efb2697d.svg)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .navigator-icon.changed[data-v-c780f74c]:after{background-image:url(../img/modified-icon.efb2697d.svg)}}.navigator-icon.changed-added[data-v-c780f74c]:after{background-image:url(../img/added-icon.832a5d2c.svg)}@media screen{[data-color-scheme=dark] .navigator-icon.changed-added[data-v-c780f74c]:after{background-image:url(../img/added-icon.832a5d2c.svg)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .navigator-icon.changed-added[data-v-c780f74c]:after{background-image:url(../img/added-icon.832a5d2c.svg)}}.navigator-icon.changed-deprecated[data-v-c780f74c]:after{background-image:url(../img/deprecated-icon.7bf1740a.svg)}@media screen{[data-color-scheme=dark] .navigator-icon.changed-deprecated[data-v-c780f74c]:after{background-image:url(../img/deprecated-icon.7bf1740a.svg)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .navigator-icon.changed-deprecated[data-v-c780f74c]:after{background-image:url(../img/deprecated-icon.7bf1740a.svg)}}.leaf-link[data-v-c780f74c]{color:var(--color-figure-gray);text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:100%;display:inline;vertical-align:middle;font-size:.8235294118rem;line-height:1.2857142857;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.fromkeyboard .leaf-link[data-v-c780f74c]:focus{outline:none}.leaf-link[data-v-c780f74c]:hover{text-decoration:none}.leaf-link.bolded[data-v-c780f74c]{font-weight:600}.leaf-link[data-v-c780f74c]:after{content:"";position:absolute;top:0;left:0;right:0;bottom:0}.extended-content[data-v-c780f74c]{font-size:.8235294118rem;line-height:1.4285714286;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-figure-gray-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tree-toggle[data-v-c780f74c]{overflow:hidden;position:absolute;width:100%;height:100%;padding-right:5px;box-sizing:border-box;z-index:1;display:flex;align-items:center;justify-content:flex-end}.chevron[data-v-c780f74c]{width:10px}.chevron.animating[data-v-c780f74c]{transition:transform .15s ease-in}.chevron.rotate[data-v-c780f74c]{transform:rotate(90deg)}.navigator-card[data-v-60246d6e]{--card-vertical-spacing:8px;--card-horizontal-spacing:20px;--nav-filter-horizontal-padding:20px;--visibility-delay:1s;display:flex;flex-direction:column;min-height:0;height:calc(var(--app-height) - var(--nav-height, 0px));position:sticky;top:var(--nav-height,0)}@media only screen and (max-width:1023px){.navigator-card[data-v-60246d6e]{height:100%;position:static;background:var(--color-fill)}}.navigator-card .navigator-card-full-height[data-v-60246d6e]{min-height:0;flex:1 1 auto}.navigator-card .head-inner[data-v-60246d6e]{overflow:hidden}.navigator-card .head-wrapper[data-v-60246d6e]{position:relative;flex:1 0 auto}.navigator-card .navigator-head[data-v-60246d6e]{--navigator-head-padding-right:calc(var(--card-horizontal-spacing)*2 + 19px);padding:0 var(--navigator-head-padding-right) 0 var(--card-horizontal-spacing);background:var(--color-fill);border-bottom:1px solid var(--color-grid);display:flex;align-items:center;height:3.0588235294rem;white-space:nowrap}.navigator-card .navigator-head .card-link[data-v-60246d6e]{color:var(--color-text);font-size:.8235294118rem;line-height:1.4285714286;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);font-weight:600;overflow:hidden;text-overflow:ellipsis}.navigator-card .navigator-head .badge[data-v-60246d6e]{margin-top:0}.navigator-card .navigator-head.router-link-exact-active[data-v-60246d6e]{background:var(--color-fill)}.navigator-card .navigator-head.router-link-exact-active .card-link[data-v-60246d6e]{font-weight:700}.navigator-card .navigator-head[data-v-60246d6e]:hover{background:var(--color-navigator-item-hover);text-decoration:none}.fromkeyboard .navigator-card .navigator-head:focus .card-link[data-v-60246d6e]{outline:4px solid var(--color-focus-color);outline-offset:1px}@supports(padding:max(0px)){.navigator-card .navigator-head[data-v-60246d6e]{padding-left:max(var(--card-horizontal-spacing),env(safe-area-inset-left));padding-right:max(var(--navigator-head-padding-right),env(safe-area-inset-right))}}@media only screen and (max-width:1023px){.navigator-card .navigator-head[data-v-60246d6e]{justify-content:center;--navigator-head-padding-right:var(--card-horizontal-spacing)}}@media only screen and (max-width:767px){.navigator-card .navigator-head[data-v-60246d6e]{height:2.8235294118rem;padding:0 20px}}.close-card[data-v-60246d6e]{display:flex;position:absolute;z-index:1;align-items:center;justify-content:center;right:1rem;padding:5px;margin-left:-5px;top:calc(50% - 14px);transition:transform .3s ease-in 0s,visibility 0s}@media only screen and (max-width:1023px){.close-card[data-v-60246d6e]{right:unset;top:0;left:0;margin:0;padding:0 1.2941176471rem 0 20px;height:100%}@supports(padding:max(0px)){.close-card[data-v-60246d6e]{padding-left:max(1.2941176471rem,env(safe-area-inset-left))}}}@media only screen and (max-width:767px){.close-card[data-v-60246d6e]{padding-left:.9411764706rem;padding-right:.9411764706rem}@supports(padding:max(0px)){.close-card[data-v-60246d6e]{padding-left:max(.9411764706rem,env(safe-area-inset-left))}}}.close-card .close-icon[data-v-60246d6e]{width:19px;height:19px}@media only screen and (min-width:1024px){.close-card.hide-on-large[data-v-60246d6e]{display:none}.close-card[data-v-60246d6e]:hover{border-radius:var(--border-radius,4px);background:var(--color-fill-gray-quaternary)}.sidebar-hidden .close-card[data-v-60246d6e]{transition:transform .3s ease-in 0s,visibility 0s linear .3s;visibility:hidden;transform:translateX(3.7647058824rem)}}[data-v-60246d6e] .card-body{padding-right:0;flex:1 1 auto;min-height:0;height:100%}@media only screen and (max-width:1023px){[data-v-60246d6e] .card-body{--card-vertical-spacing:0px}}.navigator-card-inner[data-v-60246d6e]{display:flex;flex-flow:column;height:100%}.vue-recycle-scroller{position:relative}.vue-recycle-scroller.direction-vertical:not(.page-mode){overflow-y:auto}.vue-recycle-scroller.direction-horizontal:not(.page-mode){overflow-x:auto}.vue-recycle-scroller.direction-horizontal{display:-webkit-box;display:-ms-flexbox;display:flex}.vue-recycle-scroller__slot{-webkit-box-flex:1;-ms-flex:auto 0 0px;flex:auto 0 0}.vue-recycle-scroller__item-wrapper{-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;position:relative}.vue-recycle-scroller.ready .vue-recycle-scroller__item-view{position:absolute;top:0;left:0;will-change:transform}.vue-recycle-scroller.direction-vertical .vue-recycle-scroller__item-wrapper{width:100%}.vue-recycle-scroller.direction-horizontal .vue-recycle-scroller__item-wrapper{height:100%}.vue-recycle-scroller.ready.direction-vertical .vue-recycle-scroller__item-view{width:100%}.vue-recycle-scroller.ready.direction-horizontal .vue-recycle-scroller__item-view{height:100%}.resize-observer[data-v-b329ee4c]{border:none;background-color:transparent;opacity:0}.resize-observer[data-v-b329ee4c],.resize-observer[data-v-b329ee4c] object{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%;pointer-events:none;display:block;overflow:hidden}.navigator-card.filter-on-top .filter-wrapper[data-v-66549638]{order:1;position:static}.navigator-card.filter-on-top .card-body[data-v-66549638]{order:2}.no-items-wrapper[data-v-66549638]{overflow:hidden;color:var(--color-figure-gray-tertiary)}.no-items-wrapper .no-items[data-v-66549638]{font-size:.8235294118rem;line-height:1.4285714286;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);padding:var(--card-vertical-spacing) var(--card-horizontal-spacing);min-width:200px;box-sizing:border-box}.navigator-filter[data-v-66549638]{box-sizing:border-box;padding:15px var(--nav-filter-horizontal-padding);border-top:1px solid var(--color-grid);height:71px;display:flex;align-items:flex-end}.filter-on-top .navigator-filter[data-v-66549638]{border-top:none;align-items:flex-start}@supports(padding:max(0px)){.navigator-filter[data-v-66549638]{padding-left:max(var(--nav-filter-horizontal-padding),env(safe-area-inset-left));padding-right:max(var(--nav-filter-horizontal-padding),env(safe-area-inset-right))}}@media only screen and (max-width:1023px){.navigator-filter[data-v-66549638]{--nav-filter-horizontal-padding:20px;border:none;padding-top:10px;padding-bottom:10px;height:60px}}.navigator-filter .input-wrapper[data-v-66549638]{position:relative;flex:1;min-width:0}.navigator-filter .filter-component[data-v-66549638]{--input-vertical-padding:8px;--input-height:22px;--input-border-color:var(--color-grid);--input-text:var(--color-figure-gray-secondary)}.navigator-filter .filter-component[data-v-66549638] .filter__input{font-size:1rem;line-height:1.4705882353;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.navigator-filter .filter-component[data-v-66549638] .filter__input-label:after{min-width:70px}.scroller[data-v-66549638]{height:100%;box-sizing:border-box;padding:var(--card-vertical-spacing) 0;padding-bottom:calc(var(--top-offset, 0px) + var(--card-vertical-spacing));transition:padding-bottom .15s ease-in}@media only screen and (max-width:1023px){.scroller[data-v-66549638]{padding-bottom:10em}}.scroller[data-v-66549638] .vue-recycle-scroller__item-wrapper{transform:translateZ(0)}.filter-wrapper[data-v-66549638]{position:sticky;bottom:0;background:var(--color-fill)}.sidebar-transitioning .filter-wrapper[data-v-66549638]{flex:1 0 71px;overflow:hidden}@media only screen and (max-width:1023px){.sidebar-transitioning .filter-wrapper[data-v-66549638]{flex-basis:60px}}.loader[data-v-0de29914]{height:.7058823529rem;background-color:var(--color-fill-gray-tertiary);border-radius:4px}.navigator-icon[data-v-0de29914]{width:16px;height:16px;border-radius:2px;background-color:var(--color-fill-gray-tertiary)}.loading-navigator-item[data-v-0de29914]{animation:pulse 2.5s ease;animation-iteration-count:infinite;animation-fill-mode:forwards;opacity:0;animation-delay:calc(var(--visibility-delay) + .3s*var(--index))}.delay-visibility-enter-active[data-v-4b6d345f]{transition:visibility var(--visibility-delay);visibility:hidden}.loading-navigator[data-v-4b6d345f]{padding-top:var(--card-vertical-spacing)}.navigator[data-v-159b9764]{height:100%;display:flex;flex-flow:column}@media only screen and (max-width:1023px){.navigator[data-v-159b9764]{position:static;transition:none}}.hierarchy-collapsed-items[data-v-f4ced690]{position:relative;display:inline-flex;align-items:center;margin-left:.1764705882rem}.hierarchy-collapsed-items .hierarchy-item-icon[data-v-f4ced690]{width:9px;height:15px;margin-right:.1764705882rem;display:flex;justify-content:center;font-size:1em;align-self:baseline}.nav--in-breakpoint-range .hierarchy-collapsed-items[data-v-f4ced690]{display:none}.hierarchy-collapsed-items .toggle[data-v-f4ced690]{background:var(--color-nav-hierarchy-collapse-background);border-color:var(--color-nav-hierarchy-collapse-borders);border-radius:var(--border-radius,4px);border-style:solid;border-width:0;font-weight:600;height:1.1176470588rem;text-align:center;width:2.1176470588rem;display:flex;align-items:center;justify-content:center}.theme-dark .hierarchy-collapsed-items .toggle[data-v-f4ced690]{background:var(--color-nav-dark-hierarchy-collapse-background)}.hierarchy-collapsed-items .toggle.focused[data-v-f4ced690],.hierarchy-collapsed-items .toggle[data-v-f4ced690]:active,.hierarchy-collapsed-items .toggle[data-v-f4ced690]:focus{box-shadow:0 0 0 4px var(--color-focus-color);outline:none}.indicator[data-v-f4ced690]{width:1em;height:1em;display:flex;align-items:center}.indicator .toggle-icon[data-v-f4ced690]{width:100%}.dropdown[data-v-f4ced690]{background:var(--color-nav-hierarchy-collapse-background);border-color:var(--color-nav-hierarchy-collapse-borders);border-radius:var(--border-radius,4px);border-style:solid;box-shadow:0 1px 4px -1px var(--color-figure-gray-secondary);border-width:0;padding:0 .5rem;position:absolute;z-index:42;top:calc(100% + .41176rem)}.theme-dark .dropdown[data-v-f4ced690]{background:var(--color-nav-dark-hierarchy-collapse-background);border-color:var(--color-nav-dark-hierarchy-collapse-borders)}.dropdown.collapsed[data-v-f4ced690]{opacity:0;transform:translate3d(0,-.4117647059rem,0);transition:opacity .25s ease,transform .25s ease,visibility 0s linear .25s;visibility:hidden}.dropdown[data-v-f4ced690]:not(.collapsed){opacity:1;transform:none;transition:opacity .25s ease,transform .25s ease,visibility 0s linear 0s;visibility:visible}.nav--in-breakpoint-range .dropdown[data-v-f4ced690]:not(.collapsed){display:none}.dropdown[data-v-f4ced690]:before{border-bottom-color:var(--color-nav-hierarchy-collapse-background);border-bottom-style:solid;border-bottom-width:.5rem;border-left-color:transparent;border-left-style:solid;border-left-width:.5rem;border-right-color:transparent;border-right-style:solid;border-right-width:.5rem;content:"";left:1.2647058824rem;position:absolute;top:-.4411764706rem}.theme-dark .dropdown[data-v-f4ced690]:before{border-bottom-color:var(--color-nav-dark-hierarchy-collapse-background)}.dropdown-item[data-v-f4ced690]{border-top-color:var(--color-nav-hierarchy-collapse-borders);border-top-style:solid;border-top-width:1px}.theme-dark .dropdown-item[data-v-f4ced690]{border-top-color:var(--color-nav-dark-hierarchy-collapse-borders)}.dropdown-item[data-v-f4ced690]:first-child{border-top:none}.nav-menu-link[data-v-f4ced690]{max-width:57.6470588235rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;padding:.75rem 1rem}.hierarchy-item[data-v-6cf5f1d1]{display:flex;align-items:center;margin-left:.1764705882rem}.hierarchy-item[data-v-6cf5f1d1] .hierarchy-item-icon{width:9px;height:15px;margin-right:.1764705882rem;display:flex;justify-content:center;font-size:1em;align-self:baseline}.nav--in-breakpoint-range .hierarchy-item[data-v-6cf5f1d1] .hierarchy-item-icon{display:none}.nav--in-breakpoint-range .hierarchy-item[data-v-6cf5f1d1]{border-top:1px solid var(--color-nav-hierarchy-item-borders);display:flex;align-items:center}.theme-dark.nav--in-breakpoint-range .hierarchy-item[data-v-6cf5f1d1]{border-top-color:var(--color-nav-dark-hierarchy-item-borders)}.nav--in-breakpoint-range .hierarchy-item[data-v-6cf5f1d1]:first-of-type{border-top:none}.hierarchy-item.collapsed[data-v-6cf5f1d1]{display:none}.nav--in-breakpoint-range .hierarchy-item.collapsed[data-v-6cf5f1d1]{display:inline-block}.item[data-v-6cf5f1d1]{display:inline-block;vertical-align:middle}.nav--in-breakpoint-range .item[data-v-6cf5f1d1]{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;height:100%;line-height:2.4705882353rem}@media only screen and (min-width:768px){.hierarchy-item:first-child:last-child .item[data-v-6cf5f1d1],.hierarchy-item:first-child:last-child~.hierarchy-item .item[data-v-6cf5f1d1]{max-width:45rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.has-badge .hierarchy-item:first-child:last-child .item[data-v-6cf5f1d1],.has-badge .hierarchy-item:first-child:last-child~.hierarchy-item .item[data-v-6cf5f1d1],.hierarchy-item:first-child:nth-last-child(2) .item[data-v-6cf5f1d1],.hierarchy-item:first-child:nth-last-child(2)~.hierarchy-item .item[data-v-6cf5f1d1]{max-width:36rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.has-badge .hierarchy-item:first-child:nth-last-child(2) .item[data-v-6cf5f1d1],.has-badge .hierarchy-item:first-child:nth-last-child(2)~.hierarchy-item .item[data-v-6cf5f1d1]{max-width:28.8rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hierarchy-item:first-child:nth-last-child(3) .item[data-v-6cf5f1d1],.hierarchy-item:first-child:nth-last-child(3)~.hierarchy-item .item[data-v-6cf5f1d1]{max-width:27rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.has-badge .hierarchy-item:first-child:nth-last-child(3) .item[data-v-6cf5f1d1],.has-badge .hierarchy-item:first-child:nth-last-child(3)~.hierarchy-item .item[data-v-6cf5f1d1]{max-width:21.6rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hierarchy-item:first-child:nth-last-child(4) .item[data-v-6cf5f1d1],.hierarchy-item:first-child:nth-last-child(4)~.hierarchy-item .item[data-v-6cf5f1d1]{max-width:18rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.has-badge .hierarchy-item:first-child:nth-last-child(4) .item[data-v-6cf5f1d1],.has-badge .hierarchy-item:first-child:nth-last-child(4)~.hierarchy-item .item[data-v-6cf5f1d1]{max-width:14.4rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hierarchy-item:first-child:nth-last-child(5) .item[data-v-6cf5f1d1],.hierarchy-item:first-child:nth-last-child(5)~.hierarchy-item .item[data-v-6cf5f1d1]{max-width:9rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.has-badge .hierarchy-item:first-child:nth-last-child(5) .item[data-v-6cf5f1d1],.has-badge .hierarchy-item:first-child:nth-last-child(5)~.hierarchy-item .item[data-v-6cf5f1d1]{max-width:7.2rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hierarchy-collapsed-items~.hierarchy-item .item[data-v-6cf5f1d1]{max-width:10.8rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hierarchy-collapsed-items~.hierarchy-item:last-child .item[data-v-6cf5f1d1]{max-width:none}.has-badge .hierarchy-collapsed-items~.hierarchy-item .item[data-v-6cf5f1d1]{max-width:8.64rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}.hierarchy[data-v-069ffff2]{justify-content:flex-start;min-width:0;margin-right:80px}.nav--in-breakpoint-range .hierarchy[data-v-069ffff2]{margin-right:0}.hierarchy .root-hierarchy .item[data-v-069ffff2]{max-width:10rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nav-menu-setting-label[data-v-d12167e0]{margin-right:.3529411765rem;white-space:nowrap}.language-container[data-v-d12167e0]{flex:1 0 auto}.language-dropdown[data-v-d12167e0]{-webkit-text-size-adjust:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;background-color:transparent;box-sizing:inherit;padding:0 11px 0 4px;margin-left:-4px;font-size:.8235294118rem;line-height:1.2857142857;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);cursor:pointer;position:relative;z-index:1}@media only screen and (max-width:1023px){.language-dropdown[data-v-d12167e0]{font-size:.8235294118rem;line-height:1.5;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.language-dropdown[data-v-d12167e0]:focus{outline:none}.fromkeyboard .language-dropdown[data-v-d12167e0]:focus{outline:4px solid var(--color-focus-color);outline-offset:1px}.language-sizer[data-v-d12167e0]{position:absolute;opacity:0;pointer-events:none;padding:0}.language-toggle-container[data-v-d12167e0]{display:flex;align-items:center;padding-right:.1764705882rem;position:relative}.nav--in-breakpoint-range .language-toggle-container[data-v-d12167e0]{display:none}.language-toggle-container .toggle-icon[data-v-d12167e0]{width:.6em;height:.6em;position:absolute;right:7px}.language-toggle-label[data-v-d12167e0]{margin-right:2px}.language-toggle.nav-menu-toggle-label[data-v-d12167e0]{margin-right:6px}.language-list[data-v-d12167e0]{display:inline-block;margin-top:0}.language-list-container[data-v-d12167e0]{display:none}.language-list-item[data-v-d12167e0],.nav--in-breakpoint-range .language-list-container[data-v-d12167e0]{display:inline-block}.language-list-item[data-v-d12167e0]:not(:first-child){border-left:1px solid #424242;margin-left:6px;padding-left:6px}[data-v-78ad19e0] .nav-menu{line-height:1.5}[data-v-78ad19e0] .nav-menu,[data-v-78ad19e0] .nav-menu-settings{font-size:.8235294118rem;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}[data-v-78ad19e0] .nav-menu-settings{min-width:0;line-height:1.2857142857}@media only screen and (max-width:1023px){[data-v-78ad19e0] .nav-menu-settings{font-size:.8235294118rem;line-height:1.5;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (min-width:1024px){[data-v-78ad19e0] .nav-menu-settings{margin-left:.5882352941rem}}.nav--in-breakpoint-range[data-v-78ad19e0] .nav-menu-settings:not([data-previous-menu-children-count="0"]) .nav-menu-setting:first-child{border-top:1px solid #b0b0b0;display:flex;align-items:center}[data-v-78ad19e0] .nav-menu-settings .nav-menu-setting{display:flex;align-items:center;color:var(--color-nav-current-link);margin-left:0;min-width:0}[data-v-78ad19e0] .nav-menu-settings .nav-menu-setting:first-child:not(:only-child){margin-right:.5882352941rem}.nav--in-breakpoint-range[data-v-78ad19e0] .nav-menu-settings .nav-menu-setting:first-child:not(:only-child){margin-right:0}.theme-dark[data-v-78ad19e0] .nav-menu-settings .nav-menu-setting{color:var(--color-nav-dark-current-link)}.nav--in-breakpoint-range[data-v-78ad19e0] .nav-menu-settings .nav-menu-setting:not(:first-child){border-top:1px solid #424242}.documentation-nav[data-v-78ad19e0] .nav-title{font-size:.8235294118rem;line-height:1.5;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.documentation-nav[data-v-78ad19e0] .nav-title .nav-title-link.inactive{height:auto;color:var(--color-figure-gray-secondary-alt)}.theme-dark.documentation-nav[data-v-78ad19e0] .nav-title .nav-title-link.inactive{color:#b0b0b0}.sidenav-toggle-wrapper[data-v-78ad19e0]{display:flex;margin-top:1px}.nav--in-breakpoint-range .sidenav-toggle-wrapper[data-v-78ad19e0]{display:flex!important}@media only screen and (min-width:1024px){.sidenav-toggle-enter-active[data-v-78ad19e0],.sidenav-toggle-leave-active[data-v-78ad19e0]{transition:margin .3s ease-in 0s}.sidenav-toggle-enter[data-v-78ad19e0],.sidenav-toggle-leave-to[data-v-78ad19e0]{margin-left:-3.7647058824rem}}.sidenav-toggle[data-v-78ad19e0]{align-self:center;color:var(--color-nav-link-color);position:relative;margin:0 -5px}.theme-dark .sidenav-toggle[data-v-78ad19e0]{color:var(--color-nav-dark-link-color)}.sidenav-toggle:hover .sidenav-icon-wrapper[data-v-78ad19e0]{background:var(--color-fill-gray-quaternary)}.theme-dark .sidenav-toggle:hover .sidenav-icon-wrapper[data-v-78ad19e0]{background:#424242}.sidenav-toggle__separator[data-v-78ad19e0]{height:.8em;width:1px;background:var(--color-nav-color);align-self:center;margin:0 1.2941176471rem}.nav--in-breakpoint-range .sidenav-toggle[data-v-78ad19e0]{margin-left:-14px;margin-right:-14px;padding-left:14px;padding-right:14px;align-self:stretch}.nav--in-breakpoint-range .sidenav-toggle__separator[data-v-78ad19e0]{display:none}.sidenav-icon-wrapper[data-v-78ad19e0]{padding:5px;display:flex;align-items:center;justify-content:center;border-radius:var(--border-radius,4px)}.sidenav-icon[data-v-78ad19e0]{display:flex;width:19px;height:19px}[data-v-14c47d72] .generic-modal{overflow-y:overlay}[data-v-14c47d72] .modal-fullscreen>.container{background-color:transparent;height:-moz-fit-content;height:fit-content;flex:auto;margin:9.4117647059rem 0;max-width:47.0588235294rem;overflow:visible}[data-v-14c47d72] .navigator-filter .quick-navigation-open{margin-left:var(--nav-filter-horizontal-padding);width:calc(var(--nav-filter-horizontal-padding)*2)}.doc-topic-view[data-v-14c47d72]{--delay:1s;display:flex;flex-flow:column;background:var(--colors-text-background,var(--color-text-background))}.doc-topic-view .delay-hiding-leave-active[data-v-14c47d72]{transition:display var(--delay)}.doc-topic-aside[data-v-14c47d72]{height:100%;box-sizing:border-box;border-right:1px solid var(--color-grid)}@media only screen and (max-width:1023px){.doc-topic-aside[data-v-14c47d72]{background:var(--color-fill);border-right:none}.sidebar-transitioning .doc-topic-aside[data-v-14c47d72]{border-right:1px solid var(--color-grid)}}.topic-wrapper[data-v-14c47d72]{flex:1 1 auto;width:100%}.full-width-container[data-v-14c47d72]{max-width:1920px;margin-left:auto;margin-right:auto}@media only screen and (min-width:1920px){.full-width-container[data-v-14c47d72]{border-left:1px solid var(--color-grid);border-right:1px solid var(--color-grid);box-sizing:border-box}} \ No newline at end of file diff --git a/docs/css/documentation-topic~topic~tutorials-overview.82acfe22.css b/docs/css/documentation-topic~topic~tutorials-overview.82acfe22.css deleted file mode 100644 index 68c7acd..0000000 --- a/docs/css/documentation-topic~topic~tutorials-overview.82acfe22.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * This source file is part of the Swift.org open source project - * - * Copyright (c) 2021 Apple Inc. and the Swift project authors - * Licensed under Apache License v2.0 with Runtime Library Exception - * - * See https://swift.org/LICENSE.txt for license information - * See https://swift.org/CONTRIBUTORS.txt for Swift project authors - */.svg-icon[data-v-0137d411]{fill:var(--colors-svg-icon-fill-light,var(--color-svg-icon));transform:scale(1);-webkit-transform:scale(1);overflow:visible}.theme-dark .svg-icon[data-v-0137d411]{fill:var(--colors-svg-icon-fill-dark,var(--color-svg-icon))}.svg-icon.icon-inline[data-v-0137d411]{display:inline-block;vertical-align:middle;fill:currentColor}.svg-icon.icon-inline[data-v-0137d411] .svg-icon-stroke{stroke:currentColor}[data-v-0137d411] .svg-icon-stroke{stroke:var(--colors-svg-icon-fill-light,var(--color-svg-icon))}.theme-dark[data-v-0137d411] .svg-icon-stroke{stroke:var(--colors-svg-icon-fill-dark,var(--color-svg-icon))}.label[data-v-5117d474]{font-size:.70588rem;line-height:1.33333;font-weight:600;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.label+[data-v-5117d474]{margin-top:.4em}.deprecated .label[data-v-5117d474]{color:var(--color-aside-deprecated)}.experiment .label[data-v-5117d474]{color:var(--color-aside-experiment)}.important .label[data-v-5117d474]{color:var(--color-aside-important)}.note .label[data-v-5117d474]{color:var(--color-aside-note)}.tip .label[data-v-5117d474]{color:var(--color-aside-tip)}.warning .label[data-v-5117d474]{color:var(--color-aside-warning)}.doc-topic aside[data-v-5117d474]{border-radius:4px;padding:.94118rem;border:0 solid;border-left-width:6px}.doc-topic aside.deprecated[data-v-5117d474]{background-color:var(--color-aside-deprecated-background);border-color:var(--color-aside-deprecated-border);box-shadow:0 0 0 0 var(--color-aside-deprecated-border) inset,0 0 0 0 var(--color-aside-deprecated-border)}.doc-topic aside.experiment[data-v-5117d474]{background-color:var(--color-aside-experiment-background);border-color:var(--color-aside-experiment-border);box-shadow:0 0 0 0 var(--color-aside-experiment-border) inset,0 0 0 0 var(--color-aside-experiment-border)}.doc-topic aside.important[data-v-5117d474]{background-color:var(--color-aside-important-background);border-color:var(--color-aside-important-border);box-shadow:0 0 0 0 var(--color-aside-important-border) inset,0 0 0 0 var(--color-aside-important-border)}.doc-topic aside.note[data-v-5117d474]{background-color:var(--color-aside-note-background);border-color:var(--color-aside-note-border);box-shadow:0 0 0 0 var(--color-aside-note-border) inset,0 0 0 0 var(--color-aside-note-border)}.doc-topic aside.tip[data-v-5117d474]{background-color:var(--color-aside-tip-background);border-color:var(--color-aside-tip-border);box-shadow:0 0 0 0 var(--color-aside-tip-border) inset,0 0 0 0 var(--color-aside-tip-border)}.doc-topic aside.warning[data-v-5117d474]{background-color:var(--color-aside-warning-background);border-color:var(--color-aside-warning-border);box-shadow:0 0 0 0 var(--color-aside-warning-border) inset,0 0 0 0 var(--color-aside-warning-border)}.doc-topic aside .label[data-v-5117d474]{font-size:1rem;line-height:1.52941;font-weight:600;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.file-icon[data-v-7c381064]{position:relative;align-items:flex-end;height:24px;margin:0 .5rem 0 1rem}.filename[data-v-c8c40662]{color:var(--text,var(--colors-secondary-label,var(--color-secondary-label)));font-size:.94118rem;line-height:1.1875;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;margin-top:1rem}@media only screen and (max-width:735px){.filename[data-v-c8c40662]{font-size:.82353rem;line-height:1.42857;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;margin-top:0}}.filename>a[data-v-c8c40662],.filename>span[data-v-c8c40662]{display:flex;align-items:center;line-height:normal}a[data-v-c8c40662]{color:var(--url,var(--color-link))}.code-line-container[data-v-df963650]{display:flex}.code-number[data-v-df963650]{padding:0 1rem 0 8px;text-align:right;min-width:2em;color:#666;-webkit-user-select:none;-moz-user-select:none;user-select:none}.code-number[data-v-df963650]:before{content:attr(data-line-number)}.highlighted[data-v-df963650]{background:var(--line-highlight,var(--color-code-line-highlight));border-left:4px solid var(--color-code-line-highlight-border)}.highlighted .code-number[data-v-df963650]{padding-left:4px}pre[data-v-df963650]{padding:14px 0;display:flex;overflow:unset;-webkit-overflow-scrolling:touch;white-space:pre;word-wrap:normal;height:100%}@media only screen and (max-width:735px){pre[data-v-df963650]{padding-top:.82353rem}}code[data-v-df963650]{display:flex;flex-direction:column;white-space:pre;word-wrap:normal;flex-grow:9999}.code-line-container[data-v-df963650]{flex-shrink:0;padding-right:14px}.code-listing[data-v-df963650],.container-general[data-v-df963650]{display:flex}.code-listing[data-v-df963650]{flex-direction:column;min-height:100%;border-radius:4px;overflow:auto}.code-listing.single-line[data-v-df963650]{border-radius:4px}.container-general[data-v-df963650],pre[data-v-df963650]{flex-grow:1}code[data-v-05f4a5b7]{speak-punctuation:code}code[data-v-d68ae420]{width:100%}.container-general[data-v-d68ae420]{display:flex;flex-flow:row wrap}.container-general .code-line[data-v-d68ae420]{flex:1 0 auto}.code-line-container[data-v-d68ae420]{align-items:center;display:flex;border-left:4px solid transparent;counter-increment:linenumbers;padding-right:14px}.code-number[data-v-d68ae420]{font-size:.70588rem;line-height:1.5;font-weight:400;font-family:Menlo,monospace;padding:0 1rem 0 8px;text-align:right;min-width:2.01em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.code-number[data-v-d68ae420]:before{content:counter(linenumbers)}.code-line[data-v-d68ae420]{display:flex}pre[data-v-d68ae420]{padding:14px 0;display:flex;flex-flow:row wrap;overflow:auto;-webkit-overflow-scrolling:touch;white-space:pre;word-wrap:normal}@media only screen and (max-width:735px){pre[data-v-d68ae420]{padding-top:.82353rem}}.collapsible-code-listing[data-v-d68ae420]{background:var(--background,var(--color-code-background));border-color:var(--colors-grid,var(--color-grid));color:var(--text,var(--color-code-plain));border-radius:4px;border-style:solid;border-width:1px;counter-reset:linenumbers;font-size:15px}.collapsible-code-listing.single-line[data-v-d68ae420]{border-radius:4px}.collapsible[data-v-d68ae420]{background:var(--color-code-collapsible-background);color:var(--color-code-collapsible-text)}.collapsed[data-v-d68ae420]:before{content:"⋯";display:inline-block;font-family:monospace;font-weight:700;height:100%;line-height:1;text-align:right;width:2.3rem}.collapsed .code-line-container[data-v-d68ae420]{height:0;visibility:hidden}.row[data-v-be73599c]{box-sizing:border-box;display:flex;flex-flow:row wrap}.col[data-v-2ee3ad8b]{box-sizing:border-box;flex:none}.xlarge-1[data-v-2ee3ad8b]{flex-basis:8.33333%;max-width:8.33333%}.xlarge-2[data-v-2ee3ad8b]{flex-basis:16.66667%;max-width:16.66667%}.xlarge-3[data-v-2ee3ad8b]{flex-basis:25%;max-width:25%}.xlarge-4[data-v-2ee3ad8b]{flex-basis:33.33333%;max-width:33.33333%}.xlarge-5[data-v-2ee3ad8b]{flex-basis:41.66667%;max-width:41.66667%}.xlarge-6[data-v-2ee3ad8b]{flex-basis:50%;max-width:50%}.xlarge-7[data-v-2ee3ad8b]{flex-basis:58.33333%;max-width:58.33333%}.xlarge-8[data-v-2ee3ad8b]{flex-basis:66.66667%;max-width:66.66667%}.xlarge-9[data-v-2ee3ad8b]{flex-basis:75%;max-width:75%}.xlarge-10[data-v-2ee3ad8b]{flex-basis:83.33333%;max-width:83.33333%}.xlarge-11[data-v-2ee3ad8b]{flex-basis:91.66667%;max-width:91.66667%}.xlarge-12[data-v-2ee3ad8b]{flex-basis:100%;max-width:100%}.xlarge-centered[data-v-2ee3ad8b]{margin-left:auto;margin-right:auto}.xlarge-uncentered[data-v-2ee3ad8b]{margin-left:0;margin-right:0}.large-1[data-v-2ee3ad8b]{flex-basis:8.33333%;max-width:8.33333%}.large-2[data-v-2ee3ad8b]{flex-basis:16.66667%;max-width:16.66667%}.large-3[data-v-2ee3ad8b]{flex-basis:25%;max-width:25%}.large-4[data-v-2ee3ad8b]{flex-basis:33.33333%;max-width:33.33333%}.large-5[data-v-2ee3ad8b]{flex-basis:41.66667%;max-width:41.66667%}.large-6[data-v-2ee3ad8b]{flex-basis:50%;max-width:50%}.large-7[data-v-2ee3ad8b]{flex-basis:58.33333%;max-width:58.33333%}.large-8[data-v-2ee3ad8b]{flex-basis:66.66667%;max-width:66.66667%}.large-9[data-v-2ee3ad8b]{flex-basis:75%;max-width:75%}.large-10[data-v-2ee3ad8b]{flex-basis:83.33333%;max-width:83.33333%}.large-11[data-v-2ee3ad8b]{flex-basis:91.66667%;max-width:91.66667%}.large-12[data-v-2ee3ad8b]{flex-basis:100%;max-width:100%}.large-centered[data-v-2ee3ad8b]{margin-left:auto;margin-right:auto}.large-uncentered[data-v-2ee3ad8b]{margin-left:0;margin-right:0}@media only screen and (max-width:1250px){.medium-1[data-v-2ee3ad8b]{flex-basis:8.33333%;max-width:8.33333%}.medium-2[data-v-2ee3ad8b]{flex-basis:16.66667%;max-width:16.66667%}.medium-3[data-v-2ee3ad8b]{flex-basis:25%;max-width:25%}.medium-4[data-v-2ee3ad8b]{flex-basis:33.33333%;max-width:33.33333%}.medium-5[data-v-2ee3ad8b]{flex-basis:41.66667%;max-width:41.66667%}.medium-6[data-v-2ee3ad8b]{flex-basis:50%;max-width:50%}.medium-7[data-v-2ee3ad8b]{flex-basis:58.33333%;max-width:58.33333%}.medium-8[data-v-2ee3ad8b]{flex-basis:66.66667%;max-width:66.66667%}.medium-9[data-v-2ee3ad8b]{flex-basis:75%;max-width:75%}.medium-10[data-v-2ee3ad8b]{flex-basis:83.33333%;max-width:83.33333%}.medium-11[data-v-2ee3ad8b]{flex-basis:91.66667%;max-width:91.66667%}.medium-12[data-v-2ee3ad8b]{flex-basis:100%;max-width:100%}.medium-centered[data-v-2ee3ad8b]{margin-left:auto;margin-right:auto}.medium-uncentered[data-v-2ee3ad8b]{margin-left:0;margin-right:0}}@media only screen and (max-width:735px){.small-1[data-v-2ee3ad8b]{flex-basis:8.33333%;max-width:8.33333%}.small-2[data-v-2ee3ad8b]{flex-basis:16.66667%;max-width:16.66667%}.small-3[data-v-2ee3ad8b]{flex-basis:25%;max-width:25%}.small-4[data-v-2ee3ad8b]{flex-basis:33.33333%;max-width:33.33333%}.small-5[data-v-2ee3ad8b]{flex-basis:41.66667%;max-width:41.66667%}.small-6[data-v-2ee3ad8b]{flex-basis:50%;max-width:50%}.small-7[data-v-2ee3ad8b]{flex-basis:58.33333%;max-width:58.33333%}.small-8[data-v-2ee3ad8b]{flex-basis:66.66667%;max-width:66.66667%}.small-9[data-v-2ee3ad8b]{flex-basis:75%;max-width:75%}.small-10[data-v-2ee3ad8b]{flex-basis:83.33333%;max-width:83.33333%}.small-11[data-v-2ee3ad8b]{flex-basis:91.66667%;max-width:91.66667%}.small-12[data-v-2ee3ad8b]{flex-basis:100%;max-width:100%}.small-centered[data-v-2ee3ad8b]{margin-left:auto;margin-right:auto}.small-uncentered[data-v-2ee3ad8b]{margin-left:0;margin-right:0}}.tabnav[data-v-42371214]{margin:.88235rem 0 1.47059rem 0}.tabnav-items[data-v-42371214]{display:inline-block;margin:0;text-align:center}.tabnav-item[data-v-723a9588]{border-bottom:1px solid;border-color:var(--colors-tabnav-item-border-color,var(--color-tabnav-item-border-color));display:inline-block;list-style:none;padding-left:1.76471rem;margin:0;outline:none}.tabnav-item[data-v-723a9588]:first-child{padding-left:0}.tabnav-item[data-v-723a9588]:nth-child(n+1){margin:0}.tabnav-link[data-v-723a9588]{color:var(--colors-secondary-label,var(--color-secondary-label));font-size:1rem;line-height:1;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;padding:9px 0 11px;margin-top:2px;margin-bottom:4px;text-align:left;text-decoration:none;display:block;position:relative;z-index:0}.tabnav-link[data-v-723a9588]:hover{text-decoration:none}.tabnav-link[data-v-723a9588]:focus{outline-offset:-1px}.tabnav-link[data-v-723a9588]:after{content:"";position:absolute;bottom:-5px;left:0;width:100%;border:1px solid transparent}.tabnav-link.active[data-v-723a9588]{color:var(--colors-text,var(--color-text));cursor:default;z-index:10}.tabnav-link.active[data-v-723a9588]:after{border-bottom-color:var(--colors-text,var(--color-text))}.controls[data-v-6197ce3f]{margin-top:5px;font-size:14px;display:flex;justify-content:flex-end}.controls a[data-v-6197ce3f]{color:var(--colors-text,var(--color-text));display:flex;align-items:center}.controls .control-icon[data-v-6197ce3f]{width:1.05em;margin-right:.3em}[data-v-7be42fb4] figcaption+*{margin-top:1rem}.caption[data-v-0bcb8b58]{font-size:.82353rem;line-height:1.5;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}[data-v-0bcb8b58] p{display:inline-block}[data-v-3a939631] img{max-width:100%}*+.table-wrapper,.table-wrapper+*{margin-top:1.6em}.nav-menu-items[data-v-67c1c0a5]{display:flex;justify-content:flex-end}.nav--in-breakpoint-range .nav-menu-items[data-v-67c1c0a5]{display:block;opacity:0;padding:1rem 1.88235rem 1.64706rem 1.88235rem;transform:translate3d(0,-50px,0);transition:transform 1s cubic-bezier(.07,1.06,.27,.95) .5s,opacity .7s cubic-bezier(.07,1.06,.27,.95) .2s}.nav--is-open.nav--in-breakpoint-range .nav-menu-items[data-v-67c1c0a5]{opacity:1;transform:translateZ(0);transition-delay:.2s,.4s}.nav--in-breakpoint-range .nav-menu-items[data-v-67c1c0a5]:not(:only-child):not(:last-child){padding-bottom:0}.nav--in-breakpoint-range .nav-menu-items[data-v-67c1c0a5]:not(:only-child):last-child{padding-top:0}.table-wrapper[data-v-358dcd5e]{overflow:auto;-webkit-overflow-scrolling:touch}[data-v-358dcd5e] th{font-weight:600}[data-v-358dcd5e] td,[data-v-358dcd5e] th{border-color:var(--color-fill-gray-tertiary);border-style:solid;border-width:1px 0;padding:.58824rem}.nav[data-v-be9ec8e8]{position:sticky;top:0;width:100%;height:3.05882rem;z-index:9997;--nav-padding:1.29412rem;color:var(--color-nav-color)}@media only screen and (max-width:767px){.nav[data-v-be9ec8e8]{min-width:320px;height:2.82353rem}}.theme-dark.nav[data-v-be9ec8e8]{background:none;color:var(--color-nav-dark-color)}.nav__wrapper[data-v-be9ec8e8]{position:absolute;top:0;left:0;width:100%;height:auto;min-height:100%;z-index:1}.nav__background[data-v-be9ec8e8]{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1;transition:background-color 0s ease-in}.nav__background[data-v-be9ec8e8]:after{background-color:var(--color-nav-keyline)}.nav--no-bg-transition .nav__background[data-v-be9ec8e8]{transition:none!important}.nav--solid-background .nav__background[data-v-be9ec8e8]{background-color:var(--color-nav-solid-background);-webkit-backdrop-filter:none;backdrop-filter:none}.nav--is-open.nav--solid-background .nav__background[data-v-be9ec8e8],.nav--is-sticking.nav--solid-background .nav__background[data-v-be9ec8e8]{background-color:var(--color-nav-solid-background)}.nav--is-open.theme-dark.nav--solid-background .nav__background[data-v-be9ec8e8],.nav--is-sticking.theme-dark.nav--solid-background .nav__background[data-v-be9ec8e8],.theme-dark.nav--solid-background .nav__background[data-v-be9ec8e8]{background-color:var(--color-nav-dark-solid-background)}.nav--in-breakpoint-range .nav__background[data-v-be9ec8e8]{min-height:2.82353rem;transition:background-color 0s ease .7s}.nav--is-sticking .nav__background[data-v-be9ec8e8]{background-color:var(--color-nav-expanded);max-height:none;transition:background-color 0s ease;transition-property:background-color,-webkit-backdrop-filter;transition-property:background-color,backdrop-filter;transition-property:background-color,backdrop-filter,-webkit-backdrop-filter}.nav--is-sticking .nav__background[data-v-be9ec8e8]:after{background-color:var(--color-nav-sticking-expanded-keyline)}@supports ((-webkit-backdrop-filter:initial) or (backdrop-filter:initial)){.nav--is-sticking .nav__background[data-v-be9ec8e8]{-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px);background-color:var(--color-nav-uiblur-stuck)}}.theme-dark.nav--is-sticking .nav__background[data-v-be9ec8e8]{background-color:var(--color-nav-dark-stuck)}@supports ((-webkit-backdrop-filter:initial) or (backdrop-filter:initial)){.theme-dark.nav--is-sticking .nav__background[data-v-be9ec8e8]{background-color:var(--color-nav-dark-uiblur-stuck)}}.nav--is-open .nav__background[data-v-be9ec8e8]{background-color:var(--color-nav-expanded);max-height:none;transition:background-color 0s ease;transition-property:background-color,-webkit-backdrop-filter;transition-property:background-color,backdrop-filter;transition-property:background-color,backdrop-filter,-webkit-backdrop-filter}.nav--is-open .nav__background[data-v-be9ec8e8]:after{background-color:var(--color-nav-sticking-expanded-keyline)}@supports ((-webkit-backdrop-filter:initial) or (backdrop-filter:initial)){.nav--is-open .nav__background[data-v-be9ec8e8]{-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px);background-color:var(--color-nav-uiblur-expanded)}}.theme-dark.nav--is-open .nav__background[data-v-be9ec8e8]{background-color:var(--color-nav-dark-expanded)}@supports ((-webkit-backdrop-filter:initial) or (backdrop-filter:initial)){.theme-dark.nav--is-open .nav__background[data-v-be9ec8e8]{background-color:var(--color-nav-dark-uiblur-expanded)}}.theme-dark .nav__background[data-v-be9ec8e8]:after{background-color:var(--color-nav-dark-keyline)}.nav--is-open.theme-dark .nav__background[data-v-be9ec8e8]:after,.nav--is-sticking.theme-dark .nav__background[data-v-be9ec8e8]:after{background-color:var(--color-nav-dark-sticking-expanded-keyline)}.nav__background[data-v-be9ec8e8]:after{content:"";display:block;position:absolute;top:100%;left:50%;transform:translateX(-50%);width:980px;height:1px;z-index:1}@media only screen and (max-width:1023px){.nav__background[data-v-be9ec8e8]:after{width:100%}}.nav--noborder .nav__background[data-v-be9ec8e8]:after{display:none}.nav--is-sticking.nav--noborder .nav__background[data-v-be9ec8e8]:after{display:block}.nav--fullwidth-border .nav__background[data-v-be9ec8e8]:after,.nav--is-open .nav__background[data-v-be9ec8e8]:after,.nav--is-sticking .nav__background[data-v-be9ec8e8]:after,.nav--solid-background .nav__background[data-v-be9ec8e8]:after{width:100%}.nav-overlay[data-v-be9ec8e8]{position:fixed;left:0;right:0;top:0;display:block;opacity:0}.nav--is-open .nav-overlay[data-v-be9ec8e8]{background-color:rgba(51,51,51,.4);transition:opacity .7s cubic-bezier(.07,1.06,.27,.95) .2s;bottom:0;opacity:1}.nav-wrapper[data-v-be9ec8e8]{position:absolute;top:0;left:0;width:100%;height:auto;min-height:100%;z-index:1}.pre-title[data-v-be9ec8e8],.pre-title[data-v-be9ec8e8]:empty{display:none}.nav--in-breakpoint-range .pre-title[data-v-be9ec8e8]{display:flex;padding:0}.nav-content[data-v-be9ec8e8]{display:flex;padding:0 var(--nav-padding);max-width:980px;margin:0 auto;position:relative;z-index:2;justify-content:space-between}.nav--is-wide-format .nav-content[data-v-be9ec8e8]{box-sizing:border-box;max-width:1920px;margin-left:auto;margin-right:auto}@supports (padding:calc(max(0px))){.nav-content[data-v-be9ec8e8]{padding-left:calc(max(var(--nav-padding), env(safe-area-inset-left)));padding-right:calc(max(var(--nav-padding), env(safe-area-inset-right)))}}@media only screen and (max-width:767px){.nav-content[data-v-be9ec8e8]{padding:0 0 0 .94118rem}}.nav--in-breakpoint-range .nav-content[data-v-be9ec8e8]{display:grid;grid-template-columns:auto 1fr auto;grid-auto-rows:minmax(-webkit-min-content,-webkit-max-content);grid-auto-rows:minmax(min-content,max-content);grid-template-areas:"pre-title title actions" "menu menu menu"}.nav-menu[data-v-be9ec8e8]{font-size:.70588rem;line-height:1;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;flex:1 1 auto;display:flex;padding-top:10px;min-width:0}@media only screen and (max-width:767px){.nav-menu[data-v-be9ec8e8]{font-size:.82353rem;line-height:1;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.nav--in-breakpoint-range .nav-menu[data-v-be9ec8e8]{font-size:.82353rem;line-height:1;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;padding-top:0;grid-area:menu}.nav-menu-tray[data-v-be9ec8e8]{width:100%;max-width:100%;align-items:center;display:flex;justify-content:space-between}.nav--in-breakpoint-range .nav-menu-tray[data-v-be9ec8e8]{display:block;overflow:hidden;pointer-events:none;visibility:hidden;max-height:0;transition:max-height .4s ease-in 0s,visibility 0s linear 1s}.nav--is-open.nav--in-breakpoint-range .nav-menu-tray[data-v-be9ec8e8]{max-height:calc(100vh - 5.64706rem);overflow-y:auto;-webkit-overflow-scrolling:touch;pointer-events:auto;visibility:visible;transition-delay:.2s,0s}.nav--is-transitioning.nav--is-open.nav--in-breakpoint-range .nav-menu-tray[data-v-be9ec8e8]{overflow-y:hidden}.nav--is-sticking.nav--is-open.nav--in-breakpoint-range .nav-menu-tray[data-v-be9ec8e8]{max-height:calc(100vh - 2.82353rem)}.nav-actions[data-v-be9ec8e8]{display:flex;align-items:center}.nav--in-breakpoint-range .nav-actions[data-v-be9ec8e8]{grid-area:actions;justify-content:flex-end}@media only screen and (max-width:767px){.nav-actions[data-v-be9ec8e8]{padding-right:.94118rem}}.nav-title[data-v-be9ec8e8]{height:3.05882rem;font-size:1.11765rem;line-height:1.42105;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;cursor:default;display:flex;align-items:center;white-space:nowrap;box-sizing:border-box}@media only screen and (max-width:767px){.nav-title[data-v-be9ec8e8]{padding-top:0;height:2.82353rem;width:90%}}.nav--in-breakpoint-range .nav-title[data-v-be9ec8e8]{grid-area:title}.nav--is-wide-format.nav--in-breakpoint-range .nav-title[data-v-be9ec8e8]{width:100%;justify-content:center}.nav-title[data-v-be9ec8e8] span{height:100%;line-height:normal}.nav-title a[data-v-be9ec8e8]{display:inline-block;letter-spacing:inherit;line-height:normal;margin:0;text-decoration:none;white-space:nowrap}.nav-title a[data-v-be9ec8e8]:hover{text-decoration:none}@media only screen and (max-width:767px){.nav-title a[data-v-be9ec8e8]{display:flex}}.nav-title[data-v-be9ec8e8],.nav-title a[data-v-be9ec8e8]{color:var(--color-figure-gray);transition:color 0s ease-in}.nav--is-open.theme-dark .nav-title[data-v-be9ec8e8],.nav--is-open.theme-dark .nav-title a[data-v-be9ec8e8],.nav--is-sticking.theme-dark .nav-title[data-v-be9ec8e8],.nav--is-sticking.theme-dark .nav-title a[data-v-be9ec8e8],.theme-dark .nav-title[data-v-be9ec8e8],.theme-dark .nav-title a[data-v-be9ec8e8]{color:var(--color-nav-dark-link-color)}.nav-ax-toggle[data-v-be9ec8e8]{display:none;position:absolute;top:0;left:0;width:1px;height:1px;z-index:10}.nav-ax-toggle[data-v-be9ec8e8]:focus{outline-offset:-6px;width:100%;height:100%}.nav--in-breakpoint-range .nav-ax-toggle[data-v-be9ec8e8]{display:block}.nav-menucta[data-v-be9ec8e8]{cursor:pointer;display:none;align-items:center;overflow:hidden;width:1.17647rem;-webkit-tap-highlight-color:transparent;height:2.82353rem}.nav--in-breakpoint-range .nav-menucta[data-v-be9ec8e8]{display:flex}.nav-menucta-chevron[data-v-be9ec8e8]{display:block;position:relative;width:100%;height:.70588rem;transition:transform .3s linear}.nav-menucta-chevron[data-v-be9ec8e8]:after,.nav-menucta-chevron[data-v-be9ec8e8]:before{content:"";display:block;position:absolute;top:.58824rem;width:.70588rem;height:.05882rem;transition:transform .3s linear;background:var(--color-figure-gray)}.nav-menucta-chevron[data-v-be9ec8e8]:before{right:50%;border-radius:.5px 0 0 .5px}.nav-menucta-chevron[data-v-be9ec8e8]:after{left:50%;border-radius:0 .5px .5px 0}.nav-menucta-chevron[data-v-be9ec8e8]:before{transform-origin:100% 100%;transform:rotate(40deg) scaleY(1.5)}.nav-menucta-chevron[data-v-be9ec8e8]:after{transform-origin:0 100%;transform:rotate(-40deg) scaleY(1.5)}.nav--is-open .nav-menucta-chevron[data-v-be9ec8e8]{transform:scaleY(-1)}.theme-dark .nav-menucta-chevron[data-v-be9ec8e8]:after,.theme-dark .nav-menucta-chevron[data-v-be9ec8e8]:before{background:var(--color-nav-dark-link-color)}[data-v-be9ec8e8] .nav-menu-link{color:var(--color-nav-link-color)}[data-v-be9ec8e8] .nav-menu-link:hover{color:var(--color-nav-link-color-hover);text-decoration:none}.theme-dark[data-v-be9ec8e8] .nav-menu-link{color:var(--color-nav-dark-link-color)}.theme-dark[data-v-be9ec8e8] .nav-menu-link:hover{color:var(--color-nav-dark-link-color-hover)}[data-v-be9ec8e8] .nav-menu-link.current{color:var(--color-nav-current-link);cursor:default}[data-v-be9ec8e8] .nav-menu-link.current:hover{color:var(--color-nav-current-link)}.theme-dark[data-v-be9ec8e8] .nav-menu-link.current,.theme-dark[data-v-be9ec8e8] .nav-menu-link.current:hover{color:var(--color-nav-dark-current-link)}s[data-v-eb91ce54]:after,s[data-v-eb91ce54]:before{position:absolute;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(0 0 99.9% 99.9%);clip-path:inset(0 0 99.9% 99.9%);overflow:hidden;height:1px;width:1px;padding:0;border:0}s[data-v-eb91ce54]:before{content:" [start of stricken text] "}s[data-v-eb91ce54]:after{content:" [end of stricken text] "}.nav-menu-item[data-v-66cbfe4c]{margin-left:1.41176rem;list-style:none;min-width:0}.nav--in-breakpoint-range .nav-menu-item[data-v-66cbfe4c]{margin-left:0;width:100%;min-height:2.47059rem}.nav--in-breakpoint-range .nav-menu-item[data-v-66cbfe4c]:first-child .nav-menu-link{border-top:0}.nav--in-breakpoint-range .nav-menu-item--animated[data-v-66cbfe4c]{opacity:0;transform:none;transition:.5s ease;transition-property:transform,opacity}.nav--is-open.nav--in-breakpoint-range .nav-menu-item--animated[data-v-66cbfe4c]{opacity:1;transform:translateZ(0);transition-delay:0s}.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-66cbfe4c]:first-child,.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(2),.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(3),.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(4),.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(5),.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(6),.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(7),.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-66cbfe4c]:first-child,.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(2),.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(3),.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(4),.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(5),.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(6),.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(7),.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-66cbfe4c]:first-child,.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(2),.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(3),.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(4),.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(5),.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(6),.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(7),.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-66cbfe4c]:first-child,.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(2),.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(3),.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(4),.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(5),.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(6),.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(7),.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-66cbfe4c]:first-child,.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(2),.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(3),.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(4),.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(5),.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(6),.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(7),.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-66cbfe4c]:first-child,.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(2),.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(3),.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(4),.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(5),.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(6),.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(7),.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-66cbfe4c]:first-child,.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(2),.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(3),.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(4),.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(5),.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(6),.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(7),.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-66cbfe4c]:first-child,.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(2),.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(3),.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(4),.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(5),.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(6),.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(7),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-66cbfe4c]:first-child,.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(2),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(3),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(4),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(5),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(6),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="0"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(7),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-66cbfe4c]:first-child,.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(2),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(3),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(4),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(5),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(6),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="1"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(7),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-66cbfe4c]:first-child,.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(2),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(3),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(4),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(5),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(6),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="2"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(7),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-66cbfe4c]:first-child,.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(2),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(3),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(4),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(5),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(6),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="3"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(7),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-66cbfe4c]:first-child,.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(2),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(3),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(4),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(5),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(6),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="4"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(7),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-66cbfe4c]:first-child,.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(2),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(3),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(4),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(5),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(6),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="5"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(7),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-66cbfe4c]:first-child,.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(2),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(3),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(4),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(5),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(6),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="6"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(7),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-66cbfe4c]:first-child,.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(2),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(3),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(4),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(5),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(6),.nav--is-open.nav--in-breakpoint-range [data-previous-menu-children-count="7"] .nav-menu-item--animated[data-v-66cbfe4c]:nth-child(7){transition-delay:0s}.button-cta[data-v-494ad9c8]{border-radius:var(--style-button-borderRadius,4px);background:var(--colors-button-light-background,var(--color-button-background));color:var(--colors-button-text,var(--color-button-text));cursor:pointer;min-width:1.76471rem;padding:.23529rem .88235rem;text-align:center;white-space:nowrap;display:inline-block;font-size:1rem;line-height:1.47059;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.button-cta[data-v-494ad9c8]:active{background:var(--colors-button-light-backgroundActive,var(--color-button-background-active));outline:none}.button-cta[data-v-494ad9c8]:hover:not([disabled]){background:var(--colors-button-light-backgroundHover,var(--color-button-background-hover));text-decoration:none}.button-cta[data-v-494ad9c8]:disabled{opacity:.32;cursor:default}.fromkeyboard .button-cta[data-v-494ad9c8]:focus{box-shadow:0 0 0 4px var(--color-focus-color);outline:none}.button-cta.is-dark[data-v-494ad9c8]{background:var(--colors-button-dark-background,#06f)}.button-cta.is-dark[data-v-494ad9c8]:active{background:var(--colors-button-dark-backgroundActive,var(--color-button-background-active))}.button-cta.is-dark[data-v-494ad9c8]:hover:not([disabled]){background:var(--colors-button-dark-backgroundHover,var(--color-button-background-hover))} \ No newline at end of file diff --git a/docs/css/index.12bb178a.css b/docs/css/index.12bb178a.css deleted file mode 100644 index 381df10..0000000 --- a/docs/css/index.12bb178a.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * This source file is part of the Swift.org open source project - * - * Copyright (c) 2021 Apple Inc. and the Swift project authors - * Licensed under Apache License v2.0 with Runtime Library Exception - * - * See https://swift.org/LICENSE.txt for license information - * See https://swift.org/CONTRIBUTORS.txt for Swift project authors - */.color-scheme-toggle[data-v-4472ec1e]{--toggle-color-fill:var(--color-button-background);--toggle-color-text:var(--color-fill-blue);font-size:.70588rem;line-height:1.33333;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;border:1px solid var(--toggle-color-fill);border-radius:var(--toggle-border-radius-outer,4px);display:inline-flex;padding:1px}@media screen{[data-color-scheme=dark] .color-scheme-toggle[data-v-4472ec1e]{--toggle-color-text:var(--color-figure-blue)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .color-scheme-toggle[data-v-4472ec1e]{--toggle-color-text:var(--color-figure-blue)}}input[data-v-4472ec1e]{position:absolute;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(0 0 99.9% 99.9%);clip-path:inset(0 0 99.9% 99.9%);overflow:hidden;height:1px;width:1px;padding:0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.text[data-v-4472ec1e]{border:1px solid transparent;border-radius:var(--toggle-border-radius-inner,2px);color:var(--toggle-color-text);display:inline-block;text-align:center;padding:1px 6px;min-width:42px;box-sizing:border-box}.text[data-v-4472ec1e]:hover{cursor:pointer}input:checked+.text[data-v-4472ec1e]{--toggle-color-text:var(--color-button-text);background:var(--toggle-color-fill);border-color:var(--toggle-color-fill)}.footer[data-v-72f2e2dc]{border-top:1px solid var(--color-grid)}.row[data-v-72f2e2dc]{margin-left:auto;margin-right:auto;width:980px;display:flex;flex-direction:row-reverse;padding:20px 0}@media only screen and (max-width:1250px){.row[data-v-72f2e2dc]{width:692px}}@media only screen and (max-width:735px){.row[data-v-72f2e2dc]{width:87.5%;width:100%;padding:20px .94118rem;box-sizing:border-box}}.InitialLoadingPlaceholder[data-v-35c356b6]{background:var(--colors-loading-placeholder-background,var(--color-loading-placeholder-background));height:100vh;width:100%}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;background-color:var(--colors-text-background,var(--color-text-background));height:100%}abbr,blockquote,body,button,dd,dl,dt,fieldset,figure,form,h1,h2,h3,h4,h5,h6,hgroup,input,legend,li,ol,p,pre,ul{margin:0;padding:0}address,caption,code,figcaption,pre,th{font-size:1em;font-weight:400;font-style:normal}fieldset,iframe,img{border:0}caption,th{text-align:left}table{border-collapse:collapse;border-spacing:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}button{background:none;border:0;box-sizing:content-box;color:inherit;cursor:pointer;font:inherit;line-height:inherit;overflow:visible;vertical-align:inherit}button:disabled{cursor:default}:focus{outline:4px solid var(--color-focus-color);outline-offset:1px}::-moz-focus-inner{border:0;padding:0}@media print{#content,#main,body{color:#000}a,a:link,a:visited{color:#000;text-decoration:none}.hide,.noprint{display:none}}body{height:100%;min-width:320px}html{font:var(--typography-html-font,17px "Helvetica Neue","Helvetica","Arial",sans-serif);quotes:"“" "”"}body{font-size:1rem;line-height:1.47059;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;background-color:var(--color-text-background);color:var(--colors-text,var(--color-text));font-style:normal;word-wrap:break-word}body,button,input,select,textarea{font-synthesis:none;-moz-font-feature-settings:"kern";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;direction:ltr;text-align:left}h1,h2,h3,h4,h5,h6{color:var(--colors-header-text,var(--color-header-text))}h1+*,h2+*,h3+*,h4+*,h5+*,h6+*{margin-top:.8em}h1+h1,h1+h2,h1+h3,h1+h4,h1+h5,h1+h6,h2+h1,h2+h2,h2+h3,h2+h4,h2+h5,h2+h6,h3+h1,h3+h2,h3+h3,h3+h4,h3+h5,h3+h6,h4+h1,h4+h2,h4+h3,h4+h4,h4+h5,h4+h6,h5+h1,h5+h2,h5+h3,h5+h4,h5+h5,h5+h6,h6+h1,h6+h2,h6+h3,h6+h4,h6+h5,h6+h6{margin-top:.4em}ol+h1,ol+h2,ol+h3,ol+h4,ol+h5,ol+h6,p+h1,p+h2,p+h3,p+h4,p+h5,p+h6,ul+h1,ul+h2,ul+h3,ul+h4,ul+h5,ul+h6{margin-top:1.6em}ol+*,p+*,ul+*{margin-top:.8em}ol,ul{margin-left:1.17647em}ol ol,ol ul,ul ol,ul ul{margin-top:0;margin-bottom:0}nav ol,nav ul{margin:0;list-style:none}li li{font-size:1em}a{color:var(--colors-link,var(--color-link))}a:link,a:visited{text-decoration:none}a:hover{text-decoration:underline}a:active{text-decoration:none}p+a{display:inline-block}b,strong{font-weight:600}cite,dfn,em,i{font-style:italic}sup{font-size:.6em;vertical-align:top;position:relative;bottom:-.2em}h1 sup,h2 sup,h3 sup{font-size:.4em}sup a{vertical-align:inherit;color:inherit}sup a:hover{color:var(--figure-blue);text-decoration:none}sub{line-height:1}abbr{border:0}pre{overflow:auto;-webkit-overflow-scrolling:auto;white-space:pre;word-wrap:normal}code{font-family:Menlo,monospace;font-weight:inherit;letter-spacing:0}.syntax-comment{color:var(--syntax-comment,var(--color-syntax-comments))}.syntax-quote{color:var(--syntax-quote,var(--color-syntax-comments))}.syntax-keyword{color:var(--syntax-keyword,var(--color-syntax-keywords))}.syntax-literal{color:var(--syntax-literal,var(--color-syntax-keywords))}.syntax-selector-tag{color:var(--syntax-selector-tag,var(--color-syntax-keywords))}.syntax-string{color:var(--syntax-string,var(--color-syntax-strings))}.syntax-bullet{color:var(--syntax-bullet,var(--color-syntax-characters))}.syntax-meta{color:var(--syntax-meta,var(--color-syntax-characters))}.syntax-number{color:var(--syntax-number,var(--color-syntax-characters))}.syntax-symbol{color:var(--syntax-symbol,var(--color-syntax-characters))}.syntax-tag{color:var(--syntax-tag,var(--color-syntax-characters))}.syntax-attr{color:var(--syntax-attr,var(--color-syntax-other-type-names))}.syntax-built_in{color:var(--syntax-built_in,var(--color-syntax-other-type-names))}.syntax-builtin-name{color:var(--syntax-builtin-name,var(--color-syntax-other-type-names))}.syntax-class{color:var(--syntax-class,var(--color-syntax-other-type-names))}.syntax-params{color:var(--syntax-params,var(--color-syntax-other-type-names))}.syntax-section{color:var(--syntax-section,var(--color-syntax-other-type-names))}.syntax-title{color:var(--syntax-title,var(--color-syntax-other-type-names))}.syntax-type{color:var(--syntax-type,var(--color-syntax-other-type-names))}.syntax-attribute{color:var(--syntax-attribute,var(--color-syntax-plain-text))}.syntax-identifier{color:var(--syntax-identifier,var(--color-syntax-plain-text))}.syntax-subst{color:var(--syntax-subst,var(--color-syntax-plain-text))}.syntax-doctag,.syntax-strong{font-weight:700}.syntax-emphasis,.syntax-link{font-style:italic}[data-syntax=swift] .syntax-meta{color:var(--syntax-meta,var(--color-syntax-keywords))}[data-syntax=swift] .syntax-class,[data-syntax=swift] .syntax-keyword+.syntax-params,[data-syntax=swift] .syntax-params+.syntax-params{color:unset}[data-syntax=json] .syntax-attr{color:var(--syntax-attr,var(--color-syntax-strings))}#skip-nav{position:absolute;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(0 0 99.9% 99.9%);clip-path:inset(0 0 99.9% 99.9%);overflow:hidden;height:1px;width:1px;padding:0;border:0}#skip-nav:active,#skip-nav:focus{position:relative;float:left;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;color:var(--color-figure-blue);font-size:1em;padding:0 10px;z-index:100000;top:0;left:0;height:44px;line-height:44px;-webkit-clip-path:unset;clip-path:unset}.nav--in-breakpoint-range #skip-nav{display:none}.visuallyhidden{position:absolute;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(0 0 99.9% 99.9%);clip-path:inset(0 0 99.9% 99.9%);overflow:hidden;height:1px;width:1px;padding:0;border:0}.changed{border:1px solid var(--color-changes-modified);border-radius:4px;position:relative}.changed.has-multiple-lines,.has-multiple-lines .changed{border-radius:4px}.changed:after{left:8px;background-image:url(../img/modified-icon.f496e73d.svg);background-repeat:no-repeat;bottom:0;content:" ";margin:auto;margin-right:8px;position:absolute;top:0;width:1.17647rem;height:1.17647rem;margin-top:.61765rem;z-index:2}@media screen{[data-color-scheme=dark] .changed:after{background-image:url(../img/modified-icon.f496e73d.svg)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .changed:after{background-image:url(../img/modified-icon.f496e73d.svg)}}.changed-added{border-color:var(--color-changes-added)}.changed-added:after{background-image:url(../img/added-icon.d6f7e47d.svg)}@media screen{[data-color-scheme=dark] .changed-added:after{background-image:url(../img/added-icon.d6f7e47d.svg)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .changed-added:after{background-image:url(../img/added-icon.d6f7e47d.svg)}}.changed-deprecated{border-color:var(--color-changes-deprecated)}.changed-deprecated:after{background-image:url(../img/deprecated-icon.015b4f17.svg)}@media screen{[data-color-scheme=dark] .changed-deprecated:after{background-image:url(../img/deprecated-icon.015b4f17.svg)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .changed-deprecated:after{background-image:url(../img/deprecated-icon.015b4f17.svg)}}.changed.link-block:after,.changed.relationships-item:after,.link-block .changed:after{margin-top:10px}.change-added,.change-removed{padding:2px 0}.change-removed{background-color:var(--color-highlight-red)}.change-added{background-color:var(--color-highlight-green)}body{color-scheme:light dark}body[data-color-scheme=light]{color-scheme:light}body[data-color-scheme=dark]{color-scheme:dark}body{--color-fill:#fff;--color-fill-secondary:#f7f7f7;--color-fill-tertiary:#f0f0f0;--color-fill-quaternary:#282828;--color-fill-blue:#00f;--color-fill-light-blue-secondary:#d1d1ff;--color-fill-gray:#ccc;--color-fill-gray-secondary:#f5f5f5;--color-fill-gray-tertiary:#f0f0f0;--color-fill-gray-quaternary:#f0f0f0;--color-fill-green-secondary:#f0fff0;--color-fill-orange-secondary:#fffaf6;--color-fill-red-secondary:#fff0f5;--color-figure-blue:#36f;--color-figure-gray:#000;--color-figure-gray-secondary:#666;--color-figure-gray-secondary-alt:#666;--color-figure-gray-tertiary:#666;--color-figure-green:green;--color-figure-light-gray:#666;--color-figure-orange:#c30;--color-figure-red:red;--color-tutorials-teal:#000;--color-article-background:var(--color-fill-tertiary);--color-article-body-background:var(--color-fill);--color-aside-deprecated:var(--color-figure-gray);--color-aside-deprecated-background:var(--color-fill-orange-secondary);--color-aside-deprecated-border:var(--color-figure-orange);--color-aside-experiment:var(--color-figure-gray);--color-aside-experiment-background:var(--color-fill-gray-secondary);--color-aside-experiment-border:var(--color-figure-light-gray);--color-aside-important:var(--color-figure-gray);--color-aside-important-background:var(--color-fill-gray-secondary);--color-aside-important-border:var(--color-figure-light-gray);--color-aside-note:var(--color-figure-gray);--color-aside-note-background:var(--color-fill-gray-secondary);--color-aside-note-border:var(--color-figure-light-gray);--color-aside-tip:var(--color-figure-gray);--color-aside-tip-background:var(--color-fill-gray-secondary);--color-aside-tip-border:var(--color-figure-light-gray);--color-aside-warning:var(--color-figure-gray);--color-aside-warning-background:var(--color-fill-red-secondary);--color-aside-warning-border:var(--color-figure-red);--color-badge-default:var(--color-figure-light-gray);--color-badge-beta:var(--color-figure-gray-tertiary);--color-badge-deprecated:var(--color-figure-orange);--color-badge-dark-default:#fff;--color-badge-dark-beta:#b0b0b0;--color-badge-dark-deprecated:#f60;--color-button-background:var(--color-fill-blue);--color-button-background-active:#36f;--color-button-background-hover:var(--color-figure-blue);--color-button-text:#fff;--color-call-to-action-background:var(--color-fill-secondary);--color-changes-added:var(--color-figure-light-gray);--color-changes-added-hover:var(--color-figure-light-gray);--color-changes-deprecated:var(--color-figure-light-gray);--color-changes-deprecated-hover:var(--color-figure-light-gray);--color-changes-modified:var(--color-figure-light-gray);--color-changes-modified-hover:var(--color-figure-light-gray);--color-changes-modified-previous-background:var(--color-fill);--color-code-background:var(--color-fill-secondary);--color-code-collapsible-background:var(--color-fill-tertiary);--color-code-collapsible-text:var(--color-figure-gray-secondary-alt);--color-code-line-highlight:rgba(51,102,255,0.08);--color-code-line-highlight-border:var(--color-figure-blue);--color-code-plain:var(--color-figure-gray);--color-dropdown-background:hsla(0,0%,100%,0.8);--color-dropdown-border:#ccc;--color-dropdown-option-text:#666;--color-dropdown-text:#000;--color-dropdown-dark-background:hsla(0,0%,100%,0.1);--color-dropdown-dark-border:hsla(0,0%,94.1%,0.2);--color-dropdown-dark-option-text:#ccc;--color-dropdown-dark-text:#fff;--color-eyebrow:var(--color-figure-gray-secondary);--color-focus-border-color:var(--color-fill-blue);--color-focus-color:rgba(0,125,250,0.6);--color-form-error:var(--color-figure-red);--color-form-error-background:var(--color-fill-red-secondary);--color-form-valid:var(--color-figure-green);--color-form-valid-background:var(--color-fill-green-secondary);--color-generic-modal-background:var(--color-fill);--color-grid:var(--color-fill-gray);--color-header-text:var(--color-figure-gray);--color-hero-eyebrow:#ccc;--color-link:var(--color-figure-blue);--color-loading-placeholder-background:var(--color-fill);--color-nav-color:#666;--color-nav-current-link:rgba(0,0,0,0.6);--color-nav-expanded:#fff;--color-nav-hierarchy-collapse-background:#f0f0f0;--color-nav-hierarchy-collapse-borders:#ccc;--color-nav-hierarchy-item-borders:#ccc;--color-nav-keyline:rgba(0,0,0,0.2);--color-nav-link-color:#000;--color-nav-link-color-hover:#36f;--color-nav-outlines:#ccc;--color-nav-rule:hsla(0,0%,94.1%,0.5);--color-nav-solid-background:#fff;--color-nav-sticking-expanded-keyline:rgba(0,0,0,0.1);--color-nav-stuck:hsla(0,0%,100%,0.9);--color-nav-uiblur-expanded:hsla(0,0%,100%,0.9);--color-nav-uiblur-stuck:hsla(0,0%,100%,0.7);--color-nav-root-subhead:var(--color-tutorials-teal);--color-nav-dark-border-top-color:hsla(0,0%,100%,0.4);--color-nav-dark-color:#b0b0b0;--color-nav-dark-current-link:hsla(0,0%,100%,0.6);--color-nav-dark-expanded:#2a2a2a;--color-nav-dark-hierarchy-collapse-background:#424242;--color-nav-dark-hierarchy-collapse-borders:#666;--color-nav-dark-hierarchy-item-borders:#424242;--color-nav-dark-keyline:rgba(66,66,66,0.95);--color-nav-dark-link-color:#fff;--color-nav-dark-link-color-hover:#09f;--color-nav-dark-outlines:#575757;--color-nav-dark-rule:#575757;--color-nav-dark-solid-background:#000;--color-nav-dark-sticking-expanded-keyline:rgba(66,66,66,0.7);--color-nav-dark-stuck:rgba(42,42,42,0.9);--color-nav-dark-uiblur-expanded:rgba(42,42,42,0.9);--color-nav-dark-uiblur-stuck:rgba(42,42,42,0.7);--color-nav-dark-root-subhead:#fff;--color-runtime-preview-background:var(--color-fill-tertiary);--color-runtime-preview-disabled-text:hsla(0,0%,40%,0.6);--color-runtime-preview-text:var(--color-figure-gray-secondary);--color-secondary-label:var(--color-figure-gray-secondary);--color-step-background:var(--color-fill-secondary);--color-step-caption:var(--color-figure-gray-secondary);--color-step-focused:var(--color-figure-light-gray);--color-step-text:var(--color-figure-gray-secondary);--color-svg-icon:#666;--color-syntax-attributes:#947100;--color-syntax-characters:#272ad8;--color-syntax-comments:#707f8c;--color-syntax-documentation-markup:#506375;--color-syntax-documentation-markup-keywords:#506375;--color-syntax-heading:#ba2da2;--color-syntax-keywords:#ad3da4;--color-syntax-marks:#000;--color-syntax-numbers:#272ad8;--color-syntax-other-class-names:#703daa;--color-syntax-other-constants:#4b21b0;--color-syntax-other-declarations:#047cb0;--color-syntax-other-function-and-method-names:#4b21b0;--color-syntax-other-instance-variables-and-globals:#703daa;--color-syntax-other-preprocessor-macros:#78492a;--color-syntax-other-type-names:#703daa;--color-syntax-param-internal-name:#404040;--color-syntax-plain-text:#000;--color-syntax-preprocessor-statements:#78492a;--color-syntax-project-class-names:#3e8087;--color-syntax-project-constants:#2d6469;--color-syntax-project-function-and-method-names:#2d6469;--color-syntax-project-instance-variables-and-globals:#3e8087;--color-syntax-project-preprocessor-macros:#78492a;--color-syntax-project-type-names:#3e8087;--color-syntax-strings:#d12f1b;--color-syntax-type-declarations:#03638c;--color-syntax-urls:#1337ff;--color-tabnav-item-border-color:var(--color-fill-gray);--color-text:var(--color-figure-gray);--color-text-background:var(--color-fill);--color-tutorial-assessments-background:var(--color-fill-secondary);--color-tutorial-background:var(--color-fill);--color-tutorial-navbar-dropdown-background:var(--color-fill);--color-tutorial-navbar-dropdown-border:var(--color-fill-gray);--color-tutorial-quiz-border-active:var(--color-figure-blue);--color-tutorials-overview-background:#161616;--color-tutorials-overview-content:#fff;--color-tutorials-overview-content-alt:#fff;--color-tutorials-overview-eyebrow:#ccc;--color-tutorials-overview-icon:#b0b0b0;--color-tutorials-overview-link:#09f;--color-tutorials-overview-navigation-link:#ccc;--color-tutorials-overview-navigation-link-active:#fff;--color-tutorials-overview-navigation-link-hover:#fff;--color-tutorial-hero-text:#fff;--color-tutorial-hero-background:#000;--color-navigator-item-hover:rgba(0,0,255,0.05)}@media screen{body[data-color-scheme=dark]{--color-fill:#000;--color-fill-secondary:#161616;--color-fill-tertiary:#2a2a2a;--color-fill-blue:#06f;--color-fill-light-blue-secondary:#004ec4;--color-fill-gray:#575757;--color-fill-gray-secondary:#222;--color-fill-gray-tertiary:#424242;--color-fill-gray-quaternary:#424242;--color-fill-green-secondary:#030;--color-fill-orange-secondary:#472400;--color-fill-red-secondary:#300;--color-figure-blue:#09f;--color-figure-gray:#fff;--color-figure-gray-secondary:#ccc;--color-figure-gray-secondary-alt:#b0b0b0;--color-figure-gray-tertiary:#b0b0b0;--color-figure-green:#090;--color-figure-light-gray:#b0b0b0;--color-figure-orange:#f60;--color-figure-red:#f33;--color-tutorials-teal:#fff;--color-article-body-background:#111;--color-badge-default:var(--color-badge-dark-default);--color-button-background-active:#06f;--color-code-line-highlight:rgba(0,153,255,0.08);--color-dropdown-background:var(--color-dropdown-dark-background);--color-dropdown-border:var(--color-dropdown-dark-border);--color-dropdown-option-text:var(--color-dropdown-dark-option-text);--color-dropdown-text:var(--color-dropdown-dark-text);--color-nav-color:var(--color-nav-dark-color);--color-nav-current-link:var(--color-nav-dark-current-link);--color-nav-expanded:var(--color-nav-dark-expanded);--color-nav-hierarchy-collapse-background:var(--color-nav-dark-hierarchy-collapse-background);--color-nav-hierarchy-collapse-borders:var(--color-nav-dark-hierarchy-collapse-borders);--color-nav-hierarchy-item-borders:var(--color-nav-dark-hierarchy-item-borders);--color-nav-keyline:var(--color-nav-dark-keyline);--color-nav-link-color:var(--color-nav-dark-link-color);--color-nav-link-color-hover:var(--color-nav-dark-link-color-hover);--color-nav-outlines:var(--color-nav-dark-outlines);--color-nav-rule:var(--color-nav-dark-rule);--color-nav-solid-background:var(--color-nav-dark-solid-background);--color-nav-sticking-expanded-keyline:var(--color-nav-dark-sticking-expanded-keyline);--color-nav-stuck:var(--color-nav-dark-stuck);--color-nav-uiblur-expanded:var(--color-nav-dark-uiblur-expanded);--color-nav-uiblur-stuck:var(--color-nav-dark-uiblur-stuck);--color-runtime-preview-disabled-text:hsla(0,0%,80%,0.6);--color-syntax-attributes:#cc9768;--color-syntax-characters:#d9c97c;--color-syntax-comments:#7f8c98;--color-syntax-documentation-markup:#7f8c98;--color-syntax-documentation-markup-keywords:#a3b1bf;--color-syntax-keywords:#ff7ab2;--color-syntax-marks:#fff;--color-syntax-numbers:#d9c97c;--color-syntax-other-class-names:#dabaff;--color-syntax-other-constants:#a7ebdd;--color-syntax-other-declarations:#4eb0cc;--color-syntax-other-function-and-method-names:#b281eb;--color-syntax-other-instance-variables-and-globals:#b281eb;--color-syntax-other-preprocessor-macros:#ffa14f;--color-syntax-other-type-names:#dabaff;--color-syntax-param-internal-name:#bfbfbf;--color-syntax-plain-text:#fff;--color-syntax-preprocessor-statements:#ffa14f;--color-syntax-project-class-names:#acf2e4;--color-syntax-project-constants:#78c2b3;--color-syntax-project-function-and-method-names:#78c2b3;--color-syntax-project-instance-variables-and-globals:#78c2b3;--color-syntax-project-preprocessor-macros:#ffa14f;--color-syntax-project-type-names:#acf2e4;--color-syntax-strings:#ff8170;--color-syntax-type-declarations:#6bdfff;--color-syntax-urls:#69f;--color-tutorial-background:var(--color-fill-tertiary);--color-navigator-item-hover:rgba(0,102,255,0.5)}}@media screen and (prefers-color-scheme:dark){body[data-color-scheme=auto]{--color-fill:#000;--color-fill-secondary:#161616;--color-fill-tertiary:#2a2a2a;--color-fill-blue:#06f;--color-fill-light-blue-secondary:#004ec4;--color-fill-gray:#575757;--color-fill-gray-secondary:#222;--color-fill-gray-tertiary:#424242;--color-fill-gray-quaternary:#424242;--color-fill-green-secondary:#030;--color-fill-orange-secondary:#472400;--color-fill-red-secondary:#300;--color-figure-blue:#09f;--color-figure-gray:#fff;--color-figure-gray-secondary:#ccc;--color-figure-gray-secondary-alt:#b0b0b0;--color-figure-gray-tertiary:#b0b0b0;--color-figure-green:#090;--color-figure-light-gray:#b0b0b0;--color-figure-orange:#f60;--color-figure-red:#f33;--color-tutorials-teal:#fff;--color-article-body-background:#111;--color-badge-default:var(--color-badge-dark-default);--color-button-background-active:#06f;--color-code-line-highlight:rgba(0,153,255,0.08);--color-dropdown-background:var(--color-dropdown-dark-background);--color-dropdown-border:var(--color-dropdown-dark-border);--color-dropdown-option-text:var(--color-dropdown-dark-option-text);--color-dropdown-text:var(--color-dropdown-dark-text);--color-nav-color:var(--color-nav-dark-color);--color-nav-current-link:var(--color-nav-dark-current-link);--color-nav-expanded:var(--color-nav-dark-expanded);--color-nav-hierarchy-collapse-background:var(--color-nav-dark-hierarchy-collapse-background);--color-nav-hierarchy-collapse-borders:var(--color-nav-dark-hierarchy-collapse-borders);--color-nav-hierarchy-item-borders:var(--color-nav-dark-hierarchy-item-borders);--color-nav-keyline:var(--color-nav-dark-keyline);--color-nav-link-color:var(--color-nav-dark-link-color);--color-nav-link-color-hover:var(--color-nav-dark-link-color-hover);--color-nav-outlines:var(--color-nav-dark-outlines);--color-nav-rule:var(--color-nav-dark-rule);--color-nav-solid-background:var(--color-nav-dark-solid-background);--color-nav-sticking-expanded-keyline:var(--color-nav-dark-sticking-expanded-keyline);--color-nav-stuck:var(--color-nav-dark-stuck);--color-nav-uiblur-expanded:var(--color-nav-dark-uiblur-expanded);--color-nav-uiblur-stuck:var(--color-nav-dark-uiblur-stuck);--color-runtime-preview-disabled-text:hsla(0,0%,80%,0.6);--color-syntax-attributes:#cc9768;--color-syntax-characters:#d9c97c;--color-syntax-comments:#7f8c98;--color-syntax-documentation-markup:#7f8c98;--color-syntax-documentation-markup-keywords:#a3b1bf;--color-syntax-keywords:#ff7ab2;--color-syntax-marks:#fff;--color-syntax-numbers:#d9c97c;--color-syntax-other-class-names:#dabaff;--color-syntax-other-constants:#a7ebdd;--color-syntax-other-declarations:#4eb0cc;--color-syntax-other-function-and-method-names:#b281eb;--color-syntax-other-instance-variables-and-globals:#b281eb;--color-syntax-other-preprocessor-macros:#ffa14f;--color-syntax-other-type-names:#dabaff;--color-syntax-param-internal-name:#bfbfbf;--color-syntax-plain-text:#fff;--color-syntax-preprocessor-statements:#ffa14f;--color-syntax-project-class-names:#acf2e4;--color-syntax-project-constants:#78c2b3;--color-syntax-project-function-and-method-names:#78c2b3;--color-syntax-project-instance-variables-and-globals:#78c2b3;--color-syntax-project-preprocessor-macros:#ffa14f;--color-syntax-project-type-names:#acf2e4;--color-syntax-strings:#ff8170;--color-syntax-type-declarations:#6bdfff;--color-syntax-urls:#69f;--color-tutorial-background:var(--color-fill-tertiary);--color-navigator-item-hover:rgba(0,102,255,0.5)}}#main{outline-style:none}:root{--app-height:100vh}[data-v-6f639c59] :focus:not(input):not(textarea):not(select){outline:none}.fromkeyboard[data-v-6f639c59] :focus:not(input):not(textarea):not(select){outline:4px solid var(--color-focus-color);outline-offset:1px}#app[data-v-6f639c59]{display:grid;grid-template-rows:auto 1fr auto;min-height:100%}#app[data-v-6f639c59]>*{min-width:0}#app.hascustomheader[data-v-6f639c59]{grid-template-rows:auto auto 1fr auto}.container[data-v-790053de]{margin-left:auto;margin-right:auto;width:980px;outline-style:none;margin-top:92px;margin-bottom:140px}@media only screen and (max-width:1250px){.container[data-v-790053de]{width:692px}}@media only screen and (max-width:735px){.container[data-v-790053de]{width:87.5%}}.error-content[data-v-790053de]{box-sizing:border-box;width:502px;margin-left:auto;margin-right:auto;margin-bottom:54px}@media only screen and (max-width:1250px){.error-content[data-v-790053de]{width:420px;margin-bottom:45px}}@media only screen and (max-width:735px){.error-content[data-v-790053de]{max-width:330px;width:auto;margin-bottom:35px}}.title[data-v-790053de]{text-align:center;font-size:2.82353rem;line-height:1.08333;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}@media only screen and (max-width:1250px){.title[data-v-790053de]{font-size:2.35294rem;line-height:1.1;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (max-width:735px){.title[data-v-790053de]{font-size:1.88235rem;line-height:1.125;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}} \ No newline at end of file diff --git a/docs/css/index.ff036a9e.css b/docs/css/index.ff036a9e.css new file mode 100644 index 0000000..b26af9e --- /dev/null +++ b/docs/css/index.ff036a9e.css @@ -0,0 +1,9 @@ +/*! + * This source file is part of the Swift.org open source project + * + * Copyright (c) 2021 Apple Inc. and the Swift project authors + * Licensed under Apache License v2.0 with Runtime Library Exception + * + * See https://swift.org/LICENSE.txt for license information + * See https://swift.org/CONTRIBUTORS.txt for Swift project authors + */.color-scheme-toggle[data-v-78690df2]{--toggle-color-fill:var(--color-button-background);--toggle-color-text:var(--color-fill-blue);font-size:.7058823529rem;line-height:1.3333333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);border:1px solid var(--toggle-color-fill);border-radius:var(--toggle-border-radius-outer,var(--border-radius,4px));display:inline-flex;padding:1px}@media screen{[data-color-scheme=dark] .color-scheme-toggle[data-v-78690df2]{--toggle-color-text:var(--color-figure-blue)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .color-scheme-toggle[data-v-78690df2]{--toggle-color-text:var(--color-figure-blue)}}@media print{.color-scheme-toggle[data-v-78690df2]{display:none}}input[data-v-78690df2]{position:absolute;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(0 0 99.9% 99.9%);clip-path:inset(0 0 99.9% 99.9%);overflow:hidden;height:1px;width:1px;padding:0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.fromkeyboard label[data-v-78690df2]:focus-within{outline:4px solid var(--color-focus-color);outline-offset:1px}.text[data-v-78690df2]{border:1px solid transparent;border-radius:var(--toggle-border-radius-inner,2px);color:var(--toggle-color-text);display:inline-block;text-align:center;padding:1px 6px;min-width:42px;box-sizing:border-box}.text[data-v-78690df2]:hover{cursor:pointer}input:checked+.text[data-v-78690df2]{--toggle-color-text:var(--color-button-text);background:var(--toggle-color-fill);border-color:var(--toggle-color-fill)}.footer[data-v-4e049dbd]{border-top:1px solid var(--color-grid)}.row[data-v-4e049dbd]{margin-left:auto;margin-right:auto;width:980px;display:flex;flex-direction:row-reverse;margin:20px auto}@media only screen and (max-width:1250px){.row[data-v-4e049dbd]{width:692px}}@media only screen and (max-width:735px){.row[data-v-4e049dbd]{width:87.5%}}@media only screen and (max-width:320px){.row[data-v-4e049dbd]{width:215px}}@media only screen and (max-width:735px){.row[data-v-4e049dbd]{width:100%;padding:0 .9411764706rem;box-sizing:border-box}}.InitialLoadingPlaceholder[data-v-35c356b6]{background:var(--colors-loading-placeholder-background,var(--color-loading-placeholder-background));height:100vh;width:100%}.svg-icon[data-v-979a134a]{fill:var(--colors-svg-icon-fill-light,var(--color-svg-icon));transform:scale(1);-webkit-transform:scale(1);overflow:visible}.theme-dark .svg-icon[data-v-979a134a]{fill:var(--colors-svg-icon-fill-dark,var(--color-svg-icon))}.svg-icon.icon-inline[data-v-979a134a]{display:inline-block;vertical-align:middle;fill:currentColor}.svg-icon.icon-inline[data-v-979a134a] .svg-icon-stroke{stroke:currentColor}[data-v-979a134a] .svg-icon-stroke{stroke:var(--colors-svg-icon-fill-light,var(--color-svg-icon))}.theme-dark[data-v-979a134a] .svg-icon-stroke{stroke:var(--colors-svg-icon-fill-dark,var(--color-svg-icon))}.suggest-lang[data-v-768a347b]{background:#000;color:#fff;display:flex;justify-content:center;border-bottom:1px solid var(--color-grid)}.suggest-lang__wrapper[data-v-768a347b]{display:flex;align-items:center;width:100%;max-width:var(--wrapper-max-width,1920px);margin:0 .9411764706rem;position:relative;height:52px}.suggest-lang__link[data-v-768a347b]{font-size:.8235294118rem;line-height:1.4285714286;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);margin:0 auto;color:#09f}.suggest-lang__close-icon-wrapper[data-v-768a347b]{position:absolute;right:-.2352941176rem;top:0;height:100%;box-sizing:border-box;display:flex;align-items:center;z-index:1}.suggest-lang__close-icon-button[data-v-768a347b]{padding:.2352941176rem}.suggest-lang__close-icon-button .close-icon[data-v-768a347b]{width:8px;display:block}.suggest-lang .inline-chevron-right-icon[data-v-768a347b]{padding-left:.2352941176rem;width:8px}select[data-v-d21858a2]{font-size:.7058823529rem;line-height:1.3333333333;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-fill-blue);padding-right:15px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:none;cursor:pointer}select[data-v-d21858a2]:hover{text-decoration:underline;text-underline-position:under}.locale-selector[data-v-d21858a2]{position:relative}.svg-icon.icon-inline[data-v-d21858a2]{position:absolute;fill:var(--color-fill-blue);right:2px;bottom:7px;height:5px}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;background-color:var(--colors-text-background,var(--color-text-background));height:100%}abbr,blockquote,body,button,dd,dl,dt,fieldset,figure,form,h1,h2,h3,h4,h5,h6,hgroup,input,legend,li,ol,p,pre,ul{margin:0;padding:0}address,caption,code,figcaption,pre,th{font-size:1em;font-weight:400;font-style:normal}fieldset,iframe,img{border:0}caption,th{text-align:left}table{border-collapse:collapse;border-spacing:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}button{background:none;border:0;box-sizing:content-box;color:inherit;cursor:pointer;font:inherit;line-height:inherit;overflow:visible;vertical-align:inherit}button:disabled{cursor:default}:focus{outline:4px solid var(--color-focus-color);outline-offset:1px}::-moz-focus-inner{border:0;padding:0}@media print{#content,#main,body{color:#000}a,a:link,a:visited{color:#000;text-decoration:none}.hide,.noprint{display:none}}body{height:100%;min-width:320px}html{font:var(--typography-html-font,17px "Helvetica Neue","Helvetica","Arial",sans-serif);quotes:"“" "”"}html:lang(ja-JP){quotes:"「" "」"}body{font-size:1rem;line-height:1.4705882353;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);background-color:var(--color-text-background);color:var(--colors-text,var(--color-text));font-style:normal;word-wrap:break-word;--spacing-stacked-margin-small:0.4em;--spacing-stacked-margin-large:0.8em;--spacing-stacked-margin-xlarge:calc(var(--spacing-stacked-margin-large)*2);--spacing-param:1.6470588235rem;--declaration-code-listing-margin:30px 0 0 0;--code-block-style-elements-padding:8px 14px}body,button,input,select,textarea{font-synthesis:none;-moz-font-feature-settings:"kern";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;direction:ltr;text-align:left}h1,h2,h3,h4,h5,h6{color:var(--colors-header-text,var(--color-header-text))}h1+*,h2+*,h3+*,h4+*,h5+*,h6+*{margin-top:var(--spacing-stacked-margin-large)}ol+h1,ol+h2,ol+h3,ol+h4,ol+h5,ol+h6,p+h1,p+h2,p+h3,p+h4,p+h5,p+h6,ul+h1,ul+h2,ul+h3,ul+h4,ul+h5,ul+h6{margin-top:1.6em}ol+*,p+*,ul+*{margin-top:var(--spacing-stacked-margin-large)}ol,ul{margin-left:1.1764705882em}ol ol,ol ul,ul ol,ul ul{margin-top:0;margin-bottom:0}nav ol,nav ul{margin:0;list-style:none}li li{font-size:1em}a{color:var(--colors-link,var(--color-link))}a:link,a:visited{text-decoration:none}a.inline-link,a:hover{text-decoration:underline;text-underline-position:under}a:active{text-decoration:none}p+a{display:inline-block}b,strong{font-weight:600}cite,dfn,em,i{font-style:italic}sup{font-size:.6em;vertical-align:top;position:relative;bottom:-.2em}h1 sup,h2 sup,h3 sup{font-size:.4em}sup a{vertical-align:inherit;color:inherit}sup a:hover{color:var(--figure-blue);text-decoration:none}sub{line-height:1}abbr{border:0}pre{overflow:auto;-webkit-overflow-scrolling:auto;white-space:pre;word-wrap:normal}code{font-family:var(--typography-html-font-mono,Menlo,monospace);font-weight:inherit;letter-spacing:0}.syntax-addition{color:var(--syntax-addition,var(--color-syntax-addition))}.syntax-comment{color:var(--syntax-comment,var(--color-syntax-comments))}.syntax-quote{color:var(--syntax-quote,var(--color-syntax-comments))}.syntax-deletion{color:var(--syntax-deletion,var(--color-syntax-deletion))}.syntax-keyword{color:var(--syntax-keyword,var(--color-syntax-keywords))}.syntax-literal{color:var(--syntax-literal,var(--color-syntax-keywords))}.syntax-selector-tag{color:var(--syntax-selector-tag,var(--color-syntax-keywords))}.syntax-string{color:var(--syntax-string,var(--color-syntax-strings))}.syntax-bullet{color:var(--syntax-bullet,var(--color-syntax-characters))}.syntax-meta{color:var(--syntax-meta,var(--color-syntax-characters))}.syntax-number{color:var(--syntax-number,var(--color-syntax-characters))}.syntax-symbol{color:var(--syntax-symbol,var(--color-syntax-characters))}.syntax-tag{color:var(--syntax-tag,var(--color-syntax-characters))}.syntax-attr{color:var(--syntax-attr,var(--color-syntax-other-type-names))}.syntax-built_in{color:var(--syntax-built_in,var(--color-syntax-other-type-names))}.syntax-builtin-name{color:var(--syntax-builtin-name,var(--color-syntax-other-type-names))}.syntax-class{color:var(--syntax-class,var(--color-syntax-other-type-names))}.syntax-params{color:var(--syntax-params,var(--color-syntax-other-type-names))}.syntax-section{color:var(--syntax-section,var(--color-syntax-other-type-names))}.syntax-title{color:var(--syntax-title,var(--color-syntax-other-type-names))}.syntax-type{color:var(--syntax-type,var(--color-syntax-other-type-names))}.syntax-attribute{color:var(--syntax-attribute,var(--color-syntax-plain-text))}.syntax-identifier{color:var(--syntax-identifier,var(--color-syntax-plain-text))}.syntax-subst{color:var(--syntax-subst,var(--color-syntax-plain-text))}.syntax-doctag,.syntax-strong{font-weight:700}.syntax-emphasis,.syntax-link{font-style:italic}[data-syntax=swift] .syntax-meta{color:var(--syntax-meta,var(--color-syntax-keywords))}[data-syntax=swift] .syntax-class,[data-syntax=swift] .syntax-keyword+.syntax-params,[data-syntax=swift] .syntax-params+.syntax-params{color:unset}[data-syntax=json] .syntax-attr{color:var(--syntax-attr,var(--color-syntax-strings))}#skip-nav{position:absolute;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(0 0 99.9% 99.9%);clip-path:inset(0 0 99.9% 99.9%);overflow:hidden;height:1px;width:1px;padding:0;border:0}#skip-nav:active,#skip-nav:focus{position:relative;float:left;width:-moz-fit-content;width:fit-content;color:var(--color-figure-blue);font-size:1em;padding:0 10px;z-index:100000;top:0;left:0;height:44px;line-height:44px;-webkit-clip-path:unset;clip-path:unset}.nav--in-breakpoint-range #skip-nav{display:none}.visuallyhidden{position:absolute;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(0 0 99.9% 99.9%);clip-path:inset(0 0 99.9% 99.9%);overflow:hidden;height:1px;width:1px;padding:0;border:0}@keyframes pulse{0%{opacity:0}33%{opacity:1}66%{opacity:1}to{opacity:0}}.changed{border:1px solid var(--color-changes-modified);position:relative}.changed,.changed.displays-multiple-lines,.displays-multiple-lines .changed{border-radius:var(--border-radius,4px)}.changed:after{left:8px;background-image:url(../img/modified-icon.efb2697d.svg);background-repeat:no-repeat;bottom:0;content:" ";margin:auto;margin-right:8px;position:absolute;top:0;width:1.1764705882rem;height:1.1764705882rem;margin-top:.6176470588rem;z-index:2}@media screen{[data-color-scheme=dark] .changed:after{background-image:url(../img/modified-icon.efb2697d.svg)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .changed:after{background-image:url(../img/modified-icon.efb2697d.svg)}}.changed-added{border-color:var(--color-changes-added)}.changed-added:after{background-image:url(../img/added-icon.832a5d2c.svg)}@media screen{[data-color-scheme=dark] .changed-added:after{background-image:url(../img/added-icon.832a5d2c.svg)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .changed-added:after{background-image:url(../img/added-icon.832a5d2c.svg)}}.changed-deprecated{border-color:var(--color-changes-deprecated)}.changed-deprecated:after{background-image:url(../img/deprecated-icon.7bf1740a.svg)}@media screen{[data-color-scheme=dark] .changed-deprecated:after{background-image:url(../img/deprecated-icon.7bf1740a.svg)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .changed-deprecated:after{background-image:url(../img/deprecated-icon.7bf1740a.svg)}}.changed.link-block:after,.changed.relationships-item:after,.link-block .changed:after{margin-top:10px}.change-added,.change-removed{padding:2px 0}.change-removed{background-color:var(--color-highlight-red)}.change-added{background-color:var(--color-highlight-green)}body{color-scheme:light dark}body[data-color-scheme=light]{color-scheme:light}body[data-color-scheme=dark]{color-scheme:dark}body{--color-fill:#fff;--color-fill-secondary:#f7f7f7;--color-fill-tertiary:#f0f0f0;--color-fill-quaternary:#282828;--color-fill-blue:#00f;--color-fill-light-blue-secondary:#d1d1ff;--color-fill-gray:#ccc;--color-fill-gray-secondary:#f5f5f5;--color-fill-gray-tertiary:#f0f0f0;--color-fill-gray-quaternary:#f0f0f0;--color-fill-green-secondary:#f0fff0;--color-fill-orange-secondary:#fffaf6;--color-fill-red-secondary:#fff0f5;--color-figure-blue:#36f;--color-figure-gray:#000;--color-figure-gray-secondary:#666;--color-figure-gray-secondary-alt:#666;--color-figure-gray-tertiary:#666;--color-figure-green:green;--color-figure-light-gray:#666;--color-figure-orange:#c30;--color-figure-red:red;--color-tutorials-teal:#000;--color-article-background:var(--color-fill-tertiary);--color-article-body-background:var(--color-fill);--color-aside-deprecated:var(--color-figure-gray);--color-aside-deprecated-background:var(--color-fill-orange-secondary);--color-aside-deprecated-border:var(--color-figure-orange);--color-aside-experiment:var(--color-figure-gray);--color-aside-experiment-background:var(--color-fill-gray-secondary);--color-aside-experiment-border:var(--color-figure-light-gray);--color-aside-important:var(--color-figure-gray);--color-aside-important-background:var(--color-fill-gray-secondary);--color-aside-important-border:var(--color-figure-light-gray);--color-aside-note:var(--color-figure-gray);--color-aside-note-background:var(--color-fill-gray-secondary);--color-aside-note-border:var(--color-figure-light-gray);--color-aside-tip:var(--color-figure-gray);--color-aside-tip-background:var(--color-fill-gray-secondary);--color-aside-tip-border:var(--color-figure-light-gray);--color-aside-warning:var(--color-figure-gray);--color-aside-warning-background:var(--color-fill-red-secondary);--color-aside-warning-border:var(--color-figure-red);--color-badge-default:var(--color-figure-light-gray);--color-badge-beta:var(--color-figure-gray-tertiary);--color-badge-deprecated:var(--color-figure-orange);--color-badge-dark-default:#fff;--color-badge-dark-beta:#b0b0b0;--color-badge-dark-deprecated:#f60;--color-button-background:var(--color-fill-blue);--color-button-background-active:#36f;--color-button-background-hover:var(--color-figure-blue);--color-button-text:#fff;--color-call-to-action-background:var(--color-fill-secondary);--color-changes-added:var(--color-figure-light-gray);--color-changes-added-hover:var(--color-figure-light-gray);--color-changes-deprecated:var(--color-figure-light-gray);--color-changes-deprecated-hover:var(--color-figure-light-gray);--color-changes-modified:var(--color-figure-light-gray);--color-changes-modified-hover:var(--color-figure-light-gray);--color-changes-modified-previous-background:var(--color-fill);--color-code-background:var(--color-fill-secondary);--color-code-collapsible-background:var(--color-fill-tertiary);--color-code-collapsible-text:var(--color-figure-gray-secondary-alt);--color-code-line-highlight:rgba(51,102,255,.08);--color-code-line-highlight-border:var(--color-figure-blue);--color-code-plain:var(--color-figure-gray);--color-dropdown-background:hsla(0,0%,100%,.8);--color-dropdown-border:#ccc;--color-dropdown-option-text:#666;--color-dropdown-text:#000;--color-dropdown-dark-background:hsla(0,0%,100%,.1);--color-dropdown-dark-border:hsla(0,0%,94%,.2);--color-dropdown-dark-option-text:#ccc;--color-dropdown-dark-text:#fff;--color-eyebrow:var(--color-figure-gray-secondary);--color-focus-border-color:var(--color-fill-blue);--color-focus-color:rgba(0,125,250,.6);--color-form-error:var(--color-figure-red);--color-form-error-background:var(--color-fill-red-secondary);--color-form-valid:var(--color-figure-green);--color-form-valid-background:var(--color-fill-green-secondary);--color-generic-modal-background:var(--color-fill);--color-grid:var(--color-fill-gray);--color-header-text:var(--color-figure-gray);--color-hero-eyebrow:#ccc;--color-link:var(--color-figure-blue);--color-loading-placeholder-background:var(--color-fill);--color-nav-color:#666;--color-nav-current-link:rgba(0,0,0,.6);--color-nav-expanded:#fff;--color-nav-hierarchy-collapse-background:#f0f0f0;--color-nav-hierarchy-collapse-borders:#ccc;--color-nav-hierarchy-item-borders:#ccc;--color-nav-keyline:rgba(0,0,0,.2);--color-nav-link-color:#000;--color-nav-link-color-hover:#36f;--color-nav-outlines:#ccc;--color-nav-rule:hsla(0,0%,94%,.5);--color-nav-solid-background:#fff;--color-nav-sticking-expanded-keyline:rgba(0,0,0,.1);--color-nav-stuck:hsla(0,0%,100%,.9);--color-nav-uiblur-expanded:hsla(0,0%,100%,.9);--color-nav-uiblur-stuck:hsla(0,0%,100%,.7);--color-nav-root-subhead:var(--color-tutorials-teal);--color-nav-dark-border-top-color:hsla(0,0%,100%,.4);--color-nav-dark-color:#b0b0b0;--color-nav-dark-current-link:hsla(0,0%,100%,.6);--color-nav-dark-expanded:#2a2a2a;--color-nav-dark-hierarchy-collapse-background:#424242;--color-nav-dark-hierarchy-collapse-borders:#666;--color-nav-dark-hierarchy-item-borders:#424242;--color-nav-dark-keyline:rgba(66,66,66,.95);--color-nav-dark-link-color:#fff;--color-nav-dark-link-color-hover:#09f;--color-nav-dark-outlines:#575757;--color-nav-dark-rule:#575757;--color-nav-dark-solid-background:#000;--color-nav-dark-sticking-expanded-keyline:rgba(66,66,66,.7);--color-nav-dark-stuck:rgba(42,42,42,.9);--color-nav-dark-uiblur-expanded:rgba(42,42,42,.9);--color-nav-dark-uiblur-stuck:rgba(42,42,42,.7);--color-nav-dark-root-subhead:#fff;--color-runtime-preview-background:var(--color-fill-tertiary);--color-runtime-preview-disabled-text:hsla(0,0%,40%,.6);--color-runtime-preview-text:var(--color-figure-gray-secondary);--color-secondary-label:var(--color-figure-gray-secondary);--color-step-background:var(--color-fill-secondary);--color-step-caption:var(--color-figure-gray-secondary);--color-step-focused:var(--color-figure-light-gray);--color-step-text:var(--color-figure-gray-secondary);--color-svg-icon:#666;--color-syntax-addition:var(--color-figure-green);--color-syntax-attributes:#947100;--color-syntax-characters:#272ad8;--color-syntax-comments:#707f8c;--color-syntax-deletion:var(--color-figure-red);--color-syntax-documentation-markup:#506375;--color-syntax-documentation-markup-keywords:#506375;--color-syntax-heading:#ba2da2;--color-syntax-keywords:#ad3da4;--color-syntax-marks:#000;--color-syntax-numbers:#272ad8;--color-syntax-other-class-names:#703daa;--color-syntax-other-constants:#4b21b0;--color-syntax-other-declarations:#047cb0;--color-syntax-other-function-and-method-names:#4b21b0;--color-syntax-other-instance-variables-and-globals:#703daa;--color-syntax-other-preprocessor-macros:#78492a;--color-syntax-other-type-names:#703daa;--color-syntax-param-internal-name:#404040;--color-syntax-plain-text:#000;--color-syntax-preprocessor-statements:#78492a;--color-syntax-project-class-names:#3e8087;--color-syntax-project-constants:#2d6469;--color-syntax-project-function-and-method-names:#2d6469;--color-syntax-project-instance-variables-and-globals:#3e8087;--color-syntax-project-preprocessor-macros:#78492a;--color-syntax-project-type-names:#3e8087;--color-syntax-strings:#d12f1b;--color-syntax-type-declarations:#03638c;--color-syntax-urls:#1337ff;--color-tabnav-item-border-color:var(--color-fill-gray);--color-text:var(--color-figure-gray);--color-text-background:var(--color-fill);--color-tutorial-assessments-background:var(--color-fill-secondary);--color-tutorial-background:var(--color-fill);--color-tutorial-navbar-dropdown-background:var(--color-fill);--color-tutorial-navbar-dropdown-border:var(--color-fill-gray);--color-tutorial-quiz-border-active:var(--color-figure-blue);--color-tutorials-overview-background:#161616;--color-tutorials-overview-content:#fff;--color-tutorials-overview-content-alt:#fff;--color-tutorials-overview-eyebrow:#ccc;--color-tutorials-overview-icon:#b0b0b0;--color-tutorials-overview-link:#09f;--color-tutorials-overview-navigation-link:#ccc;--color-tutorials-overview-navigation-link-active:#fff;--color-tutorials-overview-navigation-link-hover:#fff;--color-tutorial-hero-text:#fff;--color-tutorial-hero-background:#000;--color-navigator-item-hover:rgba(0,0,255,.05);--color-card-background:var(--color-fill);--color-card-content-text:var(--color-figure-gray);--color-card-eyebrow:var(--color-figure-gray-secondary-alt);--color-card-shadow:rgba(0,0,0,.04);--color-link-block-card-border:rgba(0,0,0,.04);--color-standard-red:#8b0000;--color-standard-orange:#8b4000;--color-standard-yellow:#8f7200;--color-standard-blue:#002d75;--color-standard-green:#023b2d;--color-standard-purple:#512b55;--color-standard-gray:#2a2a2a}@media screen{body[data-color-scheme=dark]{--color-fill:#000;--color-fill-secondary:#161616;--color-fill-tertiary:#2a2a2a;--color-fill-blue:#06f;--color-fill-light-blue-secondary:#004ec4;--color-fill-gray:#575757;--color-fill-gray-secondary:#222;--color-fill-gray-tertiary:#424242;--color-fill-gray-quaternary:#424242;--color-fill-green-secondary:#030;--color-fill-orange-secondary:#472400;--color-fill-red-secondary:#300;--color-figure-blue:#09f;--color-figure-gray:#fff;--color-figure-gray-secondary:#ccc;--color-figure-gray-secondary-alt:#b0b0b0;--color-figure-gray-tertiary:#b0b0b0;--color-figure-green:#090;--color-figure-light-gray:#b0b0b0;--color-figure-orange:#f60;--color-figure-red:#f33;--color-tutorials-teal:#fff;--color-article-body-background:#111;--color-badge-default:var(--color-badge-dark-default);--color-button-background-active:#06f;--color-code-line-highlight:rgba(0,153,255,.08);--color-dropdown-background:var(--color-dropdown-dark-background);--color-dropdown-border:var(--color-dropdown-dark-border);--color-dropdown-option-text:var(--color-dropdown-dark-option-text);--color-dropdown-text:var(--color-dropdown-dark-text);--color-nav-color:var(--color-nav-dark-color);--color-nav-current-link:var(--color-nav-dark-current-link);--color-nav-expanded:var(--color-nav-dark-expanded);--color-nav-hierarchy-collapse-background:var(--color-nav-dark-hierarchy-collapse-background);--color-nav-hierarchy-collapse-borders:var(--color-nav-dark-hierarchy-collapse-borders);--color-nav-hierarchy-item-borders:var(--color-nav-dark-hierarchy-item-borders);--color-nav-keyline:var(--color-nav-dark-keyline);--color-nav-link-color:var(--color-nav-dark-link-color);--color-nav-link-color-hover:var(--color-nav-dark-link-color-hover);--color-nav-outlines:var(--color-nav-dark-outlines);--color-nav-rule:var(--color-nav-dark-rule);--color-nav-solid-background:var(--color-nav-dark-solid-background);--color-nav-sticking-expanded-keyline:var(--color-nav-dark-sticking-expanded-keyline);--color-nav-stuck:var(--color-nav-dark-stuck);--color-nav-uiblur-expanded:var(--color-nav-dark-uiblur-expanded);--color-nav-uiblur-stuck:var(--color-nav-dark-uiblur-stuck);--color-runtime-preview-disabled-text:hsla(0,0%,80%,.6);--color-syntax-attributes:#cc9768;--color-syntax-characters:#d9c97c;--color-syntax-comments:#7f8c98;--color-syntax-documentation-markup:#7f8c98;--color-syntax-documentation-markup-keywords:#a3b1bf;--color-syntax-keywords:#ff7ab2;--color-syntax-marks:#fff;--color-syntax-numbers:#d9c97c;--color-syntax-other-class-names:#dabaff;--color-syntax-other-constants:#a7ebdd;--color-syntax-other-declarations:#4eb0cc;--color-syntax-other-function-and-method-names:#b281eb;--color-syntax-other-instance-variables-and-globals:#b281eb;--color-syntax-other-preprocessor-macros:#ffa14f;--color-syntax-other-type-names:#dabaff;--color-syntax-param-internal-name:#bfbfbf;--color-syntax-plain-text:#fff;--color-syntax-preprocessor-statements:#ffa14f;--color-syntax-project-class-names:#acf2e4;--color-syntax-project-constants:#78c2b3;--color-syntax-project-function-and-method-names:#78c2b3;--color-syntax-project-instance-variables-and-globals:#78c2b3;--color-syntax-project-preprocessor-macros:#ffa14f;--color-syntax-project-type-names:#acf2e4;--color-syntax-strings:#ff8170;--color-syntax-type-declarations:#6bdfff;--color-syntax-urls:#69f;--color-tutorial-background:var(--color-fill-tertiary);--color-navigator-item-hover:rgba(0,102,255,.5);--color-card-shadow:hsla(0,0%,100%,.04);--color-link-block-card-border:hsla(0,0%,100%,.25)}}@media screen and (prefers-color-scheme:dark){body[data-color-scheme=auto]{--color-fill:#000;--color-fill-secondary:#161616;--color-fill-tertiary:#2a2a2a;--color-fill-blue:#06f;--color-fill-light-blue-secondary:#004ec4;--color-fill-gray:#575757;--color-fill-gray-secondary:#222;--color-fill-gray-tertiary:#424242;--color-fill-gray-quaternary:#424242;--color-fill-green-secondary:#030;--color-fill-orange-secondary:#472400;--color-fill-red-secondary:#300;--color-figure-blue:#09f;--color-figure-gray:#fff;--color-figure-gray-secondary:#ccc;--color-figure-gray-secondary-alt:#b0b0b0;--color-figure-gray-tertiary:#b0b0b0;--color-figure-green:#090;--color-figure-light-gray:#b0b0b0;--color-figure-orange:#f60;--color-figure-red:#f33;--color-tutorials-teal:#fff;--color-article-body-background:#111;--color-badge-default:var(--color-badge-dark-default);--color-button-background-active:#06f;--color-code-line-highlight:rgba(0,153,255,.08);--color-dropdown-background:var(--color-dropdown-dark-background);--color-dropdown-border:var(--color-dropdown-dark-border);--color-dropdown-option-text:var(--color-dropdown-dark-option-text);--color-dropdown-text:var(--color-dropdown-dark-text);--color-nav-color:var(--color-nav-dark-color);--color-nav-current-link:var(--color-nav-dark-current-link);--color-nav-expanded:var(--color-nav-dark-expanded);--color-nav-hierarchy-collapse-background:var(--color-nav-dark-hierarchy-collapse-background);--color-nav-hierarchy-collapse-borders:var(--color-nav-dark-hierarchy-collapse-borders);--color-nav-hierarchy-item-borders:var(--color-nav-dark-hierarchy-item-borders);--color-nav-keyline:var(--color-nav-dark-keyline);--color-nav-link-color:var(--color-nav-dark-link-color);--color-nav-link-color-hover:var(--color-nav-dark-link-color-hover);--color-nav-outlines:var(--color-nav-dark-outlines);--color-nav-rule:var(--color-nav-dark-rule);--color-nav-solid-background:var(--color-nav-dark-solid-background);--color-nav-sticking-expanded-keyline:var(--color-nav-dark-sticking-expanded-keyline);--color-nav-stuck:var(--color-nav-dark-stuck);--color-nav-uiblur-expanded:var(--color-nav-dark-uiblur-expanded);--color-nav-uiblur-stuck:var(--color-nav-dark-uiblur-stuck);--color-runtime-preview-disabled-text:hsla(0,0%,80%,.6);--color-syntax-attributes:#cc9768;--color-syntax-characters:#d9c97c;--color-syntax-comments:#7f8c98;--color-syntax-documentation-markup:#7f8c98;--color-syntax-documentation-markup-keywords:#a3b1bf;--color-syntax-keywords:#ff7ab2;--color-syntax-marks:#fff;--color-syntax-numbers:#d9c97c;--color-syntax-other-class-names:#dabaff;--color-syntax-other-constants:#a7ebdd;--color-syntax-other-declarations:#4eb0cc;--color-syntax-other-function-and-method-names:#b281eb;--color-syntax-other-instance-variables-and-globals:#b281eb;--color-syntax-other-preprocessor-macros:#ffa14f;--color-syntax-other-type-names:#dabaff;--color-syntax-param-internal-name:#bfbfbf;--color-syntax-plain-text:#fff;--color-syntax-preprocessor-statements:#ffa14f;--color-syntax-project-class-names:#acf2e4;--color-syntax-project-constants:#78c2b3;--color-syntax-project-function-and-method-names:#78c2b3;--color-syntax-project-instance-variables-and-globals:#78c2b3;--color-syntax-project-preprocessor-macros:#ffa14f;--color-syntax-project-type-names:#acf2e4;--color-syntax-strings:#ff8170;--color-syntax-type-declarations:#6bdfff;--color-syntax-urls:#69f;--color-tutorial-background:var(--color-fill-tertiary);--color-navigator-item-hover:rgba(0,102,255,.5);--color-card-shadow:hsla(0,0%,100%,.04);--color-link-block-card-border:hsla(0,0%,100%,.25)}}#main{outline-style:none}:root{--app-height:100vh}[data-v-3742c1d7] :focus:not(input):not(textarea):not(select){outline:none}.fromkeyboard[data-v-3742c1d7] :focus:not(input):not(textarea):not(select){outline:4px solid var(--color-focus-color);outline-offset:1px}#app[data-v-3742c1d7]{display:flex;flex-flow:column;min-height:100%}#app[data-v-3742c1d7]>*{min-width:0}#app .router-content[data-v-3742c1d7]{flex:1}.container[data-v-1f05d9ec]{margin-left:auto;margin-right:auto;width:980px;outline-style:none;margin-top:92px;margin-bottom:140px}@media only screen and (max-width:1250px){.container[data-v-1f05d9ec]{width:692px}}@media only screen and (max-width:735px){.container[data-v-1f05d9ec]{width:87.5%}}@media only screen and (max-width:320px){.container[data-v-1f05d9ec]{width:215px}}.error-content[data-v-1f05d9ec]{box-sizing:border-box;width:502px;margin-left:auto;margin-right:auto;margin-bottom:54px}@media only screen and (max-width:1250px){.error-content[data-v-1f05d9ec]{width:420px;margin-bottom:45px}}@media only screen and (max-width:735px){.error-content[data-v-1f05d9ec]{max-width:330px;width:auto;margin-bottom:35px}}.title[data-v-1f05d9ec]{text-align:center;font-size:2.8235294118rem;line-height:1.0833333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:1250px){.title[data-v-1f05d9ec]{font-size:2.3529411765rem;line-height:1.1;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){.title[data-v-1f05d9ec]{font-size:1.8823529412rem;line-height:1.125;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}} \ No newline at end of file diff --git a/docs/css/topic.672a9049.css b/docs/css/topic.672a9049.css new file mode 100644 index 0000000..4ca31e0 --- /dev/null +++ b/docs/css/topic.672a9049.css @@ -0,0 +1,9 @@ +/*! + * This source file is part of the Swift.org open source project + * + * Copyright (c) 2021 Apple Inc. and the Swift project authors + * Licensed under Apache License v2.0 with Runtime Library Exception + * + * See https://swift.org/LICENSE.txt for license information + * See https://swift.org/CONTRIBUTORS.txt for Swift project authors + */.nav-title-content[data-v-854b4dd6]{max-width:100%}.title[data-v-854b4dd6]{color:var(--color-nav-root-title,currentColor);text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:inline-block;vertical-align:top;max-width:296px}@media only screen and (max-width:1023px){.title[data-v-854b4dd6]{max-width:205px}}@media only screen and (max-width:767px){.title[data-v-854b4dd6]{flex-basis:fill;display:initial;vertical-align:initial;max-width:none}}.subhead[data-v-854b4dd6]{color:var(--color-nav-root-subhead)}.theme-dark .subhead[data-v-854b4dd6]{color:var(--color-nav-dark-root-subhead)}.mobile-dropdown[data-v-2c27d339]{box-sizing:border-box}.nav--in-breakpoint-range .mobile-dropdown[data-v-2c27d339]{padding-left:.2352941176rem;padding-right:.2352941176rem}.mobile-dropdown ul[data-v-2c27d339]{list-style:none}.mobile-dropdown .option[data-v-2c27d339]{cursor:pointer;font-size:.7058823529rem;padding:.5rem 0;display:block;text-decoration:none;color:inherit}.mobile-dropdown .option[data-v-2c27d339]:focus{outline-offset:0}.mobile-dropdown .option.depth1[data-v-2c27d339]{padding-left:.4705882353rem}.active[data-v-2c27d339],.tutorial.router-link-active[data-v-2c27d339]{font-weight:600}.active[data-v-2c27d339]:focus,.tutorial.router-link-active[data-v-2c27d339]:focus{outline:none}.chapter-list[data-v-2c27d339]:not(:first-child){margin-top:1rem}.chapter-name[data-v-2c27d339],.tutorial[data-v-2c27d339]{padding:.5rem 0;font-size:1rem;line-height:1.4705882353;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.section-list[data-v-2c27d339],.tutorial-list[data-v-2c27d339]{padding:0 .5882352941rem}.chapter-list:last-child .tutorial-list[data-v-2c27d339]:last-child{padding-bottom:10em}.chapter-list[data-v-2c27d339]{display:inline-block}.form-element[data-v-47dfd245]{position:relative}.form-dropdown[data-v-47dfd245]{font-size:1rem;line-height:1.2352941176;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);display:block;box-sizing:border-box;width:100%;height:3.3em;color:var(--color-dropdown-text);padding:1.1176470588rem 2.3529411765rem 0 .9411764706rem;text-align:left;border:1px solid var(--color-dropdown-border);border-radius:var(--border-radius,4px);background-clip:padding-box;margin-bottom:.8235294118rem;-webkit-appearance:none;-moz-appearance:none;appearance:none;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;min-height:32px}.form-dropdown[data-v-47dfd245]:focus{box-shadow:0 0 0 4px var(--color-focus-color);outline:none;border-color:var(--color-focus-border-color)}.form-dropdown.no-eyebrow[data-v-47dfd245]{padding-top:0}.form-dropdown[data-v-47dfd245]:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--color-dropdown-text)}.form-dropdown[data-v-47dfd245]::-ms-expand{opacity:0}.form-dropdown~.form-icon[data-v-47dfd245]{position:absolute;display:block;pointer-events:none;fill:var(--color-figure-gray-tertiary);right:14px;width:13px;height:auto;top:50%;transform:translateY(-50%)}.is-open .form-dropdown~.form-icon[data-v-47dfd245]{transform:translateY(-50%) scale(-1)}@media only screen and (max-width:735px){.form-dropdown~.form-icon[data-v-47dfd245]{right:14px}}.form-dropdown~.form-label[data-v-47dfd245]{font-size:.7058823529rem;line-height:1.75;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);position:absolute;top:.4705882353rem;left:17px;color:var(--color-figure-gray-secondary);pointer-events:none;padding:0;z-index:1}.form-dropdown[data-v-47dfd245] option{color:var(--color-dropdown-text)}.form-dropdown-selectnone[data-v-47dfd245]{color:transparent}.form-dropdown-selectnone~.form-label[data-v-47dfd245]{font-size:1rem;line-height:1.2352941176;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);top:19px;left:17px;color:var(--color-figure-gray-tertiary)}.form-dropdown-selectnone[data-v-47dfd245]:-moz-focusring{text-shadow:none}.form-dropdown-selectnone[data-v-47dfd245]::-ms-value{display:none}.theme-dark .form-dropdown[data-v-47dfd245]{color:var(--color-dropdown-dark-text);background-color:var(--color-dropdown-dark-background);border-color:var(--color-dropdown-dark-border)}.theme-dark .form-dropdown~.form-label[data-v-47dfd245]{color:#ccc}.theme-dark .form-dropdown[data-v-47dfd245]:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--color-dropdown-dark-text)}.theme-dark .form-dropdown.form-dropdown-selectnone[data-v-47dfd245]{color:transparent}.theme-dark .form-dropdown.form-dropdown-selectnone[data-v-47dfd245]:-moz-focusring{text-shadow:none}.theme-dark .form-dropdown-selectnone~.form-label[data-v-47dfd245]{color:#b0b0b0}.dropdown-small[data-v-6adda760]{height:30px;display:flex;align-items:center;position:relative;background:var(--color-fill)}.dropdown-small .form-dropdown-toggle[data-v-6adda760]{line-height:1.5;font-size:12px;padding-top:0;padding-bottom:0;padding-left:20px;min-height:unset;height:30px;display:flex;align-items:center}.dropdown-small .form-dropdown-toggle[data-v-6adda760]:focus{box-shadow:none;border-color:var(--color-dropdown-border)}.fromkeyboard .dropdown-small .form-dropdown-toggle[data-v-6adda760]:focus{box-shadow:0 0 0 2px var(--color-focus-color);outline:none;border-color:var(--color-focus-border-color)}.form-dropdown-toggle[data-v-6adda760]{margin:0}.is-open .form-dropdown-toggle[data-v-6adda760]{border-radius:var(--border-radius,4px) var(--border-radius,4px) 0 0;border-bottom:none;padding-bottom:1px}.fromkeyboard .is-open .form-dropdown-toggle[data-v-6adda760]{box-shadow:1px -1px 0 1px var(--color-focus-color),-1px -1px 0 1px var(--color-focus-color);border-color:var(--color-focus-border-color)}.form-dropdown-title[data-v-6adda760]{margin:0;padding:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.dropdown-custom[data-v-6adda760]{border-radius:var(--border-radius,4px)}.dropdown-custom.is-open[data-v-6adda760]{border-radius:var(--border-radius,4px) var(--border-radius,4px) 0 0}.dropdown-custom[data-v-6adda760] .form-dropdown-content{background:var(--color-fill);position:absolute;right:0;left:0;top:100%;border-bottom-left-radius:var(--border-radius,4px);border-bottom-right-radius:var(--border-radius,4px);border:1px solid var(--color-dropdown-border);border-top:none;display:none;overflow-y:auto}.dropdown-custom[data-v-6adda760] .form-dropdown-content.is-open{display:block}.fromkeyboard .dropdown-custom[data-v-6adda760] .form-dropdown-content.is-open{box-shadow:1px 1px 0 1px var(--color-focus-color),-1px 1px 0 1px var(--color-focus-color);border-color:var(--color-focus-border-color);border-top-color:transparent}.nav .dropdown-custom[data-v-6adda760] .form-dropdown-content{max-height:calc(100vh - 116px - 3.05882rem)}.nav--is-sticking.nav .dropdown-custom[data-v-6adda760] .form-dropdown-content{max-height:calc(100vh - 3.05882rem - 72px)}.dropdown-custom[data-v-6adda760] .options{list-style:none;margin:0;padding:0 0 20px}.dropdown-custom[data-v-6adda760] .option{cursor:pointer;padding:5px 20px;font-size:12px;line-height:20px;outline:none}.dropdown-custom[data-v-6adda760] .option:hover{background-color:var(--color-fill-tertiary)}.dropdown-custom[data-v-6adda760] .option.option-active{font-weight:600}.fromkeyboard .dropdown-custom[data-v-6adda760] .option:hover{background-color:transparent}.fromkeyboard .dropdown-custom[data-v-6adda760] .option:focus{background-color:var(--color-fill-tertiary);outline:none}.tutorial-dropdown[data-v-618ff780]{grid-column:3}.section-tracker[data-v-618ff780]{font-size:.7058823529rem;line-height:1.3333333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-figure-gray-secondary);margin-left:15px}.tutorial-dropdown[data-v-03cbd7f7]{grid-column:1/2}.tutorial-dropdown .options[data-v-03cbd7f7]{padding-top:1rem;padding-bottom:0}.tutorial-dropdown .option[data-v-03cbd7f7]{padding:5px 20px 5px 30px}.chapter-list[data-v-03cbd7f7]{padding-bottom:20px}.chapter-name[data-v-03cbd7f7]{margin:0 20px 5px 20px;line-height:normal;color:var(--color-figure-gray-secondary)}.chevron-icon[data-v-5381d5f3]{padding:0;color:var(--color-nav-outlines);grid-column:2;height:20px;width:20px;margin:0 4px}@media only screen and (min-width:768px){.nav[data-v-5381d5f3] .nav-content{display:grid;grid-template-columns:auto auto 3fr;align-items:center}.nav[data-v-5381d5f3] .nav-menu{padding:0;grid-column:3/5}.nav[data-v-5381d5f3] .nav-menu-item{margin:0}}.dropdown-container[data-v-5381d5f3]{height:3.0588235294rem;display:grid;grid-template-columns:minmax(230px,285px) auto minmax(230px,1fr);align-items:center}@media only screen and (max-width:1023px){.dropdown-container[data-v-5381d5f3]{grid-template-columns:minmax(173px,216px) auto minmax(173px,1fr)}}.separator[data-v-5381d5f3]{height:20px;border-right:1px solid;border-color:var(--color-nav-outlines);margin:0 20px;grid-column:2}.mobile-dropdown-container[data-v-5381d5f3],.nav--in-breakpoint-range.nav .dropdown-container[data-v-5381d5f3],.nav--in-breakpoint-range.nav .separator[data-v-5381d5f3]{display:none}.nav--in-breakpoint-range.nav .mobile-dropdown-container[data-v-5381d5f3]{display:block}.nav--in-breakpoint-range.nav[data-v-5381d5f3] .nav-title{grid-area:title}.nav--in-breakpoint-range.nav[data-v-5381d5f3] .pre-title{display:none}.nav[data-v-5381d5f3] .nav-title{grid-column:1;width:90%;padding-top:0}.primary-dropdown[data-v-5381d5f3],.secondary-dropdown[data-v-5381d5f3]{background:var(--color-tutorial-navbar-dropdown-background);border-color:var(--color-tutorial-navbar-dropdown-border)}.primary-dropdown[data-v-5381d5f3] .form-dropdown,.primary-dropdown[data-v-5381d5f3] .form-dropdown:focus,.secondary-dropdown[data-v-5381d5f3] .form-dropdown,.secondary-dropdown[data-v-5381d5f3] .form-dropdown:focus{border-color:var(--color-tutorial-navbar-dropdown-border)}.primary-dropdown[data-v-5381d5f3] .options,.secondary-dropdown[data-v-5381d5f3] .options{background:var(--color-tutorial-navbar-dropdown-background);border-color:var(--color-tutorial-navbar-dropdown-border)}[data-v-0861b5be] .code-listing+*,[data-v-0861b5be] aside+*,[data-v-0861b5be] h2+*,[data-v-0861b5be] h3+*,[data-v-0861b5be] ol+*,[data-v-0861b5be] p+*,[data-v-0861b5be] ul+*{margin-top:20px}[data-v-0861b5be] ol ol,[data-v-0861b5be] ol ul,[data-v-0861b5be] ul ol,[data-v-0861b5be] ul ul{margin-top:0}[data-v-0861b5be] h2{font-size:1.8823529412rem;line-height:1.25;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:1250px){[data-v-0861b5be] h2{font-size:1.6470588235rem;line-height:1.2857142857;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){[data-v-0861b5be] h2{font-size:1.4117647059rem;line-height:1.3333333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}[data-v-0861b5be] h3{font-size:1.4117647059rem;line-height:1.1666666667;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:1250px){[data-v-0861b5be] h3{font-size:1.2352941176rem;line-height:1.1904761905;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}[data-v-0861b5be] .code-listing{background:var(--color-code-background);border-color:var(--colors-grid,var(--color-grid));border-style:solid;border-width:1px}[data-v-0861b5be] .code-listing pre{font-size:.7058823529rem;line-height:1.8333333333;font-weight:400;font-family:var(--typography-html-font-mono,Menlo,monospace);padding:20px 0}.columns[data-v-30edf911]{display:grid;grid-template-rows:repeat(2,auto)}.columns.cols-2[data-v-30edf911]{gap:20px 8.3333333333%;grid-template-columns:repeat(2,1fr)}.columns.cols-3[data-v-30edf911]{gap:20px 4.1666666667%;grid-template-columns:repeat(3,1fr)}.asset[data-v-30edf911]{align-self:end;grid-row:1}.content[data-v-30edf911]{grid-row:2}@media only screen and (max-width:735px){.columns.cols-2[data-v-30edf911],.columns.cols-3[data-v-30edf911]{grid-template-columns:unset}.asset[data-v-30edf911],.content[data-v-30edf911]{grid-row:auto}}.content-and-media[data-v-3fa44f9e]{display:flex}.content-and-media.media-leading[data-v-3fa44f9e]{flex-direction:row-reverse}.content-and-media.media-trailing[data-v-3fa44f9e]{flex-direction:row}@media only screen and (min-width:736px){.content-and-media[data-v-3fa44f9e]{align-items:center;justify-content:center}}.content[data-v-3fa44f9e]{width:62.5%}.asset[data-v-3fa44f9e]{width:29.1666666667%}.media-leading .asset[data-v-3fa44f9e]{margin-right:8.3333333333%}.media-trailing .asset[data-v-3fa44f9e]{margin-left:8.3333333333%}@media only screen and (max-width:735px){.content-and-media.media-leading[data-v-3fa44f9e],.content-and-media.media-trailing[data-v-3fa44f9e]{flex-direction:column}.asset[data-v-3fa44f9e],.content[data-v-3fa44f9e]{width:100%}.media-leading .asset[data-v-3fa44f9e],.media-trailing .asset[data-v-3fa44f9e]{margin:20px 0 0 0}}.group[id][data-v-5b4a8b3c]{margin-top:20px;padding-top:20px}[data-v-5b4a8b3c] img,[data-v-5b4a8b3c] video{display:block;margin:0 auto;max-width:100%}.layout+[data-v-4d5a806e]{margin-top:40px}@media only screen and (max-width:735px){.layout[data-v-4d5a806e]:first-child>:not(.group[id]){margin-top:40px}}.body[data-v-20dca692]{background:var(--colors-text-background,var(--color-article-body-background));margin-left:auto;margin-right:auto;width:980px;border-radius:10px;transform:translateY(-120px)}@media only screen and (max-width:1250px){.body[data-v-20dca692]{width:692px}}@media only screen and (max-width:735px){.body[data-v-20dca692]{width:87.5%}}@media only screen and (max-width:320px){.body[data-v-20dca692]{width:215px}}@media only screen and (max-width:735px){.body[data-v-20dca692]{border-radius:0;transform:none}}.body[data-v-20dca692]~*{margin-top:-40px}.body-content[data-v-20dca692]{padding:40px 8.3333333333% 80px 8.3333333333%}@media only screen and (max-width:735px){.body-content[data-v-20dca692]{padding:0 0 40px 0}}.call-to-action[data-v-2bfdf182]{padding:65px 0;background:var(--color-call-to-action-background)}.theme-dark .call-to-action[data-v-2bfdf182]{--color-call-to-action-background:#424242}.row[data-v-2bfdf182]{margin-left:auto;margin-right:auto;width:980px;display:flex;align-items:center}@media only screen and (max-width:1250px){.row[data-v-2bfdf182]{width:692px}}@media only screen and (max-width:735px){.row[data-v-2bfdf182]{width:87.5%}}@media only screen and (max-width:320px){.row[data-v-2bfdf182]{width:215px}}[data-v-2bfdf182] img,[data-v-2bfdf182] video{max-height:560px}h2[data-v-2bfdf182]{font-size:1.8823529412rem;line-height:1.25;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:1250px){h2[data-v-2bfdf182]{font-size:1.6470588235rem;line-height:1.2857142857;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){h2[data-v-2bfdf182]{font-size:1.4117647059rem;line-height:1.3333333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.label[data-v-2bfdf182]{display:block;font-size:1.2352941176rem;line-height:1.1904761905;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);margin-bottom:var(--spacing-stacked-margin-small);color:var(--color-eyebrow)}@media only screen and (max-width:735px){.label[data-v-2bfdf182]{font-size:1.1176470588rem;line-height:1.2105263158;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.content[data-v-2bfdf182]{margin-bottom:1.5rem}.right-column[data-v-2bfdf182]{margin-left:auto}@media only screen and (max-width:735px){.row[data-v-2bfdf182]{display:block}.col+.col[data-v-2bfdf182]{margin-top:40px}.call-to-action[data-v-426a965c]{margin-top:0}}.headline[data-v-d46a1474]{margin-bottom:var(--spacing-stacked-margin-large)}.heading[data-v-d46a1474]{font-size:2.8235294118rem;line-height:1.0833333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-header-text)}@media only screen and (max-width:1250px){.heading[data-v-d46a1474]{font-size:2.3529411765rem;line-height:1.1;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){.heading[data-v-d46a1474]{font-size:1.8823529412rem;line-height:1.125;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.dark .heading[data-v-d46a1474]{color:#fff}.eyebrow[data-v-d46a1474]{font-size:1.4117647059rem;line-height:1.1666666667;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);display:block;margin-bottom:var(--spacing-stacked-margin-small);color:var(--color-eyebrow)}@media only screen and (max-width:1250px){.eyebrow[data-v-d46a1474]{font-size:1.2352941176rem;line-height:1.1904761905;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.generic-modal[data-v-795f7b59]{position:fixed;top:0;left:0;right:0;bottom:0;margin:0;z-index:11000;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;background:none;overflow:auto}.modal-fullscreen[data-v-795f7b59]{align-items:stretch}.modal-fullscreen .container[data-v-795f7b59]{margin:0;flex:1;width:100%;height:100%;padding-top:env(safe-area-inset-top);padding-right:env(safe-area-inset-right);padding-bottom:env(safe-area-inset-bottom);padding-left:env(safe-area-inset-left)}.modal-standard[data-v-795f7b59]{padding:20px}.modal-standard .container[data-v-795f7b59]{padding:60px;border-radius:var(--border-radius,4px)}@media screen{[data-color-scheme=dark] .modal-standard .container[data-v-795f7b59]{background:#1d1d1f}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .modal-standard .container[data-v-795f7b59]{background:#1d1d1f}}@media only screen and (max-width:735px){.modal-standard[data-v-795f7b59]{padding:0;align-items:stretch}.modal-standard .container[data-v-795f7b59]{margin:20px 0 0;padding:50px 30px;flex:1;width:100%;border-bottom-left-radius:0;border-bottom-right-radius:0}}.backdrop[data-v-795f7b59]{overflow:auto;background:var(--backdrop-background,rgba(0,0,0,.4));-webkit-overflow-scrolling:touch;width:100%;height:100%;position:fixed}.container[data-v-795f7b59]{margin-left:auto;margin-right:auto;width:980px;background:var(--colors-generic-modal-background,var(--color-generic-modal-background));z-index:1;position:relative;overflow:auto;max-width:100%}@media only screen and (max-width:1250px){.container[data-v-795f7b59]{width:692px}}@media only screen and (max-width:735px){.container[data-v-795f7b59]{width:87.5%}}@media only screen and (max-width:320px){.container[data-v-795f7b59]{width:215px}}.close[data-v-795f7b59]{position:absolute;z-index:9999;top:22px;left:22px;width:17px;height:17px;color:#666;cursor:pointer;background:none;border:0;display:flex;align-items:center}.close .close-icon[data-v-795f7b59]{fill:currentColor;width:100%;height:100%}.theme-dark .container[data-v-795f7b59]{background:#000}.theme-dark .container .close[data-v-795f7b59]{color:#b0b0b0}.theme-code .container[data-v-795f7b59]{background-color:var(--code-background,var(--color-code-background))}.metadata[data-v-94ff76c0]{display:flex}.item[data-v-94ff76c0]{font-size:.7058823529rem;line-height:1.3333333333;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);display:flex;flex-direction:column;justify-content:flex-end;align-items:center;border-right:1px solid #fff;padding:0 27.5px}@media only screen and (max-width:735px){.item[data-v-94ff76c0]{font-size:.6470588235rem;line-height:1.6363636364;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);padding:0 8px}}.item[data-v-94ff76c0]:first-of-type{padding-left:0}.item[data-v-94ff76c0]:last-of-type{border:none}@media only screen and (max-width:735px){.item[data-v-94ff76c0]:last-of-type{padding-right:0}}.content[data-v-94ff76c0]{color:#fff}.icon[data-v-94ff76c0]{font-size:2.8235294118rem;line-height:1.0833333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:1250px){.icon[data-v-94ff76c0]{font-size:2.3529411765rem;line-height:1.1;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){.icon[data-v-94ff76c0]{font-size:1.8823529412rem;line-height:1.125;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.small-icon[data-v-94ff76c0]{width:1em;height:1em;margin-left:.2rem}.small-icon.xcode-icon[data-v-94ff76c0]{width:.8em;height:.8em}.content-link[data-v-94ff76c0]{display:flex;align-items:center}a[data-v-94ff76c0]{color:var(--colors-link,var(--color-tutorials-overview-link))}.duration[data-v-94ff76c0]{display:flex;align-items:baseline;font-size:2.3529411765rem;line-height:1;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);line-height:1.8rem}@media only screen and (max-width:735px){.duration[data-v-94ff76c0]{font-size:1.6470588235rem;line-height:1;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);line-height:1.3rem}}.minutes[data-v-94ff76c0]{display:inline-block;font-size:1.6470588235rem;line-height:1;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);line-height:1.3rem}@media only screen and (max-width:735px){.minutes[data-v-94ff76c0]{font-size:1rem;line-height:1.2352941176;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);line-height:.8rem}}.item-large-icon[data-v-94ff76c0]{height:2.3rem;max-width:100%}@media only screen and (max-width:735px){.item-large-icon[data-v-94ff76c0]{height:1.5rem;max-width:100%}}.bottom[data-v-94ff76c0]{margin-top:13px}@media only screen and (max-width:735px){.bottom[data-v-94ff76c0]{margin-top:8px}}.hero[data-v-2a434750]{background-color:var(--color-tutorial-hero-background);color:var(--color-tutorial-hero-text);position:relative}@media screen{.hero.dark[data-v-2a434750]{--color-fill:#fff;--color-fill-secondary:#f7f7f7;--color-fill-tertiary:#f0f0f0;--color-fill-quaternary:#282828;--color-fill-blue:#00f;--color-fill-light-blue-secondary:#d1d1ff;--color-fill-gray:#ccc;--color-fill-gray-secondary:#f5f5f5;--color-fill-gray-tertiary:#f0f0f0;--color-fill-gray-quaternary:#f0f0f0;--color-fill-green-secondary:#f0fff0;--color-fill-orange-secondary:#fffaf6;--color-fill-red-secondary:#fff0f5;--color-figure-blue:#36f;--color-figure-gray:#000;--color-figure-gray-secondary:#666;--color-figure-gray-secondary-alt:#666;--color-figure-gray-tertiary:#666;--color-figure-green:green;--color-figure-light-gray:#666;--color-figure-orange:#c30;--color-figure-red:red;--color-tutorials-teal:#000;--color-article-background:var(--color-fill-tertiary);--color-article-body-background:var(--color-fill);--color-aside-deprecated:var(--color-figure-gray);--color-aside-deprecated-background:var(--color-fill-orange-secondary);--color-aside-deprecated-border:var(--color-figure-orange);--color-aside-experiment:var(--color-figure-gray);--color-aside-experiment-background:var(--color-fill-gray-secondary);--color-aside-experiment-border:var(--color-figure-light-gray);--color-aside-important:var(--color-figure-gray);--color-aside-important-background:var(--color-fill-gray-secondary);--color-aside-important-border:var(--color-figure-light-gray);--color-aside-note:var(--color-figure-gray);--color-aside-note-background:var(--color-fill-gray-secondary);--color-aside-note-border:var(--color-figure-light-gray);--color-aside-tip:var(--color-figure-gray);--color-aside-tip-background:var(--color-fill-gray-secondary);--color-aside-tip-border:var(--color-figure-light-gray);--color-aside-warning:var(--color-figure-gray);--color-aside-warning-background:var(--color-fill-red-secondary);--color-aside-warning-border:var(--color-figure-red);--color-badge-default:var(--color-figure-light-gray);--color-badge-beta:var(--color-figure-gray-tertiary);--color-badge-deprecated:var(--color-figure-orange);--color-badge-dark-default:#fff;--color-badge-dark-beta:#b0b0b0;--color-badge-dark-deprecated:#f60;--color-button-background:var(--color-fill-blue);--color-button-background-active:#36f;--color-button-background-hover:var(--color-figure-blue);--color-button-text:#fff;--color-call-to-action-background:var(--color-fill-secondary);--color-changes-added:var(--color-figure-light-gray);--color-changes-added-hover:var(--color-figure-light-gray);--color-changes-deprecated:var(--color-figure-light-gray);--color-changes-deprecated-hover:var(--color-figure-light-gray);--color-changes-modified:var(--color-figure-light-gray);--color-changes-modified-hover:var(--color-figure-light-gray);--color-changes-modified-previous-background:var(--color-fill);--color-code-background:var(--color-fill-secondary);--color-code-collapsible-background:var(--color-fill-tertiary);--color-code-collapsible-text:var(--color-figure-gray-secondary-alt);--color-code-line-highlight:rgba(51,102,255,.08);--color-code-line-highlight-border:var(--color-figure-blue);--color-code-plain:var(--color-figure-gray);--color-dropdown-background:hsla(0,0%,100%,.8);--color-dropdown-border:#ccc;--color-dropdown-option-text:#666;--color-dropdown-text:#000;--color-dropdown-dark-background:hsla(0,0%,100%,.1);--color-dropdown-dark-border:hsla(0,0%,94%,.2);--color-dropdown-dark-option-text:#ccc;--color-dropdown-dark-text:#fff;--color-eyebrow:var(--color-figure-gray-secondary);--color-focus-border-color:var(--color-fill-blue);--color-focus-color:rgba(0,125,250,.6);--color-form-error:var(--color-figure-red);--color-form-error-background:var(--color-fill-red-secondary);--color-form-valid:var(--color-figure-green);--color-form-valid-background:var(--color-fill-green-secondary);--color-generic-modal-background:var(--color-fill);--color-grid:var(--color-fill-gray);--color-header-text:var(--color-figure-gray);--color-hero-eyebrow:#ccc;--color-link:var(--color-figure-blue);--color-loading-placeholder-background:var(--color-fill);--color-nav-color:#666;--color-nav-current-link:rgba(0,0,0,.6);--color-nav-expanded:#fff;--color-nav-hierarchy-collapse-background:#f0f0f0;--color-nav-hierarchy-collapse-borders:#ccc;--color-nav-hierarchy-item-borders:#ccc;--color-nav-keyline:rgba(0,0,0,.2);--color-nav-link-color:#000;--color-nav-link-color-hover:#36f;--color-nav-outlines:#ccc;--color-nav-rule:hsla(0,0%,94%,.5);--color-nav-solid-background:#fff;--color-nav-sticking-expanded-keyline:rgba(0,0,0,.1);--color-nav-stuck:hsla(0,0%,100%,.9);--color-nav-uiblur-expanded:hsla(0,0%,100%,.9);--color-nav-uiblur-stuck:hsla(0,0%,100%,.7);--color-nav-root-subhead:var(--color-tutorials-teal);--color-nav-dark-border-top-color:hsla(0,0%,100%,.4);--color-nav-dark-color:#b0b0b0;--color-nav-dark-current-link:hsla(0,0%,100%,.6);--color-nav-dark-expanded:#2a2a2a;--color-nav-dark-hierarchy-collapse-background:#424242;--color-nav-dark-hierarchy-collapse-borders:#666;--color-nav-dark-hierarchy-item-borders:#424242;--color-nav-dark-keyline:rgba(66,66,66,.95);--color-nav-dark-link-color:#fff;--color-nav-dark-link-color-hover:#09f;--color-nav-dark-outlines:#575757;--color-nav-dark-rule:#575757;--color-nav-dark-solid-background:#000;--color-nav-dark-sticking-expanded-keyline:rgba(66,66,66,.7);--color-nav-dark-stuck:rgba(42,42,42,.9);--color-nav-dark-uiblur-expanded:rgba(42,42,42,.9);--color-nav-dark-uiblur-stuck:rgba(42,42,42,.7);--color-nav-dark-root-subhead:#fff;--color-runtime-preview-background:var(--color-fill-tertiary);--color-runtime-preview-disabled-text:hsla(0,0%,40%,.6);--color-runtime-preview-text:var(--color-figure-gray-secondary);--color-secondary-label:var(--color-figure-gray-secondary);--color-step-background:var(--color-fill-secondary);--color-step-caption:var(--color-figure-gray-secondary);--color-step-focused:var(--color-figure-light-gray);--color-step-text:var(--color-figure-gray-secondary);--color-svg-icon:#666;--color-syntax-addition:var(--color-figure-green);--color-syntax-attributes:#947100;--color-syntax-characters:#272ad8;--color-syntax-comments:#707f8c;--color-syntax-deletion:var(--color-figure-red);--color-syntax-documentation-markup:#506375;--color-syntax-documentation-markup-keywords:#506375;--color-syntax-heading:#ba2da2;--color-syntax-keywords:#ad3da4;--color-syntax-marks:#000;--color-syntax-numbers:#272ad8;--color-syntax-other-class-names:#703daa;--color-syntax-other-constants:#4b21b0;--color-syntax-other-declarations:#047cb0;--color-syntax-other-function-and-method-names:#4b21b0;--color-syntax-other-instance-variables-and-globals:#703daa;--color-syntax-other-preprocessor-macros:#78492a;--color-syntax-other-type-names:#703daa;--color-syntax-param-internal-name:#404040;--color-syntax-plain-text:#000;--color-syntax-preprocessor-statements:#78492a;--color-syntax-project-class-names:#3e8087;--color-syntax-project-constants:#2d6469;--color-syntax-project-function-and-method-names:#2d6469;--color-syntax-project-instance-variables-and-globals:#3e8087;--color-syntax-project-preprocessor-macros:#78492a;--color-syntax-project-type-names:#3e8087;--color-syntax-strings:#d12f1b;--color-syntax-type-declarations:#03638c;--color-syntax-urls:#1337ff;--color-tabnav-item-border-color:var(--color-fill-gray);--color-text:var(--color-figure-gray);--color-text-background:var(--color-fill);--color-tutorial-assessments-background:var(--color-fill-secondary);--color-tutorial-background:var(--color-fill);--color-tutorial-navbar-dropdown-background:var(--color-fill);--color-tutorial-navbar-dropdown-border:var(--color-fill-gray);--color-tutorial-quiz-border-active:var(--color-figure-blue);--color-tutorials-overview-background:#161616;--color-tutorials-overview-content:#fff;--color-tutorials-overview-content-alt:#fff;--color-tutorials-overview-eyebrow:#ccc;--color-tutorials-overview-icon:#b0b0b0;--color-tutorials-overview-link:#09f;--color-tutorials-overview-navigation-link:#ccc;--color-tutorials-overview-navigation-link-active:#fff;--color-tutorials-overview-navigation-link-hover:#fff;--color-tutorial-hero-text:#fff;--color-tutorial-hero-background:#000;--color-navigator-item-hover:rgba(0,0,255,.05);--color-card-background:var(--color-fill);--color-card-content-text:var(--color-figure-gray);--color-card-eyebrow:var(--color-figure-gray-secondary-alt);--color-card-shadow:rgba(0,0,0,.04);--color-link-block-card-border:rgba(0,0,0,.04);--color-standard-red:#8b0000;--color-standard-orange:#8b4000;--color-standard-yellow:#8f7200;--color-standard-blue:#002d75;--color-standard-green:#023b2d;--color-standard-purple:#512b55;--color-standard-gray:#2a2a2a;--color-fill:#000;--color-fill-secondary:#161616;--color-fill-tertiary:#2a2a2a;--color-fill-blue:#06f;--color-fill-light-blue-secondary:#004ec4;--color-fill-gray:#575757;--color-fill-gray-secondary:#222;--color-fill-gray-tertiary:#424242;--color-fill-gray-quaternary:#424242;--color-fill-green-secondary:#030;--color-fill-orange-secondary:#472400;--color-fill-red-secondary:#300;--color-figure-blue:#09f;--color-figure-gray:#fff;--color-figure-gray-secondary:#ccc;--color-figure-gray-secondary-alt:#b0b0b0;--color-figure-gray-tertiary:#b0b0b0;--color-figure-green:#090;--color-figure-light-gray:#b0b0b0;--color-figure-orange:#f60;--color-figure-red:#f33;--color-tutorials-teal:#fff;--color-article-body-background:#111;--color-badge-default:var(--color-badge-dark-default);--color-button-background-active:#06f;--color-code-line-highlight:rgba(0,153,255,.08);--color-dropdown-background:var(--color-dropdown-dark-background);--color-dropdown-border:var(--color-dropdown-dark-border);--color-dropdown-option-text:var(--color-dropdown-dark-option-text);--color-dropdown-text:var(--color-dropdown-dark-text);--color-nav-color:var(--color-nav-dark-color);--color-nav-current-link:var(--color-nav-dark-current-link);--color-nav-expanded:var(--color-nav-dark-expanded);--color-nav-hierarchy-collapse-background:var(--color-nav-dark-hierarchy-collapse-background);--color-nav-hierarchy-collapse-borders:var(--color-nav-dark-hierarchy-collapse-borders);--color-nav-hierarchy-item-borders:var(--color-nav-dark-hierarchy-item-borders);--color-nav-keyline:var(--color-nav-dark-keyline);--color-nav-link-color:var(--color-nav-dark-link-color);--color-nav-link-color-hover:var(--color-nav-dark-link-color-hover);--color-nav-outlines:var(--color-nav-dark-outlines);--color-nav-rule:var(--color-nav-dark-rule);--color-nav-solid-background:var(--color-nav-dark-solid-background);--color-nav-sticking-expanded-keyline:var(--color-nav-dark-sticking-expanded-keyline);--color-nav-stuck:var(--color-nav-dark-stuck);--color-nav-uiblur-expanded:var(--color-nav-dark-uiblur-expanded);--color-nav-uiblur-stuck:var(--color-nav-dark-uiblur-stuck);--color-runtime-preview-disabled-text:hsla(0,0%,80%,.6);--color-syntax-attributes:#cc9768;--color-syntax-characters:#d9c97c;--color-syntax-comments:#7f8c98;--color-syntax-documentation-markup:#7f8c98;--color-syntax-documentation-markup-keywords:#a3b1bf;--color-syntax-keywords:#ff7ab2;--color-syntax-marks:#fff;--color-syntax-numbers:#d9c97c;--color-syntax-other-class-names:#dabaff;--color-syntax-other-constants:#a7ebdd;--color-syntax-other-declarations:#4eb0cc;--color-syntax-other-function-and-method-names:#b281eb;--color-syntax-other-instance-variables-and-globals:#b281eb;--color-syntax-other-preprocessor-macros:#ffa14f;--color-syntax-other-type-names:#dabaff;--color-syntax-param-internal-name:#bfbfbf;--color-syntax-plain-text:#fff;--color-syntax-preprocessor-statements:#ffa14f;--color-syntax-project-class-names:#acf2e4;--color-syntax-project-constants:#78c2b3;--color-syntax-project-function-and-method-names:#78c2b3;--color-syntax-project-instance-variables-and-globals:#78c2b3;--color-syntax-project-preprocessor-macros:#ffa14f;--color-syntax-project-type-names:#acf2e4;--color-syntax-strings:#ff8170;--color-syntax-type-declarations:#6bdfff;--color-syntax-urls:#69f;--color-tutorial-background:var(--color-fill-tertiary);--color-navigator-item-hover:rgba(0,102,255,.5);--color-card-shadow:hsla(0,0%,100%,.04);--color-link-block-card-border:hsla(0,0%,100%,.25)}}.bg[data-v-2a434750]{background-color:var(--color-tutorial-hero-background);background-position:top;background-repeat:no-repeat;background-size:cover;content:"";height:100%;left:0;opacity:.3;position:absolute;top:0;width:100%}.row[data-v-2a434750]{margin-left:auto;margin-right:auto;width:980px;padding:80px 0}@media only screen and (max-width:1250px){.row[data-v-2a434750]{width:692px}}@media only screen and (max-width:735px){.row[data-v-2a434750]{width:87.5%}}@media only screen and (max-width:320px){.row[data-v-2a434750]{width:215px}}.col[data-v-2a434750]{z-index:1}[data-v-2a434750] .eyebrow{font-size:1.4117647059rem;line-height:1.1666666667;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-hero-eyebrow)}@media only screen and (max-width:1250px){[data-v-2a434750] .eyebrow{font-size:1.2352941176rem;line-height:1.1904761905;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.headline[data-v-2a434750]{font-size:2.8235294118rem;line-height:1.0833333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);margin-bottom:2rem}@media only screen and (max-width:1250px){.headline[data-v-2a434750]{font-size:2.3529411765rem;line-height:1.1;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){.headline[data-v-2a434750]{font-size:1.8823529412rem;line-height:1.125;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.intro[data-v-2a434750]{font-size:1.2352941176rem;line-height:1.380952381;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:735px){.intro[data-v-2a434750]{font-size:1.1176470588rem;line-height:1.4210526316;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.content+p[data-v-2a434750]{margin-top:var(--spacing-stacked-margin-large)}@media only screen and (max-width:735px){.content+p[data-v-2a434750]{margin-top:8px}}.call-to-action[data-v-2a434750]{display:flex;align-items:center}.call-to-action .cta-icon[data-v-2a434750]{margin-left:.4rem;width:1em;height:1em}.metadata[data-v-2a434750]{margin-top:2rem}.video-asset[data-v-2a434750]{display:grid;height:100vh;margin:0;place-items:center center}.video-asset[data-v-2a434750] video{max-width:1280px;min-width:320px;width:100%}@media only screen and (max-width:735px){.headline[data-v-2a434750]{margin-bottom:19px}}.tutorial-hero[data-v-35a9482f]{margin-bottom:80px}@media only screen and (max-width:735px){.tutorial-hero[data-v-35a9482f]{margin-bottom:0}}.title[data-v-28135d78]{font-size:.7058823529rem;line-height:1.3333333333;color:var(--colors-secondary-label,var(--color-secondary-label))}.title[data-v-28135d78],.title[data-v-61b03ec2]{font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.title[data-v-61b03ec2]{font-size:1.1176470588rem;line-height:1.2105263158;color:var(--colors-header-text,var(--color-header-text));margin:25px 0}.question-content[data-v-61b03ec2] code{font-size:.7647058824rem;line-height:1.8461538462;font-weight:400;font-family:var(--typography-html-font-mono,Menlo,monospace)}.choices[data-v-61b03ec2]{display:flex;flex-direction:column;padding:0;list-style:none;margin:25px 0}.choice[data-v-61b03ec2]{font-size:.8235294118rem;line-height:1.4285714286;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);flex:1;border-radius:var(--border-radius,4px);margin:8px 0;padding:1.5rem 40px;cursor:pointer;background:var(--colors-text-background,var(--color-text-background));display:flex;flex-direction:column;justify-content:center;border-width:1px;border-style:solid;border-color:var(--colors-grid,var(--color-grid));position:relative}.choice[data-v-61b03ec2] img{max-height:23.5294117647rem}.choice[data-v-61b03ec2]:first-of-type{margin-top:0}.choice[data-v-61b03ec2] code{font-size:.7647058824rem;line-height:1.8461538462;font-weight:400;font-family:var(--typography-html-font-mono,Menlo,monospace)}.controls[data-v-61b03ec2]{text-align:center;margin-bottom:40px}.controls .button-cta[data-v-61b03ec2]{margin:.5rem;margin-top:0;padding:.3rem 3rem;min-width:8rem}input[type=radio][data-v-61b03ec2]{position:absolute;width:100%;left:0;height:100%;opacity:0;z-index:-1}.active[data-v-61b03ec2]{border-color:var(--color-tutorial-quiz-border-active);box-shadow:0 0 0 4px var(--color-focus-color);outline:none}.active [data-v-61b03ec2]{color:var(--colors-text,var(--color-text))}.correct[data-v-61b03ec2]{background:var(--color-form-valid-background);border-color:var(--color-form-valid)}.correct .choice-icon[data-v-61b03ec2]{fill:var(--color-form-valid)}.incorrect[data-v-61b03ec2]{background:var(--color-form-error-background);border-color:var(--color-form-error)}.incorrect .choice-icon[data-v-61b03ec2]{fill:var(--color-form-error)}.correct[data-v-61b03ec2],.incorrect[data-v-61b03ec2]{position:relative}.correct .choice-icon[data-v-61b03ec2],.incorrect .choice-icon[data-v-61b03ec2]{position:absolute;top:11px;left:10px;font-size:20px;width:1.05em}.disabled[data-v-61b03ec2]{pointer-events:none}.answer[data-v-61b03ec2]{margin:.5rem 1.5rem .5rem 0;font-size:.7058823529rem;line-height:1.3333333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.answer[data-v-61b03ec2]:last-of-type{margin-bottom:0}[data-v-61b03ec2] .question>.code-listing{padding:unset;border-radius:0}[data-v-61b03ec2] pre{padding:0}[data-v-61b03ec2] img{display:block;margin-left:auto;margin-right:auto;max-width:100%}.title[data-v-65e3c02c]{font-size:1.8823529412rem;line-height:1.25;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--colors-header-text,var(--color-header-text))}@media only screen and (max-width:1250px){.title[data-v-65e3c02c]{font-size:1.6470588235rem;line-height:1.2857142857;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){.title[data-v-65e3c02c]{font-size:1.4117647059rem;line-height:1.3333333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.title p[data-v-65e3c02c]{color:var(--colors-text,var(--color-text))}.assessments[data-v-65e3c02c]{box-sizing:content-box;padding:0 1rem;background:var(--color-tutorial-assessments-background);margin-left:auto;margin-right:auto;width:980px;margin-bottom:80px}@media only screen and (max-width:1250px){.assessments[data-v-65e3c02c]{width:692px}}@media only screen and (max-width:735px){.assessments[data-v-65e3c02c]{width:87.5%}}@media only screen and (max-width:320px){.assessments[data-v-65e3c02c]{width:215px}}.banner[data-v-65e3c02c]{padding:40px 0;border-bottom:1px solid;margin-bottom:40px;border-color:var(--colors-grid,var(--color-grid));text-align:center}.success[data-v-65e3c02c]{text-align:center;padding-bottom:40px;font-size:1.8823529412rem;line-height:1.25;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--colors-text,var(--color-text))}@media only screen and (max-width:1250px){.success[data-v-65e3c02c]{font-size:1.6470588235rem;line-height:1.2857142857;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){.success[data-v-65e3c02c]{font-size:1.4117647059rem;line-height:1.3333333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.assessments-wrapper[data-v-65e3c02c]{padding-top:80px}.assessments-wrapper[data-v-6db06128]{padding-bottom:40px;padding-top:0}@media only screen and (max-width:735px){.assessments-wrapper[data-v-6db06128]{padding-top:80px}}.article[data-v-1b2e3b6a]{background:var(--colors-article-background,var(--color-article-background))}@media only screen and (max-width:735px){.article[data-v-1b2e3b6a]{background:var(--colors-text-background,var(--color-article-body-background))}}.intro-container[data-v-4a7343c7]{margin-bottom:80px}.intro[data-v-4a7343c7]{display:flex;align-items:center}@media only screen and (max-width:735px){.intro[data-v-4a7343c7]{padding-bottom:0;flex-direction:column}}.intro.ide .media[data-v-4a7343c7] img{background-color:var(--colors-text-background,var(--color-text-background))}.col.left[data-v-4a7343c7]{padding-right:40px}@media only screen and (max-width:1250px){.col.left[data-v-4a7343c7]{padding-right:28px}}@media only screen and (max-width:735px){.col.left[data-v-4a7343c7]{margin-left:auto;margin-right:auto;width:980px;padding-right:0}}@media only screen and (max-width:735px)and (max-width:1250px){.col.left[data-v-4a7343c7]{width:692px}}@media only screen and (max-width:735px)and (max-width:735px){.col.left[data-v-4a7343c7]{width:87.5%}}@media only screen and (max-width:735px)and (max-width:320px){.col.left[data-v-4a7343c7]{width:215px}}.col.right[data-v-4a7343c7]{padding-left:40px}@media only screen and (max-width:1250px){.col.right[data-v-4a7343c7]{padding-left:28px}}@media only screen and (max-width:735px){.col.right[data-v-4a7343c7]{padding-left:0}}.content[data-v-4a7343c7]{font-size:1rem;line-height:1.4705882353;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.media[data-v-4a7343c7] img{width:auto;max-height:560px;min-height:18.8235294118rem;-o-object-fit:scale-down;object-fit:scale-down}@media only screen and (max-width:735px){.media[data-v-4a7343c7]{margin:0;margin-top:40px}.media[data-v-4a7343c7] image,.media[data-v-4a7343c7] video{max-height:80vh}}.media[data-v-4a7343c7] .asset{padding:0 20px}.headline[data-v-4a7343c7]{color:var(--colors-header-text,var(--color-header-text))}[data-v-4a7343c7] .eyebrow{font-size:1.2352941176rem;line-height:1.1904761905;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:735px){[data-v-4a7343c7] .eyebrow{font-size:1.1176470588rem;line-height:1.2105263158;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}[data-v-4a7343c7] .eyebrow a{color:inherit}[data-v-4a7343c7] .heading{font-size:1.8823529412rem;line-height:1.25;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:1250px){[data-v-4a7343c7] .heading{font-size:1.6470588235rem;line-height:1.2857142857;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){[data-v-4a7343c7] .heading{font-size:1.4117647059rem;line-height:1.3333333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.expanded-intro[data-v-4a7343c7]{margin-left:auto;margin-right:auto;width:980px;margin-top:40px}@media only screen and (max-width:1250px){.expanded-intro[data-v-4a7343c7]{width:692px}}@media only screen and (max-width:735px){.expanded-intro[data-v-4a7343c7]{width:87.5%}}@media only screen and (max-width:320px){.expanded-intro[data-v-4a7343c7]{width:215px}}[data-v-4a7343c7] .cols-2{gap:20px 16.6666666667%}[data-v-4a7343c7] .cols-3 .column{gap:20px 12.5%}.code-preview[data-v-395e30cd]{position:sticky;overflow-y:auto;-webkit-overflow-scrolling:touch;background-color:var(--background,var(--color-step-background));height:calc(100vh - 3.05882rem)}.code-preview.ide[data-v-395e30cd]{height:100vh}.code-preview[data-v-395e30cd] .code-listing{color:var(--text,var(--color-code-plain))}.code-preview[data-v-395e30cd] .code-listing .code-line-container{padding-right:14px}.code-preview[data-v-395e30cd] pre{font-size:.7058823529rem;line-height:1.8333333333;font-weight:400;font-family:var(--typography-html-font-mono,Menlo,monospace)}.header[data-v-395e30cd]{font-size:.7058823529rem;line-height:1.3333333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);position:relative;display:flex;justify-content:space-between;align-items:center;width:-webkit-fill-available;width:-moz-available;width:stretch;cursor:pointer;font-weight:600;padding:8px 12px;border-radius:var(--border-radius,4px) var(--border-radius,4px) 0 0;z-index:1;background:var(--color-runtime-preview-background);color:var(--colors-runtime-preview-text,var(--color-runtime-preview-text))}.header[data-v-395e30cd]:focus{outline-style:none}#app.fromkeyboard .header[data-v-395e30cd]:focus{box-shadow:0 0 0 4px var(--color-focus-color);outline:none;border-color:var(--color-focus-border-color)}.runtime-preview[data-v-395e30cd]{--color-runtime-preview-shadow:rgba(0,0,0,.4);position:absolute;top:0;right:0;background:var(--color-runtime-preview-background);border-radius:var(--border-radius,4px);margin:1rem;margin-left:0;transition:width .2s ease-in;box-shadow:0 0 3px 0 var(--color-runtime-preview-shadow)}@media screen{[data-color-scheme=dark] .runtime-preview[data-v-395e30cd]{--color-runtime-preview-shadow:hsla(0,0%,100%,.4)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .runtime-preview[data-v-395e30cd]{--color-runtime-preview-shadow:hsla(0,0%,100%,.4)}}@supports not ((width:-webkit-fill-available) or (width:-moz-available) or (width:stretch)){.runtime-preview[data-v-395e30cd]{display:flex;flex-direction:column}}.runtime-preview .runtimve-preview__container[data-v-395e30cd]{border-radius:var(--border-radius,4px);overflow:hidden}.runtime-preview-ide[data-v-395e30cd]{top:0}.runtime-preview-ide .runtime-preview-asset[data-v-395e30cd] img{background-color:var(--color-runtime-preview-background)}.runtime-preview.collapsed[data-v-395e30cd]{box-shadow:0 0 3px 0 var(--color-runtime-preview-shadow);width:102px}.runtime-preview.collapsed .header[data-v-395e30cd]{border-radius:var(--border-radius,4px)}.runtime-preview.disabled[data-v-395e30cd]{box-shadow:0 0 3px 0 transparent}.runtime-preview.disabled .header[data-v-395e30cd]{color:var(--color-runtime-preview-disabled-text);cursor:auto}.runtime-preview-asset[data-v-395e30cd]{border-radius:0 0 var(--border-radius,4px) var(--border-radius,4px)}.runtime-preview-asset[data-v-395e30cd] img{border-bottom-left-radius:var(--border-radius,4px);border-bottom-right-radius:var(--border-radius,4px)}.preview-icon[data-v-395e30cd]{height:.8em;width:.8em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.preview-show[data-v-395e30cd]{transform:scale(-1)}[data-v-0bdf2f26] pre{padding:10px 0}.toggle-preview[data-v-78763c14]{color:var(--color-runtime-preview-disabled-text);display:flex;align-items:center}a[data-v-78763c14]{color:var(--url,var(--color-link))}.toggle-text[data-v-78763c14]{display:flex;align-items:center}svg.toggle-icon[data-v-78763c14]{width:1em;height:1em;margin-left:.5em}.mobile-code-preview[data-v-b1691954]{background-color:var(--background,var(--color-step-background));padding:14px 0}@media only screen and (max-width:735px){.mobile-code-preview[data-v-b1691954]{display:flex;flex-direction:column}}.runtime-preview-modal-content[data-v-b1691954]{padding:45px 60px 0 60px;min-width:200px}.runtime-preview-modal-content[data-v-b1691954] img:not(.file-icon){border-radius:var(--border-radius,4px);box-shadow:0 0 3px rgba(0,0,0,.4);max-height:80vh;width:auto;display:block;margin-bottom:1rem}.runtime-preview-modal-content .runtime-preview-label[data-v-b1691954]{font-size:.7058823529rem;line-height:1.3333333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-runtime-preview-text);display:block;text-align:center;padding:.5em}[data-v-b1691954] .code-listing{color:var(--text,var(--color-code-plain))}[data-v-b1691954] .full-code-listing{padding-top:60px;min-height:calc(100vh - 60px)}[data-v-b1691954] pre{font-size:.7058823529rem;line-height:1.8333333333;font-weight:400;font-family:var(--typography-html-font-mono,Menlo,monospace)}.preview-toggle-container[data-v-b1691954]{align-self:flex-end;margin-right:20px}.step-container[data-v-1f74235c]{margin:0}.step-container[data-v-1f74235c]:not(:last-child){margin-bottom:100px}@media only screen and (max-width:735px){.step-container[data-v-1f74235c]:not(:last-child){margin-bottom:80px}}.step[data-v-1f74235c]{position:relative;border-radius:var(--tutorial-step-border-radius,var(--border-radius,4px));padding:1rem 2rem;background-color:var(--color-step-background);overflow:hidden;filter:blur(0)}.step[data-v-1f74235c]:before{content:"";position:absolute;top:0;left:0;border:1px solid var(--color-step-focused);background-color:var(--color-step-focused);height:calc(100% - 2px);width:4px;opacity:0;transition:opacity .15s ease-in}.step.focused[data-v-1f74235c],.step[data-v-1f74235c]:focus{outline:none}.step.focused[data-v-1f74235c]:before,.step[data-v-1f74235c]:focus:before{opacity:1}@media only screen and (max-width:735px){.step[data-v-1f74235c]{padding-left:2rem}.step[data-v-1f74235c]:before{opacity:1}}.step-label[data-v-1f74235c]{font-size:.7058823529rem;line-height:1.3333333333;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--colors-text,var(--color-step-text));margin-bottom:var(--spacing-stacked-margin-small)}.caption[data-v-1f74235c]{border-top:1px solid;border-color:var(--color-step-caption);padding:1rem 0 0 0;margin-top:1rem}.media-container[data-v-1f74235c]{display:none}@media only screen and (max-width:735px){.step[data-v-1f74235c]{margin:0 .5882352941rem 1.1764705882rem .5882352941rem}.step.focused[data-v-1f74235c],.step[data-v-1f74235c]:focus{outline:none}.media-container[data-v-1f74235c]{display:block;position:relative}.media-container[data-v-1f74235c] img,.media-container[data-v-1f74235c] video{max-height:80vh}[data-v-1f74235c] .asset{padding:0 20px}}.steps[data-v-c87bb95a]{position:relative;font-size:.8235294118rem;line-height:1.4285714286;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);display:flex;color:var(--colors-text,var(--color-text))}@media only screen and (max-width:735px){.steps[data-v-c87bb95a]{padding-top:80px}.steps[data-v-c87bb95a]:before{position:absolute;top:0;border-top:1px solid var(--color-fill-gray-tertiary);content:"";width:calc(100% - 2.35294rem);margin:0 1.1764705882rem}}.steps[data-v-c87bb95a] aside{background:unset;border:unset;box-shadow:unset;-moz-column-break-inside:unset;break-inside:unset;padding:unset}.steps[data-v-c87bb95a] aside .label{font-size:.7058823529rem;line-height:1.3333333333;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.steps[data-v-c87bb95a] aside+*{margin-top:var(--spacing-stacked-margin-large)}.content-container[data-v-c87bb95a]{flex:none;margin-right:4.1666666667%;width:37.5%;margin-top:140px;margin-bottom:94vh}@media only screen and (max-width:735px){.content-container[data-v-c87bb95a]{margin-top:0;margin-bottom:0;height:100%;margin-left:0;margin-right:0;position:relative;width:100%}}.asset-container[data-v-c87bb95a]{flex:none;height:calc(100vh - 3.05882rem);background-color:var(--background,var(--color-step-background));max-width:921px;width:calc(50vw + 8.33333%);position:sticky;top:3.0588235294rem;transition:margin .1s ease-in-out}@media only screen and (max-width:767px){.asset-container[data-v-c87bb95a]{top:2.8235294118rem;height:calc(100vh - 2.82353rem)}}.asset-container[data-v-c87bb95a]:not(.for-step-code){overflow-y:auto;-webkit-overflow-scrolling:touch}.asset-container.ide[data-v-c87bb95a]{height:100vh;top:0}@media only screen and (min-width:736px){.asset-container[data-v-c87bb95a]{display:grid}.asset-container>[data-v-c87bb95a]{grid-row:1;grid-column:1;height:calc(100vh - 3.05882rem)}.asset-container.ide>[data-v-c87bb95a]{height:100vh}}.asset-container .step-asset[data-v-c87bb95a]{box-sizing:border-box;padding:0;padding-left:40px;min-height:320px;height:100%}.asset-container .step-asset[data-v-c87bb95a],.asset-container .step-asset[data-v-c87bb95a] picture{height:100%;display:flex;align-items:center}.asset-container .step-asset[data-v-c87bb95a] .video-replay-container{height:100%;display:flex;flex-direction:column;justify-content:center}.asset-container .step-asset[data-v-c87bb95a] img,.asset-container .step-asset[data-v-c87bb95a] video{width:auto;max-height:calc(100vh - 3.05882rem - 80px);max-width:531.66667px;margin:0}@media only screen and (max-width:1250px){.asset-container .step-asset[data-v-c87bb95a] img,.asset-container .step-asset[data-v-c87bb95a] video{max-width:363.66667px}}.asset-container .step-asset[data-v-c87bb95a] .video-replay-container,.asset-container .step-asset[data-v-c87bb95a] img{min-height:320px}.asset-container .step-asset[data-v-c87bb95a] .video-replay-container video{min-height:280px}.asset-container .step-asset[data-v-c87bb95a] [data-orientation=landscape]{max-width:min(841px,calc(50vw + 8.33333% - 80px))}@media only screen and (max-width:735px){.asset-container[data-v-c87bb95a]{display:none}}.asset-wrapper[data-v-c87bb95a]{width:63.2%;align-self:center;transition:transform .25s ease-out;will-change:transform}.asset-wrapper.ide .step-asset[data-v-c87bb95a] img{background-color:var(--background,var(--color-step-background))}.asset-wrapper[data-v-c87bb95a]:has([data-orientation=landscape]){width:unset}[data-v-c87bb95a] .runtime-preview-asset{display:grid}[data-v-c87bb95a] .runtime-preview-asset>*{grid-row:1;grid-column:1}.interstitial[data-v-c87bb95a]{padding:0 2rem}.interstitial[data-v-c87bb95a]:not(:first-child){margin-top:5.8823529412rem}.interstitial[data-v-c87bb95a]:not(:last-child){margin-bottom:30px}@media only screen and (max-width:735px){.interstitial[data-v-c87bb95a]{margin-left:auto;margin-right:auto;width:980px;padding:0}}@media only screen and (max-width:735px)and (max-width:1250px){.interstitial[data-v-c87bb95a]{width:692px}}@media only screen and (max-width:735px)and (max-width:735px){.interstitial[data-v-c87bb95a]{width:87.5%}}@media only screen and (max-width:735px)and (max-width:320px){.interstitial[data-v-c87bb95a]{width:215px}}@media only screen and (max-width:735px){.interstitial[data-v-c87bb95a]:not(:first-child){margin-top:0}}.fade-enter-active[data-v-c87bb95a],.fade-leave-active[data-v-c87bb95a]{transition:opacity .3s ease-in-out}.fade-enter[data-v-c87bb95a],.fade-leave-to[data-v-c87bb95a]{opacity:0}.section[data-v-6b3a0b3a]{padding-top:80px}.sections[data-v-79a75e9e]{margin-left:auto;margin-right:auto;width:980px}@media only screen and (max-width:1250px){.sections[data-v-79a75e9e]{width:692px}}@media only screen and (max-width:735px){.sections[data-v-79a75e9e]{width:87.5%}}@media only screen and (max-width:320px){.sections[data-v-79a75e9e]{width:215px}}@media only screen and (max-width:735px){.sections[data-v-79a75e9e]{margin:0;width:100%}}.tutorial[data-v-566b3655]{background-color:var(--colors-text-background,var(--color-tutorial-background))} \ No newline at end of file diff --git a/docs/css/topic.ee15af52.css b/docs/css/topic.ee15af52.css deleted file mode 100644 index 82d8849..0000000 --- a/docs/css/topic.ee15af52.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * This source file is part of the Swift.org open source project - * - * Copyright (c) 2021 Apple Inc. and the Swift project authors - * Licensed under Apache License v2.0 with Runtime Library Exception - * - * See https://swift.org/LICENSE.txt for license information - * See https://swift.org/CONTRIBUTORS.txt for Swift project authors - */.nav-title-content[data-v-60ea3af8]{max-width:100%}.title[data-v-60ea3af8]{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:inline-block;vertical-align:top;max-width:296px}@media only screen and (max-width:1023px){.title[data-v-60ea3af8]{max-width:205px}}@media only screen and (max-width:767px){.title[data-v-60ea3af8]{flex-basis:fill;display:initial;vertical-align:initial;max-width:none}}.subhead[data-v-60ea3af8]{color:var(--color-nav-root-subhead)}.theme-dark .subhead[data-v-60ea3af8]{color:var(--color-nav-dark-root-subhead)}.mobile-dropdown[data-v-154acfbd]{box-sizing:border-box}.nav--in-breakpoint-range .mobile-dropdown[data-v-154acfbd]{padding-left:.23529rem;padding-right:.23529rem}.mobile-dropdown ul[data-v-154acfbd]{list-style:none}.mobile-dropdown .option[data-v-154acfbd]{cursor:pointer;font-size:.70588rem;padding:.5rem 0;display:block;text-decoration:none;color:inherit}.mobile-dropdown .option[data-v-154acfbd]:focus{outline-offset:0}.mobile-dropdown .option.depth1[data-v-154acfbd]{padding-left:.47059rem}.active[data-v-154acfbd],.tutorial.router-link-active[data-v-154acfbd]{font-weight:600}.active[data-v-154acfbd]:focus,.tutorial.router-link-active[data-v-154acfbd]:focus{outline:none}.chapter-list[data-v-154acfbd]:not(:first-child){margin-top:1rem}.chapter-name[data-v-154acfbd],.tutorial[data-v-154acfbd]{padding:.5rem 0;font-size:1rem;line-height:1.47059;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.section-list[data-v-154acfbd],.tutorial-list[data-v-154acfbd]{padding:0 .58824rem}.chapter-list:last-child .tutorial-list[data-v-154acfbd]:last-child{padding-bottom:10em}.chapter-list[data-v-154acfbd]{display:inline-block}.form-element[data-v-998803d8]{position:relative}.form-dropdown[data-v-998803d8]{font-size:1rem;line-height:1.23529;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;display:block;box-sizing:border-box;width:100%;height:3.3em;color:var(--color-dropdown-text);padding:1.11765rem 2.35294rem 0 .94118rem;text-align:left;border:1px solid var(--color-dropdown-border);border-radius:4px;background-clip:padding-box;margin-bottom:.82353rem;-webkit-appearance:none;-moz-appearance:none;appearance:none;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;min-height:32px}.form-dropdown[data-v-998803d8]:focus{box-shadow:0 0 0 4px var(--color-focus-color);outline:none;border-color:var(--color-focus-border-color)}.form-dropdown.no-eyebrow[data-v-998803d8]{padding-top:0}.form-dropdown[data-v-998803d8]:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--color-dropdown-text)}.form-dropdown[data-v-998803d8]::-ms-expand{opacity:0}.form-dropdown~.form-icon[data-v-998803d8]{position:absolute;display:block;pointer-events:none;fill:var(--color-figure-gray-tertiary);right:14px;width:13px;height:auto;top:50%;transform:translateY(-50%)}.is-open .form-dropdown~.form-icon[data-v-998803d8]{transform:translateY(-50%) scale(-1)}@media only screen and (max-width:735px){.form-dropdown~.form-icon[data-v-998803d8]{right:14px}}.form-dropdown~.form-label[data-v-998803d8]{font-size:.70588rem;line-height:1.75;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;position:absolute;top:.47059rem;left:17px;color:var(--color-figure-gray-secondary);pointer-events:none;padding:0;z-index:1}.form-dropdown[data-v-998803d8] option{color:var(--color-dropdown-text)}.form-dropdown-selectnone[data-v-998803d8]{color:transparent}.form-dropdown-selectnone~.form-label[data-v-998803d8]{font-size:1rem;line-height:1.23529;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;top:19px;left:17px;color:var(--color-figure-gray-tertiary)}.form-dropdown-selectnone[data-v-998803d8]:-moz-focusring{text-shadow:none}.form-dropdown-selectnone[data-v-998803d8]::-ms-value{display:none}.theme-dark .form-dropdown[data-v-998803d8]{color:var(--color-dropdown-dark-text);background-color:var(--color-dropdown-dark-background);border-color:var(--color-dropdown-dark-border)}.theme-dark .form-dropdown~.form-label[data-v-998803d8]{color:#ccc}.theme-dark .form-dropdown[data-v-998803d8]:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--color-dropdown-dark-text)}.theme-dark .form-dropdown.form-dropdown-selectnone[data-v-998803d8]{color:transparent}.theme-dark .form-dropdown.form-dropdown-selectnone[data-v-998803d8]:-moz-focusring{text-shadow:none}.theme-dark .form-dropdown-selectnone~.form-label[data-v-998803d8]{color:#b0b0b0}.dropdown-small[data-v-12dd746a]{height:30px;display:flex;align-items:center;position:relative;background:var(--color-fill)}.dropdown-small .form-dropdown-toggle[data-v-12dd746a]{line-height:1.5;font-size:12px;padding-top:0;padding-bottom:0;padding-left:20px;min-height:unset;height:30px;display:flex;align-items:center}.dropdown-small .form-dropdown-toggle[data-v-12dd746a]:focus{box-shadow:none;border-color:var(--color-dropdown-border)}.fromkeyboard .dropdown-small .form-dropdown-toggle[data-v-12dd746a]:focus{box-shadow:0 0 0 2px var(--color-focus-color);outline:none;border-color:var(--color-focus-border-color)}.form-dropdown-toggle[data-v-12dd746a]{margin:0}.is-open .form-dropdown-toggle[data-v-12dd746a]{border-radius:4px 4px 0 0;border-bottom:none;padding-bottom:1px}.fromkeyboard .is-open .form-dropdown-toggle[data-v-12dd746a]{box-shadow:1px -1px 0 1px var(--color-focus-color),-1px -1px 0 1px var(--color-focus-color);border-color:var(--color-focus-border-color)}.form-dropdown-title[data-v-12dd746a]{margin:0;padding:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.dropdown-custom[data-v-12dd746a]{border-radius:4px}.dropdown-custom.is-open[data-v-12dd746a]{border-radius:4px 4px 0 0}.dropdown-custom[data-v-12dd746a] .form-dropdown-content{background:var(--color-fill);position:absolute;right:0;left:0;top:100%;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border:1px solid var(--color-dropdown-border);border-top:none;display:none;overflow-y:auto}.dropdown-custom[data-v-12dd746a] .form-dropdown-content.is-open{display:block}.fromkeyboard .dropdown-custom[data-v-12dd746a] .form-dropdown-content.is-open{box-shadow:1px 1px 0 1px var(--color-focus-color),-1px 1px 0 1px var(--color-focus-color);border-color:var(--color-focus-border-color);border-top-color:transparent}.nav .dropdown-custom[data-v-12dd746a] .form-dropdown-content{max-height:calc(100vh - 116px - 3.05882rem)}.nav--is-sticking.nav .dropdown-custom[data-v-12dd746a] .form-dropdown-content{max-height:calc(100vh - 3.05882rem - 72px)}.dropdown-custom[data-v-12dd746a] .options{list-style:none;margin:0;padding:0 0 20px}.dropdown-custom[data-v-12dd746a] .option{cursor:pointer;padding:5px 20px;font-size:12px;line-height:20px;outline:none}.dropdown-custom[data-v-12dd746a] .option:hover{background-color:var(--color-fill-tertiary)}.dropdown-custom[data-v-12dd746a] .option.option-active{font-weight:600}.fromkeyboard .dropdown-custom[data-v-12dd746a] .option:hover{background-color:transparent}.fromkeyboard .dropdown-custom[data-v-12dd746a] .option:focus{background-color:var(--color-fill-tertiary);outline:none}.tutorial-dropdown[data-v-4a151342]{grid-column:3}.section-tracker[data-v-4a151342]{font-size:.70588rem;line-height:1.33333;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--color-figure-gray-secondary);margin-left:15px}.tutorial-dropdown[data-v-78dc103f]{grid-column:1/2}.tutorial-dropdown .options[data-v-78dc103f]{padding-top:1rem;padding-bottom:0}.tutorial-dropdown .option[data-v-78dc103f]{padding:5px 20px 5px 30px}.chapter-list[data-v-78dc103f]{padding-bottom:20px}.chapter-name[data-v-78dc103f]{margin:0 20px 5px 20px;line-height:normal;color:var(--color-figure-gray-secondary)}.chevron-icon[data-v-26e19f17]{padding:0;color:var(--color-nav-outlines);grid-column:2;height:20px;width:20px;margin:0 4px}@media only screen and (min-width:768px){.nav[data-v-26e19f17] .nav-content{display:grid;grid-template-columns:auto auto 3fr;align-items:center}.nav[data-v-26e19f17] .nav-menu{padding:0;grid-column:3/5}.nav[data-v-26e19f17] .nav-menu-item{margin:0}}.dropdown-container[data-v-26e19f17]{height:3.05882rem;display:grid;grid-template-columns:minmax(230px,285px) auto minmax(230px,1fr);align-items:center}@media only screen and (max-width:1023px){.dropdown-container[data-v-26e19f17]{grid-template-columns:minmax(173px,216px) auto minmax(173px,1fr)}}.separator[data-v-26e19f17]{height:20px;border-right:1px solid;border-color:var(--color-nav-outlines);margin:0 20px;grid-column:2}.mobile-dropdown-container[data-v-26e19f17],.nav--in-breakpoint-range.nav .dropdown-container[data-v-26e19f17],.nav--in-breakpoint-range.nav .separator[data-v-26e19f17]{display:none}.nav--in-breakpoint-range.nav .mobile-dropdown-container[data-v-26e19f17]{display:block}.nav--in-breakpoint-range.nav[data-v-26e19f17] .nav-title{grid-area:title}.nav--in-breakpoint-range.nav[data-v-26e19f17] .pre-title{display:none}.nav[data-v-26e19f17] .nav-title{grid-column:1;width:90%;padding-top:0}.primary-dropdown[data-v-26e19f17],.secondary-dropdown[data-v-26e19f17]{background:var(--color-tutorial-navbar-dropdown-background);border-color:var(--color-tutorial-navbar-dropdown-border)}.primary-dropdown[data-v-26e19f17] .form-dropdown,.primary-dropdown[data-v-26e19f17] .form-dropdown:focus,.secondary-dropdown[data-v-26e19f17] .form-dropdown,.secondary-dropdown[data-v-26e19f17] .form-dropdown:focus{border-color:var(--color-tutorial-navbar-dropdown-border)}.primary-dropdown[data-v-26e19f17] .options,.secondary-dropdown[data-v-26e19f17] .options{background:var(--color-tutorial-navbar-dropdown-background);border-color:var(--color-tutorial-navbar-dropdown-border)}.replay-button[data-v-59608016]{display:flex;align-items:center;justify-content:center;cursor:pointer;visibility:hidden;margin-top:.5rem;-webkit-tap-highlight-color:transparent}.replay-button.visible[data-v-59608016]{visibility:visible}.replay-button svg.replay-icon[data-v-59608016]{height:12px;width:12px;margin-left:.3em}[data-v-1b5cc854] img,[data-v-1b5cc854] video{display:block;margin-left:auto;margin-right:auto;-o-object-fit:contain;object-fit:contain;max-width:100%}[data-v-3cfe1c35] .code-listing+*,[data-v-3cfe1c35] aside+*,[data-v-3cfe1c35] h2+*,[data-v-3cfe1c35] h3+*,[data-v-3cfe1c35] ol+*,[data-v-3cfe1c35] p+*,[data-v-3cfe1c35] ul+*{margin-top:20px}[data-v-3cfe1c35] ol ol,[data-v-3cfe1c35] ol ul,[data-v-3cfe1c35] ul ol,[data-v-3cfe1c35] ul ul{margin-top:0}[data-v-3cfe1c35] h2{font-size:1.88235rem;line-height:1.25;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}@media only screen and (max-width:1250px){[data-v-3cfe1c35] h2{font-size:1.64706rem;line-height:1.28571;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (max-width:735px){[data-v-3cfe1c35] h2{font-size:1.41176rem;line-height:1.33333;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}[data-v-3cfe1c35] h3{font-size:1.41176rem;line-height:1.16667;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}@media only screen and (max-width:1250px){[data-v-3cfe1c35] h3{font-size:1.23529rem;line-height:1.19048;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}[data-v-3cfe1c35] .code-listing{background:var(--color-code-background);border-color:var(--colors-grid,var(--color-grid));border-style:solid;border-width:1px}[data-v-3cfe1c35] .code-listing pre{font-size:.70588rem;line-height:1.83333;font-weight:400;font-family:Menlo,monospace;padding:20px 0}.columns[data-v-30edf911]{display:grid;grid-template-rows:repeat(2,auto)}.columns.cols-2[data-v-30edf911]{gap:20px 8.33333%;grid-template-columns:repeat(2,1fr)}.columns.cols-3[data-v-30edf911]{gap:20px 4.16667%;grid-template-columns:repeat(3,1fr)}.asset[data-v-30edf911]{align-self:end;grid-row:1}.content[data-v-30edf911]{grid-row:2}@media only screen and (max-width:735px){.columns.cols-2[data-v-30edf911],.columns.cols-3[data-v-30edf911]{grid-template-columns:unset}.asset[data-v-30edf911],.content[data-v-30edf911]{grid-row:auto}}.content-and-media[data-v-3fa44f9e]{display:flex}.content-and-media.media-leading[data-v-3fa44f9e]{flex-direction:row-reverse}.content-and-media.media-trailing[data-v-3fa44f9e]{flex-direction:row}@media only screen and (min-width:736px){.content-and-media[data-v-3fa44f9e]{align-items:center;justify-content:center}}.content[data-v-3fa44f9e]{width:62.5%}.asset[data-v-3fa44f9e]{width:29.16667%}.media-leading .asset[data-v-3fa44f9e]{margin-right:8.33333%}.media-trailing .asset[data-v-3fa44f9e]{margin-left:8.33333%}@media only screen and (max-width:735px){.content-and-media.media-leading[data-v-3fa44f9e],.content-and-media.media-trailing[data-v-3fa44f9e]{flex-direction:column}.asset[data-v-3fa44f9e],.content[data-v-3fa44f9e]{width:100%}.media-leading .asset[data-v-3fa44f9e],.media-trailing .asset[data-v-3fa44f9e]{margin:20px 0 0 0}}.group[id][data-v-1f2be54b]{margin-top:20px;padding-top:20px}[data-v-1f2be54b] img,[data-v-1f2be54b] video{display:block;margin:0 auto;max-width:100%}.layout+[data-v-4d5a806e]{margin-top:40px}@media only screen and (max-width:735px){.layout[data-v-4d5a806e]:first-child>:not(.group[id]){margin-top:40px}}.body[data-v-6499e2f2]{background:var(--colors-text-background,var(--color-article-body-background));margin-left:auto;margin-right:auto;width:980px;border-radius:10px;transform:translateY(-120px)}@media only screen and (max-width:1250px){.body[data-v-6499e2f2]{width:692px}}@media only screen and (max-width:735px){.body[data-v-6499e2f2]{width:87.5%;border-radius:0;transform:none}}.body[data-v-6499e2f2]~*{margin-top:-40px}.body-content[data-v-6499e2f2]{padding:40px 8.33333% 80px 8.33333%}@media only screen and (max-width:735px){.body-content[data-v-6499e2f2]{padding:0 0 40px 0}}.call-to-action[data-v-2016b288]{padding:65px 0;background:var(--color-call-to-action-background)}.theme-dark .call-to-action[data-v-2016b288]{--color-call-to-action-background:#424242}.row[data-v-2016b288]{margin-left:auto;margin-right:auto;width:980px;display:flex;align-items:center}@media only screen and (max-width:1250px){.row[data-v-2016b288]{width:692px}}@media only screen and (max-width:735px){.row[data-v-2016b288]{width:87.5%}}[data-v-2016b288] img,[data-v-2016b288] video{max-height:560px}h2[data-v-2016b288]{font-size:1.88235rem;line-height:1.25;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}@media only screen and (max-width:1250px){h2[data-v-2016b288]{font-size:1.64706rem;line-height:1.28571;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (max-width:735px){h2[data-v-2016b288]{font-size:1.41176rem;line-height:1.33333;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.label[data-v-2016b288]{display:block;font-size:1.23529rem;line-height:1.19048;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;margin-bottom:.4em;color:var(--color-eyebrow)}@media only screen and (max-width:735px){.label[data-v-2016b288]{font-size:1.11765rem;line-height:1.21053;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.content[data-v-2016b288]{margin-bottom:1.5rem}.right-column[data-v-2016b288]{margin-left:auto}@media only screen and (max-width:735px){.row[data-v-2016b288]{display:block}.col+.col[data-v-2016b288]{margin-top:40px}}@media only screen and (max-width:735px){.call-to-action[data-v-426a965c]{margin-top:0}}.headline[data-v-1898f592]{margin-bottom:.8em}.heading[data-v-1898f592]{font-size:2.82353rem;line-height:1.08333;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--color-header-text)}@media only screen and (max-width:1250px){.heading[data-v-1898f592]{font-size:2.35294rem;line-height:1.1;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (max-width:735px){.heading[data-v-1898f592]{font-size:1.88235rem;line-height:1.125;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.dark .heading[data-v-1898f592]{color:#fff}.eyebrow[data-v-1898f592]{font-size:1.41176rem;line-height:1.16667;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;display:block;margin-bottom:.4em;color:var(--color-eyebrow)}@media only screen and (max-width:1250px){.eyebrow[data-v-1898f592]{font-size:1.23529rem;line-height:1.19048;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.generic-modal[data-v-ea628b36]{position:fixed;top:0;left:0;right:0;bottom:0;margin:0;z-index:11000;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;background:none;overflow:auto}.modal-fullscreen[data-v-ea628b36]{align-items:stretch}.modal-fullscreen .container[data-v-ea628b36]{margin:0;flex:1;width:100%;height:100%;padding-top:env(safe-area-inset-top);padding-right:env(safe-area-inset-right);padding-bottom:env(safe-area-inset-bottom);padding-left:env(safe-area-inset-left)}.modal-standard[data-v-ea628b36]{padding:20px}.modal-standard .container[data-v-ea628b36]{padding:60px;border-radius:4px}@media screen{[data-color-scheme=dark] .modal-standard .container[data-v-ea628b36]{background:#1d1d1f}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .modal-standard .container[data-v-ea628b36]{background:#1d1d1f}}@media only screen and (max-width:735px){.modal-standard[data-v-ea628b36]{padding:0;align-items:stretch}.modal-standard .container[data-v-ea628b36]{margin:20px 0 0;padding:50px 30px;flex:1;width:100%;border-bottom-left-radius:0;border-bottom-right-radius:0}}.backdrop[data-v-ea628b36]{overflow:auto;background:rgba(0,0,0,.4);-webkit-overflow-scrolling:touch;width:100%;height:100%;position:fixed}.container[data-v-ea628b36]{margin-left:auto;margin-right:auto;width:980px;background:var(--colors-generic-modal-background,var(--color-generic-modal-background));z-index:1;position:relative;overflow:auto;max-width:100%}@media only screen and (max-width:1250px){.container[data-v-ea628b36]{width:692px}}@media only screen and (max-width:735px){.container[data-v-ea628b36]{width:87.5%}}.close[data-v-ea628b36]{position:absolute;z-index:9999;top:22px;left:22px;width:30px;height:30px;color:#666;cursor:pointer;background:none;border:0;display:flex;align-items:center}.close .close-icon[data-v-ea628b36]{fill:currentColor;width:100%;height:100%}.theme-dark .container[data-v-ea628b36]{background:#000}.theme-dark .container .close[data-v-ea628b36]{color:#b0b0b0}.theme-code .container[data-v-ea628b36]{background-color:var(--background,var(--color-code-background))}.metadata[data-v-2fa6f125]{display:flex}.item[data-v-2fa6f125]{font-size:.70588rem;line-height:1.33333;font-weight:600;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;border-right:1px solid #fff;padding:0 27.5px}@media only screen and (max-width:735px){.item[data-v-2fa6f125]{font-size:.64706rem;line-height:1.63636;font-weight:600;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;padding:0 8px}}.item[data-v-2fa6f125]:first-of-type{padding-left:0}.item[data-v-2fa6f125]:last-of-type{border:none}@media only screen and (max-width:735px){.item[data-v-2fa6f125]:last-of-type{padding-right:0}}.content[data-v-2fa6f125]{color:#fff}.icon[data-v-2fa6f125]{font-size:2.82353rem;line-height:1.08333;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}@media only screen and (max-width:1250px){.icon[data-v-2fa6f125]{font-size:2.35294rem;line-height:1.1;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (max-width:735px){.icon[data-v-2fa6f125]{font-size:1.88235rem;line-height:1.125;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.small-icon[data-v-2fa6f125]{width:1em;height:1em;margin-left:.2rem}.small-icon.xcode-icon[data-v-2fa6f125]{width:.8em;height:.8em}.content-link[data-v-2fa6f125]{display:flex;align-items:center}a[data-v-2fa6f125]{color:var(--colors-link,var(--color-tutorials-overview-link))}.duration[data-v-2fa6f125]{display:flex;align-items:baseline;font-size:2.35294rem;line-height:1;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;line-height:1.8rem}@media only screen and (max-width:735px){.duration[data-v-2fa6f125]{font-size:1.64706rem;line-height:1;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;line-height:1.3rem}}.minutes[data-v-2fa6f125]{display:inline-block;font-size:1.64706rem;line-height:1;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;line-height:1.3rem}@media only screen and (max-width:735px){.minutes[data-v-2fa6f125]{font-size:1rem;line-height:1.23529;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;line-height:.8rem}}.item-large-icon[data-v-2fa6f125]{height:2.3rem;max-width:100%}@media only screen and (max-width:735px){.item-large-icon[data-v-2fa6f125]{height:1.5rem;max-width:100%}}.bottom[data-v-2fa6f125]{margin-top:13px}@media only screen and (max-width:735px){.bottom[data-v-2fa6f125]{margin-top:8px}}.hero[data-v-cb87b2d0]{color:var(--color-tutorial-hero-text);position:relative}.bg[data-v-cb87b2d0],.hero[data-v-cb87b2d0]{background-color:var(--color-tutorial-hero-background)}.bg[data-v-cb87b2d0]{background-position:top;background-repeat:no-repeat;background-size:cover;content:"";height:100%;left:0;opacity:.3;position:absolute;top:0;width:100%}.row[data-v-cb87b2d0]{margin-left:auto;margin-right:auto;width:980px;padding:80px 0}@media only screen and (max-width:1250px){.row[data-v-cb87b2d0]{width:692px}}@media only screen and (max-width:735px){.row[data-v-cb87b2d0]{width:87.5%}}.col[data-v-cb87b2d0]{z-index:1}[data-v-cb87b2d0] .eyebrow{font-size:1.41176rem;line-height:1.16667;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--color-hero-eyebrow)}@media only screen and (max-width:1250px){[data-v-cb87b2d0] .eyebrow{font-size:1.23529rem;line-height:1.19048;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.headline[data-v-cb87b2d0]{font-size:2.82353rem;line-height:1.08333;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;margin-bottom:2rem}@media only screen and (max-width:1250px){.headline[data-v-cb87b2d0]{font-size:2.35294rem;line-height:1.1;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (max-width:735px){.headline[data-v-cb87b2d0]{font-size:1.88235rem;line-height:1.125;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.intro[data-v-cb87b2d0]{font-size:1.23529rem;line-height:1.38095;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}@media only screen and (max-width:735px){.intro[data-v-cb87b2d0]{font-size:1.11765rem;line-height:1.42105;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.content+p[data-v-cb87b2d0]{margin-top:.8em}@media only screen and (max-width:735px){.content+p[data-v-cb87b2d0]{margin-top:8px}}.call-to-action[data-v-cb87b2d0]{display:flex;align-items:center}.call-to-action .cta-icon[data-v-cb87b2d0]{margin-left:.4rem;width:1em;height:1em}.metadata[data-v-cb87b2d0]{margin-top:2rem}.video-asset[data-v-cb87b2d0]{display:grid;height:100vh;margin:0;place-items:center center}.video-asset[data-v-cb87b2d0] video{max-width:1280px;min-width:320px;width:100%}@media only screen and (max-width:735px){.headline[data-v-cb87b2d0]{margin-bottom:19px}}.tutorial-hero[data-v-35a9482f]{margin-bottom:80px}@media only screen and (max-width:735px){.tutorial-hero[data-v-35a9482f]{margin-bottom:0}}.title[data-v-8ec95972]{font-size:.70588rem;line-height:1.33333;color:var(--colors-secondary-label,var(--color-secondary-label))}.title[data-v-8ec95972],.title[data-v-455ff2a6]{font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.title[data-v-455ff2a6]{font-size:1.11765rem;line-height:1.21053;color:var(--colors-header-text,var(--color-header-text));margin:25px 0}.question-content[data-v-455ff2a6] code{font-size:.76471rem;line-height:1.84615;font-weight:400;font-family:Menlo,monospace}.choices[data-v-455ff2a6]{display:flex;flex-direction:column;padding:0;list-style:none;margin:25px 0}.choice[data-v-455ff2a6]{font-size:.82353rem;line-height:1.42857;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;flex:1;border-radius:4px;margin:8px 0;padding:1.5rem 40px;cursor:pointer;background:var(--colors-text-background,var(--color-text-background));display:flex;flex-direction:column;justify-content:center;border-width:1px;border-style:solid;border-color:var(--colors-grid,var(--color-grid));position:relative}.choice[data-v-455ff2a6] img{max-height:23.52941rem}.choice[data-v-455ff2a6]:first-of-type{margin-top:0}.choice[data-v-455ff2a6] code{font-size:.76471rem;line-height:1.84615;font-weight:400;font-family:Menlo,monospace}.controls[data-v-455ff2a6]{text-align:center;margin-bottom:40px}.controls .button-cta[data-v-455ff2a6]{margin:.5rem;margin-top:0;padding:.3rem 3rem;min-width:8rem}input[type=radio][data-v-455ff2a6]{position:absolute;width:100%;left:0;height:100%;opacity:0;z-index:-1}.active[data-v-455ff2a6]{border-color:var(--color-tutorial-quiz-border-active);box-shadow:0 0 0 4px var(--color-focus-color);outline:none}.active [data-v-455ff2a6]{color:var(--colors-text,var(--color-text))}.correct[data-v-455ff2a6]{background:var(--color-form-valid-background);border-color:var(--color-form-valid)}.correct .choice-icon[data-v-455ff2a6]{fill:var(--color-form-valid)}.incorrect[data-v-455ff2a6]{background:var(--color-form-error-background);border-color:var(--color-form-error)}.incorrect .choice-icon[data-v-455ff2a6]{fill:var(--color-form-error)}.correct[data-v-455ff2a6],.incorrect[data-v-455ff2a6]{position:relative}.correct .choice-icon[data-v-455ff2a6],.incorrect .choice-icon[data-v-455ff2a6]{position:absolute;top:11px;left:10px;font-size:20px;width:1.05em}.disabled[data-v-455ff2a6]{pointer-events:none}.answer[data-v-455ff2a6]{margin:.5rem 1.5rem .5rem 0;font-size:.70588rem;line-height:1.33333;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.answer[data-v-455ff2a6]:last-of-type{margin-bottom:0}[data-v-455ff2a6] .question>.code-listing{padding:unset;border-radius:0}[data-v-455ff2a6] pre{padding:0}[data-v-455ff2a6] img{display:block;margin-left:auto;margin-right:auto;max-width:100%}.title[data-v-c1de71de]{font-size:1.88235rem;line-height:1.25;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--colors-header-text,var(--color-header-text))}@media only screen and (max-width:1250px){.title[data-v-c1de71de]{font-size:1.64706rem;line-height:1.28571;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (max-width:735px){.title[data-v-c1de71de]{font-size:1.41176rem;line-height:1.33333;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.title p[data-v-c1de71de]{color:var(--colors-text,var(--color-text))}.assessments[data-v-c1de71de]{box-sizing:content-box;padding:0 1rem;background:var(--color-tutorial-assessments-background);margin-left:auto;margin-right:auto;width:980px;margin-bottom:80px}@media only screen and (max-width:1250px){.assessments[data-v-c1de71de]{width:692px}}@media only screen and (max-width:735px){.assessments[data-v-c1de71de]{width:87.5%}}.banner[data-v-c1de71de]{padding:40px 0;border-bottom:1px solid;margin-bottom:40px;border-color:var(--colors-grid,var(--color-grid));text-align:center}.success[data-v-c1de71de]{text-align:center;padding-bottom:40px;font-size:1.88235rem;line-height:1.25;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--colors-text,var(--color-text))}@media only screen and (max-width:1250px){.success[data-v-c1de71de]{font-size:1.64706rem;line-height:1.28571;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (max-width:735px){.success[data-v-c1de71de]{font-size:1.41176rem;line-height:1.33333;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.assessments-wrapper[data-v-c1de71de]{padding-top:80px}.assessments-wrapper[data-v-3c94366b]{padding-bottom:40px;padding-top:0}@media only screen and (max-width:735px){.assessments-wrapper[data-v-3c94366b]{padding-top:80px}}.article[data-v-d9f204d0]{background:var(--colors-article-background,var(--color-article-background))}@media only screen and (max-width:735px){.article[data-v-d9f204d0]{background:var(--colors-text-background,var(--color-article-body-background))}}.intro-container[data-v-54daa228]{margin-bottom:80px}.intro[data-v-54daa228]{display:flex;align-items:center}@media only screen and (max-width:735px){.intro[data-v-54daa228]{padding-bottom:0;flex-direction:column}}.intro.ide .media[data-v-54daa228] img{background-color:var(--colors-text-background,var(--color-text-background))}.col.left[data-v-54daa228]{padding-right:40px}@media only screen and (max-width:1250px){.col.left[data-v-54daa228]{padding-right:28px}}@media only screen and (max-width:735px){.col.left[data-v-54daa228]{margin-left:auto;margin-right:auto;width:980px;padding-right:0}}@media only screen and (max-width:735px) and (max-width:1250px){.col.left[data-v-54daa228]{width:692px}}@media only screen and (max-width:735px) and (max-width:735px){.col.left[data-v-54daa228]{width:87.5%}}.col.right[data-v-54daa228]{padding-left:40px}@media only screen and (max-width:1250px){.col.right[data-v-54daa228]{padding-left:28px}}@media only screen and (max-width:735px){.col.right[data-v-54daa228]{padding-left:0}}.content[data-v-54daa228]{font-size:1rem;line-height:1.47059;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.media[data-v-54daa228] img{width:auto;max-height:560px;min-height:18.82353rem;-o-object-fit:scale-down;object-fit:scale-down}@media only screen and (max-width:735px){.media[data-v-54daa228]{margin:0;margin-top:40px}.media[data-v-54daa228] img,.media[data-v-54daa228] video{max-height:80vh}}.media[data-v-54daa228] .asset{padding:0 20px}.headline[data-v-54daa228]{color:var(--colors-header-text,var(--color-header-text))}[data-v-54daa228] .eyebrow{font-size:1.23529rem;line-height:1.19048;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}@media only screen and (max-width:735px){[data-v-54daa228] .eyebrow{font-size:1.11765rem;line-height:1.21053;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}[data-v-54daa228] .eyebrow a{color:inherit}[data-v-54daa228] .heading{font-size:1.88235rem;line-height:1.25;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}@media only screen and (max-width:1250px){[data-v-54daa228] .heading{font-size:1.64706rem;line-height:1.28571;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (max-width:735px){[data-v-54daa228] .heading{font-size:1.41176rem;line-height:1.33333;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.expanded-intro[data-v-54daa228]{margin-left:auto;margin-right:auto;width:980px;margin-top:40px}@media only screen and (max-width:1250px){.expanded-intro[data-v-54daa228]{width:692px}}@media only screen and (max-width:735px){.expanded-intro[data-v-54daa228]{width:87.5%}}[data-v-54daa228] .cols-2{gap:20px 16.66667%}[data-v-54daa228] .cols-3 .column{gap:20px 12.5%}.code-preview[data-v-9acc0234]{position:sticky;overflow-y:auto;-webkit-overflow-scrolling:touch;background-color:var(--background,var(--color-step-background));height:calc(100vh - 3.05882rem)}.code-preview.ide[data-v-9acc0234]{height:100vh}.code-preview[data-v-9acc0234] .code-listing{color:var(--text,var(--color-code-plain))}.code-preview[data-v-9acc0234] pre{font-size:.70588rem;line-height:1.83333;font-weight:400;font-family:Menlo,monospace}.header[data-v-9acc0234]{font-size:.70588rem;line-height:1.33333;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;position:relative;display:flex;justify-content:space-between;align-items:center;width:-webkit-fill-available;width:-moz-available;width:stretch;cursor:pointer;font-weight:600;padding:8px 12px;border-radius:4px 4px 0 0;z-index:1;background:var(--color-runtime-preview-background);color:var(--colors-runtime-preview-text,var(--color-runtime-preview-text))}.header[data-v-9acc0234]:focus{outline-style:none}#app.fromkeyboard .header[data-v-9acc0234]:focus{box-shadow:0 0 0 4px var(--color-focus-color);outline:none;border-color:var(--color-focus-border-color)}.runtime-preview[data-v-9acc0234]{--color-runtime-preview-shadow:rgba(0,0,0,0.4);position:absolute;top:0;right:0;background:var(--color-runtime-preview-background);border-radius:4px;margin:1rem;margin-left:0;transition:width .2s ease-in;box-shadow:0 0 3px 0 var(--color-runtime-preview-shadow)}@media screen{[data-color-scheme=dark] .runtime-preview[data-v-9acc0234]{--color-runtime-preview-shadow:hsla(0,0%,100%,0.4)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .runtime-preview[data-v-9acc0234]{--color-runtime-preview-shadow:hsla(0,0%,100%,0.4)}}@supports not ((width:-webkit-fill-available) or (width:-moz-available) or (width:stretch)){.runtime-preview[data-v-9acc0234]{display:flex;flex-direction:column}}.runtime-preview .runtimve-preview__container[data-v-9acc0234]{border-radius:4px;overflow:hidden}.runtime-preview-ide[data-v-9acc0234]{top:0}.runtime-preview-ide .runtime-preview-asset[data-v-9acc0234] img{background-color:var(--color-runtime-preview-background)}.runtime-preview.collapsed[data-v-9acc0234]{box-shadow:0 0 3px 0 var(--color-runtime-preview-shadow);width:102px}.runtime-preview.collapsed .header[data-v-9acc0234]{border-radius:4px}.runtime-preview.disabled[data-v-9acc0234]{box-shadow:0 0 3px 0 transparent}.runtime-preview.disabled .header[data-v-9acc0234]{color:var(--color-runtime-preview-disabled-text);cursor:auto}.runtime-preview-asset[data-v-9acc0234]{border-radius:0 0 4px 4px}.runtime-preview-asset[data-v-9acc0234] img{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.preview-icon[data-v-9acc0234]{height:.8em;width:.8em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.preview-show[data-v-9acc0234]{transform:scale(-1)}[data-v-5ad4e037] pre{padding:10px 0}.toggle-preview[data-v-d0709828]{color:var(--color-runtime-preview-disabled-text);display:flex;align-items:center}a[data-v-d0709828]{color:var(--url,var(--color-link))}.toggle-text[data-v-d0709828]{display:flex;align-items:center}svg.toggle-icon[data-v-d0709828]{width:1em;height:1em;margin-left:.5em}.mobile-code-preview[data-v-3bee1128]{background-color:var(--background,var(--color-step-background));padding:14px 0}@media only screen and (max-width:735px){.mobile-code-preview[data-v-3bee1128]{display:flex;flex-direction:column}}.runtime-preview-modal-content[data-v-3bee1128]{padding:45px 60px 0 60px;min-width:200px}.runtime-preview-modal-content[data-v-3bee1128] img:not(.file-icon){border-radius:4px;box-shadow:0 0 3px rgba(0,0,0,.4);max-height:80vh;width:auto;display:block;margin-bottom:1rem}.runtime-preview-modal-content .runtime-preview-label[data-v-3bee1128]{font-size:.70588rem;line-height:1.33333;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--color-runtime-preview-text);display:block;text-align:center;padding:.5em}[data-v-3bee1128] .code-listing{color:var(--text,var(--color-code-plain))}[data-v-3bee1128] .full-code-listing{padding-top:60px;min-height:calc(100vh - 60px)}[data-v-3bee1128] pre{font-size:.70588rem;line-height:1.83333;font-weight:400;font-family:Menlo,monospace}.preview-toggle-container[data-v-3bee1128]{align-self:flex-end;margin-right:20px}.step-container[data-v-4abdd121]{margin:0}.step-container[data-v-4abdd121]:not(:last-child){margin-bottom:100px}@media only screen and (max-width:735px){.step-container[data-v-4abdd121]:not(:last-child){margin-bottom:80px}}.step[data-v-4abdd121]{position:relative;border-radius:4px;padding:1rem 2rem;background-color:var(--color-step-background);overflow:hidden;-webkit-mask-image:-webkit-radial-gradient(#fff,#000)}.step[data-v-4abdd121]:before{content:"";position:absolute;top:0;left:0;border:1px solid var(--color-step-focused);background-color:var(--color-step-focused);height:calc(100% - 2px);width:4px;opacity:0;transition:opacity .15s ease-in}.step.focused[data-v-4abdd121],.step[data-v-4abdd121]:focus{outline:none}.step.focused[data-v-4abdd121]:before,.step[data-v-4abdd121]:focus:before{opacity:1}@media only screen and (max-width:735px){.step[data-v-4abdd121]{padding-left:2rem}.step[data-v-4abdd121]:before{opacity:1}}.step-label[data-v-4abdd121]{font-size:.70588rem;line-height:1.33333;font-weight:600;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--colors-text,var(--color-step-text));margin-bottom:.4em}.caption[data-v-4abdd121]{border-top:1px solid;border-color:var(--color-step-caption);padding:1rem 0 0 0;margin-top:1rem}.media-container[data-v-4abdd121]{display:none}@media only screen and (max-width:735px){.step[data-v-4abdd121]{margin:0 .58824rem 1.17647rem .58824rem}.step.focused[data-v-4abdd121],.step[data-v-4abdd121]:focus{outline:none}.media-container[data-v-4abdd121]{display:block;position:relative}.media-container[data-v-4abdd121] img,.media-container[data-v-4abdd121] video{max-height:80vh}[data-v-4abdd121] .asset{padding:0 20px}}.steps[data-v-25d30c2c]{position:relative;font-size:.82353rem;line-height:1.42857;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;display:flex;color:var(--colors-text,var(--color-text))}@media only screen and (max-width:735px){.steps[data-v-25d30c2c]{padding-top:80px}.steps[data-v-25d30c2c]:before{position:absolute;top:0;border-top:1px solid var(--color-fill-gray-tertiary);content:"";width:calc(100% - 2.35294rem);margin:0 1.17647rem}}.content-container[data-v-25d30c2c]{flex:none;margin-right:4.16667%;width:37.5%;margin-top:140px;margin-bottom:94vh}@media only screen and (max-width:735px){.content-container[data-v-25d30c2c]{margin-top:0;margin-bottom:0;height:100%;margin-left:0;margin-right:0;position:relative;width:100%}}.asset-container[data-v-25d30c2c]{flex:none;height:calc(100vh - 3.05882rem);background-color:var(--background,var(--color-step-background));max-width:921px;width:calc(50vw + 8.33333%);position:sticky;top:3.05882rem;transition:margin .1s ease-in-out}@media only screen and (max-width:767px){.asset-container[data-v-25d30c2c]{top:2.82353rem;height:calc(100vh - 2.82353rem)}}.asset-container[data-v-25d30c2c]:not(.for-step-code){overflow-y:auto;-webkit-overflow-scrolling:touch}.asset-container.ide[data-v-25d30c2c]{height:100vh;top:0}@media only screen and (min-width:736px){.asset-container[data-v-25d30c2c]{display:grid}.asset-container>[data-v-25d30c2c]{grid-row:1;grid-column:1;height:calc(100vh - 3.05882rem)}.asset-container.ide>[data-v-25d30c2c]{height:100vh}}.asset-container .step-asset[data-v-25d30c2c]{box-sizing:border-box;padding:0;padding-left:40px;min-height:320px;height:100%}.asset-container .step-asset[data-v-25d30c2c],.asset-container .step-asset[data-v-25d30c2c] picture{height:100%;display:flex;align-items:center}.asset-container .step-asset[data-v-25d30c2c] .video-replay-container{height:100%;display:flex;flex-direction:column;justify-content:center}.asset-container .step-asset[data-v-25d30c2c] img,.asset-container .step-asset[data-v-25d30c2c] video{width:auto;max-height:calc(100vh - 3.05882rem - 80px);max-width:531.6634px;margin:0}@media only screen and (max-width:1250px){.asset-container .step-asset[data-v-25d30c2c] img,.asset-container .step-asset[data-v-25d30c2c] video{max-width:363.66436px}}.asset-container .step-asset[data-v-25d30c2c] .video-replay-container,.asset-container .step-asset[data-v-25d30c2c] img{min-height:320px}.asset-container .step-asset[data-v-25d30c2c] .video-replay-container video{min-height:280px}@media only screen and (max-width:735px){.asset-container[data-v-25d30c2c]{display:none}}.asset-wrapper[data-v-25d30c2c]{width:63.2%;align-self:center;transition:transform .25s ease-out;will-change:transform}.asset-wrapper.ide .step-asset[data-v-25d30c2c] img{background-color:var(--background,var(--color-step-background))}[data-v-25d30c2c] .runtime-preview-asset{display:grid}[data-v-25d30c2c] .runtime-preview-asset>*{grid-row:1;grid-column:1}.interstitial[data-v-25d30c2c]{padding:0 2rem}.interstitial[data-v-25d30c2c]:not(:first-child){margin-top:5.88235rem}.interstitial[data-v-25d30c2c]:not(:last-child){margin-bottom:30px}@media only screen and (max-width:735px){.interstitial[data-v-25d30c2c]{margin-left:auto;margin-right:auto;width:980px;padding:0}}@media only screen and (max-width:735px) and (max-width:1250px){.interstitial[data-v-25d30c2c]{width:692px}}@media only screen and (max-width:735px) and (max-width:735px){.interstitial[data-v-25d30c2c]{width:87.5%}}@media only screen and (max-width:735px){.interstitial[data-v-25d30c2c]:not(:first-child){margin-top:0}}.fade-enter-active[data-v-25d30c2c],.fade-leave-active[data-v-25d30c2c]{transition:opacity .3s ease-in-out}.fade-enter[data-v-25d30c2c],.fade-leave-to[data-v-25d30c2c]{opacity:0}.section[data-v-6b3a0b3a]{padding-top:80px}.sections[data-v-79a75e9e]{margin-left:auto;margin-right:auto;width:980px}@media only screen and (max-width:1250px){.sections[data-v-79a75e9e]{width:692px}}@media only screen and (max-width:735px){.sections[data-v-79a75e9e]{width:87.5%;margin:0;width:100%}}.tutorial[data-v-0f871b08]{background-color:var(--colors-text-background,var(--color-tutorial-background))} \ No newline at end of file diff --git a/docs/css/tutorials-overview.06e8bcf7.css b/docs/css/tutorials-overview.06e8bcf7.css deleted file mode 100644 index 9f65a57..0000000 --- a/docs/css/tutorials-overview.06e8bcf7.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * This source file is part of the Swift.org open source project - * - * Copyright (c) 2021 Apple Inc. and the Swift project authors - * Licensed under Apache License v2.0 with Runtime Library Exception - * - * See https://swift.org/LICENSE.txt for license information - * See https://swift.org/CONTRIBUTORS.txt for Swift project authors - */.tutorials-navigation-link[data-v-6bb99205]{color:var(--color-tutorials-overview-navigation-link);transition:color .3s linear}.tutorials-navigation-link[data-v-6bb99205]:hover{text-decoration:none;transition:none;color:var(--color-tutorials-overview-navigation-link-hover)}.tutorials-navigation-link.active[data-v-6bb99205]{color:var(--color-tutorials-overview-navigation-link-active)}.tutorials-navigation-list[data-v-6f2800d1]{list-style-type:none;margin:0}.tutorials-navigation-list li+li[data-v-6f2800d1]:not(.volume--named){margin-top:24px}.tutorials-navigation-list .volume--named+.volume--named[data-v-6f2800d1]{margin-top:12px}.expand-enter-active,.expand-leave-active{transition:height .3s ease-in-out;overflow:hidden}.expand-enter,.expand-leave-to{height:0}.toggle[data-v-6513d652]{color:#f0f0f0;line-height:21px;display:flex;align-items:center;width:100%;font-weight:600;padding:6px 6px 6px 0;border-bottom:1px solid #2a2a2a;text-decoration:none;box-sizing:border-box}@media only screen and (max-width:767px){.toggle[data-v-6513d652]{padding-right:6px;border-bottom-color:hsla(0,0%,100%,.1)}}.toggle .text[data-v-6513d652]{word-break:break-word}.toggle[data-v-6513d652]:hover{text-decoration:none}.toggle .toggle-icon[data-v-6513d652]{display:inline-block;transition:transform .2s ease-in;height:.4em;width:.4em;margin-left:auto;margin-right:.2em}.collapsed .toggle .toggle-icon[data-v-6513d652]{transform:rotate(45deg)}.collapsed .toggle[data-v-6513d652],.collapsed .toggle[data-v-6513d652]:hover{color:#b0b0b0}.tutorials-navigation-menu-content[data-v-6513d652]{opacity:1;transition:height .2s ease-in,opacity .2s ease-in}.collapsed .tutorials-navigation-menu-content[data-v-6513d652]{height:0;opacity:0}.tutorials-navigation-menu-content .tutorials-navigation-list[data-v-6513d652]{padding:24px 0 12px 0}.tutorials-navigation[data-v-0cbd8adb]{font-size:1rem;line-height:1.23529;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.nav-title-content[data-v-60ea3af8]{max-width:100%}.title[data-v-60ea3af8]{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:inline-block;vertical-align:top;max-width:296px}@media only screen and (max-width:1023px){.title[data-v-60ea3af8]{max-width:205px}}@media only screen and (max-width:767px){.title[data-v-60ea3af8]{flex-basis:fill;display:initial;vertical-align:initial;max-width:none}}.subhead[data-v-60ea3af8]{color:var(--color-nav-root-subhead)}.theme-dark .subhead[data-v-60ea3af8]{color:var(--color-nav-dark-root-subhead)}.nav[data-v-1001350c] .nav-menu{padding-top:0}.nav[data-v-1001350c] .nav-menu .nav-menu-items{margin-left:auto}@media only screen and (min-width:768px){.nav[data-v-1001350c] .nav-menu .nav-menu-items .in-page-navigation{display:none}}@media only screen and (min-width:320px) and (max-width:735px){.nav[data-v-1001350c] .nav-menu .nav-menu-items{padding:18px 0 40px}}.replay-button[data-v-59608016]{display:flex;align-items:center;justify-content:center;cursor:pointer;visibility:hidden;margin-top:.5rem;-webkit-tap-highlight-color:transparent}.replay-button.visible[data-v-59608016]{visibility:visible}.replay-button svg.replay-icon[data-v-59608016]{height:12px;width:12px;margin-left:.3em}[data-v-1b5cc854] img,[data-v-1b5cc854] video{display:block;margin-left:auto;margin-right:auto;-o-object-fit:contain;object-fit:contain;max-width:100%}.hero[data-v-fc7f508c]{margin-left:auto;margin-right:auto;width:980px;padding-bottom:4.70588rem;padding-top:4.70588rem}@media only screen and (max-width:1250px){.hero[data-v-fc7f508c]{width:692px}}@media only screen and (max-width:735px){.hero[data-v-fc7f508c]{width:87.5%}}.copy-container[data-v-fc7f508c]{margin:0 auto;text-align:center;width:720px}.title[data-v-fc7f508c]{font-size:2.82353rem;line-height:1.08333;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--color-tutorials-overview-content)}@media only screen and (max-width:1250px){.title[data-v-fc7f508c]{font-size:2.35294rem;line-height:1.1;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (max-width:735px){.title[data-v-fc7f508c]{font-size:1.88235rem;line-height:1.125;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.content[data-v-fc7f508c]{font-size:1.23529rem;line-height:1.38095;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--color-tutorials-overview-content)}@media only screen and (max-width:735px){.content[data-v-fc7f508c]{font-size:1.11765rem;line-height:1.42105;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.meta[data-v-fc7f508c]{color:var(--color-tutorials-overview-content-alt);align-items:center;display:flex;justify-content:center}.meta-content[data-v-fc7f508c]{font-size:.82353rem;line-height:1.42857;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.meta .timer-icon[data-v-fc7f508c]{margin-right:.35294rem;height:.94118rem;width:.94118rem;fill:var(--color-tutorials-overview-icon)}@media only screen and (max-width:735px){.meta .timer-icon[data-v-fc7f508c]{margin-right:.29412rem;height:.82353rem;width:.82353rem}}.meta .time[data-v-fc7f508c]{font-size:1.11765rem;line-height:1.21053;font-weight:600;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}@media only screen and (max-width:735px){.meta .time[data-v-fc7f508c]{font-size:1rem;line-height:1.11765;font-weight:600;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.title+.content[data-v-fc7f508c]{margin-top:1.47059rem}.content+.meta[data-v-fc7f508c]{margin-top:1.17647rem}.button-cta[data-v-fc7f508c]{margin-top:1.76471rem}*+.asset[data-v-fc7f508c]{margin-top:4.11765rem}@media only screen and (max-width:1250px){.copy-container[data-v-fc7f508c]{width:636px}}@media only screen and (max-width:735px){.hero[data-v-fc7f508c]{padding-bottom:1.76471rem;padding-top:2.35294rem}.copy-container[data-v-fc7f508c]{width:100%}.title+.content[data-v-fc7f508c]{margin-top:.88235rem}.button-cta[data-v-fc7f508c]{margin-top:1.41176rem}*+.asset[data-v-fc7f508c]{margin-top:2.23529rem}}.image[data-v-14577284]{margin-bottom:10px}.name[data-v-14577284]{font-size:1.88235rem;line-height:1.125;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:#f0f0f0;word-break:break-word}@media only screen and (max-width:1250px){.name[data-v-14577284]{font-size:1.64706rem;line-height:1.14286;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (max-width:735px){.name[data-v-14577284]{font-size:1.41176rem;line-height:1.16667;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.content[data-v-14577284]{font-size:1rem;line-height:1.23529;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--color-tutorials-overview-content-alt);margin-top:10px}.volume-name[data-v-14577284]{padding:50px 60px;text-align:center;background:#161616;margin:2px 0}@media only screen and (max-width:735px){.volume-name[data-v-14577284]{padding:40px 20px}}.document-icon[data-v-56114692]{margin-left:-3px}.tile[data-v-86db603a]{background:#161616;padding:40px 30px;color:var(--color-tutorials-overview-content-alt)}.content[data-v-86db603a] a,a[data-v-86db603a]{color:var(--colors-link,var(--color-tutorials-overview-link))}.icon[data-v-86db603a]{display:block;height:1.47059rem;line-height:1.47059rem;margin-bottom:.58824rem;width:1.47059rem}.icon[data-v-86db603a] svg.svg-icon{width:100%;max-height:100%;fill:var(--color-tutorials-overview-icon)}.icon[data-v-86db603a] svg.svg-icon .svg-icon-stroke{stroke:var(--color-tutorials-overview-content-alt)}.title[data-v-86db603a]{font-size:1.23529rem;line-height:1.19048;font-weight:600;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;margin-bottom:.8em}.content[data-v-86db603a],.link[data-v-86db603a]{font-size:.82353rem;line-height:1.42857;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.content[data-v-86db603a]{color:var(--color-tutorials-overview-content-alt)}.link[data-v-86db603a]{display:block;margin-top:1.17647rem}.link .link-icon[data-v-86db603a]{margin-left:.2em;width:.6em;height:.6em}[data-v-86db603a] .content ul{list-style-type:none;margin-left:0;font-size:.82353rem;line-height:1.28571;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}[data-v-86db603a] .content ul li:before{content:"\200B";position:absolute}[data-v-86db603a] .content li+li{margin-top:8px}@media only screen and (max-width:735px){.tile[data-v-86db603a]{padding:1.76471rem 1.17647rem}}.tile-group[data-v-015f9f13]{display:grid;grid-column-gap:2px;grid-row-gap:2px}.tile-group.count-1[data-v-015f9f13]{grid-template-columns:1fr;text-align:center}.tile-group.count-1[data-v-015f9f13] .icon{margin-left:auto;margin-right:auto}.tile-group.count-2[data-v-015f9f13]{grid-template-columns:repeat(2,1fr)}.tile-group.count-3[data-v-015f9f13]{grid-template-columns:repeat(3,1fr)}.tile-group.count-4[data-v-015f9f13]{grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(2,auto)}.tile-group.count-5[data-v-015f9f13]{grid-template-columns:repeat(6,1fr);grid-template-rows:repeat(2,auto)}.tile-group.count-5 .tile[data-v-015f9f13]{grid-column-end:span 2}.tile-group.count-5 .tile[data-v-015f9f13]:nth-of-type(-n+2){grid-column-end:span 3}.tile-group.count-6[data-v-015f9f13]{grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(3,auto)}@media only screen and (min-width:768px) and (max-width:1250px){.tile-group.tile-group[data-v-015f9f13]{grid-template-columns:1fr;grid-template-rows:auto}}@media only screen and (max-width:735px){.tile-group.count-1[data-v-015f9f13],.tile-group.count-2[data-v-015f9f13],.tile-group.count-3[data-v-015f9f13],.tile-group.count-4[data-v-015f9f13],.tile-group.count-5[data-v-015f9f13],.tile-group.count-6[data-v-015f9f13]{grid-template-columns:1fr;grid-template-rows:auto}}.title[data-v-49ba6f62]{font-size:1.88235rem;line-height:1.125;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:#f0f0f0}@media only screen and (max-width:1250px){.title[data-v-49ba6f62]{font-size:1.64706rem;line-height:1.14286;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}@media only screen and (max-width:735px){.title[data-v-49ba6f62]{font-size:1.41176rem;line-height:1.16667;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.content[data-v-49ba6f62]{font-size:1rem;line-height:1.23529;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:#b0b0b0;margin-top:10px}.topic-list[data-v-da979188]{list-style-type:none;margin:50px 0 0 0;position:relative}.topic-list li[data-v-da979188]:before{content:"\200B";position:absolute}.topic-list[data-v-da979188]:before{content:"";border-left:1px solid var(--color-fill-quaternary);display:block;height:calc(100% - .88235rem);left:.88235rem;position:absolute;top:50%;transform:translateY(-50%);width:0}.topic[data-v-da979188]{font-size:1rem;line-height:1.47059;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;display:flex;align-items:flex-start}@media only screen and (max-width:735px){.topic[data-v-da979188]{font-size:.82353rem;line-height:1.28571;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}}.topic+.topic[data-v-da979188]{margin-top:.58824rem}.topic .topic-icon[data-v-da979188]{background-color:var(--color-fill-quaternary);border-radius:50%;flex-shrink:0;height:1.76471rem;width:1.76471rem;margin-right:1.17647rem;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;padding:.47059rem;box-sizing:border-box;display:flex;justify-content:center;align-items:center}.topic .topic-icon svg[data-v-da979188]{fill:var(--color-tutorials-overview-icon);max-width:100%;max-height:100%;width:100%}.container[data-v-da979188]{align-items:baseline;display:flex;justify-content:space-between;width:100%;padding-top:.11765rem}.container[data-v-da979188]:hover{text-decoration:none}.container:hover .link[data-v-da979188]{text-decoration:underline}.timer-icon[data-v-da979188]{margin-right:.29412rem;height:.70588rem;width:.70588rem;fill:var(--color-tutorials-overview-icon)}.time[data-v-da979188]{font-size:.82353rem;line-height:1.28571;font-weight:400;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:var(--color-tutorials-overview-content-alt);align-items:center;display:inline-flex}.link[data-v-da979188]{padding-right:.58824rem;color:var(--colors-link,var(--color-tutorials-overview-link))}@media only screen and (min-width:768px) and (max-width:1250px){.topic-list[data-v-da979188]{margin-top:2.35294rem}}@media only screen and (max-width:735px){.topic-list[data-v-da979188]{margin-top:1.76471rem}.topic[data-v-da979188]{height:auto;align-items:flex-start}.topic.no-time-estimate[data-v-da979188]{align-items:center}.topic.no-time-estimate .topic-icon[data-v-da979188]{align-self:flex-start;top:0}.topic+.topic[data-v-da979188]{margin-top:1.17647rem}.topic .topic-icon[data-v-da979188]{top:.29412rem;margin-right:.76471rem}.container[data-v-da979188]{flex-wrap:wrap;padding-top:0}.link[data-v-da979188],.time[data-v-da979188]{flex-basis:100%}.time[data-v-da979188]{margin-top:.29412rem}}.chapter[data-v-1d13969f]:focus{outline:none!important}.info[data-v-1d13969f]{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between}.name[data-v-1d13969f]{font-size:1.23529rem;line-height:1.19048;font-weight:600;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:#f0f0f0}.name-text[data-v-1d13969f]{word-break:break-word}.eyebrow[data-v-1d13969f]{font-size:1rem;line-height:1.23529;font-weight:400;color:var(--color-tutorials-overview-eyebrow);display:block;font-weight:600;margin-bottom:5px}.content[data-v-1d13969f],.eyebrow[data-v-1d13969f]{font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.content[data-v-1d13969f]{font-size:.82353rem;line-height:1.42857;font-weight:400;color:var(--color-tutorials-overview-content-alt)}.asset[data-v-1d13969f]{flex:0 0 190px}.intro[data-v-1d13969f]{flex:0 1 360px}@media only screen and (min-width:768px) and (max-width:1250px){.asset[data-v-1d13969f]{flex:0 0 130px}.intro[data-v-1d13969f]{flex:0 1 260px}}@media only screen and (max-width:767px){.intro[data-v-1d13969f]{flex:0 1 340px}}@media only screen and (max-width:735px){.info[data-v-1d13969f]{display:block;text-align:center}.asset[data-v-1d13969f]{margin:0 45px}.eyebrow[data-v-1d13969f]{margin-bottom:7px}.intro[data-v-1d13969f]{margin-top:40px}}.tile[data-v-2129f58c]{background:#161616;margin:2px 0;padding:50px 60px}.asset[data-v-2129f58c]{margin-bottom:10px}@media only screen and (min-width:768px) and (max-width:1250px){.tile[data-v-2129f58c]{padding:40px 30px}}@media only screen and (max-width:735px){.volume[data-v-2129f58c]{border-radius:0}.tile[data-v-2129f58c]{padding:40px 20px}}.learning-path[data-v-48bfa85c]{background:#000;padding:4.70588rem 0}.main-container[data-v-48bfa85c]{margin-left:auto;margin-right:auto;width:980px;align-items:stretch;display:flex;justify-content:space-between}@media only screen and (max-width:1250px){.main-container[data-v-48bfa85c]{width:692px}}@media only screen and (max-width:735px){.main-container[data-v-48bfa85c]{width:87.5%}}.ide .main-container[data-v-48bfa85c]{justify-content:center}.secondary-content-container[data-v-48bfa85c]{flex:0 0 200px;width:200px}.tutorials-navigation[data-v-48bfa85c]{position:sticky;top:7.76471rem}.primary-content-container[data-v-48bfa85c]{flex:0 1 720px;max-width:100%}.content-sections-container .content-section[data-v-48bfa85c]{border-radius:12px;overflow:hidden}.content-sections-container .content-section+.content-section[data-v-48bfa85c]{margin-top:1.17647rem}@media only screen and (min-width:768px) and (max-width:1250px){.learning-path[data-v-48bfa85c]{padding:2.35294rem 0}.primary-content-container[data-v-48bfa85c]{flex-basis:auto;margin-left:1.29412rem}.secondary-content-container[data-v-48bfa85c]{flex:0 0 180px;width:180px}}@media only screen and (max-width:767px){.secondary-content-container[data-v-48bfa85c]{display:none}}@media only screen and (max-width:735px){.content-sections-container .content-section[data-v-48bfa85c]{border-radius:0}.content-sections-container .content-section.volume[data-v-48bfa85c]{margin-top:1.17647rem}.learning-path[data-v-48bfa85c]{padding:0}.main-container[data-v-48bfa85c]{width:100%}}.tutorials-overview[data-v-53888684]{height:100%}.tutorials-overview .radial-gradient[data-v-53888684]{margin-top:-3.05882rem;padding-top:3.05882rem;background:var(--color-tutorials-overview-background)}@media only screen and (max-width:735px){.tutorials-overview .radial-gradient[data-v-53888684]{margin-top:-2.82353rem;padding-top:2.82353rem}}@-moz-document url-prefix(){.tutorials-overview .radial-gradient{background:#111!important}} \ No newline at end of file diff --git a/docs/css/tutorials-overview.6eb589ed.css b/docs/css/tutorials-overview.6eb589ed.css new file mode 100644 index 0000000..05f0105 --- /dev/null +++ b/docs/css/tutorials-overview.6eb589ed.css @@ -0,0 +1,9 @@ +/*! + * This source file is part of the Swift.org open source project + * + * Copyright (c) 2021 Apple Inc. and the Swift project authors + * Licensed under Apache License v2.0 with Runtime Library Exception + * + * See https://swift.org/LICENSE.txt for license information + * See https://swift.org/CONTRIBUTORS.txt for Swift project authors + */.tutorials-navigation-link[data-v-e9f9b59c]{color:var(--color-tutorials-overview-navigation-link);transition:color .3s linear}.tutorials-navigation-link[data-v-e9f9b59c]:hover{text-decoration:none;transition:none;color:var(--color-tutorials-overview-navigation-link-hover)}.tutorials-navigation-link.active[data-v-e9f9b59c]{color:var(--color-tutorials-overview-navigation-link-active)}.tutorials-navigation-list[data-v-4e0180fa]{list-style-type:none;margin:0}.tutorials-navigation-list li+li[data-v-4e0180fa]:not(.volume--named){margin-top:24px}.tutorials-navigation-list .volume--named+.volume--named[data-v-4e0180fa]{margin-top:12px}.expand-enter-active,.expand-leave-active{transition:height .3s ease-in-out;overflow:hidden}.expand-enter,.expand-leave-to{height:0}.toggle[data-v-489416f8]{color:#f0f0f0;line-height:21px;display:flex;align-items:center;width:100%;font-weight:600;padding:6px 6px 6px 0;border-bottom:1px solid #2a2a2a;text-decoration:none;box-sizing:border-box}@media only screen and (max-width:767px){.toggle[data-v-489416f8]{padding-right:6px;border-bottom-color:hsla(0,0%,100%,.1)}}.toggle .text[data-v-489416f8]{word-break:break-word}.toggle[data-v-489416f8]:hover{text-decoration:none}.toggle .toggle-icon[data-v-489416f8]{display:inline-block;transition:transform .2s ease-in;height:.4em;width:.4em;margin-left:auto;margin-right:.2em}.collapsed .toggle .toggle-icon[data-v-489416f8]{transform:rotate(45deg)}.collapsed .toggle[data-v-489416f8],.collapsed .toggle[data-v-489416f8]:hover{color:#b0b0b0}.tutorials-navigation-menu-content[data-v-489416f8]{opacity:1;transition:height .2s ease-in,opacity .2s ease-in}.collapsed .tutorials-navigation-menu-content[data-v-489416f8]{height:0;opacity:0}.tutorials-navigation-menu-content .tutorials-navigation-list[data-v-489416f8]{padding:24px 0 12px 0}.tutorials-navigation[data-v-79093ed6]{font-size:1rem;line-height:1.2352941176;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.nav-title-content[data-v-854b4dd6]{max-width:100%}.title[data-v-854b4dd6]{color:var(--color-nav-root-title,currentColor);text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:inline-block;vertical-align:top;max-width:296px}@media only screen and (max-width:1023px){.title[data-v-854b4dd6]{max-width:205px}}@media only screen and (max-width:767px){.title[data-v-854b4dd6]{flex-basis:fill;display:initial;vertical-align:initial;max-width:none}}.subhead[data-v-854b4dd6]{color:var(--color-nav-root-subhead)}.theme-dark .subhead[data-v-854b4dd6]{color:var(--color-nav-dark-root-subhead)}.nav[data-v-54bcce6d] .nav-menu{padding-top:0}.nav[data-v-54bcce6d] .nav-menu .nav-menu-items{margin-left:auto}@media only screen and (min-width:768px){.nav[data-v-54bcce6d] .nav-menu .nav-menu-items .in-page-navigation{display:none}}@media only screen and (min-width:320px)and (max-width:735px){.nav[data-v-54bcce6d] .nav-menu .nav-menu-items{padding:18px 0 40px}}.hero[data-v-383dab71]{margin-left:auto;margin-right:auto;width:980px;padding-bottom:4.7058823529rem;padding-top:4.7058823529rem}@media only screen and (max-width:1250px){.hero[data-v-383dab71]{width:692px}}@media only screen and (max-width:735px){.hero[data-v-383dab71]{width:87.5%}}@media only screen and (max-width:320px){.hero[data-v-383dab71]{width:215px}}.copy-container[data-v-383dab71]{margin:0 auto;text-align:center;width:720px}.title[data-v-383dab71]{font-size:2.8235294118rem;line-height:1.0833333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-tutorials-overview-content)}@media only screen and (max-width:1250px){.title[data-v-383dab71]{font-size:2.3529411765rem;line-height:1.1;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){.title[data-v-383dab71]{font-size:1.8823529412rem;line-height:1.125;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.content[data-v-383dab71]{font-size:1.2352941176rem;line-height:1.380952381;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-tutorials-overview-content)}@media only screen and (max-width:735px){.content[data-v-383dab71]{font-size:1.1176470588rem;line-height:1.4210526316;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.meta[data-v-383dab71]{color:var(--color-tutorials-overview-content-alt);align-items:center;display:flex;justify-content:center}.meta-content[data-v-383dab71]{font-size:.8235294118rem;line-height:1.4285714286;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.meta .timer-icon[data-v-383dab71]{margin-right:.3529411765rem;height:16px;width:16px;fill:var(--color-tutorials-overview-icon)}@media only screen and (max-width:735px){.meta .timer-icon[data-v-383dab71]{margin-right:.2941176471rem;height:.8235294118rem;width:.8235294118rem}}.meta .time[data-v-383dab71]{font-size:1.1176470588rem;line-height:1.2105263158;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}@media only screen and (max-width:735px){.meta .time[data-v-383dab71]{font-size:1rem;line-height:1.1176470588;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.title+.content[data-v-383dab71]{margin-top:1.4705882353rem}.content+.meta[data-v-383dab71]{margin-top:1.1764705882rem}.button-cta[data-v-383dab71]{margin-top:1.7647058824rem}*+.asset[data-v-383dab71]{margin-top:4.1176470588rem}@media only screen and (max-width:1250px){.copy-container[data-v-383dab71]{width:636px}}@media only screen and (max-width:735px){.hero[data-v-383dab71]{padding-bottom:1.7647058824rem;padding-top:2.3529411765rem}.copy-container[data-v-383dab71]{width:100%}.title+.content[data-v-383dab71]{margin-top:.8823529412rem}.button-cta[data-v-383dab71]{margin-top:1.4117647059rem}*+.asset[data-v-383dab71]{margin-top:2.2352941176rem}}.image[data-v-569db166]{margin-bottom:10px}.name[data-v-569db166]{font-size:1.8823529412rem;line-height:1.125;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-tutorials-overview-header-text,#f0f0f0);word-break:break-word}@media only screen and (max-width:1250px){.name[data-v-569db166]{font-size:1.6470588235rem;line-height:1.1428571429;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){.name[data-v-569db166]{font-size:1.4117647059rem;line-height:1.1666666667;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.content[data-v-569db166]{font-size:1rem;line-height:1.2352941176;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-tutorials-overview-content-alt);margin-top:10px}.volume-name[data-v-569db166]{padding:50px 60px;text-align:center;background:var(--color-tutorials-overview-fill-secondary,#161616);margin:2px 0}@media only screen and (max-width:735px){.volume-name[data-v-569db166]{padding:40px 20px}}.document-icon[data-v-3a80772b]{margin-left:-3px}.tile[data-v-74dbeb68]{background:var(--color-tutorials-overview-fill-secondary,#161616);padding:40px 30px;color:var(--color-tutorials-overview-content-alt)}.content[data-v-74dbeb68] a,a[data-v-74dbeb68]{color:var(--colors-link,var(--color-tutorials-overview-link))}.icon[data-v-74dbeb68]{display:block;height:1.4705882353rem;line-height:1.4705882353rem;margin-bottom:.5882352941rem;width:1.4705882353rem}.icon[data-v-74dbeb68] svg.svg-icon{width:100%;max-height:100%;fill:var(--color-tutorials-overview-icon)}.icon[data-v-74dbeb68] svg.svg-icon .svg-icon-stroke{stroke:var(--color-tutorials-overview-content-alt)}.title[data-v-74dbeb68]{font-size:1.2352941176rem;line-height:1.1904761905;font-weight:600;margin-bottom:.8em}.content[data-v-74dbeb68],.link[data-v-74dbeb68],.title[data-v-74dbeb68]{font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.content[data-v-74dbeb68],.link[data-v-74dbeb68]{font-size:.8235294118rem;line-height:1.4285714286;font-weight:400}.content[data-v-74dbeb68]{color:var(--color-tutorials-overview-content-alt)}.link[data-v-74dbeb68]{display:block;margin-top:1.1764705882rem}.link .link-icon[data-v-74dbeb68]{margin-left:.2em;width:.6em;height:.6em}[data-v-74dbeb68] .inline-link{text-decoration:none}[data-v-74dbeb68] .content ul{list-style-type:none;margin-left:0;font-size:.8235294118rem;line-height:1.2857142857;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}[data-v-74dbeb68] .content ul li:before{content:"";position:absolute}[data-v-74dbeb68] .content li+li{margin-top:8px}@media only screen and (max-width:735px){.tile[data-v-74dbeb68]{padding:1.7647058824rem 1.1764705882rem}}.tile-group[data-v-4cacce0a]{display:grid;grid-column-gap:2px;grid-row-gap:2px}.tile-group.count-1[data-v-4cacce0a]{grid-template-columns:1fr;text-align:center}.tile-group.count-1[data-v-4cacce0a] .icon{margin-left:auto;margin-right:auto}.tile-group.count-2[data-v-4cacce0a]{grid-template-columns:repeat(2,1fr)}.tile-group.count-3[data-v-4cacce0a]{grid-template-columns:repeat(3,1fr)}.tile-group.count-4[data-v-4cacce0a]{grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(2,auto)}.tile-group.count-5[data-v-4cacce0a]{grid-template-columns:repeat(6,1fr);grid-template-rows:repeat(2,auto)}.tile-group.count-5 .tile[data-v-4cacce0a]{grid-column-end:span 2}.tile-group.count-5 .tile[data-v-4cacce0a]:nth-of-type(-n+2){grid-column-end:span 3}.tile-group.count-6[data-v-4cacce0a]{grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(3,auto)}@media only screen and (min-width:768px)and (max-width:1250px){.tile-group.tile-group[data-v-4cacce0a]{grid-template-columns:1fr;grid-template-rows:auto}}@media only screen and (max-width:735px){.tile-group.count-1[data-v-4cacce0a],.tile-group.count-2[data-v-4cacce0a],.tile-group.count-3[data-v-4cacce0a],.tile-group.count-4[data-v-4cacce0a],.tile-group.count-5[data-v-4cacce0a],.tile-group.count-6[data-v-4cacce0a]{grid-template-columns:1fr;grid-template-rows:auto}}.title[data-v-7f8022c1]{font-size:1.8823529412rem;line-height:1.125;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:#f0f0f0}@media only screen and (max-width:1250px){.title[data-v-7f8022c1]{font-size:1.6470588235rem;line-height:1.1428571429;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}@media only screen and (max-width:735px){.title[data-v-7f8022c1]{font-size:1.4117647059rem;line-height:1.1666666667;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.content[data-v-7f8022c1]{font-size:1rem;line-height:1.2352941176;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:#b0b0b0;margin-top:10px}.topic-list[data-v-0589dc3b]{list-style-type:none;margin:50px 0 0 0;position:relative}.topic-list li[data-v-0589dc3b]:before{content:"";position:absolute}.topic-list[data-v-0589dc3b]:before{content:"";border-left:1px solid var(--color-fill-quaternary);display:block;height:calc(100% - .88235rem);left:.8823529412rem;position:absolute;top:50%;transform:translateY(-50%);width:0}.topic[data-v-0589dc3b]{font-size:1rem;line-height:1.4705882353;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);display:flex;align-items:flex-start}@media only screen and (max-width:735px){.topic[data-v-0589dc3b]{font-size:.8235294118rem;line-height:1.2857142857;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}}.topic+.topic[data-v-0589dc3b]{margin-top:.5882352941rem}.topic .topic-icon[data-v-0589dc3b]{background-color:var(--color-fill-quaternary);border-radius:50%;flex-shrink:0;height:1.7647058824rem;width:1.7647058824rem;margin-right:1.1764705882rem;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;padding:.4705882353rem;box-sizing:border-box;display:flex;justify-content:center;align-items:center}.topic .topic-icon svg[data-v-0589dc3b]{fill:var(--color-tutorials-overview-icon);max-width:100%;max-height:100%;width:100%}.container[data-v-0589dc3b]{align-items:baseline;display:flex;justify-content:space-between;width:100%;padding-top:.1176470588rem}.container[data-v-0589dc3b]:hover{text-decoration:none}.container:hover .link[data-v-0589dc3b]{text-decoration:underline;text-underline-position:under}.timer-icon[data-v-0589dc3b]{margin-right:.2941176471rem;height:.7058823529rem;width:.7058823529rem;fill:var(--color-tutorials-overview-icon)}.time[data-v-0589dc3b]{font-size:.8235294118rem;line-height:1.2857142857;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-tutorials-overview-content-alt);align-items:center;display:inline-flex}.link[data-v-0589dc3b]{padding-right:.5882352941rem;color:var(--colors-link,var(--color-tutorials-overview-link))}@media only screen and (min-width:768px)and (max-width:1250px){.topic-list[data-v-0589dc3b]{margin-top:2.3529411765rem}}@media only screen and (max-width:735px){.topic-list[data-v-0589dc3b]{margin-top:1.7647058824rem}.topic[data-v-0589dc3b]{height:auto;align-items:flex-start}.topic.no-time-estimate[data-v-0589dc3b]{align-items:center}.topic.no-time-estimate .topic-icon[data-v-0589dc3b]{align-self:flex-start;top:0}.topic+.topic[data-v-0589dc3b]{margin-top:1.1764705882rem}.topic .topic-icon[data-v-0589dc3b]{top:.2941176471rem;margin-right:.7647058824rem}.container[data-v-0589dc3b]{flex-wrap:wrap;padding-top:0}.link[data-v-0589dc3b],.time[data-v-0589dc3b]{flex-basis:100%}.time[data-v-0589dc3b]{margin-top:.2941176471rem}}.chapter[data-v-7468bc5e]:focus{outline:none!important}.info[data-v-7468bc5e]{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between}.name[data-v-7468bc5e]{font-size:1.2352941176rem;line-height:1.1904761905;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-tutorials-overview-header-text,#f0f0f0)}.name-text[data-v-7468bc5e]{word-break:break-word}.eyebrow[data-v-7468bc5e]{font-size:1rem;line-height:1.2352941176;font-weight:400;color:var(--color-tutorials-overview-eyebrow);display:block;font-weight:600;margin-bottom:5px}.content[data-v-7468bc5e],.eyebrow[data-v-7468bc5e]{font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.content[data-v-7468bc5e]{font-size:.8235294118rem;line-height:1.4285714286;font-weight:400;color:var(--color-tutorials-overview-content-alt)}.asset[data-v-7468bc5e]{flex:0 0 190px}.intro[data-v-7468bc5e]{flex:0 1 360px}@media only screen and (min-width:768px)and (max-width:1250px){.asset[data-v-7468bc5e]{flex:0 0 130px}.intro[data-v-7468bc5e]{flex:0 1 260px}}@media only screen and (max-width:767px){.intro[data-v-7468bc5e]{flex:0 1 340px}}@media only screen and (max-width:735px){.info[data-v-7468bc5e]{display:block;text-align:center}.asset[data-v-7468bc5e]{margin:0 45px}.eyebrow[data-v-7468bc5e]{margin-bottom:7px}.intro[data-v-7468bc5e]{margin-top:40px}}.tile[data-v-540dbf10]{background:var(--color-tutorials-overview-fill-secondary,#161616);margin:2px 0;padding:50px 60px}.asset[data-v-540dbf10]{margin-bottom:10px}@media only screen and (min-width:768px)and (max-width:1250px){.tile[data-v-540dbf10]{padding:40px 30px}}@media only screen and (max-width:735px){.volume[data-v-540dbf10]{border-radius:0}.tile[data-v-540dbf10]{padding:40px 20px}}.learning-path[data-v-69a72bbc]{background:var(--color-tutorials-overview-fill,#000);padding:4.7058823529rem 0}.main-container[data-v-69a72bbc]{margin-left:auto;margin-right:auto;width:980px;align-items:stretch;display:flex;justify-content:space-between}@media only screen and (max-width:1250px){.main-container[data-v-69a72bbc]{width:692px}}@media only screen and (max-width:735px){.main-container[data-v-69a72bbc]{width:87.5%}}@media only screen and (max-width:320px){.main-container[data-v-69a72bbc]{width:215px}}.ide .main-container[data-v-69a72bbc]{justify-content:center}.secondary-content-container[data-v-69a72bbc]{flex:0 0 200px;width:200px}.tutorials-navigation[data-v-69a72bbc]{position:sticky;top:7.7647058824rem}.primary-content-container[data-v-69a72bbc]{flex:0 1 720px;max-width:100%}.content-sections-container .content-section[data-v-69a72bbc]{border-radius:12px;overflow:hidden}.content-sections-container .content-section+.content-section[data-v-69a72bbc]{margin-top:1.1764705882rem}@media only screen and (min-width:768px)and (max-width:1250px){.learning-path[data-v-69a72bbc]{padding:2.3529411765rem 0}.primary-content-container[data-v-69a72bbc]{flex-basis:auto;margin-left:1.2941176471rem}.secondary-content-container[data-v-69a72bbc]{flex:0 0 180px;width:180px}}@media only screen and (max-width:767px){.secondary-content-container[data-v-69a72bbc]{display:none}}@media only screen and (max-width:735px){.content-sections-container .content-section[data-v-69a72bbc]{border-radius:0}.content-sections-container .content-section.volume[data-v-69a72bbc]{margin-top:1.1764705882rem}.learning-path[data-v-69a72bbc]{padding:0}.main-container[data-v-69a72bbc]{width:100%}}.tutorials-overview[data-v-40c62c57]{background:#000;flex:1;height:100%}.tutorials-overview .radial-gradient[data-v-40c62c57]{margin-top:-3.0588235294rem;padding-top:3.0588235294rem;background:var(--color-tutorials-overview-fill-secondary,var(--color-tutorials-overview-background))}@media only screen and (max-width:735px){.tutorials-overview .radial-gradient[data-v-40c62c57]{margin-top:-2.8235294118rem;padding-top:2.8235294118rem}}@-moz-document url-prefix(){.tutorials-overview .radial-gradient[data-v-40c62c57]{background:#111!important}} \ No newline at end of file diff --git a/docs/data/documentation/boutique.json b/docs/data/documentation/boutique.json index e95dce9..1c035cb 100644 --- a/docs/data/documentation/boutique.json +++ b/docs/data/documentation/boutique.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"content","content":[{"anchor":"Overview","level":2,"type":"heading","text":"Overview"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Boutique is a simple but powerful persistence library, and so much more. With Boutique’s dual-layered memory + disk caching architecture Boutique provides a way to build SwiftUI, UIKit, and AppKit apps that update in real time with full offline storage in only a few lines of code using an incredibly simple API."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Boutique is built atop "},{"type":"reference","isActive":true,"identifier":"https:\/\/github.com\/mergesort\/Bodega"},{"type":"text","text":", and below is a demo project that demonstrates the ideal Boutique app, along with many useful techniques you can apply to other SwiftUI apps."}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"reference","isActive":true,"identifier":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo"}]}]}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"You’ll notice that it looks almost identical to any other SwiftUI app, an explicit goal of Boutique. Boutique stays as far away as it can from your app’s logic as it can, allowing you to write the app you want to write, with full offline support and realtime state updates that propagate to all of your views in only a few lines of code. You can read more about the thinking behind Boutique and my preference towards a Model View Controller Store architecture in this "},{"type":"reference","isActive":true,"identifier":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store"},{"type":"text","text":", but Boutique should work with any architecture."}]},{"anchor":"Getting-Started","level":2,"type":"heading","text":"Getting Started"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Boutique only has one concept you need to understand. When you save data to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" your data will be persisted automatically for you and exposed as a regular Swift array. The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":", @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":", and @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrappers work the same way, but instead of an array when you call "},{"type":"codeVoice","code":"$storedValue.set(value)"},{"type":"text","text":" a singular Swift value will be saved. You’ll never have to think about databases, everything in your app is a regular Swift array or value using your app’s models, with straightforward code that looks like any other app."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"You may be familiar with the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" from "},{"type":"reference","isActive":true,"identifier":"https:\/\/redux.js.org\/"},{"type":"text","text":" or "},{"type":"reference","isActive":true,"identifier":"https:\/\/github.com\/pointfreeco\/swift-composable-architecture"},{"type":"text","text":", but unlike those frameworks you won’t need to worry about adding Actions or Reducers. With this "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" implementation all your data is persisted for you automatically, no additional code required. This allows you to build realtime updating apps with full offline support in an incredibly simple and straightforward manner."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"If you’d like to explore these core concepts you’ll be up and running in no time."}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Using-Stores"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/The-@Stored-Family-Of-Property-Wrappers"}]}]}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Since Boutique is built atop Bodega, learning more about "},{"overridingTitleInlineContent":[{"type":"text","text":"Bodega"}],"isActive":true,"type":"reference","identifier":"https:\/\/github.com\/mergesort\/Bodega","overridingTitle":"Bodega"},{"type":"text","text":" may be helpful, especially to understand how a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"’s "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" works."}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"reference","isActive":true,"identifier":"https:\/\/build.ms\/bodega\/docs"}]}]}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"kind":"symbol","metadata":{"roleHeading":"Framework","externalID":"Boutique","title":"Boutique","symbolKind":"module","role":"collection","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[[]]},"topicSections":[{"title":"Articles","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/The-@Stored-Family-Of-Property-Wrappers","doc:\/\/Boutique\/documentation\/Boutique\/Using-Stores"],"generated":true},{"title":"Classes","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store"]},{"title":"Structures","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","doc:\/\/Boutique\/documentation\/Boutique\/Stored","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]},{"title":"Enumerations","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"]}],"references":{"https://redux.js.org/":{"title":"Redux","titleInlineContent":[{"type":"text","text":"Redux"}],"type":"link","identifier":"https:\/\/redux.js.org\/","url":"https:\/\/redux.js.org\/"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"role":"symbol","title":"AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}],"url":"\/documentation\/boutique\/asyncstoredvalue"},"https://github.com/pointfreeco/swift-composable-architecture":{"title":"The Composable Architecture","titleInlineContent":[{"type":"text","text":"The Composable Architecture"}],"type":"link","identifier":"https:\/\/github.com\/pointfreeco\/swift-composable-architecture","url":"https:\/\/github.com\/pointfreeco\/swift-composable-architecture"},"doc://Boutique/documentation/Boutique/Using-Stores":{"role":"article","title":"Using Stores","abstract":[{"type":"text","text":"The "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" is at the heart of what makes Boutique, Boutique."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Using-Stores","kind":"article","type":"topic","url":"\/documentation\/boutique\/using-stores"},"doc://Boutique/documentation/Boutique/StoredValue":{"role":"symbol","title":"StoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"StoredValue"}],"url":"\/documentation\/boutique\/storedvalue"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"https://github.com/mergesort/Boutique/tree/main/Demo":{"title":"Boutique Demo","titleInlineContent":[{"type":"text","text":"Boutique Demo"}],"type":"link","identifier":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo","url":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo"},"https://build.ms/2022/06/22/model-view-controller-store":{"title":"blog post","titleInlineContent":[{"type":"text","text":"blog post"}],"type":"link","identifier":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store","url":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store"},"https://github.com/mergesort/Bodega":{"title":"Bodega","titleInlineContent":[{"type":"text","text":"Bodega"}],"type":"link","identifier":"https:\/\/github.com\/mergesort\/Bodega","url":"https:\/\/github.com\/mergesort\/Bodega"},"doc://Boutique/documentation/Boutique/The-@Stored-Family-Of-Property-Wrappers":{"role":"article","title":"The @Stored Family Of Property Wrappers","abstract":[{"type":"text","text":"Property Wrappers that take the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" and make it magical. ✨"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/The-@Stored-Family-Of-Property-Wrappers","kind":"article","type":"topic","url":"\/documentation\/boutique\/the-@stored-family-of-property-wrappers"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainError":{"role":"symbol","title":"KeychainError","fragments":[{"kind":"keyword","text":"enum"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"KeychainError"}],"url":"\/documentation\/boutique\/keychainerror"},"https://build.ms/bodega/docs":{"title":"Bodega Documentation","titleInlineContent":[{"type":"text","text":"Bodega Documentation"}],"type":"link","identifier":"https:\/\/build.ms\/bodega\/docs","url":"https:\/\/build.ms\/bodega\/docs"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","title":"SecurelyStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"SecurelyStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property wrapper automagically persists a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in the system "},{"type":"codeVoice","code":"Keychain"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"SecurelyStoredValue"}],"url":"\/documentation\/boutique\/securelystoredvalue"}}} \ No newline at end of file +{"topicSections":[{"generated":true,"title":"Articles","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/The-@Stored-Family-Of-Property-Wrappers","doc:\/\/Boutique\/documentation\/Boutique\/Using-Stores"]},{"title":"Classes","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store"]},{"title":"Structures","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup","doc:\/\/Boutique\/documentation\/Boutique\/KeychainService","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","doc:\/\/Boutique\/documentation\/Boutique\/Stored","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]},{"identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"],"title":"Enumerations"}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique"},"sections":[],"schemaVersion":{"minor":3,"major":0,"patch":0},"abstract":[{"text":"A simple but surprisingly fancy data store and so much more","type":"text"}],"primaryContentSections":[{"kind":"content","content":[{"type":"heading","text":"Overview","level":2,"anchor":"Overview"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Boutique is a simple but powerful persistence library, and so much more. With Boutique’s dual-layered memory + disk caching architecture Boutique provides a way to build SwiftUI, UIKit, and AppKit apps that update in real time with full offline storage in only a few lines of code using an incredibly simple API."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Boutique is built atop "},{"identifier":"https:\/\/github.com\/mergesort\/Bodega","isActive":true,"type":"reference"},{"text":", and below is a demo project that demonstrates the ideal Boutique app, along with many useful techniques you can apply to other SwiftUI apps.","type":"text"}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"reference","identifier":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo","isActive":true}]}]}]},{"inlineContent":[{"text":"You’ll notice that it looks almost identical to any other SwiftUI app, an explicit goal of Boutique. Boutique stays as far away as it can from your app’s logic as it can, allowing you to write the app you want to write, with full offline support and realtime state updates that propagate to all of your views in only a few lines of code. You can read more about the thinking behind Boutique and my preference towards a Model View Controller Store architecture in this ","type":"text"},{"identifier":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store","type":"reference","isActive":true},{"type":"text","text":", but Boutique should work with any architecture."}],"type":"paragraph"},{"type":"heading","level":2,"text":"Getting Started","anchor":"Getting-Started"},{"inlineContent":[{"text":"Boutique only has one concept you need to understand. When you save data to the ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":" your data will be persisted automatically for you and exposed as a regular Swift array. The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","type":"reference","isActive":true},{"type":"text","text":", @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":", and @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"type":"text","text":" property wrappers work the same way, but instead of an array when you call "},{"code":"$storedValue.set(value)","type":"codeVoice"},{"text":" a singular Swift value will be saved. You’ll never have to think about databases, everything in your app is a regular Swift array or value using your app’s models, with straightforward code that looks like any other app.","type":"text"}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"You may be familiar with the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" from "},{"type":"reference","identifier":"https:\/\/redux.js.org\/","isActive":true},{"type":"text","text":" or "},{"isActive":true,"type":"reference","identifier":"https:\/\/github.com\/pointfreeco\/swift-composable-architecture"},{"text":", but unlike those frameworks you won’t need to worry about adding Actions or Reducers. With this ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" implementation all your data is persisted for you automatically, no additional code required. This allows you to build realtime updating apps with full offline support in an incredibly simple and straightforward manner."}],"type":"paragraph"},{"type":"paragraph","inlineContent":[{"type":"text","text":"If you’d like to explore these core concepts you’ll be up and running in no time."}]},{"items":[{"content":[{"type":"paragraph","inlineContent":[{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Using-Stores"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/The-@Stored-Family-Of-Property-Wrappers","isActive":true,"type":"reference"}]}]}],"type":"unorderedList"},{"inlineContent":[{"text":"Since Boutique is built atop Bodega, learning more about ","type":"text"},{"identifier":"https:\/\/github.com\/mergesort\/Bodega","type":"reference","overridingTitleInlineContent":[{"type":"text","text":"Bodega"}],"overridingTitle":"Bodega","isActive":true},{"text":" may be helpful, especially to understand how a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":"’s ","type":"text"},{"code":"StorageEngine","type":"codeVoice"},{"text":" works.","type":"text"}],"type":"paragraph"},{"type":"unorderedList","items":[{"content":[{"inlineContent":[{"type":"reference","identifier":"https:\/\/build.ms\/bodega\/docs","isActive":true}],"type":"paragraph"}]}]}]}],"kind":"symbol","hierarchy":{"paths":[[]]},"variants":[{"paths":["\/documentation\/boutique"],"traits":[{"interfaceLanguage":"swift"}]}],"metadata":{"role":"collection","symbolKind":"module","title":"Boutique","modules":[{"name":"Boutique"}],"externalID":"Boutique","roleHeading":"Framework"},"references":{"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue","navigatorTitle":[{"text":"AsyncStoredValue","kind":"identifier"}],"type":"topic","title":"AsyncStoredValue","abstract":[{"type":"text","text":"The @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":" "},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" or using @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"type":"text","text":"."}],"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AsyncStoredValue"}]},"doc://Boutique/documentation/Boutique/KeychainService":{"kind":"symbol","title":"KeychainService","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"KeychainService"}],"navigatorTitle":[{"kind":"identifier","text":"KeychainService"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService","type":"topic","url":"\/documentation\/boutique\/keychainservice","abstract":[{"type":"text","text":"A type representing Tagged"},{"type":"text","text":", to statically represent the keychain’s Service."},{"text":" ","type":"text"},{"text":"This is done to be more type-safe than passing string parameters in all places.","type":"text"}]},"https://build.ms/2022/06/22/model-view-controller-store":{"identifier":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store","type":"link","url":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store","titleInlineContent":[{"text":"blog post","type":"text"}],"title":"blog post"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Using-Stores":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Using-Stores","title":"Using Stores","type":"topic","abstract":[{"type":"text","text":"The "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" is at the heart of what makes Boutique, Boutique."}],"role":"article","kind":"article","url":"\/documentation\/boutique\/using-stores"},"https://redux.js.org/":{"identifier":"https:\/\/redux.js.org\/","title":"Redux","type":"link","titleInlineContent":[{"text":"Redux","type":"text"}],"url":"https:\/\/redux.js.org\/"},"https://github.com/pointfreeco/swift-composable-architecture":{"identifier":"https:\/\/github.com\/pointfreeco\/swift-composable-architecture","type":"link","url":"https:\/\/github.com\/pointfreeco\/swift-composable-architecture","titleInlineContent":[{"text":"The Composable Architecture","type":"text"}],"title":"The Composable Architecture"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"SecurelyStoredValue"}],"type":"topic","navigatorTitle":[{"text":"SecurelyStoredValue","kind":"identifier"}],"title":"SecurelyStoredValue","url":"\/documentation\/boutique\/securelystoredvalue","abstract":[{"text":"The @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"text":" property wrapper automagically persists a single ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" in the system ","type":"text"},{"code":"Keychain","type":"codeVoice"},{"text":" ","type":"text"},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" or using @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/KeychainGroup":{"type":"topic","abstract":[{"text":"A type representing Tagged","type":"text"},{"type":"text","text":", to statically represent the keychain’s Group."},{"type":"text","text":" "},{"type":"text","text":"This is done to be more type-safe than passing string parameters in all places."}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"text":"KeychainGroup","kind":"identifier"}],"url":"\/documentation\/boutique\/keychaingroup","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup","title":"KeychainGroup","role":"symbol","navigatorTitle":[{"kind":"identifier","text":"KeychainGroup"}],"kind":"symbol"},"doc://Boutique/documentation/Boutique/StoredValue":{"type":"topic","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"StoredValue","kind":"identifier"}],"navigatorTitle":[{"text":"StoredValue","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","url":"\/documentation\/boutique\/storedvalue","kind":"symbol","title":"StoredValue","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":" ","type":"text"},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" or using @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/The-@Stored-Family-Of-Property-Wrappers":{"abstract":[{"type":"text","text":"Property Wrappers that take the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" and make it magical. ✨"}],"url":"\/documentation\/boutique\/the-@stored-family-of-property-wrappers","role":"article","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/The-@Stored-Family-Of-Property-Wrappers","kind":"article","type":"topic","title":"The @Stored Family Of Property Wrappers"},"https://github.com/mergesort/Bodega":{"identifier":"https:\/\/github.com\/mergesort\/Bodega","title":"Bodega","type":"link","titleInlineContent":[{"text":"Bodega","type":"text"}],"url":"https:\/\/github.com\/mergesort\/Bodega"},"https://build.ms/bodega/docs":{"identifier":"https:\/\/build.ms\/bodega\/docs","type":"link","url":"https:\/\/build.ms\/bodega\/docs","titleInlineContent":[{"text":"Bodega Documentation","type":"text"}],"title":"Bodega Documentation"},"https://github.com/mergesort/Boutique/tree/main/Demo":{"type":"link","url":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo","title":"Boutique Demo","identifier":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo","titleInlineContent":[{"text":"Boutique Demo","type":"text"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainError":{"title":"KeychainError","type":"topic","kind":"symbol","role":"symbol","fragments":[{"text":"enum","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"navigatorTitle":[{"text":"KeychainError","kind":"identifier"}],"url":"\/documentation\/boutique\/keychainerror","abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/asyncstoredvalue.json b/docs/data/documentation/boutique/asyncstoredvalue.json index bf26a08..2bf273d 100644 --- a/docs/data/documentation/boutique/asyncstoredvalue.json +++ b/docs/data/documentation/boutique/asyncstoredvalue.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"attribute","text":"@propertyWrapper"},{"kind":"text","text":" "},{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Item"},{"kind":"text","text":"> "},{"kind":"keyword","text":"where"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Decodable","preciseIdentifier":"s:Se"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Encodable","preciseIdentifier":"s:SE"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Equatable","preciseIdentifier":"s:SQ"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"overview","level":2,"type":"heading","text":"Overview"},{"type":"paragraph","inlineContent":[{"type":"text","text":"You should use an @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" if you’re only storing a single item, as opposed to a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" "},{"type":"text","text":"which stores an array of items exposed as the "},{"type":"codeVoice","code":"items: [Item]"},{"type":"text","text":" property."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is useful for similar use cases as "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":", where it’s common to store only a single item"},{"type":"text","text":" "},{"type":"text","text":"such as the app’s "},{"type":"codeVoice","code":"lastOpenedDate"},{"type":"text","text":", an object of the user’s preferences, configurations, and more."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Results are delivered asynchronously so you cannot depend on this value to be available on-demand."},{"type":"text","text":" "},{"type":"strong","inlineContent":[{"type":"text","text":"If you need to access a value at app launch you should consider using"}]},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" which has"},{"type":"text","text":" "},{"type":"text","text":"the same API but stores data into "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"You must initialize an @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" with a default value like you would any other Swift property."}]},{"type":"codeListing","syntax":null,"code":["@AsyncStoredValue(storage: SQLiteStorageEngine.default(appendingPath: \"RedPandaStorage\"))","private var redPanda = RedPanda(cuteRating: 100)"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"An @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" can be nullable but in that case you will have to specify the type as well."}]},{"type":"codeListing","syntax":null,"code":["@AsyncStoredValue(storage: SQLiteStorageEngine.default(appendingPath: \"SpanishRedPandaStorage\"))","private var spanishRedPanda = nil"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" is also straightforward, there are only two functions."},{"type":"text","text":" "},{"type":"text","text":"To change the value of the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":", you can use the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()"},{"type":"text","text":" functions."}]},{"type":"codeListing","syntax":null,"code":["$redPanda.set(RedPanda(cuteRating: 99)) \/\/ The @AsyncStoredValue has a new red panda","$redPanda.reset() \/\/ The @AsyncStoredValue is nil"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"One last bit of advice, when calling "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()"},{"type":"text","text":" don’t forget to put a "},{"type":"codeVoice","code":"$"},{"type":"text","text":" "},{"type":"text","text":"in front of the the "},{"type":"codeVoice","code":"$storedValue"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"See: "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()"},{"type":"text","text":" docs for a more in depth explanation."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/asyncstoredvalue"],"traits":[{"interfaceLanguage":"swift"}]}],"relationshipsSections":[{"identifiers":["doc:\/\/Boutique\/s8SendableP"],"kind":"relationships","title":"Conforms To","type":"conformsTo"}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"}],"title":"AsyncStoredValue","roleHeading":"Structure","role":"symbol","symbolKind":"struct","externalID":"s:8Boutique16AsyncStoredValueV","modules":[{"name":"Boutique"}],"navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique"]]},"topicSections":[{"title":"Initializers","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/init(wrappedValue:storage:)"]},{"title":"Instance Properties","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/binding","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/projectedValue","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/publisher","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/wrappedValue"]},{"title":"Instance Methods","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/append(_:)","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/toggle()","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/update(key:value:)"]}],"references":{"doc://Boutique/documentation/Boutique/AsyncStoredValue/update(key:value:)":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Equatable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"update(key:value:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"update"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Key"},{"kind":"text","text":", "},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":", "},{"kind":"externalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"?) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"A function to set an @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" represented by a "},{"type":"codeVoice","code":"Dictionary"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/update(key:value:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/update(key:value:)"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/binding":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Equatable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"binding","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"binding"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Binding","preciseIdentifier":"s:7SwiftUI7BindingV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A convenient way to create a "},{"type":"codeVoice","code":"Binding"},{"type":"text","text":" from an "},{"type":"codeVoice","code":"AsyncStoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/binding","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/binding"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"role":"symbol","title":"AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}],"url":"\/documentation\/boutique\/asyncstoredvalue"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/wrappedValue":{"role":"symbol","title":"wrappedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"}],"abstract":[{"type":"text","text":"The currently stored value"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/wrappedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/wrappedvalue"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/projectedValue":{"role":"symbol","title":"projectedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AsyncStoredValue","preciseIdentifier":"s:8Boutique16AsyncStoredValueV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"An @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" which exposes "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()"},{"type":"text","text":" functions alongside a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/publisher"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/projectedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/projectedvalue"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/reset()":{"role":"symbol","title":"reset()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"reset"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Resets the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" to the default value."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/reset()"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/init(wrappedValue:storage:)":{"role":"symbol","title":"init(wrappedValue:storage:)","fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":")"}],"abstract":[{"type":"text","text":"Initializes an @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/init(wrappedValue:storage:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/init(wrappedvalue:storage:)"},"doc://Boutique/s8SendableP":{"type":"unresolvable","title":"Swift.Sendable","identifier":"doc:\/\/Boutique\/s8SendableP"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/publisher":{"role":"symbol","title":"publisher","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"publisher"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A Combine publisher that allows you to observe any changes to the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/publisher","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/publisher"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/toggle()":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" is "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"toggle()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"toggle"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"A function to toggle an @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" that represent a "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/toggle()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/toggle()"},"doc://Boutique/documentation/Boutique/StoredValue":{"role":"symbol","title":"StoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"StoredValue"}],"url":"\/documentation\/boutique\/storedvalue"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/append(_:)":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Equatable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"append(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"append"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"A function to append a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" represented by an "},{"type":"codeVoice","code":"Array"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/append(_:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/append(_:)"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/set(_:)":{"role":"symbol","title":"set(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"set"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Sets a value for the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/set(_:)"}}} \ No newline at end of file +{"sections":[],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","interfaceLanguage":"swift"},"variants":[{"paths":["\/documentation\/boutique\/asyncstoredvalue"],"traits":[{"interfaceLanguage":"swift"}]}],"abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"text":" ","type":"text"},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":" or using @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":"."}],"primaryContentSections":[{"declarations":[{"platforms":["macOS"],"tokens":[{"text":"@","kind":"attribute"},{"preciseIdentifier":"s:ScM","text":"MainActor","kind":"attribute"},{"text":" ","kind":"text"},{"text":"@propertyWrapper","kind":"attribute"},{"kind":"text","text":" "},{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"AsyncStoredValue","kind":"identifier"},{"text":"<","kind":"text"},{"kind":"genericParameter","text":"Item"},{"text":"> ","kind":"text"},{"text":"where","kind":"keyword"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" : "},{"text":"Decodable","preciseIdentifier":"s:Se","kind":"typeIdentifier"},{"kind":"text","text":", "},{"text":"Item","kind":"typeIdentifier"},{"text":" : ","kind":"text"},{"text":"Encodable","kind":"typeIdentifier","preciseIdentifier":"s:SE"},{"text":", ","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" : "},{"text":"Equatable","kind":"typeIdentifier","preciseIdentifier":"s:SQ"}],"languages":["swift"]}],"kind":"declarations"},{"kind":"content","content":[{"level":2,"anchor":"overview","text":"Overview","type":"heading"},{"type":"paragraph","inlineContent":[{"type":"text","text":"You should use an @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","type":"reference","isActive":true},{"text":" if you’re only storing a single item, as opposed to a @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" ","type":"text"},{"type":"text","text":"which stores an array of items exposed as the "},{"code":"items: [Item]","type":"codeVoice"},{"type":"text","text":" property."}]},{"inlineContent":[{"type":"text","text":"This is useful for similar use cases as "},{"type":"codeVoice","code":"UserDefaults"},{"text":", where it’s common to store only a single item","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"such as the app’s "},{"type":"codeVoice","code":"lastOpenedDate"},{"type":"text","text":", an object of the user’s preferences, configurations, and more."}],"type":"paragraph"},{"type":"paragraph","inlineContent":[{"text":"Results are delivered asynchronously so you cannot depend on this value to be available on-demand.","type":"text"},{"type":"text","text":" "},{"type":"strong","inlineContent":[{"type":"text","text":"If you need to access a value at app launch you should consider using"}]},{"type":"text","text":" "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"text":" which has","type":"text"},{"type":"text","text":" "},{"type":"text","text":"the same API but stores data into "},{"code":"UserDefaults","type":"codeVoice"},{"text":".","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"You must initialize an @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true},{"type":"text","text":" with a default value like you would any other Swift property."}]},{"code":["@AsyncStoredValue(storage: SQLiteStorageEngine.default(appendingPath: \"RedPandaStorage\"))","private var redPanda = RedPanda(cuteRating: 100)"],"type":"codeListing","syntax":null},{"type":"paragraph","inlineContent":[{"type":"text","text":"An @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" can be nullable but in that case you will have to specify the type as well."}]},{"syntax":null,"code":["@AsyncStoredValue(storage: SQLiteStorageEngine.default(appendingPath: \"SpanishRedPandaStorage\"))","private var spanishRedPanda = nil"],"type":"codeListing"},{"inlineContent":[{"type":"text","text":"Using @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"text":" is also straightforward, there are only two functions.","type":"text"},{"type":"text","text":" "},{"text":"To change the value of the @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","type":"reference","isActive":true},{"type":"text","text":", you can use the "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)","type":"reference"},{"type":"text","text":" and "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()","type":"reference","isActive":true},{"type":"text","text":" functions."}],"type":"paragraph"},{"syntax":null,"type":"codeListing","code":["$redPanda.set(RedPanda(cuteRating: 99)) \/\/ The @AsyncStoredValue has a new red panda","$redPanda.reset() \/\/ The @AsyncStoredValue is nil"]},{"type":"paragraph","inlineContent":[{"text":"One last bit of advice, when calling ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)"},{"type":"text","text":" and "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()","type":"reference"},{"text":" don’t forget to put a ","type":"text"},{"type":"codeVoice","code":"$"},{"type":"text","text":" "},{"type":"text","text":"in front of the the "},{"type":"codeVoice","code":"$storedValue"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"See: "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()","isActive":true},{"type":"text","text":" docs for a more in depth explanation."}]}]}],"topicSections":[{"title":"Initializers","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/init(wrappedValue:storage:)"]},{"title":"Instance Properties","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/binding","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/projectedValue","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/publisher","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/wrappedValue"]},{"title":"Instance Methods","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/append(_:)","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/toggle()","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/togglePresence(_:)","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/update(key:value:)"]}],"relationshipsSections":[{"identifiers":["doc:\/\/Boutique\/s8SendableP"],"title":"Conforms To","type":"conformsTo","kind":"relationships"}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique"]]},"kind":"symbol","metadata":{"externalID":"s:8Boutique16AsyncStoredValueV","title":"AsyncStoredValue","navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}],"symbolKind":"struct","roleHeading":"Structure","modules":[{"name":"Boutique"}],"role":"symbol","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"AsyncStoredValue","kind":"identifier"}]},"schemaVersion":{"patch":0,"major":0,"minor":3},"references":{"doc://Boutique/documentation/Boutique/AsyncStoredValue/publisher":{"url":"\/documentation\/boutique\/asyncstoredvalue\/publisher","title":"publisher","role":"symbol","kind":"symbol","type":"topic","abstract":[{"type":"text","text":"A Combine publisher that allows you to observe any changes to the @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true},{"text":".","type":"text"}],"fragments":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"text":"publisher","kind":"identifier"},{"kind":"text","text":": "},{"text":"AnyPublisher","kind":"typeIdentifier","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":", ","kind":"text"},{"text":"Never","kind":"typeIdentifier","preciseIdentifier":"s:s5NeverO"},{"text":">","kind":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/publisher"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue","navigatorTitle":[{"text":"AsyncStoredValue","kind":"identifier"}],"type":"topic","title":"AsyncStoredValue","abstract":[{"type":"text","text":"The @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":" "},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" or using @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"type":"text","text":"."}],"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AsyncStoredValue"}]},"doc://Boutique/documentation/Boutique/AsyncStoredValue/update(key:value:)":{"fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"update","kind":"identifier"},{"text":"<","kind":"text"},{"text":"Key","kind":"genericParameter"},{"kind":"text","text":", "},{"text":"Value","kind":"genericParameter"},{"kind":"text","text":">("},{"text":"key","kind":"externalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Key"},{"text":", ","kind":"text"},{"kind":"externalParam","text":"value"},{"text":": ","kind":"text"},{"text":"Value","kind":"typeIdentifier"},{"kind":"text","text":"?) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/update(key:value:)","type":"topic","title":"update(key:value:)","url":"\/documentation\/boutique\/asyncstoredvalue\/update(key:value:)","role":"symbol","conformance":{"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Equatable"},{"text":".","type":"text"}]},"abstract":[{"type":"text","text":"A function to set an @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" represented by a "},{"type":"codeVoice","code":"Dictionary"},{"type":"text","text":" "},{"text":"without having to manually make an intermediate copy for every value update.","type":"text"}]},"doc://Boutique/documentation/Boutique/AsyncStoredValue/binding":{"title":"binding","url":"\/documentation\/boutique\/asyncstoredvalue\/binding","role":"symbol","conformance":{"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"text":", and ","type":"text"},{"code":"Equatable","type":"codeVoice"},{"type":"text","text":"."}]},"kind":"symbol","type":"topic","abstract":[{"text":"A convenient way to create a ","type":"text"},{"code":"Binding","type":"codeVoice"},{"text":" from an ","type":"text"},{"code":"AsyncStoredValue","type":"codeVoice"},{"text":".","type":"text"}],"fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"text":"binding","kind":"identifier"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:7SwiftUI7BindingV","text":"Binding"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">","kind":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/binding"},"doc://Boutique/s8SendableP":{"type":"unresolvable","title":"Swift.Sendable","identifier":"doc:\/\/Boutique\/s8SendableP"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/init(wrappedValue:storage:)":{"url":"\/documentation\/boutique\/asyncstoredvalue\/init(wrappedvalue:storage:)","title":"init(wrappedValue:storage:)","role":"symbol","kind":"symbol","type":"topic","abstract":[{"type":"text","text":"Initializes an @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true},{"type":"text","text":"."}],"fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"text":"wrappedValue","kind":"externalParam"},{"kind":"text","text":": "},{"text":"Item","kind":"typeIdentifier"},{"text":", ","kind":"text"},{"text":"storage","kind":"externalParam"},{"text":": any ","kind":"text"},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"text":")","kind":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/init(wrappedValue:storage:)"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/reset()":{"fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"reset"},{"kind":"text","text":"() "},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()","url":"\/documentation\/boutique\/asyncstoredvalue\/reset()","type":"topic","kind":"symbol","role":"symbol","abstract":[{"type":"text","text":"Resets the @"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","type":"reference"},{"type":"text","text":" to the default value."}],"title":"reset()"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/append(_:)":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/append(_:)","abstract":[{"type":"text","text":"A function to append a @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","type":"reference","isActive":true},{"text":" represented by an ","type":"text"},{"type":"codeVoice","code":"Array"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"append"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"."},{"text":"Element","kind":"typeIdentifier","preciseIdentifier":"s:ST7ElementQa"},{"kind":"text","text":") "},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"}],"conformance":{"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"code":"Decodable","type":"codeVoice"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Encodable"},{"text":", ","type":"text"},{"code":"Equatable","type":"codeVoice"},{"type":"text","text":", and "},{"type":"codeVoice","code":"RangeReplaceableCollection"},{"text":".","type":"text"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"type":"text","text":"Available when"}]},"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue\/append(_:)","type":"topic","title":"append(_:)"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/toggle()":{"fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"toggle","kind":"identifier"},{"text":"() ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"A function to toggle an @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" that represent a "},{"code":"Bool","type":"codeVoice"},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/toggle()","conformance":{"availabilityPrefix":[{"type":"text","text":"Available when"}],"constraints":[{"type":"codeVoice","code":"Item"},{"text":" is ","type":"text"},{"code":"Bool","type":"codeVoice"},{"type":"text","text":"."}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"title":"toggle()","kind":"symbol","type":"topic","role":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue\/toggle()"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/togglePresence(_:)":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/togglePresence(_:)","title":"togglePresence(_:)","abstract":[],"role":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue\/togglepresence(_:)","conformance":{"availabilityPrefix":[{"type":"text","text":"Available when"}],"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Equatable"},{"text":", and ","type":"text"},{"code":"RangeReplaceableCollection","type":"codeVoice"},{"text":".","type":"text"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"kind":"symbol","type":"topic","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"togglePresence"},{"text":"<","kind":"text"},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"text":"Value","kind":"typeIdentifier"},{"kind":"text","text":") "},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}]},"doc://Boutique/documentation/Boutique/AsyncStoredValue/set(_:)":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue\/set(_:)","type":"topic","abstract":[{"type":"text","text":"Sets a value for the @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","type":"reference","isActive":true},{"type":"text","text":" property."}],"title":"set(_:)","role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)","fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"set","kind":"identifier"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}]},"doc://Boutique/documentation/Boutique/AsyncStoredValue/wrappedValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue\/wrappedvalue","type":"topic","abstract":[{"text":"The currently stored value","type":"text"}],"title":"wrappedValue","role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/wrappedValue","fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/StoredValue":{"type":"topic","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"StoredValue","kind":"identifier"}],"navigatorTitle":[{"text":"StoredValue","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","url":"\/documentation\/boutique\/storedvalue","kind":"symbol","title":"StoredValue","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":" ","type":"text"},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" or using @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/AsyncStoredValue/projectedValue":{"fragments":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"text":"projectedValue","kind":"identifier"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:8Boutique16AsyncStoredValueV","text":"AsyncStoredValue","kind":"typeIdentifier"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">","kind":"text"}],"url":"\/documentation\/boutique\/asyncstoredvalue\/projectedvalue","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/projectedValue","type":"topic","kind":"symbol","role":"symbol","abstract":[{"type":"text","text":"An @"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","type":"reference"},{"type":"text","text":" which exposes "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)"},{"type":"text","text":" and "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()"},{"type":"text","text":" functions alongside a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/publisher","type":"reference","isActive":true},{"type":"text","text":"."}],"title":"projectedValue"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/asyncstoredvalue/append(_:).json b/docs/data/documentation/boutique/asyncstoredvalue/append(_:).json index c3a6ee2..0b8a984 100644 --- a/docs/data/documentation/boutique/asyncstoredvalue/append(_:).json +++ b/docs/data/documentation/boutique/asyncstoredvalue/append(_:).json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"append"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" "},{"kind":"keyword","text":"where"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" == ["},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"], "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Decodable","preciseIdentifier":"s:Se"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Encodable","preciseIdentifier":"s:SE"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Equatable","preciseIdentifier":"s:SQ"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is meant to provide a simple ergonomic improvement, avoiding callsites like this."}]},{"type":"codeListing","syntax":null,"code":["var updatedRedPandaList = self.redPandaList","updatedRedPandaList.append(\"Pabu\")","self.$redPandaList.set(updatedRedPandaList)"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Instead this function provides a much simpler alternative."}]},{"type":"codeListing","syntax":null,"code":["try await self.$redPandaList.append(\"Pabu\")"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/asyncstoredvalue\/append(_:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/append(_:)","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A function to append a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" represented by an "},{"type":"codeVoice","code":"Array"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Equatable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"append(_:)","roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"append"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"symbolKind":"method","externalID":"s:8Boutique16AsyncStoredValueV6appendyyqd__YaKSayqd__GRszSeRd__SERd__SQRd__lF","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"role":"symbol","title":"AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}],"url":"\/documentation\/boutique\/asyncstoredvalue"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/StoredValue":{"role":"symbol","title":"StoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"StoredValue"}],"url":"\/documentation\/boutique\/storedvalue"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/append(_:)":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Equatable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"append(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"append"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"A function to append a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" represented by an "},{"type":"codeVoice","code":"Array"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/append(_:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/append(_:)"}}} \ No newline at end of file +{"schemaVersion":{"patch":0,"major":0,"minor":3},"abstract":[{"type":"text","text":"A function to append a @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" represented by an ","type":"text"},{"code":"Array","type":"codeVoice"},{"type":"text","text":" "},{"text":"without having to manually make an intermediate copy for every value update.","type":"text"}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"primaryContentSections":[{"declarations":[{"platforms":["macOS"],"languages":["swift"],"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"append"},{"text":"(","kind":"text"},{"text":"_","kind":"externalParam"},{"kind":"text","text":" "},{"text":"item","kind":"internalParam"},{"kind":"text","text":": "},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"."},{"text":"Element","preciseIdentifier":"s:ST7ElementQa","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"}]}],"kind":"declarations"},{"content":[{"type":"heading","text":"Discussion","level":2,"anchor":"discussion"},{"type":"paragraph","inlineContent":[{"text":"This is meant to provide a simple ergonomic improvement, avoiding callsites like this.","type":"text"}]},{"syntax":null,"code":["var updatedRedPandaList = self.redPandaList","updatedRedPandaList.append(\"Pabu\")","self.$redPandaList.set(updatedRedPandaList)"],"type":"codeListing"},{"type":"paragraph","inlineContent":[{"text":"Instead this function provides a much simpler alternative.","type":"text"}]},{"type":"codeListing","syntax":null,"code":["try await self.$redPandaList.append(\"Pabu\")"]}],"kind":"content"}],"sections":[],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/append(_:)"},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/asyncstoredvalue\/append(_:)"]}],"kind":"symbol","metadata":{"symbolKind":"method","role":"symbol","roleHeading":"Instance Method","fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"append","kind":"identifier"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"."},{"preciseIdentifier":"s:ST7ElementQa","kind":"typeIdentifier","text":"Element"},{"text":") ","kind":"text"},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"conformance":{"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"code":"Decodable","type":"codeVoice"},{"text":", ","type":"text"},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", "},{"type":"codeVoice","code":"Equatable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"RangeReplaceableCollection"},{"type":"text","text":"."}]},"extendedModule":"Boutique","modules":[{"name":"Boutique"}],"title":"append(_:)","externalID":"s:8Boutique16AsyncStoredValueVAASmRzrlE6appendyy7ElementSTQzYaKF"},"references":{"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/StoredValue":{"type":"topic","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"StoredValue","kind":"identifier"}],"navigatorTitle":[{"text":"StoredValue","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","url":"\/documentation\/boutique\/storedvalue","kind":"symbol","title":"StoredValue","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":" ","type":"text"},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" or using @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/AsyncStoredValue/append(_:)":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/append(_:)","abstract":[{"type":"text","text":"A function to append a @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","type":"reference","isActive":true},{"text":" represented by an ","type":"text"},{"type":"codeVoice","code":"Array"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"append"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"."},{"text":"Element","kind":"typeIdentifier","preciseIdentifier":"s:ST7ElementQa"},{"kind":"text","text":") "},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"}],"conformance":{"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"code":"Decodable","type":"codeVoice"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Encodable"},{"text":", ","type":"text"},{"code":"Equatable","type":"codeVoice"},{"type":"text","text":", and "},{"type":"codeVoice","code":"RangeReplaceableCollection"},{"text":".","type":"text"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"type":"text","text":"Available when"}]},"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue\/append(_:)","type":"topic","title":"append(_:)"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue","navigatorTitle":[{"text":"AsyncStoredValue","kind":"identifier"}],"type":"topic","title":"AsyncStoredValue","abstract":[{"type":"text","text":"The @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":" "},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" or using @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"type":"text","text":"."}],"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AsyncStoredValue"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/asyncstoredvalue/binding.json b/docs/data/documentation/boutique/asyncstoredvalue/binding.json index ea4bee8..8d625f8 100644 --- a/docs/data/documentation/boutique/asyncstoredvalue/binding.json +++ b/docs/data/documentation/boutique/asyncstoredvalue/binding.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"binding"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Binding","preciseIdentifier":"s:7SwiftUI7BindingV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"> { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"return-value","level":2,"type":"heading","text":"Return Value"},{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"codeVoice","code":"Binding"},{"type":"text","text":" of the "},{"type":"codeVoice","code":"AsyncStoredValue"},{"type":"text","text":" provided."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/asyncstoredvalue\/binding"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/binding","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A convenient way to create a "},{"type":"codeVoice","code":"Binding"},{"type":"text","text":" from an "},{"type":"codeVoice","code":"AsyncStoredValue"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Equatable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"binding","roleHeading":"Instance Property","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"binding"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Binding","preciseIdentifier":"s:7SwiftUI7BindingV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"symbolKind":"property","externalID":"s:8Boutique16AsyncStoredValueV7binding7SwiftUI7BindingVyxGvp","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/binding":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Equatable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"binding","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"binding"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Binding","preciseIdentifier":"s:7SwiftUI7BindingV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A convenient way to create a "},{"type":"codeVoice","code":"Binding"},{"type":"text","text":" from an "},{"type":"codeVoice","code":"AsyncStoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/binding","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/binding"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"role":"symbol","title":"AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}],"url":"\/documentation\/boutique\/asyncstoredvalue"}}} \ No newline at end of file +{"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/asyncstoredvalue\/binding"]}],"sections":[],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"kind":"symbol","schemaVersion":{"patch":0,"major":0,"minor":3},"metadata":{"symbolKind":"property","title":"binding","role":"symbol","conformance":{"availabilityPrefix":[{"text":"Available when","type":"text"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"text":", ","type":"text"},{"code":"Encodable","type":"codeVoice"},{"text":", and ","type":"text"},{"code":"Equatable","type":"codeVoice"},{"type":"text","text":"."}]},"extendedModule":"Boutique","modules":[{"name":"Boutique"}],"externalID":"s:8Boutique16AsyncStoredValueV7binding7SwiftUI7BindingVyxGvp","roleHeading":"Instance Property","fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"text":"binding","kind":"identifier"},{"text":": ","kind":"text"},{"text":"Binding","kind":"typeIdentifier","preciseIdentifier":"s:7SwiftUI7BindingV"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">","kind":"text"}]},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/binding","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A convenient way to create a "},{"code":"Binding","type":"codeVoice"},{"text":" from an ","type":"text"},{"type":"codeVoice","code":"AsyncStoredValue"},{"type":"text","text":"."}],"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"kind":"identifier","text":"binding"},{"kind":"text","text":": "},{"preciseIdentifier":"s:7SwiftUI7BindingV","text":"Binding","kind":"typeIdentifier"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"> { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}]}]},{"kind":"content","content":[{"type":"heading","text":"Return Value","level":2,"anchor":"return-value"},{"type":"paragraph","inlineContent":[{"text":"A ","type":"text"},{"code":"Binding","type":"codeVoice"},{"text":" of the ","type":"text"},{"code":"AsyncStoredValue","type":"codeVoice"},{"text":" provided.","type":"text"}]}]}],"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue","navigatorTitle":[{"text":"AsyncStoredValue","kind":"identifier"}],"type":"topic","title":"AsyncStoredValue","abstract":[{"type":"text","text":"The @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":" "},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" or using @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"type":"text","text":"."}],"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AsyncStoredValue"}]},"doc://Boutique/documentation/Boutique/AsyncStoredValue/binding":{"title":"binding","url":"\/documentation\/boutique\/asyncstoredvalue\/binding","role":"symbol","conformance":{"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"text":", and ","type":"text"},{"code":"Equatable","type":"codeVoice"},{"type":"text","text":"."}]},"kind":"symbol","type":"topic","abstract":[{"text":"A convenient way to create a ","type":"text"},{"code":"Binding","type":"codeVoice"},{"text":" from an ","type":"text"},{"code":"AsyncStoredValue","type":"codeVoice"},{"text":".","type":"text"}],"fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"text":"binding","kind":"identifier"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:7SwiftUI7BindingV","text":"Binding"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">","kind":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/binding"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/asyncstoredvalue/init(wrappedvalue:storage:).json b/docs/data/documentation/boutique/asyncstoredvalue/init(wrappedvalue:storage:).json index 1803612..dfda800 100644 --- a/docs/data/documentation/boutique/asyncstoredvalue/init(wrappedvalue:storage:).json +++ b/docs/data/documentation/boutique/asyncstoredvalue/init(wrappedvalue:storage:).json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":")"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"wrappedValue","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"An value set when initializing an @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"}]}]},{"name":"storage","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" that defines where the value will be stored."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This initializer allows you to specify an item to save and a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" where the "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" should be stored."},{"type":"text","text":" "},{"type":"text","text":"For example if you were to create a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" that has it’s own concept of keys or even allows"},{"type":"text","text":" "},{"type":"text","text":"you to store items in the Keychain, you would need to be able to provide the underlying storage mechanism."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/asyncstoredvalue\/init(wrappedvalue:storage:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/init(wrappedValue:storage:)","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Initializes an @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":")"}],"title":"init(wrappedValue:storage:)","roleHeading":"Initializer","role":"symbol","symbolKind":"init","externalID":"s:8Boutique16AsyncStoredValueV07wrappedD07storageACyxGx_6Bodega13StorageEngine_ptcfc","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"role":"symbol","title":"AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}],"url":"\/documentation\/boutique\/asyncstoredvalue"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/init(wrappedValue:storage:)":{"role":"symbol","title":"init(wrappedValue:storage:)","fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":")"}],"abstract":[{"type":"text","text":"Initializes an @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/init(wrappedValue:storage:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/init(wrappedvalue:storage:)"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"}}} \ No newline at end of file +{"metadata":{"symbolKind":"init","modules":[{"name":"Boutique"}],"roleHeading":"Initializer","fragments":[{"kind":"identifier","text":"init"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"wrappedValue"},{"kind":"text","text":": "},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":", "},{"text":"storage","kind":"externalParam"},{"kind":"text","text":": any "},{"preciseIdentifier":"s:6Bodega13StorageEngineP","kind":"typeIdentifier","text":"StorageEngine"},{"kind":"text","text":")"}],"externalID":"s:8Boutique16AsyncStoredValueV07wrappedD07storageACyxGx_6Bodega13StorageEngine_ptcfc","role":"symbol","title":"init(wrappedValue:storage:)"},"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"languages":["swift"],"tokens":[{"kind":"keyword","text":"init"},{"text":"(","kind":"text"},{"text":"wrappedValue","kind":"externalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"text":"storage","kind":"externalParam"},{"text":": any ","kind":"text"},{"text":"StorageEngine","kind":"typeIdentifier","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":")"}]}]},{"parameters":[{"name":"wrappedValue","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"An value set when initializing an @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"A ","type":"text"},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" that defines where the value will be stored."}]}],"name":"storage"}],"kind":"parameters"},{"content":[{"type":"heading","text":"Discussion","level":2,"anchor":"discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This initializer allows you to specify an item to save and a "},{"type":"codeVoice","code":"StorageEngine"},{"text":" where the ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" should be stored."},{"text":" ","type":"text"},{"text":"For example if you were to create a ","type":"text"},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" that has it’s own concept of keys or even allows"},{"text":" ","type":"text"},{"text":"you to store items in the Keychain, you would need to be able to provide the underlying storage mechanism.","type":"text"}]}],"kind":"content"}],"schemaVersion":{"minor":3,"patch":0,"major":0},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"kind":"symbol","sections":[],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/asyncstoredvalue\/init(wrappedvalue:storage:)"]}],"abstract":[{"text":"Initializes an @","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":"."}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/init(wrappedValue:storage:)"},"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue","navigatorTitle":[{"text":"AsyncStoredValue","kind":"identifier"}],"type":"topic","title":"AsyncStoredValue","abstract":[{"type":"text","text":"The @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":" "},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" or using @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"type":"text","text":"."}],"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AsyncStoredValue"}]},"doc://Boutique/documentation/Boutique/AsyncStoredValue/init(wrappedValue:storage:)":{"url":"\/documentation\/boutique\/asyncstoredvalue\/init(wrappedvalue:storage:)","title":"init(wrappedValue:storage:)","role":"symbol","kind":"symbol","type":"topic","abstract":[{"type":"text","text":"Initializes an @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true},{"type":"text","text":"."}],"fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"text":"wrappedValue","kind":"externalParam"},{"kind":"text","text":": "},{"text":"Item","kind":"typeIdentifier"},{"text":", ","kind":"text"},{"text":"storage","kind":"externalParam"},{"text":": any ","kind":"text"},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"text":")","kind":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/init(wrappedValue:storage:)"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/asyncstoredvalue/projectedvalue.json b/docs/data/documentation/boutique/asyncstoredvalue/projectedvalue.json index bd48cb4..d3bcdb5 100644 --- a/docs/data/documentation/boutique/asyncstoredvalue/projectedvalue.json +++ b/docs/data/documentation/boutique/asyncstoredvalue/projectedvalue.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","preciseIdentifier":"s:8Boutique16AsyncStoredValueV","text":"AsyncStoredValue"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"> { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/asyncstoredvalue\/projectedvalue"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/projectedValue","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"An @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" which exposes "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()"},{"type":"text","text":" functions alongside a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/publisher"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AsyncStoredValue","preciseIdentifier":"s:8Boutique16AsyncStoredValueV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"title":"projectedValue","roleHeading":"Instance Property","role":"symbol","symbolKind":"property","externalID":"s:8Boutique16AsyncStoredValueV09projectedD0ACyxGvp","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/AsyncStoredValue/set(_:)":{"role":"symbol","title":"set(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"set"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Sets a value for the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/set(_:)"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/reset()":{"role":"symbol","title":"reset()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"reset"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Resets the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" to the default value."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/reset()"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"role":"symbol","title":"AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}],"url":"\/documentation\/boutique\/asyncstoredvalue"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/projectedValue":{"role":"symbol","title":"projectedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AsyncStoredValue","preciseIdentifier":"s:8Boutique16AsyncStoredValueV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"An @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" which exposes "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()"},{"type":"text","text":" functions alongside a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/publisher"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/projectedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/projectedvalue"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/publisher":{"role":"symbol","title":"publisher","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"publisher"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A Combine publisher that allows you to observe any changes to the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/publisher","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/publisher"}}} \ No newline at end of file +{"primaryContentSections":[{"declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"text":"AsyncStoredValue","preciseIdentifier":"s:8Boutique16AsyncStoredValueV","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","kind":"typeIdentifier"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"> { "},{"kind":"keyword","text":"get"},{"text":" }","kind":"text"}]}],"kind":"declarations"}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/projectedValue","interfaceLanguage":"swift"},"sections":[],"kind":"symbol","metadata":{"role":"symbol","roleHeading":"Instance Property","fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"kind":"identifier","text":"projectedValue"},{"text":": ","kind":"text"},{"text":"AsyncStoredValue","preciseIdentifier":"s:8Boutique16AsyncStoredValueV","kind":"typeIdentifier"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">","kind":"text"}],"modules":[{"name":"Boutique"}],"symbolKind":"property","externalID":"s:8Boutique16AsyncStoredValueV09projectedD0ACyxGvp","title":"projectedValue"},"schemaVersion":{"patch":0,"minor":3,"major":0},"abstract":[{"type":"text","text":"An @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" which exposes "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)","isActive":true},{"type":"text","text":" and "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()"},{"type":"text","text":" functions alongside a "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/publisher"},{"text":".","type":"text"}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/asyncstoredvalue\/projectedvalue"]}],"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/reset()":{"fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"reset"},{"kind":"text","text":"() "},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()","url":"\/documentation\/boutique\/asyncstoredvalue\/reset()","type":"topic","kind":"symbol","role":"symbol","abstract":[{"type":"text","text":"Resets the @"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","type":"reference"},{"type":"text","text":" to the default value."}],"title":"reset()"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/projectedValue":{"fragments":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"text":"projectedValue","kind":"identifier"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:8Boutique16AsyncStoredValueV","text":"AsyncStoredValue","kind":"typeIdentifier"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">","kind":"text"}],"url":"\/documentation\/boutique\/asyncstoredvalue\/projectedvalue","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/projectedValue","type":"topic","kind":"symbol","role":"symbol","abstract":[{"type":"text","text":"An @"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","type":"reference"},{"type":"text","text":" which exposes "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)"},{"type":"text","text":" and "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()"},{"type":"text","text":" functions alongside a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/publisher","type":"reference","isActive":true},{"type":"text","text":"."}],"title":"projectedValue"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/set(_:)":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue\/set(_:)","type":"topic","abstract":[{"type":"text","text":"Sets a value for the @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","type":"reference","isActive":true},{"type":"text","text":" property."}],"title":"set(_:)","role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)","fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"set","kind":"identifier"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}]},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue","navigatorTitle":[{"text":"AsyncStoredValue","kind":"identifier"}],"type":"topic","title":"AsyncStoredValue","abstract":[{"type":"text","text":"The @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":" "},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" or using @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"type":"text","text":"."}],"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AsyncStoredValue"}]},"doc://Boutique/documentation/Boutique/AsyncStoredValue/publisher":{"url":"\/documentation\/boutique\/asyncstoredvalue\/publisher","title":"publisher","role":"symbol","kind":"symbol","type":"topic","abstract":[{"type":"text","text":"A Combine publisher that allows you to observe any changes to the @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true},{"text":".","type":"text"}],"fragments":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"text":"publisher","kind":"identifier"},{"kind":"text","text":": "},{"text":"AnyPublisher","kind":"typeIdentifier","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":", ","kind":"text"},{"text":"Never","kind":"typeIdentifier","preciseIdentifier":"s:s5NeverO"},{"text":">","kind":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/publisher"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/asyncstoredvalue/publisher.json b/docs/data/documentation/boutique/asyncstoredvalue/publisher.json index c50e166..3cc78fb 100644 --- a/docs/data/documentation/boutique/asyncstoredvalue/publisher.json +++ b/docs/data/documentation/boutique/asyncstoredvalue/publisher.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"publisher"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"kind":"text","text":"> { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/asyncstoredvalue\/publisher"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/publisher","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A Combine publisher that allows you to observe any changes to the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"publisher"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"kind":"text","text":">"}],"title":"publisher","roleHeading":"Instance Property","role":"symbol","symbolKind":"property","externalID":"s:8Boutique16AsyncStoredValueV9publisher7Combine12AnyPublisherVyxs5NeverOGvp","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"role":"symbol","title":"AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}],"url":"\/documentation\/boutique\/asyncstoredvalue"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/publisher":{"role":"symbol","title":"publisher","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"publisher"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A Combine publisher that allows you to observe any changes to the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/publisher","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/publisher"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"}}} \ No newline at end of file +{"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/asyncstoredvalue\/publisher"]}],"sections":[],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"kind":"symbol","metadata":{"modules":[{"name":"Boutique"}],"roleHeading":"Instance Property","title":"publisher","role":"symbol","symbolKind":"property","externalID":"s:8Boutique16AsyncStoredValueV9publisher7Combine12AnyPublisherVyxs5NeverOGvp","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"text":"publisher","kind":"identifier"},{"text":": ","kind":"text"},{"text":"AnyPublisher","kind":"typeIdentifier","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":", ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:s5NeverO","text":"Never"},{"kind":"text","text":">"}]},"schemaVersion":{"minor":3,"patch":0,"major":0},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/publisher"},"abstract":[{"type":"text","text":"A Combine publisher that allows you to observe any changes to the @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"type":"text","text":"."}],"primaryContentSections":[{"declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"text":"publisher","kind":"identifier"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":", "},{"text":"Never","kind":"typeIdentifier","preciseIdentifier":"s:s5NeverO"},{"text":"> { ","kind":"text"},{"text":"get","kind":"keyword"},{"text":" }","kind":"text"}]}],"kind":"declarations"}],"references":{"doc://Boutique/documentation/Boutique/AsyncStoredValue/publisher":{"url":"\/documentation\/boutique\/asyncstoredvalue\/publisher","title":"publisher","role":"symbol","kind":"symbol","type":"topic","abstract":[{"type":"text","text":"A Combine publisher that allows you to observe any changes to the @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true},{"text":".","type":"text"}],"fragments":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"text":"publisher","kind":"identifier"},{"kind":"text","text":": "},{"text":"AnyPublisher","kind":"typeIdentifier","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":", ","kind":"text"},{"text":"Never","kind":"typeIdentifier","preciseIdentifier":"s:s5NeverO"},{"text":">","kind":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/publisher"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue","navigatorTitle":[{"text":"AsyncStoredValue","kind":"identifier"}],"type":"topic","title":"AsyncStoredValue","abstract":[{"type":"text","text":"The @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":" "},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" or using @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"type":"text","text":"."}],"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AsyncStoredValue"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/asyncstoredvalue/reset().json b/docs/data/documentation/boutique/asyncstoredvalue/reset().json index cb63e63..9775f8f 100644 --- a/docs/data/documentation/boutique/asyncstoredvalue/reset().json +++ b/docs/data/documentation/boutique/asyncstoredvalue/reset().json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"reset"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"You may run into an error that says"}]},{"type":"codeListing","syntax":null,"code":["\"'reset' is inaccessible due to 'internal' protection level.\""]},{"type":"paragraph","inlineContent":[{"type":"text","text":"If that occurs the fix is straightforward. Rather than calling "},{"type":"codeVoice","code":"storedValue.reset()"},{"type":"text","text":" "},{"type":"text","text":"you need to call "},{"type":"codeVoice","code":"$storedValue.reset()"},{"type":"text","text":", with a dollar sign ($) in front of "},{"type":"codeVoice","code":"storedValue"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"When using a property wrapper the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/wrappedValue"},{"type":"text","text":" is an "},{"type":"codeVoice","code":"Item"},{"type":"text","text":", but the "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" "},{"type":"text","text":"is a "},{"type":"codeVoice","code":"AsyncStoredValue"},{"type":"text","text":". That means when you access "},{"type":"codeVoice","code":"storedValue"},{"type":"text","text":" you’re interacting"},{"type":"text","text":" "},{"type":"text","text":"with the item itself, of type "},{"type":"codeVoice","code":"Item"},{"type":"text","text":". But it’s the "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" that is"},{"type":"text","text":" "},{"type":"text","text":"the "},{"type":"codeVoice","code":"AsyncStoredValue"},{"type":"text","text":" type, and has the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()"},{"type":"text","text":" function."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This follows similar conventions to the "},{"type":"codeVoice","code":"@Published"},{"type":"text","text":" property wrapper."},{"type":"text","text":" "},{"type":"codeVoice","code":"@Published var items: [Item]"},{"type":"text","text":" would let you use "},{"type":"codeVoice","code":"items"},{"type":"text","text":" as a regular "},{"type":"codeVoice","code":"[Item]"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"text","text":"but $items projects "},{"type":"codeVoice","code":"AnyPublisher<[Item], Never>"},{"type":"text","text":" so you can subscribe to changes items produces."},{"type":"text","text":" "},{"type":"text","text":"Within Boutique the @Stored property wrapper works very similarly."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/asyncstoredvalue\/reset()"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Resets the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" to the default value."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"reset"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"title":"reset()","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique16AsyncStoredValueV5resetyyYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/AsyncStoredValue/wrappedValue":{"role":"symbol","title":"wrappedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"}],"abstract":[{"type":"text","text":"The currently stored value"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/wrappedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/wrappedvalue"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"role":"symbol","title":"AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}],"url":"\/documentation\/boutique\/asyncstoredvalue"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/reset()":{"role":"symbol","title":"reset()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"reset"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Resets the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" to the default value."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/reset()"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file +{"variants":[{"paths":["\/documentation\/boutique\/asyncstoredvalue\/reset()"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()","interfaceLanguage":"swift"},"kind":"symbol","abstract":[{"type":"text","text":"Resets the @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true},{"text":" to the default value.","type":"text"}],"metadata":{"role":"symbol","fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"reset"},{"text":"() ","kind":"text"},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"}],"externalID":"s:8Boutique16AsyncStoredValueV5resetyyYaKF","title":"reset()","modules":[{"name":"Boutique"}],"symbolKind":"method","roleHeading":"Instance Method"},"sections":[],"schemaVersion":{"major":0,"minor":3,"patch":0},"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"reset"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"languages":["swift"]}]},{"kind":"content","content":[{"type":"heading","level":2,"text":"Discussion","anchor":"discussion"},{"inlineContent":[{"text":"You may run into an error that says","type":"text"}],"type":"paragraph"},{"code":["\"'reset' is inaccessible due to 'internal' protection level.\""],"syntax":null,"type":"codeListing"},{"type":"paragraph","inlineContent":[{"type":"text","text":"If that occurs the fix is straightforward. Rather than calling "},{"code":"storedValue.reset()","type":"codeVoice"},{"text":" ","type":"text"},{"text":"you need to call ","type":"text"},{"type":"codeVoice","code":"$storedValue.reset()"},{"text":", with a dollar sign ($) in front of ","type":"text"},{"type":"codeVoice","code":"storedValue"},{"type":"text","text":"."}]},{"inlineContent":[{"type":"text","text":"When using a property wrapper the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/wrappedValue","isActive":true,"type":"reference"},{"text":" is an ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":", but the "},{"code":"projectedValue","type":"codeVoice"},{"type":"text","text":" "},{"type":"text","text":"is a "},{"code":"AsyncStoredValue","type":"codeVoice"},{"type":"text","text":". That means when you access "},{"type":"codeVoice","code":"storedValue"},{"text":" you’re interacting","type":"text"},{"type":"text","text":" "},{"text":"with the item itself, of type ","type":"text"},{"code":"Item","type":"codeVoice"},{"type":"text","text":". But it’s the "},{"type":"codeVoice","code":"projectedValue"},{"text":" that is","type":"text"},{"type":"text","text":" "},{"type":"text","text":"the "},{"type":"codeVoice","code":"AsyncStoredValue"},{"text":" type, and has the ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()","type":"reference","isActive":true},{"type":"text","text":" function."}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"This follows similar conventions to the "},{"type":"codeVoice","code":"@Published"},{"type":"text","text":" property wrapper."},{"type":"text","text":" "},{"code":"@Published var items: [Item]","type":"codeVoice"},{"text":" would let you use ","type":"text"},{"type":"codeVoice","code":"items"},{"text":" as a regular ","type":"text"},{"type":"codeVoice","code":"[Item]"},{"text":",","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"but $items projects "},{"type":"codeVoice","code":"AnyPublisher<[Item], Never>"},{"type":"text","text":" so you can subscribe to changes items produces."},{"type":"text","text":" "},{"type":"text","text":"Within Boutique the @Stored property wrapper works very similarly."}],"type":"paragraph"}]}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/reset()":{"fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"reset"},{"kind":"text","text":"() "},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/reset()","url":"\/documentation\/boutique\/asyncstoredvalue\/reset()","type":"topic","kind":"symbol","role":"symbol","abstract":[{"type":"text","text":"Resets the @"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","type":"reference"},{"type":"text","text":" to the default value."}],"title":"reset()"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue","navigatorTitle":[{"text":"AsyncStoredValue","kind":"identifier"}],"type":"topic","title":"AsyncStoredValue","abstract":[{"type":"text","text":"The @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":" "},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" or using @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"type":"text","text":"."}],"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AsyncStoredValue"}]},"doc://Boutique/documentation/Boutique/AsyncStoredValue/wrappedValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue\/wrappedvalue","type":"topic","abstract":[{"text":"The currently stored value","type":"text"}],"title":"wrappedValue","role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/wrappedValue","fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/asyncstoredvalue/set(_:).json b/docs/data/documentation/boutique/asyncstoredvalue/set(_:).json index f23781c..e205f96 100644 --- a/docs/data/documentation/boutique/asyncstoredvalue/set(_:).json +++ b/docs/data/documentation/boutique/asyncstoredvalue/set(_:).json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"set"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"value","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The value to set @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" to."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"You may run into an error that says"}]},{"type":"codeListing","syntax":null,"code":["\"'set' is inaccessible due to 'internal' protection level.\""]},{"type":"paragraph","inlineContent":[{"type":"text","text":"If that occurs the fix is straightforward. Rather than calling "},{"type":"codeVoice","code":"storedValue.set(newValue)"},{"type":"text","text":" "},{"type":"text","text":"you need to call "},{"type":"codeVoice","code":"$storedValue.set(newValue)"},{"type":"text","text":", with a dollar sign ($) in front of "},{"type":"codeVoice","code":"storedValue"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"When using a property wrapper the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/wrappedValue"},{"type":"text","text":" is an "},{"type":"codeVoice","code":"Item"},{"type":"text","text":", but the "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" "},{"type":"text","text":"is a "},{"type":"codeVoice","code":"AsyncStoredValue"},{"type":"text","text":". That means you are accessing the "},{"type":"codeVoice","code":"storedValue"},{"type":"text","text":" you’re interacting"},{"type":"text","text":" "},{"type":"text","text":"with, a value type "},{"type":"codeVoice","code":"Item"},{"type":"text","text":". But it is the "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" that is the "},{"type":"codeVoice","code":"AsyncStoredValue"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"text","text":"that property and has the ``set(_:) function."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This follows similar conventions to the "},{"type":"codeVoice","code":"@Published"},{"type":"text","text":" property wrapper."},{"type":"text","text":" "},{"type":"codeVoice","code":"@Published var items: [Item]"},{"type":"text","text":" allows you to use "},{"type":"codeVoice","code":"items"},{"type":"text","text":" as a regular "},{"type":"codeVoice","code":"[Item]"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"text","text":"but "},{"type":"codeVoice","code":"$items"},{"type":"text","text":" projects "},{"type":"codeVoice","code":"AnyPublisher<[Item], Never>"},{"type":"text","text":" so you can subscribe to changes items produces."},{"type":"text","text":" "},{"type":"text","text":"Within Boutique the @Stored property wrapper works very similarly."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/asyncstoredvalue\/set(_:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Sets a value for the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"set"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"title":"set(_:)","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique16AsyncStoredValueV3setyyxYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/AsyncStoredValue/wrappedValue":{"role":"symbol","title":"wrappedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"}],"abstract":[{"type":"text","text":"The currently stored value"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/wrappedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/wrappedvalue"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"role":"symbol","title":"AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}],"url":"\/documentation\/boutique\/asyncstoredvalue"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/set(_:)":{"role":"symbol","title":"set(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"set"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Sets a value for the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/set(_:)"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file +{"schemaVersion":{"patch":0,"major":0,"minor":3},"sections":[],"metadata":{"externalID":"s:8Boutique16AsyncStoredValueV3setyyxYaKF","title":"set(_:)","roleHeading":"Instance Method","symbolKind":"method","role":"symbol","modules":[{"name":"Boutique"}],"fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"set","kind":"identifier"},{"text":"(","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}]},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"kind":"symbol","abstract":[{"text":"Sets a value for the @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true},{"text":" property.","type":"text"}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/asyncstoredvalue\/set(_:)"]}],"primaryContentSections":[{"declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"set","kind":"identifier"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"text":" ","kind":"text"},{"kind":"internalParam","text":"value"},{"kind":"text","text":": "},{"text":"Item","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"}],"languages":["swift"],"platforms":["macOS"]}],"kind":"declarations"},{"kind":"parameters","parameters":[{"name":"value","content":[{"type":"paragraph","inlineContent":[{"text":"The value to set @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"type":"text","text":" to."}]}]}]},{"content":[{"text":"Discussion","type":"heading","anchor":"discussion","level":2},{"inlineContent":[{"type":"text","text":"You may run into an error that says"}],"type":"paragraph"},{"type":"codeListing","code":["\"'set' is inaccessible due to 'internal' protection level.\""],"syntax":null},{"inlineContent":[{"text":"If that occurs the fix is straightforward. Rather than calling ","type":"text"},{"type":"codeVoice","code":"storedValue.set(newValue)"},{"type":"text","text":" "},{"text":"you need to call ","type":"text"},{"code":"$storedValue.set(newValue)","type":"codeVoice"},{"text":", with a dollar sign ($) in front of ","type":"text"},{"code":"storedValue","type":"codeVoice"},{"text":".","type":"text"}],"type":"paragraph"},{"type":"paragraph","inlineContent":[{"text":"When using a property wrapper the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/wrappedValue","isActive":true},{"text":" is an ","type":"text"},{"code":"Item","type":"codeVoice"},{"type":"text","text":", but the "},{"code":"projectedValue","type":"codeVoice"},{"type":"text","text":" "},{"type":"text","text":"is a "},{"type":"codeVoice","code":"AsyncStoredValue"},{"type":"text","text":". That means you are accessing the "},{"code":"storedValue","type":"codeVoice"},{"type":"text","text":" you’re interacting"},{"type":"text","text":" "},{"text":"with, a value type ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":". But it is the ","type":"text"},{"type":"codeVoice","code":"projectedValue"},{"text":" that is the ","type":"text"},{"type":"codeVoice","code":"AsyncStoredValue"},{"type":"text","text":","},{"type":"text","text":" "},{"text":"that property and has the ``set(_:) function.","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This follows similar conventions to the "},{"type":"codeVoice","code":"@Published"},{"text":" property wrapper.","type":"text"},{"type":"text","text":" "},{"type":"codeVoice","code":"@Published var items: [Item]"},{"type":"text","text":" allows you to use "},{"code":"items","type":"codeVoice"},{"type":"text","text":" as a regular "},{"type":"codeVoice","code":"[Item]"},{"text":",","type":"text"},{"text":" ","type":"text"},{"text":"but ","type":"text"},{"code":"$items","type":"codeVoice"},{"type":"text","text":" projects "},{"type":"codeVoice","code":"AnyPublisher<[Item], Never>"},{"text":" so you can subscribe to changes items produces.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Within Boutique the @Stored property wrapper works very similarly."}]}],"kind":"content"}],"references":{"doc://Boutique/documentation/Boutique/AsyncStoredValue/wrappedValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue\/wrappedvalue","type":"topic","abstract":[{"text":"The currently stored value","type":"text"}],"title":"wrappedValue","role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/wrappedValue","fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue","navigatorTitle":[{"text":"AsyncStoredValue","kind":"identifier"}],"type":"topic","title":"AsyncStoredValue","abstract":[{"type":"text","text":"The @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":" "},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" or using @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"type":"text","text":"."}],"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AsyncStoredValue"}]},"doc://Boutique/documentation/Boutique/AsyncStoredValue/set(_:)":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue\/set(_:)","type":"topic","abstract":[{"type":"text","text":"Sets a value for the @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","type":"reference","isActive":true},{"type":"text","text":" property."}],"title":"set(_:)","role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/set(_:)","fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"set","kind":"identifier"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}]},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/asyncstoredvalue/toggle().json b/docs/data/documentation/boutique/asyncstoredvalue/toggle().json index 0b9bbe5..7d202ce 100644 --- a/docs/data/documentation/boutique/asyncstoredvalue/toggle().json +++ b/docs/data/documentation/boutique/asyncstoredvalue/toggle().json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"toggle"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is meant to provide a simple ergonomic improvement, avoiding callsites like this."}]},{"type":"codeListing","syntax":null,"code":["try await self.appState.$proFeaturesEnabled.set(!self.appState.proFeaturesEnabled)"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Instead having a much simpler simpler option."}]},{"type":"codeListing","syntax":null,"code":["try await self.appState.$proFeaturesEnabled.toggle()"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/asyncstoredvalue\/toggle()"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/toggle()","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A function to toggle an @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" that represent a "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" is "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"toggle()","roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"toggle"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"symbolKind":"method","externalID":"s:8Boutique16AsyncStoredValueVAASbRszrlE6toggleyyYaKF","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"role":"symbol","title":"AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}],"url":"\/documentation\/boutique\/asyncstoredvalue"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/toggle()":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" is "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"toggle()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"toggle"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"A function to toggle an @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" that represent a "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/toggle()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/toggle()"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file +{"kind":"symbol","schemaVersion":{"major":0,"minor":3,"patch":0},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/toggle()"},"abstract":[{"type":"text","text":"A function to toggle an @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","type":"reference","isActive":true},{"type":"text","text":" that represent a "},{"code":"Bool","type":"codeVoice"},{"type":"text","text":"."}],"metadata":{"externalID":"s:8Boutique16AsyncStoredValueVAASbRszrlE6toggleyyYaKF","symbolKind":"method","conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" is "},{"code":"Bool","type":"codeVoice"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}]},"extendedModule":"Boutique","title":"toggle()","role":"symbol","modules":[{"name":"Boutique"}],"roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"toggle","kind":"identifier"},{"kind":"text","text":"() "},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"primaryContentSections":[{"declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"toggle","kind":"identifier"},{"text":"() ","kind":"text"},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}],"kind":"declarations"},{"content":[{"text":"Discussion","anchor":"discussion","level":2,"type":"heading"},{"type":"paragraph","inlineContent":[{"text":"This is meant to provide a simple ergonomic improvement, avoiding callsites like this.","type":"text"}]},{"code":["try await self.appState.$proFeaturesEnabled.set(!self.appState.proFeaturesEnabled)"],"syntax":null,"type":"codeListing"},{"type":"paragraph","inlineContent":[{"text":"Instead having a much simpler simpler option.","type":"text"}]},{"type":"codeListing","syntax":null,"code":["try await self.appState.$proFeaturesEnabled.toggle()"]}],"kind":"content"}],"sections":[],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/asyncstoredvalue\/toggle()"]}],"references":{"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/toggle()":{"fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"toggle","kind":"identifier"},{"text":"() ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"A function to toggle an @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" that represent a "},{"code":"Bool","type":"codeVoice"},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/toggle()","conformance":{"availabilityPrefix":[{"type":"text","text":"Available when"}],"constraints":[{"type":"codeVoice","code":"Item"},{"text":" is ","type":"text"},{"code":"Bool","type":"codeVoice"},{"type":"text","text":"."}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"title":"toggle()","kind":"symbol","type":"topic","role":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue\/toggle()"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue","navigatorTitle":[{"text":"AsyncStoredValue","kind":"identifier"}],"type":"topic","title":"AsyncStoredValue","abstract":[{"type":"text","text":"The @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":" "},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" or using @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"type":"text","text":"."}],"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AsyncStoredValue"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/asyncstoredvalue/togglepresence(_:).json b/docs/data/documentation/boutique/asyncstoredvalue/togglepresence(_:).json new file mode 100644 index 0000000..f462d5c --- /dev/null +++ b/docs/data/documentation/boutique/asyncstoredvalue/togglepresence(_:).json @@ -0,0 +1 @@ +{"sections":[],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"kind":"symbol","primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"kind":"attribute","text":"@"},{"preciseIdentifier":"s:ScM","text":"MainActor","kind":"attribute"},{"kind":"text","text":" "},{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"togglePresence","kind":"identifier"},{"text":"<","kind":"text"},{"text":"Value","kind":"genericParameter"},{"text":">(","kind":"text"},{"text":"_","kind":"externalParam"},{"kind":"text","text":" "},{"text":"value","kind":"internalParam"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"text":") ","kind":"text"},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"where"},{"text":" ","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":" == ["},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"], "},{"kind":"typeIdentifier","text":"Value"},{"text":" : ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:Se","text":"Decodable"},{"kind":"text","text":", "},{"text":"Value","kind":"typeIdentifier"},{"text":" : ","kind":"text"},{"text":"Encodable","preciseIdentifier":"s:SE","kind":"typeIdentifier"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Value"},{"text":" : ","kind":"text"},{"text":"Equatable","preciseIdentifier":"s:SQ","kind":"typeIdentifier"}],"languages":["swift"]}]}],"variants":[{"paths":["\/documentation\/boutique\/asyncstoredvalue\/togglepresence(_:)"],"traits":[{"interfaceLanguage":"swift"}]}],"metadata":{"fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"togglePresence"},{"kind":"text","text":"<"},{"text":"Value","kind":"genericParameter"},{"kind":"text","text":">("},{"text":"Value","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"symbolKind":"method","modules":[{"name":"Boutique"}],"extendedModule":"Boutique","title":"togglePresence(_:)","conformance":{"conformancePrefix":[{"type":"text","text":"Conforms when"}],"constraints":[{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Equatable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"RangeReplaceableCollection"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}]},"externalID":"s:8Boutique16AsyncStoredValueVAASmRzrlE14togglePresenceyyqd__YaKSayqd__GRszSeRd__SERd__SQRd__lF","roleHeading":"Instance Method","role":"symbol"},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/togglePresence(_:)"},"schemaVersion":{"patch":0,"major":0,"minor":3},"references":{"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue","navigatorTitle":[{"text":"AsyncStoredValue","kind":"identifier"}],"type":"topic","title":"AsyncStoredValue","abstract":[{"type":"text","text":"The @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":" "},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" or using @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"type":"text","text":"."}],"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AsyncStoredValue"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/togglePresence(_:)":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/togglePresence(_:)","title":"togglePresence(_:)","abstract":[],"role":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue\/togglepresence(_:)","conformance":{"availabilityPrefix":[{"type":"text","text":"Available when"}],"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Equatable"},{"text":", and ","type":"text"},{"code":"RangeReplaceableCollection","type":"codeVoice"},{"text":".","type":"text"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"kind":"symbol","type":"topic","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"togglePresence"},{"text":"<","kind":"text"},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"text":"Value","kind":"typeIdentifier"},{"kind":"text","text":") "},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/asyncstoredvalue/update(key:value:).json b/docs/data/documentation/boutique/asyncstoredvalue/update(key:value:).json index 3ac28a5..01d0f3d 100644 --- a/docs/data/documentation/boutique/asyncstoredvalue/update(key:value:).json +++ b/docs/data/documentation/boutique/asyncstoredvalue/update(key:value:).json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"update"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Key"},{"kind":"text","text":", "},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":", "},{"kind":"externalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"?) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" "},{"kind":"keyword","text":"where"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" == ["},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"], "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Decodable","preciseIdentifier":"s:Se"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Encodable","preciseIdentifier":"s:SE"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Hashable","preciseIdentifier":"s:SH"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Decodable","preciseIdentifier":"s:Se"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Encodable","preciseIdentifier":"s:SE"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Equatable","preciseIdentifier":"s:SQ"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is meant to provide a simple ergonomic improvement, avoiding callsites like this."}]},{"type":"codeListing","syntax":null,"code":["var updatedRedPandaList = try await self.redPandaList","updatedRedPandaList[\"best\"] = \"Pabu\"","try await self.$redPandaList.set(updatedRedPandaList)"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Instead this function provides a much simpler alternative."}]},{"type":"codeListing","syntax":null,"code":["try await self.$redPandaList.update(key: \"best\", value: \"Pabu\")"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/asyncstoredvalue\/update(key:value:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/update(key:value:)","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A function to set an @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" represented by a "},{"type":"codeVoice","code":"Dictionary"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Equatable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"update(key:value:)","roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"update"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Key"},{"kind":"text","text":", "},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":", "},{"kind":"externalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"?) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"symbolKind":"method","externalID":"s:8Boutique16AsyncStoredValueV6update3key5valueyqd___qd_0_SgtYaKSDyqd__qd_0_GRszSeRd__SERd__SHRd__SeRd_0_SERd_0_SQRd_0_r0_lF","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"role":"symbol","title":"AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}],"url":"\/documentation\/boutique\/asyncstoredvalue"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/update(key:value:)":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Equatable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"update(key:value:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"update"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Key"},{"kind":"text","text":", "},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":", "},{"kind":"externalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"?) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"A function to set an @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" represented by a "},{"type":"codeVoice","code":"Dictionary"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/update(key:value:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/update(key:value:)"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file +{"kind":"symbol","schemaVersion":{"patch":0,"major":0,"minor":3},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/asyncstoredvalue\/update(key:value:)"]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/update(key:value:)","interfaceLanguage":"swift"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"abstract":[{"text":"A function to set an @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","type":"reference","isActive":true},{"type":"text","text":" represented by a "},{"code":"Dictionary","type":"codeVoice"},{"text":" ","type":"text"},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"primaryContentSections":[{"declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"update"},{"kind":"text","text":"<"},{"text":"Key","kind":"genericParameter"},{"kind":"text","text":", "},{"kind":"genericParameter","text":"Value"},{"text":">(","kind":"text"},{"text":"key","kind":"externalParam"},{"kind":"text","text":": "},{"text":"Key","kind":"typeIdentifier"},{"text":", ","kind":"text"},{"text":"value","kind":"externalParam"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"text":"?) ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"text":" ","kind":"text"},{"text":"where","kind":"keyword"},{"kind":"text","text":" "},{"text":"Item","kind":"typeIdentifier"},{"text":" == [","kind":"text"},{"kind":"typeIdentifier","text":"Key"},{"text":" : ","kind":"text"},{"text":"Value","kind":"typeIdentifier"},{"text":"], ","kind":"text"},{"text":"Key","kind":"typeIdentifier"},{"kind":"text","text":" : "},{"text":"Decodable","kind":"typeIdentifier","preciseIdentifier":"s:Se"},{"text":", ","kind":"text"},{"text":"Key","kind":"typeIdentifier"},{"text":" : ","kind":"text"},{"text":"Encodable","kind":"typeIdentifier","preciseIdentifier":"s:SE"},{"text":", ","kind":"text"},{"text":"Key","kind":"typeIdentifier"},{"text":" : ","kind":"text"},{"kind":"typeIdentifier","text":"Hashable","preciseIdentifier":"s:SH"},{"text":", ","kind":"text"},{"text":"Value","kind":"typeIdentifier"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","preciseIdentifier":"s:Se","text":"Decodable"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Value"},{"text":" : ","kind":"text"},{"text":"Encodable","preciseIdentifier":"s:SE","kind":"typeIdentifier"},{"kind":"text","text":", "},{"text":"Value","kind":"typeIdentifier"},{"text":" : ","kind":"text"},{"preciseIdentifier":"s:SQ","text":"Equatable","kind":"typeIdentifier"}],"languages":["swift"],"platforms":["macOS"]}],"kind":"declarations"},{"content":[{"type":"heading","text":"Discussion","level":2,"anchor":"discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is meant to provide a simple ergonomic improvement, avoiding callsites like this."}]},{"type":"codeListing","code":["var updatedRedPandaList = try await self.redPandaList","updatedRedPandaList[\"best\"] = \"Pabu\"","try await self.$redPandaList.set(updatedRedPandaList)"],"syntax":null},{"type":"paragraph","inlineContent":[{"text":"Instead this function provides a much simpler alternative.","type":"text"}]},{"syntax":null,"code":["try await self.$redPandaList.update(key: \"best\", value: \"Pabu\")"],"type":"codeListing"}],"kind":"content"}],"metadata":{"fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"update","kind":"identifier"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Key"},{"kind":"text","text":", "},{"text":"Value","kind":"genericParameter"},{"kind":"text","text":">("},{"kind":"externalParam","text":"key"},{"text":": ","kind":"text"},{"text":"Key","kind":"typeIdentifier"},{"kind":"text","text":", "},{"text":"value","kind":"externalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Value"},{"text":"?) ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"}],"roleHeading":"Instance Method","symbolKind":"method","externalID":"s:8Boutique16AsyncStoredValueV6update3key5valueyqd___qd_0_SgtYaKSDyqd__qd_0_GRszSeRd__SERd__SHRd__SeRd_0_SERd_0_SQRd_0_r0_lF","title":"update(key:value:)","extendedModule":"Boutique","role":"symbol","conformance":{"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Equatable","type":"codeVoice"},{"type":"text","text":"."}]},"modules":[{"name":"Boutique"}]},"sections":[],"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue","navigatorTitle":[{"text":"AsyncStoredValue","kind":"identifier"}],"type":"topic","title":"AsyncStoredValue","abstract":[{"type":"text","text":"The @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":" "},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" or using @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"type":"text","text":"."}],"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AsyncStoredValue"}]},"doc://Boutique/documentation/Boutique/AsyncStoredValue/update(key:value:)":{"fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"update","kind":"identifier"},{"text":"<","kind":"text"},{"text":"Key","kind":"genericParameter"},{"kind":"text","text":", "},{"text":"Value","kind":"genericParameter"},{"kind":"text","text":">("},{"text":"key","kind":"externalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Key"},{"text":", ","kind":"text"},{"kind":"externalParam","text":"value"},{"text":": ","kind":"text"},{"text":"Value","kind":"typeIdentifier"},{"kind":"text","text":"?) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/update(key:value:)","type":"topic","title":"update(key:value:)","url":"\/documentation\/boutique\/asyncstoredvalue\/update(key:value:)","role":"symbol","conformance":{"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Equatable"},{"text":".","type":"text"}]},"abstract":[{"type":"text","text":"A function to set an @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" represented by a "},{"type":"codeVoice","code":"Dictionary"},{"type":"text","text":" "},{"text":"without having to manually make an intermediate copy for every value update.","type":"text"}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/asyncstoredvalue/wrappedvalue.json b/docs/data/documentation/boutique/asyncstoredvalue/wrappedvalue.json index 2221277..bc4acb1 100644 --- a/docs/data/documentation/boutique/asyncstoredvalue/wrappedvalue.json +++ b/docs/data/documentation/boutique/asyncstoredvalue/wrappedvalue.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/asyncstoredvalue\/wrappedvalue"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/wrappedValue","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"The currently stored value"}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"}],"title":"wrappedValue","roleHeading":"Instance Property","role":"symbol","symbolKind":"property","externalID":"s:8Boutique16AsyncStoredValueV07wrappedD0xvp","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/AsyncStoredValue/wrappedValue":{"role":"symbol","title":"wrappedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"}],"abstract":[{"type":"text","text":"The currently stored value"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/wrappedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/asyncstoredvalue\/wrappedvalue"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"role":"symbol","title":"AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}],"url":"\/documentation\/boutique\/asyncstoredvalue"}}} \ No newline at end of file +{"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/asyncstoredvalue\/wrappedvalue"]}],"primaryContentSections":[{"declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"text":"wrappedValue","kind":"identifier"},{"kind":"text","text":": "},{"text":"Item","kind":"typeIdentifier"},{"text":" { ","kind":"text"},{"kind":"keyword","text":"get"},{"text":" }","kind":"text"}],"languages":["swift"],"platforms":["macOS"]}],"kind":"declarations"}],"kind":"symbol","abstract":[{"text":"The currently stored value","type":"text"}],"sections":[],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/wrappedValue","interfaceLanguage":"swift"},"metadata":{"symbolKind":"property","modules":[{"name":"Boutique"}],"role":"symbol","fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"}],"title":"wrappedValue","externalID":"s:8Boutique16AsyncStoredValueV07wrappedD0xvp","roleHeading":"Instance Property"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"]]},"schemaVersion":{"major":0,"minor":3,"patch":0},"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue","navigatorTitle":[{"text":"AsyncStoredValue","kind":"identifier"}],"type":"topic","title":"AsyncStoredValue","abstract":[{"type":"text","text":"The @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":" "},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" or using @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"type":"text","text":"."}],"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AsyncStoredValue"}]},"doc://Boutique/documentation/Boutique/AsyncStoredValue/wrappedValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue\/wrappedvalue","type":"topic","abstract":[{"text":"The currently stored value","type":"text"}],"title":"wrappedValue","role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue\/wrappedValue","fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychainerror.json b/docs/data/documentation/boutique/keychainerror.json index c6ce298..afb549e 100644 --- a/docs/data/documentation/boutique/keychainerror.json +++ b/docs/data/documentation/boutique/keychainerror.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"enum"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/keychainerror"],"traits":[{"interfaceLanguage":"swift"}]}],"relationshipsSections":[{"identifiers":["doc:\/\/Boutique\/s5ErrorP","doc:\/\/Boutique\/s8SendableP"],"kind":"relationships","title":"Conforms To","type":"conformsTo"}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError","interfaceLanguage":"swift"},"topicSections":[{"title":"Enumeration Cases","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/couldNotAccessKeychain","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/errorWithStatus(status:)","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/itemNotFound","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/missingEntitlement"]},{"title":"Default Implementations","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/Error-Implementations"],"generated":true}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"enum"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"title":"KeychainError","roleHeading":"Enumeration","role":"symbol","symbolKind":"enum","externalID":"s:8Boutique13KeychainErrorO","modules":[{"name":"Boutique"}],"navigatorTitle":[{"kind":"identifier","text":"KeychainError"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique"]]},"references":{"doc://Boutique/documentation/Boutique/KeychainError":{"role":"symbol","title":"KeychainError","fragments":[{"kind":"keyword","text":"enum"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"KeychainError"}],"url":"\/documentation\/boutique\/keychainerror"},"doc://Boutique/s8SendableP":{"type":"unresolvable","title":"Swift.Sendable","identifier":"doc:\/\/Boutique\/s8SendableP"},"doc://Boutique/documentation/Boutique/KeychainError/couldNotAccessKeychain":{"role":"symbol","title":"KeychainError.couldNotAccessKeychain","fragments":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"kind":"identifier","text":"couldNotAccessKeychain"}],"abstract":[{"type":"text","text":"The keychain could not be accessed."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/couldNotAccessKeychain","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/keychainerror\/couldnotaccesskeychain"},"doc://Boutique/documentation/Boutique/KeychainError/itemNotFound":{"role":"symbol","title":"KeychainError.itemNotFound","fragments":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"kind":"identifier","text":"itemNotFound"}],"abstract":[{"type":"text","text":"No data was found for the requested key."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/itemNotFound","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/keychainerror\/itemnotfound"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/s5ErrorP":{"type":"unresolvable","title":"Swift.Error","identifier":"doc:\/\/Boutique\/s5ErrorP"},"doc://Boutique/documentation/Boutique/KeychainError/errorWithStatus(status:)":{"role":"symbol","title":"KeychainError.errorWithStatus(status:)","fragments":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"kind":"identifier","text":"errorWithStatus"},{"kind":"text","text":"("},{"kind":"externalParam","text":"status"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"OSStatus","preciseIdentifier":"c:@T@OSStatus"},{"kind":"text","text":")"}],"abstract":[{"type":"text","text":"We did not match any commonly encountered keychain errors and want to bubble up the status code"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/errorWithStatus(status:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/keychainerror\/errorwithstatus(status:)"},"doc://Boutique/documentation/Boutique/KeychainError/Error-Implementations":{"role":"collectionGroup","title":"Error Implementations","abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/Error-Implementations","kind":"article","type":"topic","url":"\/documentation\/boutique\/keychainerror\/error-implementations"},"doc://Boutique/documentation/Boutique/KeychainError/missingEntitlement":{"role":"symbol","title":"KeychainError.missingEntitlement","fragments":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"kind":"identifier","text":"missingEntitlement"}],"abstract":[{"type":"text","text":"The application does not have the proper entitlements to perform the requested action."},{"type":"text","text":" "},{"type":"text","text":"This may be due to an Apple Keychain bug. As a workaround try running on a device that is not attached to a debugger."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/missingEntitlement","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/keychainerror\/missingentitlement"}}} \ No newline at end of file +{"relationshipsSections":[{"type":"conformsTo","identifiers":["doc:\/\/Boutique\/s5ErrorP","doc:\/\/Boutique\/s8SendableP"],"kind":"relationships","title":"Conforms To"}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/keychainerror"]}],"sections":[],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique"]]},"topicSections":[{"identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/couldNotAccessKeychain","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/errorWithStatus(status:)","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/itemNotFound","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/missingEntitlement"],"title":"Enumeration Cases"},{"identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/Error-Implementations"],"title":"Default Implementations","generated":true}],"kind":"symbol","metadata":{"modules":[{"name":"Boutique"}],"roleHeading":"Enumeration","title":"KeychainError","role":"symbol","symbolKind":"enum","navigatorTitle":[{"text":"KeychainError","kind":"identifier"}],"externalID":"s:8Boutique13KeychainErrorO","fragments":[{"text":"enum","kind":"keyword"},{"text":" ","kind":"text"},{"text":"KeychainError","kind":"identifier"}]},"schemaVersion":{"patch":0,"major":0,"minor":3},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError","interfaceLanguage":"swift"},"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"text":"enum","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"languages":["swift"]}]}],"references":{"doc://Boutique/s8SendableP":{"type":"unresolvable","identifier":"doc:\/\/Boutique\/s8SendableP","title":"Swift.Sendable"},"doc://Boutique/documentation/Boutique/KeychainError":{"title":"KeychainError","type":"topic","kind":"symbol","role":"symbol","fragments":[{"text":"enum","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"navigatorTitle":[{"text":"KeychainError","kind":"identifier"}],"url":"\/documentation\/boutique\/keychainerror","abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"},"doc://Boutique/documentation/Boutique/KeychainError/Error-Implementations":{"url":"\/documentation\/boutique\/keychainerror\/error-implementations","title":"Error Implementations","role":"collectionGroup","kind":"article","type":"topic","abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/Error-Implementations"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainError/itemNotFound":{"title":"KeychainError.itemNotFound","url":"\/documentation\/boutique\/keychainerror\/itemnotfound","role":"symbol","kind":"symbol","type":"topic","abstract":[{"text":"No data was found for the requested key.","type":"text"}],"fragments":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"text":"itemNotFound","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/itemNotFound"},"doc://Boutique/documentation/Boutique/KeychainError/missingEntitlement":{"title":"KeychainError.missingEntitlement","type":"topic","url":"\/documentation\/boutique\/keychainerror\/missingentitlement","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/missingEntitlement","role":"symbol","abstract":[{"text":"The application does not have the proper entitlements to perform the requested action.","type":"text"},{"text":" ","type":"text"},{"text":"This may be due to an Apple Keychain bug. As a workaround try running on a device that is not attached to a debugger.","type":"text"}],"fragments":[{"text":"case","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"missingEntitlement"}]},"doc://Boutique/documentation/Boutique/KeychainError/errorWithStatus(status:)":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/errorWithStatus(status:)","fragments":[{"kind":"keyword","text":"case"},{"text":" ","kind":"text"},{"text":"errorWithStatus","kind":"identifier"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"status"},{"text":": ","kind":"text"},{"preciseIdentifier":"c:@T@OSStatus","kind":"typeIdentifier","text":"OSStatus"},{"kind":"text","text":")"}],"title":"KeychainError.errorWithStatus(status:)","type":"topic","abstract":[{"text":"We did not match any commonly encountered keychain errors and want to bubble up the status code","type":"text"}],"kind":"symbol","url":"\/documentation\/boutique\/keychainerror\/errorwithstatus(status:)"},"doc://Boutique/s5ErrorP":{"type":"unresolvable","identifier":"doc:\/\/Boutique\/s5ErrorP","title":"Swift.Error"},"doc://Boutique/documentation/Boutique/KeychainError/couldNotAccessKeychain":{"kind":"symbol","title":"KeychainError.couldNotAccessKeychain","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/couldNotAccessKeychain","role":"symbol","type":"topic","fragments":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"text":"couldNotAccessKeychain","kind":"identifier"}],"url":"\/documentation\/boutique\/keychainerror\/couldnotaccesskeychain","abstract":[{"text":"The keychain could not be accessed.","type":"text"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychainerror/couldnotaccesskeychain.json b/docs/data/documentation/boutique/keychainerror/couldnotaccesskeychain.json index cf0fce3..ebdad42 100644 --- a/docs/data/documentation/boutique/keychainerror/couldnotaccesskeychain.json +++ b/docs/data/documentation/boutique/keychainerror/couldnotaccesskeychain.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"kind":"identifier","text":"couldNotAccessKeychain"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/keychainerror\/couldnotaccesskeychain"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/couldNotAccessKeychain","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"The keychain could not be accessed."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"kind":"identifier","text":"couldNotAccessKeychain"}],"title":"KeychainError.couldNotAccessKeychain","roleHeading":"Case","role":"symbol","symbolKind":"case","externalID":"s:8Boutique13KeychainErrorO014couldNotAccessB0yA2CmF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"]]},"references":{"doc://Boutique/documentation/Boutique/KeychainError/couldNotAccessKeychain":{"role":"symbol","title":"KeychainError.couldNotAccessKeychain","fragments":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"kind":"identifier","text":"couldNotAccessKeychain"}],"abstract":[{"type":"text","text":"The keychain could not be accessed."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/couldNotAccessKeychain","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/keychainerror\/couldnotaccesskeychain"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainError":{"role":"symbol","title":"KeychainError","fragments":[{"kind":"keyword","text":"enum"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"KeychainError"}],"url":"\/documentation\/boutique\/keychainerror"}}} \ No newline at end of file +{"abstract":[{"type":"text","text":"The keychain could not be accessed."}],"sections":[],"schemaVersion":{"major":0,"minor":3,"patch":0},"metadata":{"title":"KeychainError.couldNotAccessKeychain","externalID":"s:8Boutique13KeychainErrorO014couldNotAccessB0yA2CmF","roleHeading":"Case","symbolKind":"case","role":"symbol","modules":[{"name":"Boutique"}],"fragments":[{"kind":"keyword","text":"case"},{"text":" ","kind":"text"},{"kind":"identifier","text":"couldNotAccessKeychain"}]},"kind":"symbol","hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"]]},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/couldNotAccessKeychain","interfaceLanguage":"swift"},"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"languages":["swift"],"tokens":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"text":"couldNotAccessKeychain","kind":"identifier"}]}]}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/keychainerror\/couldnotaccesskeychain"]}],"references":{"doc://Boutique/documentation/Boutique/KeychainError":{"title":"KeychainError","type":"topic","kind":"symbol","role":"symbol","fragments":[{"text":"enum","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"navigatorTitle":[{"text":"KeychainError","kind":"identifier"}],"url":"\/documentation\/boutique\/keychainerror","abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainError/couldNotAccessKeychain":{"kind":"symbol","title":"KeychainError.couldNotAccessKeychain","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/couldNotAccessKeychain","role":"symbol","type":"topic","fragments":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"text":"couldNotAccessKeychain","kind":"identifier"}],"url":"\/documentation\/boutique\/keychainerror\/couldnotaccesskeychain","abstract":[{"text":"The keychain could not be accessed.","type":"text"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychainerror/error-implementations.json b/docs/data/documentation/boutique/keychainerror/error-implementations.json index 4eed2d3..f77806c 100644 --- a/docs/data/documentation/boutique/keychainerror/error-implementations.json +++ b/docs/data/documentation/boutique/keychainerror/error-implementations.json @@ -1 +1 @@ -{"variants":[{"paths":["\/documentation\/boutique\/keychainerror\/error-implementations"],"traits":[{"interfaceLanguage":"swift"}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/Error-Implementations","interfaceLanguage":"swift"},"topicSections":[{"title":"Instance Properties","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/localizedDescription"],"generated":true}],"kind":"article","metadata":{"modules":[{"name":"Boutique"}],"role":"collectionGroup","title":"Error Implementations"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"]]},"references":{"doc://Boutique/documentation/Boutique/KeychainError/localizedDescription":{"role":"symbol","title":"localizedDescription","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"localizedDescription"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/localizedDescription","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/keychainerror\/localizeddescription"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainError":{"role":"symbol","title":"KeychainError","fragments":[{"kind":"keyword","text":"enum"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"KeychainError"}],"url":"\/documentation\/boutique\/keychainerror"}}} \ No newline at end of file +{"schemaVersion":{"patch":0,"major":0,"minor":3},"topicSections":[{"title":"Instance Properties","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/localizedDescription"],"generated":true}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"]]},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/Error-Implementations","interfaceLanguage":"swift"},"kind":"article","sections":[],"metadata":{"title":"Error Implementations","roleHeading":"API Collection","role":"collectionGroup","modules":[{"name":"Boutique"}]},"variants":[{"paths":["\/documentation\/boutique\/keychainerror\/error-implementations"],"traits":[{"interfaceLanguage":"swift"}]}],"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainError":{"title":"KeychainError","type":"topic","kind":"symbol","role":"symbol","fragments":[{"text":"enum","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"navigatorTitle":[{"text":"KeychainError","kind":"identifier"}],"url":"\/documentation\/boutique\/keychainerror","abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"},"doc://Boutique/documentation/Boutique/KeychainError/localizedDescription":{"title":"localizedDescription","role":"symbol","fragments":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"localizedDescription"},{"kind":"text","text":": "},{"text":"String","preciseIdentifier":"s:SS","kind":"typeIdentifier"}],"url":"\/documentation\/boutique\/keychainerror\/localizeddescription","abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/localizedDescription","type":"topic","kind":"symbol"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychainerror/errorwithstatus(status:).json b/docs/data/documentation/boutique/keychainerror/errorwithstatus(status:).json index a8afe20..13fd377 100644 --- a/docs/data/documentation/boutique/keychainerror/errorwithstatus(status:).json +++ b/docs/data/documentation/boutique/keychainerror/errorwithstatus(status:).json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"kind":"identifier","text":"errorWithStatus"},{"kind":"text","text":"("},{"kind":"externalParam","text":"status"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"OSStatus","preciseIdentifier":"c:@T@OSStatus"},{"kind":"text","text":")"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/keychainerror\/errorwithstatus(status:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/errorWithStatus(status:)","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"We did not match any commonly encountered keychain errors and want to bubble up the status code"}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"kind":"identifier","text":"errorWithStatus"},{"kind":"text","text":"("},{"kind":"externalParam","text":"status"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"OSStatus","preciseIdentifier":"c:@T@OSStatus"},{"kind":"text","text":")"}],"title":"KeychainError.errorWithStatus(status:)","roleHeading":"Case","role":"symbol","symbolKind":"case","externalID":"s:8Boutique13KeychainErrorO15errorWithStatusyACs5Int32V_tcACmF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"]]},"references":{"doc://Boutique/documentation/Boutique/KeychainError/errorWithStatus(status:)":{"role":"symbol","title":"KeychainError.errorWithStatus(status:)","fragments":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"kind":"identifier","text":"errorWithStatus"},{"kind":"text","text":"("},{"kind":"externalParam","text":"status"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"OSStatus","preciseIdentifier":"c:@T@OSStatus"},{"kind":"text","text":")"}],"abstract":[{"type":"text","text":"We did not match any commonly encountered keychain errors and want to bubble up the status code"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/errorWithStatus(status:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/keychainerror\/errorwithstatus(status:)"},"doc://Boutique/documentation/Boutique/KeychainError":{"role":"symbol","title":"KeychainError","fragments":[{"kind":"keyword","text":"enum"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"KeychainError"}],"url":"\/documentation\/boutique\/keychainerror"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file +{"metadata":{"fragments":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"kind":"identifier","text":"errorWithStatus"},{"text":"(","kind":"text"},{"text":"status","kind":"externalParam"},{"text":": ","kind":"text"},{"preciseIdentifier":"c:@T@OSStatus","kind":"typeIdentifier","text":"OSStatus"},{"kind":"text","text":")"}],"externalID":"s:8Boutique13KeychainErrorO15errorWithStatusyACs5Int32V_tcACmF","roleHeading":"Case","modules":[{"name":"Boutique"}],"title":"KeychainError.errorWithStatus(status:)","symbolKind":"case","role":"symbol"},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/errorWithStatus(status:)","interfaceLanguage":"swift"},"primaryContentSections":[{"declarations":[{"tokens":[{"text":"case","kind":"keyword"},{"kind":"text","text":" "},{"text":"errorWithStatus","kind":"identifier"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"status"},{"kind":"text","text":": "},{"text":"OSStatus","kind":"typeIdentifier","preciseIdentifier":"c:@T@OSStatus"},{"kind":"text","text":")"}],"platforms":["macOS"],"languages":["swift"]}],"kind":"declarations"}],"sections":[],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"]]},"abstract":[{"text":"We did not match any commonly encountered keychain errors and want to bubble up the status code","type":"text"}],"schemaVersion":{"major":0,"minor":3,"patch":0},"kind":"symbol","variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/keychainerror\/errorwithstatus(status:)"]}],"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainError/errorWithStatus(status:)":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/errorWithStatus(status:)","fragments":[{"kind":"keyword","text":"case"},{"text":" ","kind":"text"},{"text":"errorWithStatus","kind":"identifier"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"status"},{"text":": ","kind":"text"},{"preciseIdentifier":"c:@T@OSStatus","kind":"typeIdentifier","text":"OSStatus"},{"kind":"text","text":")"}],"title":"KeychainError.errorWithStatus(status:)","type":"topic","abstract":[{"text":"We did not match any commonly encountered keychain errors and want to bubble up the status code","type":"text"}],"kind":"symbol","url":"\/documentation\/boutique\/keychainerror\/errorwithstatus(status:)"},"doc://Boutique/documentation/Boutique/KeychainError":{"title":"KeychainError","type":"topic","kind":"symbol","role":"symbol","fragments":[{"text":"enum","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"navigatorTitle":[{"text":"KeychainError","kind":"identifier"}],"url":"\/documentation\/boutique\/keychainerror","abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychainerror/itemnotfound.json b/docs/data/documentation/boutique/keychainerror/itemnotfound.json index 907caee..e47cd40 100644 --- a/docs/data/documentation/boutique/keychainerror/itemnotfound.json +++ b/docs/data/documentation/boutique/keychainerror/itemnotfound.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"kind":"identifier","text":"itemNotFound"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/keychainerror\/itemnotfound"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/itemNotFound","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"No data was found for the requested key."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"kind":"identifier","text":"itemNotFound"}],"title":"KeychainError.itemNotFound","roleHeading":"Case","role":"symbol","symbolKind":"case","externalID":"s:8Boutique13KeychainErrorO12itemNotFoundyA2CmF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"]]},"references":{"doc://Boutique/documentation/Boutique/KeychainError/itemNotFound":{"role":"symbol","title":"KeychainError.itemNotFound","fragments":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"kind":"identifier","text":"itemNotFound"}],"abstract":[{"type":"text","text":"No data was found for the requested key."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/itemNotFound","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/keychainerror\/itemnotfound"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainError":{"role":"symbol","title":"KeychainError","fragments":[{"kind":"keyword","text":"enum"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"KeychainError"}],"url":"\/documentation\/boutique\/keychainerror"}}} \ No newline at end of file +{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"text":"case","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"itemNotFound"}],"platforms":["macOS"],"languages":["swift"]}]}],"sections":[],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"]]},"variants":[{"paths":["\/documentation\/boutique\/keychainerror\/itemnotfound"],"traits":[{"interfaceLanguage":"swift"}]}],"metadata":{"roleHeading":"Case","externalID":"s:8Boutique13KeychainErrorO12itemNotFoundyA2CmF","role":"symbol","fragments":[{"text":"case","kind":"keyword"},{"text":" ","kind":"text"},{"text":"itemNotFound","kind":"identifier"}],"modules":[{"name":"Boutique"}],"symbolKind":"case","title":"KeychainError.itemNotFound"},"schemaVersion":{"minor":3,"major":0,"patch":0},"abstract":[{"type":"text","text":"No data was found for the requested key."}],"kind":"symbol","identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/itemNotFound","interfaceLanguage":"swift"},"references":{"doc://Boutique/documentation/Boutique/KeychainError/itemNotFound":{"title":"KeychainError.itemNotFound","url":"\/documentation\/boutique\/keychainerror\/itemnotfound","role":"symbol","kind":"symbol","type":"topic","abstract":[{"text":"No data was found for the requested key.","type":"text"}],"fragments":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"text":"itemNotFound","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/itemNotFound"},"doc://Boutique/documentation/Boutique/KeychainError":{"title":"KeychainError","type":"topic","kind":"symbol","role":"symbol","fragments":[{"text":"enum","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"navigatorTitle":[{"text":"KeychainError","kind":"identifier"}],"url":"\/documentation\/boutique\/keychainerror","abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychainerror/localizeddescription.json b/docs/data/documentation/boutique/keychainerror/localizeddescription.json index 37f1608..da61943 100644 --- a/docs/data/documentation/boutique/keychainerror/localizeddescription.json +++ b/docs/data/documentation/boutique/keychainerror/localizeddescription.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"localizedDescription"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":" { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/keychainerror\/localizeddescription"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/localizedDescription","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Inherited from "},{"type":"codeVoice","code":"Error.localizedDescription"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"role":"symbol","title":"localizedDescription","roleHeading":"Instance Property","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"localizedDescription"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"}],"symbolKind":"property","externalID":"s:s5ErrorP10FoundationE20localizedDescriptionSSvp::SYNTHESIZED::s:8Boutique13KeychainErrorO","extendedModule":"Swift","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/Error-Implementations"]]},"references":{"doc://Boutique/documentation/Boutique/KeychainError/localizedDescription":{"role":"symbol","title":"localizedDescription","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"localizedDescription"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/localizedDescription","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/keychainerror\/localizeddescription"},"doc://Boutique/documentation/Boutique/KeychainError":{"role":"symbol","title":"KeychainError","fragments":[{"kind":"keyword","text":"enum"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"KeychainError"}],"url":"\/documentation\/boutique\/keychainerror"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainError/Error-Implementations":{"role":"collectionGroup","title":"Error Implementations","abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/Error-Implementations","kind":"article","type":"topic","url":"\/documentation\/boutique\/keychainerror\/error-implementations"}}} \ No newline at end of file +{"sections":[],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/keychainerror\/localizeddescription"]}],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"kind":"identifier","text":"localizedDescription"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:SS","text":"String","kind":"typeIdentifier"},{"text":" { ","kind":"text"},{"text":"get","kind":"keyword"},{"text":" }","kind":"text"}],"languages":["swift"]}]}],"metadata":{"platforms":[{"introducedAt":"8.0","beta":false,"unavailable":false,"deprecated":false,"name":"iOS"},{"introducedAt":"10.10","deprecated":false,"unavailable":false,"beta":false,"name":"macOS"},{"name":"tvOS","deprecated":false,"introducedAt":"9.0","unavailable":false,"beta":false},{"beta":false,"unavailable":false,"name":"watchOS","introducedAt":"2.0","deprecated":false}],"fragments":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"localizedDescription"},{"kind":"text","text":": "},{"preciseIdentifier":"s:SS","text":"String","kind":"typeIdentifier"}],"symbolKind":"property","roleHeading":"Instance Property","modules":[{"relatedModules":["Swift"],"name":"Boutique"}],"extendedModule":"Swift","title":"localizedDescription","externalID":"s:s5ErrorP10FoundationE20localizedDescriptionSSvp::SYNTHESIZED::s:8Boutique13KeychainErrorO","role":"symbol"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/Error-Implementations"]]},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/localizedDescription"},"schemaVersion":{"major":0,"minor":3,"patch":0},"abstract":[{"type":"text","text":"Inherited from "},{"type":"codeVoice","code":"Error.localizedDescription"},{"text":".","type":"text"}],"kind":"symbol","references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainError/Error-Implementations":{"url":"\/documentation\/boutique\/keychainerror\/error-implementations","title":"Error Implementations","role":"collectionGroup","kind":"article","type":"topic","abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/Error-Implementations"},"doc://Boutique/documentation/Boutique/KeychainError":{"title":"KeychainError","type":"topic","kind":"symbol","role":"symbol","fragments":[{"text":"enum","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"navigatorTitle":[{"text":"KeychainError","kind":"identifier"}],"url":"\/documentation\/boutique\/keychainerror","abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"},"doc://Boutique/documentation/Boutique/KeychainError/localizedDescription":{"title":"localizedDescription","role":"symbol","fragments":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"localizedDescription"},{"kind":"text","text":": "},{"text":"String","preciseIdentifier":"s:SS","kind":"typeIdentifier"}],"url":"\/documentation\/boutique\/keychainerror\/localizeddescription","abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/localizedDescription","type":"topic","kind":"symbol"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychainerror/missingentitlement.json b/docs/data/documentation/boutique/keychainerror/missingentitlement.json index 1cf6635..27b513c 100644 --- a/docs/data/documentation/boutique/keychainerror/missingentitlement.json +++ b/docs/data/documentation/boutique/keychainerror/missingentitlement.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"kind":"identifier","text":"missingEntitlement"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/keychainerror\/missingentitlement"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/missingEntitlement","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"The application does not have the proper entitlements to perform the requested action."},{"type":"text","text":" "},{"type":"text","text":"This may be due to an Apple Keychain bug. As a workaround try running on a device that is not attached to a debugger."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"kind":"identifier","text":"missingEntitlement"}],"title":"KeychainError.missingEntitlement","roleHeading":"Case","role":"symbol","symbolKind":"case","externalID":"s:8Boutique13KeychainErrorO18missingEntitlementyA2CmF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"]]},"references":{"doc://Boutique/documentation/Boutique/KeychainError":{"role":"symbol","title":"KeychainError","fragments":[{"kind":"keyword","text":"enum"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"KeychainError"}],"url":"\/documentation\/boutique\/keychainerror"},"doc://Boutique/documentation/Boutique/KeychainError/missingEntitlement":{"role":"symbol","title":"KeychainError.missingEntitlement","fragments":[{"kind":"keyword","text":"case"},{"kind":"text","text":" "},{"kind":"identifier","text":"missingEntitlement"}],"abstract":[{"type":"text","text":"The application does not have the proper entitlements to perform the requested action."},{"type":"text","text":" "},{"type":"text","text":"This may be due to an Apple Keychain bug. As a workaround try running on a device that is not attached to a debugger."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/missingEntitlement","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/keychainerror\/missingentitlement"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file +{"sections":[],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/missingEntitlement"},"variants":[{"paths":["\/documentation\/boutique\/keychainerror\/missingentitlement"],"traits":[{"interfaceLanguage":"swift"}]}],"abstract":[{"type":"text","text":"The application does not have the proper entitlements to perform the requested action."},{"type":"text","text":" "},{"type":"text","text":"This may be due to an Apple Keychain bug. As a workaround try running on a device that is not attached to a debugger."}],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"languages":["swift"],"tokens":[{"kind":"keyword","text":"case"},{"text":" ","kind":"text"},{"kind":"identifier","text":"missingEntitlement"}]}]},{"kind":"content","content":[{"text":"Discussion","level":2,"type":"heading","anchor":"discussion"},{"type":"aside","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"https:\/\/forums.developer.apple.com\/thread\/4743"}]}],"name":"See Also","style":"note"}]}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"]]},"kind":"symbol","metadata":{"externalID":"s:8Boutique13KeychainErrorO18missingEntitlementyA2CmF","title":"KeychainError.missingEntitlement","symbolKind":"case","roleHeading":"Case","modules":[{"name":"Boutique"}],"role":"symbol","fragments":[{"text":"case","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"missingEntitlement"}]},"schemaVersion":{"patch":0,"minor":3,"major":0},"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainError/missingEntitlement":{"title":"KeychainError.missingEntitlement","type":"topic","url":"\/documentation\/boutique\/keychainerror\/missingentitlement","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError\/missingEntitlement","role":"symbol","abstract":[{"text":"The application does not have the proper entitlements to perform the requested action.","type":"text"},{"text":" ","type":"text"},{"text":"This may be due to an Apple Keychain bug. As a workaround try running on a device that is not attached to a debugger.","type":"text"}],"fragments":[{"text":"case","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"missingEntitlement"}]},"doc://Boutique/documentation/Boutique/KeychainError":{"title":"KeychainError","type":"topic","kind":"symbol","role":"symbol","fragments":[{"text":"enum","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"KeychainError"}],"navigatorTitle":[{"text":"KeychainError","kind":"identifier"}],"url":"\/documentation\/boutique\/keychainerror","abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainError"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychaingroup.json b/docs/data/documentation/boutique/keychaingroup.json new file mode 100644 index 0000000..c4c785c --- /dev/null +++ b/docs/data/documentation/boutique/keychaingroup.json @@ -0,0 +1 @@ +{"metadata":{"externalID":"s:8Boutique13KeychainGroupV","title":"KeychainGroup","roleHeading":"Structure","role":"symbol","modules":[{"name":"Boutique"}],"symbolKind":"struct","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"KeychainGroup"}],"navigatorTitle":[{"text":"KeychainGroup","kind":"identifier"}]},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup"},"variants":[{"paths":["\/documentation\/boutique\/keychaingroup"],"traits":[{"interfaceLanguage":"swift"}]}],"abstract":[{"type":"text","text":"A type representing Tagged"},{"type":"text","text":", to statically represent the keychain’s Group."},{"text":" ","type":"text"},{"text":"This is done to be more type-safe than passing string parameters in all places.","type":"text"}],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"KeychainGroup","kind":"identifier"}],"languages":["swift"]}]}],"topicSections":[{"title":"Initializers","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/init(stringLiteral:)","doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/init(value:)"]},{"title":"Instance Properties","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/value"]},{"identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/ExpressibleByExtendedGraphemeClusterLiteral-Implementations","doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/ExpressibleByUnicodeScalarLiteral-Implementations"],"title":"Default Implementations","generated":true}],"relationshipsSections":[{"kind":"relationships","identifiers":["doc:\/\/Boutique\/s43ExpressibleByExtendedGraphemeClusterLiteralP","doc:\/\/Boutique\/s26ExpressibleByStringLiteralP","doc:\/\/Boutique\/s33ExpressibleByUnicodeScalarLiteralP"],"type":"conformsTo","title":"Conforms To"}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique"]]},"kind":"symbol","sections":[],"schemaVersion":{"major":0,"minor":3,"patch":0},"references":{"doc://Boutique/documentation/Boutique/KeychainGroup/value":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/value","abstract":[],"title":"value","role":"symbol","url":"\/documentation\/boutique\/keychaingroup\/value","kind":"symbol","type":"topic","fragments":[{"text":"let","kind":"keyword"},{"kind":"text","text":" "},{"text":"value","kind":"identifier"},{"text":": ","kind":"text"},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"}]},"doc://Boutique/s33ExpressibleByUnicodeScalarLiteralP":{"title":"Swift.ExpressibleByUnicodeScalarLiteral","identifier":"doc:\/\/Boutique\/s33ExpressibleByUnicodeScalarLiteralP","type":"unresolvable"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainGroup/ExpressibleByExtendedGraphemeClusterLiteral-Implementations":{"url":"\/documentation\/boutique\/keychaingroup\/expressiblebyextendedgraphemeclusterliteral-implementations","role":"collectionGroup","type":"topic","kind":"article","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/ExpressibleByExtendedGraphemeClusterLiteral-Implementations","title":"ExpressibleByExtendedGraphemeClusterLiteral Implementations","abstract":[]},"doc://Boutique/documentation/Boutique/KeychainGroup/ExpressibleByUnicodeScalarLiteral-Implementations":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/ExpressibleByUnicodeScalarLiteral-Implementations","abstract":[],"title":"ExpressibleByUnicodeScalarLiteral Implementations","role":"collectionGroup","url":"\/documentation\/boutique\/keychaingroup\/expressiblebyunicodescalarliteral-implementations","kind":"article","type":"topic"},"doc://Boutique/documentation/Boutique/KeychainGroup/init(stringLiteral:)":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/init(stringLiteral:)","abstract":[],"title":"init(stringLiteral:)","role":"symbol","url":"\/documentation\/boutique\/keychaingroup\/init(stringliteral:)","kind":"symbol","type":"topic","fragments":[{"text":"init","kind":"identifier"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"stringLiteral"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"StaticString","preciseIdentifier":"s:s12StaticStringV"},{"text":")","kind":"text"}]},"doc://Boutique/documentation/Boutique/KeychainGroup/init(value:)":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/init(value:)","abstract":[],"title":"init(value:)","role":"symbol","url":"\/documentation\/boutique\/keychaingroup\/init(value:)","kind":"symbol","type":"topic","fragments":[{"text":"init","kind":"identifier"},{"text":"(","kind":"text"},{"text":"value","kind":"externalParam"},{"kind":"text","text":": "},{"preciseIdentifier":"s:SS","text":"String","kind":"typeIdentifier"},{"text":")","kind":"text"}]},"doc://Boutique/s26ExpressibleByStringLiteralP":{"type":"unresolvable","identifier":"doc:\/\/Boutique\/s26ExpressibleByStringLiteralP","title":"Swift.ExpressibleByStringLiteral"},"doc://Boutique/documentation/Boutique/KeychainGroup":{"type":"topic","abstract":[{"text":"A type representing Tagged","type":"text"},{"type":"text","text":", to statically represent the keychain’s Group."},{"type":"text","text":" "},{"type":"text","text":"This is done to be more type-safe than passing string parameters in all places."}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"text":"KeychainGroup","kind":"identifier"}],"url":"\/documentation\/boutique\/keychaingroup","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup","title":"KeychainGroup","role":"symbol","navigatorTitle":[{"kind":"identifier","text":"KeychainGroup"}],"kind":"symbol"},"doc://Boutique/s43ExpressibleByExtendedGraphemeClusterLiteralP":{"type":"unresolvable","identifier":"doc:\/\/Boutique\/s43ExpressibleByExtendedGraphemeClusterLiteralP","title":"Swift.ExpressibleByExtendedGraphemeClusterLiteral"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychaingroup/expressiblebyextendedgraphemeclusterliteral-implementations.json b/docs/data/documentation/boutique/keychaingroup/expressiblebyextendedgraphemeclusterliteral-implementations.json new file mode 100644 index 0000000..0731cac --- /dev/null +++ b/docs/data/documentation/boutique/keychaingroup/expressiblebyextendedgraphemeclusterliteral-implementations.json @@ -0,0 +1 @@ +{"sections":[],"metadata":{"roleHeading":"API Collection","role":"collectionGroup","modules":[{"name":"Boutique"}],"title":"ExpressibleByExtendedGraphemeClusterLiteral Implementations"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup"]]},"topicSections":[{"generated":true,"title":"Initializers","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/init(extendedGraphemeClusterLiteral:)"]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/ExpressibleByExtendedGraphemeClusterLiteral-Implementations","interfaceLanguage":"swift"},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/keychaingroup\/expressiblebyextendedgraphemeclusterliteral-implementations"]}],"kind":"article","schemaVersion":{"minor":3,"patch":0,"major":0},"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainGroup/init(extendedGraphemeClusterLiteral:)":{"kind":"symbol","url":"\/documentation\/boutique\/keychaingroup\/init(extendedgraphemeclusterliteral:)","type":"topic","title":"init(extendedGraphemeClusterLiteral:)","abstract":[],"conformance":{"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"constraints":[{"code":"ExtendedGraphemeClusterLiteralType","type":"codeVoice"},{"text":" is ","type":"text"},{"code":"Self.StringLiteralType","type":"codeVoice"},{"text":".","type":"text"}]},"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/init(extendedGraphemeClusterLiteral:)","fragments":[{"kind":"identifier","text":"init"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"extendedGraphemeClusterLiteral"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Self"},{"text":".","kind":"text"},{"kind":"typeIdentifier","text":"StringLiteralType","preciseIdentifier":"s:s26ExpressibleByStringLiteralP0cD4TypeQa"},{"kind":"text","text":")"}]},"doc://Boutique/documentation/Boutique/KeychainGroup":{"type":"topic","abstract":[{"text":"A type representing Tagged","type":"text"},{"type":"text","text":", to statically represent the keychain’s Group."},{"type":"text","text":" "},{"type":"text","text":"This is done to be more type-safe than passing string parameters in all places."}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"text":"KeychainGroup","kind":"identifier"}],"url":"\/documentation\/boutique\/keychaingroup","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup","title":"KeychainGroup","role":"symbol","navigatorTitle":[{"kind":"identifier","text":"KeychainGroup"}],"kind":"symbol"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychaingroup/expressiblebyunicodescalarliteral-implementations.json b/docs/data/documentation/boutique/keychaingroup/expressiblebyunicodescalarliteral-implementations.json new file mode 100644 index 0000000..9050983 --- /dev/null +++ b/docs/data/documentation/boutique/keychaingroup/expressiblebyunicodescalarliteral-implementations.json @@ -0,0 +1 @@ +{"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/keychaingroup\/expressiblebyunicodescalarliteral-implementations"]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/ExpressibleByUnicodeScalarLiteral-Implementations","interfaceLanguage":"swift"},"schemaVersion":{"patch":0,"major":0,"minor":3},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup"]]},"metadata":{"role":"collectionGroup","modules":[{"name":"Boutique"}],"title":"ExpressibleByUnicodeScalarLiteral Implementations","roleHeading":"API Collection"},"kind":"article","sections":[],"topicSections":[{"title":"Initializers","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/init(unicodeScalarLiteral:)"],"generated":true}],"references":{"doc://Boutique/documentation/Boutique/KeychainGroup":{"type":"topic","abstract":[{"text":"A type representing Tagged","type":"text"},{"type":"text","text":", to statically represent the keychain’s Group."},{"type":"text","text":" "},{"type":"text","text":"This is done to be more type-safe than passing string parameters in all places."}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"text":"KeychainGroup","kind":"identifier"}],"url":"\/documentation\/boutique\/keychaingroup","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup","title":"KeychainGroup","role":"symbol","navigatorTitle":[{"kind":"identifier","text":"KeychainGroup"}],"kind":"symbol"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainGroup/init(unicodeScalarLiteral:)":{"title":"init(unicodeScalarLiteral:)","role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/init(unicodeScalarLiteral:)","fragments":[{"text":"init","kind":"identifier"},{"text":"(","kind":"text"},{"text":"unicodeScalarLiteral","kind":"externalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Self"},{"text":".","kind":"text"},{"text":"ExtendedGraphemeClusterLiteralType","preciseIdentifier":"s:s43ExpressibleByExtendedGraphemeClusterLiteralP0cdeF4TypeQa","kind":"typeIdentifier"},{"text":")","kind":"text"}],"type":"topic","kind":"symbol","abstract":[],"conformance":{"constraints":[{"type":"codeVoice","code":"ExtendedGraphemeClusterLiteralType"},{"text":" is ","type":"text"},{"type":"codeVoice","code":"Self.UnicodeScalarLiteralType"},{"type":"text","text":"."}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"type":"text","text":"Available when"}]},"url":"\/documentation\/boutique\/keychaingroup\/init(unicodescalarliteral:)"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychaingroup/init(extendedgraphemeclusterliteral:).json b/docs/data/documentation/boutique/keychaingroup/init(extendedgraphemeclusterliteral:).json new file mode 100644 index 0000000..147cf74 --- /dev/null +++ b/docs/data/documentation/boutique/keychaingroup/init(extendedgraphemeclusterliteral:).json @@ -0,0 +1 @@ +{"kind":"symbol","schemaVersion":{"patch":0,"major":0,"minor":3},"metadata":{"extendedModule":"Swift","role":"symbol","symbolKind":"init","conformance":{"constraints":[{"code":"ExtendedGraphemeClusterLiteralType","type":"codeVoice"},{"type":"text","text":" is "},{"type":"codeVoice","code":"Self.StringLiteralType"},{"type":"text","text":"."}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"fragments":[{"text":"init","kind":"identifier"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"extendedGraphemeClusterLiteral"},{"kind":"text","text":": "},{"text":"Self","kind":"typeIdentifier"},{"text":".","kind":"text"},{"kind":"typeIdentifier","text":"StringLiteralType","preciseIdentifier":"s:s26ExpressibleByStringLiteralP0cD4TypeQa"},{"text":")","kind":"text"}],"roleHeading":"Initializer","modules":[{"name":"Boutique","relatedModules":["Swift"]}],"title":"init(extendedGraphemeClusterLiteral:)","externalID":"s:s26ExpressibleByStringLiteralPs0cD4TypeQz023ExtendedGraphemeClusterdE0RtzrlE08extendedghD0xAF_tcfc::SYNTHESIZED::s:8Boutique13KeychainGroupV"},"sections":[],"abstract":[{"text":"Inherited from ","type":"text"},{"type":"codeVoice","code":"ExpressibleByExtendedGraphemeClusterLiteral.init(extendedGraphemeClusterLiteral:)"},{"type":"text","text":"."}],"primaryContentSections":[{"declarations":[{"tokens":[{"text":"init","kind":"keyword"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"extendedGraphemeClusterLiteral"},{"text":" ","kind":"text"},{"kind":"internalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Self"},{"text":".","kind":"text"},{"text":"StringLiteralType","preciseIdentifier":"s:s26ExpressibleByStringLiteralP0cD4TypeQa","kind":"typeIdentifier"},{"kind":"text","text":")"}],"languages":["swift"],"platforms":["macOS"]}],"kind":"declarations"}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup","doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/ExpressibleByExtendedGraphemeClusterLiteral-Implementations"]]},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/init(extendedGraphemeClusterLiteral:)","interfaceLanguage":"swift"},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/keychaingroup\/init(extendedgraphemeclusterliteral:)"]}],"references":{"doc://Boutique/documentation/Boutique/KeychainGroup":{"type":"topic","abstract":[{"text":"A type representing Tagged","type":"text"},{"type":"text","text":", to statically represent the keychain’s Group."},{"type":"text","text":" "},{"type":"text","text":"This is done to be more type-safe than passing string parameters in all places."}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"text":"KeychainGroup","kind":"identifier"}],"url":"\/documentation\/boutique\/keychaingroup","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup","title":"KeychainGroup","role":"symbol","navigatorTitle":[{"kind":"identifier","text":"KeychainGroup"}],"kind":"symbol"},"doc://Boutique/documentation/Boutique/KeychainGroup/init(extendedGraphemeClusterLiteral:)":{"kind":"symbol","url":"\/documentation\/boutique\/keychaingroup\/init(extendedgraphemeclusterliteral:)","type":"topic","title":"init(extendedGraphemeClusterLiteral:)","abstract":[],"conformance":{"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"constraints":[{"code":"ExtendedGraphemeClusterLiteralType","type":"codeVoice"},{"text":" is ","type":"text"},{"code":"Self.StringLiteralType","type":"codeVoice"},{"text":".","type":"text"}]},"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/init(extendedGraphemeClusterLiteral:)","fragments":[{"kind":"identifier","text":"init"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"extendedGraphemeClusterLiteral"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Self"},{"text":".","kind":"text"},{"kind":"typeIdentifier","text":"StringLiteralType","preciseIdentifier":"s:s26ExpressibleByStringLiteralP0cD4TypeQa"},{"kind":"text","text":")"}]},"doc://Boutique/documentation/Boutique/KeychainGroup/ExpressibleByExtendedGraphemeClusterLiteral-Implementations":{"url":"\/documentation\/boutique\/keychaingroup\/expressiblebyextendedgraphemeclusterliteral-implementations","role":"collectionGroup","type":"topic","kind":"article","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/ExpressibleByExtendedGraphemeClusterLiteral-Implementations","title":"ExpressibleByExtendedGraphemeClusterLiteral Implementations","abstract":[]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychaingroup/init(stringliteral:).json b/docs/data/documentation/boutique/keychaingroup/init(stringliteral:).json new file mode 100644 index 0000000..6796d24 --- /dev/null +++ b/docs/data/documentation/boutique/keychaingroup/init(stringliteral:).json @@ -0,0 +1 @@ +{"kind":"symbol","primaryContentSections":[{"declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"init"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"stringLiteral"},{"kind":"text","text":" "},{"kind":"internalParam","text":"value"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:s12StaticStringV","text":"StaticString"},{"text":")","kind":"text"}]}],"kind":"declarations"}],"variants":[{"paths":["\/documentation\/boutique\/keychaingroup\/init(stringliteral:)"],"traits":[{"interfaceLanguage":"swift"}]}],"schemaVersion":{"major":0,"patch":0,"minor":3},"abstract":[{"text":"Inherited from ","type":"text"},{"type":"codeVoice","code":"ExpressibleByStringLiteral.init(stringLiteral:)"},{"text":".","type":"text"}],"sections":[],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup"]]},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/init(stringLiteral:)","interfaceLanguage":"swift"},"metadata":{"roleHeading":"Initializer","symbolKind":"init","externalID":"s:8Boutique13KeychainGroupV13stringLiteralACs12StaticStringV_tcfc","title":"init(stringLiteral:)","modules":[{"name":"Boutique"}],"role":"symbol","fragments":[{"text":"init","kind":"identifier"},{"kind":"text","text":"("},{"text":"stringLiteral","kind":"externalParam"},{"kind":"text","text":": "},{"text":"StaticString","kind":"typeIdentifier","preciseIdentifier":"s:s12StaticStringV"},{"text":")","kind":"text"}]},"references":{"doc://Boutique/documentation/Boutique/KeychainGroup/init(stringLiteral:)":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/init(stringLiteral:)","abstract":[],"title":"init(stringLiteral:)","role":"symbol","url":"\/documentation\/boutique\/keychaingroup\/init(stringliteral:)","kind":"symbol","type":"topic","fragments":[{"text":"init","kind":"identifier"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"stringLiteral"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"StaticString","preciseIdentifier":"s:s12StaticStringV"},{"text":")","kind":"text"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainGroup":{"type":"topic","abstract":[{"text":"A type representing Tagged","type":"text"},{"type":"text","text":", to statically represent the keychain’s Group."},{"type":"text","text":" "},{"type":"text","text":"This is done to be more type-safe than passing string parameters in all places."}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"text":"KeychainGroup","kind":"identifier"}],"url":"\/documentation\/boutique\/keychaingroup","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup","title":"KeychainGroup","role":"symbol","navigatorTitle":[{"kind":"identifier","text":"KeychainGroup"}],"kind":"symbol"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychaingroup/init(unicodescalarliteral:).json b/docs/data/documentation/boutique/keychaingroup/init(unicodescalarliteral:).json new file mode 100644 index 0000000..4fc5330 --- /dev/null +++ b/docs/data/documentation/boutique/keychaingroup/init(unicodescalarliteral:).json @@ -0,0 +1 @@ +{"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/keychaingroup\/init(unicodescalarliteral:)"]}],"primaryContentSections":[{"declarations":[{"tokens":[{"kind":"keyword","text":"init"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"unicodeScalarLiteral"},{"text":" ","kind":"text"},{"kind":"internalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Self"},{"text":".","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:s43ExpressibleByExtendedGraphemeClusterLiteralP0cdeF4TypeQa","text":"ExtendedGraphemeClusterLiteralType"},{"kind":"text","text":")"}],"languages":["swift"],"platforms":["macOS"]}],"kind":"declarations"}],"kind":"symbol","abstract":[{"text":"Inherited from ","type":"text"},{"code":"ExpressibleByUnicodeScalarLiteral.init(unicodeScalarLiteral:)","type":"codeVoice"},{"type":"text","text":"."}],"sections":[],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/init(unicodeScalarLiteral:)"},"metadata":{"symbolKind":"init","extendedModule":"Swift","modules":[{"name":"Boutique","relatedModules":["Swift"]}],"role":"symbol","fragments":[{"kind":"identifier","text":"init"},{"text":"(","kind":"text"},{"text":"unicodeScalarLiteral","kind":"externalParam"},{"text":": ","kind":"text"},{"text":"Self","kind":"typeIdentifier"},{"text":".","kind":"text"},{"text":"ExtendedGraphemeClusterLiteralType","preciseIdentifier":"s:s43ExpressibleByExtendedGraphemeClusterLiteralP0cdeF4TypeQa","kind":"typeIdentifier"},{"text":")","kind":"text"}],"conformance":{"availabilityPrefix":[{"type":"text","text":"Available when"}],"constraints":[{"type":"codeVoice","code":"ExtendedGraphemeClusterLiteralType"},{"type":"text","text":" is "},{"code":"Self.UnicodeScalarLiteralType","type":"codeVoice"},{"text":".","type":"text"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"title":"init(unicodeScalarLiteral:)","externalID":"s:s43ExpressibleByExtendedGraphemeClusterLiteralPs013UnicodeScalarF4TypeQz0cdefI0RtzrlE07unicodehF0xAF_tcfc::SYNTHESIZED::s:8Boutique13KeychainGroupV","roleHeading":"Initializer"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup","doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/ExpressibleByUnicodeScalarLiteral-Implementations"]]},"schemaVersion":{"major":0,"minor":3,"patch":0},"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainGroup/init(unicodeScalarLiteral:)":{"type":"topic","abstract":[],"role":"symbol","fragments":[{"text":"init","kind":"identifier"},{"kind":"text","text":"("},{"text":"unicodeScalarLiteral","kind":"externalParam"},{"text":": ","kind":"text"},{"text":"Self","kind":"typeIdentifier"},{"kind":"text","text":"."},{"text":"ExtendedGraphemeClusterLiteralType","kind":"typeIdentifier","preciseIdentifier":"s:s43ExpressibleByExtendedGraphemeClusterLiteralP0cdeF4TypeQa"},{"text":")","kind":"text"}],"url":"\/documentation\/boutique\/keychaingroup\/init(unicodescalarliteral:)","conformance":{"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}],"constraints":[{"code":"ExtendedGraphemeClusterLiteralType","type":"codeVoice"},{"text":" is ","type":"text"},{"type":"codeVoice","code":"Self.UnicodeScalarLiteralType"},{"text":".","type":"text"}]},"title":"init(unicodeScalarLiteral:)","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/init(unicodeScalarLiteral:)","kind":"symbol"},"doc://Boutique/documentation/Boutique/KeychainGroup/ExpressibleByUnicodeScalarLiteral-Implementations":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/ExpressibleByUnicodeScalarLiteral-Implementations","abstract":[],"title":"ExpressibleByUnicodeScalarLiteral Implementations","role":"collectionGroup","url":"\/documentation\/boutique\/keychaingroup\/expressiblebyunicodescalarliteral-implementations","kind":"article","type":"topic"},"doc://Boutique/documentation/Boutique/KeychainGroup":{"type":"topic","abstract":[{"text":"A type representing Tagged","type":"text"},{"type":"text","text":", to statically represent the keychain’s Group."},{"type":"text","text":" "},{"type":"text","text":"This is done to be more type-safe than passing string parameters in all places."}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"text":"KeychainGroup","kind":"identifier"}],"url":"\/documentation\/boutique\/keychaingroup","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup","title":"KeychainGroup","role":"symbol","navigatorTitle":[{"kind":"identifier","text":"KeychainGroup"}],"kind":"symbol"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychaingroup/init(value:).json b/docs/data/documentation/boutique/keychaingroup/init(value:).json new file mode 100644 index 0000000..496dcb8 --- /dev/null +++ b/docs/data/documentation/boutique/keychaingroup/init(value:).json @@ -0,0 +1 @@ +{"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup"]]},"kind":"symbol","variants":[{"paths":["\/documentation\/boutique\/keychaingroup\/init(value:)"],"traits":[{"interfaceLanguage":"swift"}]}],"primaryContentSections":[{"declarations":[{"languages":["swift"],"tokens":[{"text":"init","kind":"keyword"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"value"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:SS","kind":"typeIdentifier","text":"String"},{"text":")","kind":"text"}],"platforms":["macOS"]}],"kind":"declarations"}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/init(value:)"},"sections":[],"schemaVersion":{"minor":3,"patch":0,"major":0},"metadata":{"fragments":[{"text":"init","kind":"identifier"},{"kind":"text","text":"("},{"text":"value","kind":"externalParam"},{"kind":"text","text":": "},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"},{"kind":"text","text":")"}],"symbolKind":"init","externalID":"s:8Boutique13KeychainGroupV5valueACSS_tcfc","role":"symbol","title":"init(value:)","modules":[{"name":"Boutique"}],"roleHeading":"Initializer"},"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainGroup/init(value:)":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/init(value:)","abstract":[],"title":"init(value:)","role":"symbol","url":"\/documentation\/boutique\/keychaingroup\/init(value:)","kind":"symbol","type":"topic","fragments":[{"text":"init","kind":"identifier"},{"text":"(","kind":"text"},{"text":"value","kind":"externalParam"},{"kind":"text","text":": "},{"preciseIdentifier":"s:SS","text":"String","kind":"typeIdentifier"},{"text":")","kind":"text"}]},"doc://Boutique/documentation/Boutique/KeychainGroup":{"type":"topic","abstract":[{"text":"A type representing Tagged","type":"text"},{"type":"text","text":", to statically represent the keychain’s Group."},{"type":"text","text":" "},{"type":"text","text":"This is done to be more type-safe than passing string parameters in all places."}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"text":"KeychainGroup","kind":"identifier"}],"url":"\/documentation\/boutique\/keychaingroup","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup","title":"KeychainGroup","role":"symbol","navigatorTitle":[{"kind":"identifier","text":"KeychainGroup"}],"kind":"symbol"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychaingroup/value.json b/docs/data/documentation/boutique/keychaingroup/value.json new file mode 100644 index 0000000..2f2e0cf --- /dev/null +++ b/docs/data/documentation/boutique/keychaingroup/value.json @@ -0,0 +1 @@ +{"kind":"symbol","schemaVersion":{"patch":0,"major":0,"minor":3},"sections":[],"metadata":{"roleHeading":"Instance Property","symbolKind":"property","externalID":"s:8Boutique13KeychainGroupV5valueSSvp","title":"value","modules":[{"name":"Boutique"}],"role":"symbol","fragments":[{"kind":"keyword","text":"let"},{"text":" ","kind":"text"},{"text":"value","kind":"identifier"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:SS","text":"String","kind":"typeIdentifier"}]},"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"text":"value","kind":"identifier"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:SS","text":"String"}]}]}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/value"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup"]]},"variants":[{"paths":["\/documentation\/boutique\/keychaingroup\/value"],"traits":[{"interfaceLanguage":"swift"}]}],"references":{"doc://Boutique/documentation/Boutique/KeychainGroup/value":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup\/value","abstract":[],"title":"value","role":"symbol","url":"\/documentation\/boutique\/keychaingroup\/value","kind":"symbol","type":"topic","fragments":[{"text":"let","kind":"keyword"},{"kind":"text","text":" "},{"text":"value","kind":"identifier"},{"text":": ","kind":"text"},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"}]},"doc://Boutique/documentation/Boutique/KeychainGroup":{"type":"topic","abstract":[{"text":"A type representing Tagged","type":"text"},{"type":"text","text":", to statically represent the keychain’s Group."},{"type":"text","text":" "},{"type":"text","text":"This is done to be more type-safe than passing string parameters in all places."}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"text":"KeychainGroup","kind":"identifier"}],"url":"\/documentation\/boutique\/keychaingroup","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup","title":"KeychainGroup","role":"symbol","navigatorTitle":[{"kind":"identifier","text":"KeychainGroup"}],"kind":"symbol"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychainservice.json b/docs/data/documentation/boutique/keychainservice.json new file mode 100644 index 0000000..aed4965 --- /dev/null +++ b/docs/data/documentation/boutique/keychainservice.json @@ -0,0 +1 @@ +{"sections":[],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService","interfaceLanguage":"swift"},"topicSections":[{"title":"Initializers","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/init(stringLiteral:)","doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/init(value:)"]},{"title":"Instance Properties","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/value"]},{"identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/ExpressibleByExtendedGraphemeClusterLiteral-Implementations","doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/ExpressibleByUnicodeScalarLiteral-Implementations"],"generated":true,"title":"Default Implementations"}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/keychainservice"]}],"abstract":[{"type":"text","text":"A type representing Tagged"},{"text":", to statically represent the keychain’s Service.","type":"text"},{"type":"text","text":" "},{"text":"This is done to be more type-safe than passing string parameters in all places.","type":"text"}],"primaryContentSections":[{"declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"KeychainService","kind":"identifier"}]}],"kind":"declarations"}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique"]]},"kind":"symbol","schemaVersion":{"minor":3,"major":0,"patch":0},"relationshipsSections":[{"title":"Conforms To","type":"conformsTo","identifiers":["doc:\/\/Boutique\/s43ExpressibleByExtendedGraphemeClusterLiteralP","doc:\/\/Boutique\/s26ExpressibleByStringLiteralP","doc:\/\/Boutique\/s33ExpressibleByUnicodeScalarLiteralP"],"kind":"relationships"}],"metadata":{"symbolKind":"struct","externalID":"s:8Boutique15KeychainServiceV","roleHeading":"Structure","navigatorTitle":[{"text":"KeychainService","kind":"identifier"}],"role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"KeychainService","kind":"identifier"}],"title":"KeychainService","modules":[{"name":"Boutique"}]},"references":{"doc://Boutique/documentation/Boutique/KeychainService/init(value:)":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/init(value:)","abstract":[],"title":"init(value:)","role":"symbol","url":"\/documentation\/boutique\/keychainservice\/init(value:)","kind":"symbol","type":"topic","fragments":[{"kind":"identifier","text":"init"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"value"},{"kind":"text","text":": "},{"preciseIdentifier":"s:SS","kind":"typeIdentifier","text":"String"},{"text":")","kind":"text"}]},"doc://Boutique/s26ExpressibleByStringLiteralP":{"title":"Swift.ExpressibleByStringLiteral","type":"unresolvable","identifier":"doc:\/\/Boutique\/s26ExpressibleByStringLiteralP"},"doc://Boutique/documentation/Boutique/KeychainService/init(stringLiteral:)":{"fragments":[{"text":"init","kind":"identifier"},{"text":"(","kind":"text"},{"text":"stringLiteral","kind":"externalParam"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:s12StaticStringV","text":"StaticString","kind":"typeIdentifier"},{"text":")","kind":"text"}],"type":"topic","abstract":[],"kind":"symbol","role":"symbol","url":"\/documentation\/boutique\/keychainservice\/init(stringliteral:)","title":"init(stringLiteral:)","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/init(stringLiteral:)"},"doc://Boutique/documentation/Boutique/KeychainService/value":{"url":"\/documentation\/boutique\/keychainservice\/value","title":"value","role":"symbol","kind":"symbol","type":"topic","abstract":[],"fragments":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"value"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:SS","kind":"typeIdentifier","text":"String"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/value"},"doc://Boutique/documentation/Boutique/KeychainService/ExpressibleByUnicodeScalarLiteral-Implementations":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/ExpressibleByUnicodeScalarLiteral-Implementations","title":"ExpressibleByUnicodeScalarLiteral Implementations","type":"topic","abstract":[],"role":"collectionGroup","kind":"article","url":"\/documentation\/boutique\/keychainservice\/expressiblebyunicodescalarliteral-implementations"},"doc://Boutique/s43ExpressibleByExtendedGraphemeClusterLiteralP":{"title":"Swift.ExpressibleByExtendedGraphemeClusterLiteral","type":"unresolvable","identifier":"doc:\/\/Boutique\/s43ExpressibleByExtendedGraphemeClusterLiteralP"},"doc://Boutique/s33ExpressibleByUnicodeScalarLiteralP":{"title":"Swift.ExpressibleByUnicodeScalarLiteral","type":"unresolvable","identifier":"doc:\/\/Boutique\/s33ExpressibleByUnicodeScalarLiteralP"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainService":{"kind":"symbol","title":"KeychainService","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"KeychainService"}],"navigatorTitle":[{"kind":"identifier","text":"KeychainService"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService","type":"topic","url":"\/documentation\/boutique\/keychainservice","abstract":[{"type":"text","text":"A type representing Tagged"},{"type":"text","text":", to statically represent the keychain’s Service."},{"text":" ","type":"text"},{"text":"This is done to be more type-safe than passing string parameters in all places.","type":"text"}]},"doc://Boutique/documentation/Boutique/KeychainService/ExpressibleByExtendedGraphemeClusterLiteral-Implementations":{"title":"ExpressibleByExtendedGraphemeClusterLiteral Implementations","kind":"article","role":"collectionGroup","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/ExpressibleByExtendedGraphemeClusterLiteral-Implementations","type":"topic","url":"\/documentation\/boutique\/keychainservice\/expressiblebyextendedgraphemeclusterliteral-implementations","abstract":[]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychainservice/expressiblebyextendedgraphemeclusterliteral-implementations.json b/docs/data/documentation/boutique/keychainservice/expressiblebyextendedgraphemeclusterliteral-implementations.json new file mode 100644 index 0000000..7f964ab --- /dev/null +++ b/docs/data/documentation/boutique/keychainservice/expressiblebyextendedgraphemeclusterliteral-implementations.json @@ -0,0 +1 @@ +{"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainService"]]},"topicSections":[{"title":"Initializers","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/init(extendedGraphemeClusterLiteral:)"],"generated":true}],"sections":[],"metadata":{"modules":[{"name":"Boutique"}],"roleHeading":"API Collection","role":"collectionGroup","title":"ExpressibleByExtendedGraphemeClusterLiteral Implementations"},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/ExpressibleByExtendedGraphemeClusterLiteral-Implementations","interfaceLanguage":"swift"},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/keychainservice\/expressiblebyextendedgraphemeclusterliteral-implementations"]}],"schemaVersion":{"minor":3,"patch":0,"major":0},"kind":"article","references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainService/init(extendedGraphemeClusterLiteral:)":{"kind":"symbol","title":"init(extendedGraphemeClusterLiteral:)","role":"symbol","fragments":[{"kind":"identifier","text":"init"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"extendedGraphemeClusterLiteral"},{"text":": ","kind":"text"},{"text":"Self","kind":"typeIdentifier"},{"text":".","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:s26ExpressibleByStringLiteralP0cD4TypeQa","text":"StringLiteralType"},{"kind":"text","text":")"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/init(extendedGraphemeClusterLiteral:)","type":"topic","conformance":{"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"type":"codeVoice","code":"ExtendedGraphemeClusterLiteralType"},{"text":" is ","type":"text"},{"code":"Self.StringLiteralType","type":"codeVoice"},{"text":".","type":"text"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"url":"\/documentation\/boutique\/keychainservice\/init(extendedgraphemeclusterliteral:)","abstract":[]},"doc://Boutique/documentation/Boutique/KeychainService":{"kind":"symbol","title":"KeychainService","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"KeychainService"}],"navigatorTitle":[{"kind":"identifier","text":"KeychainService"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService","type":"topic","url":"\/documentation\/boutique\/keychainservice","abstract":[{"type":"text","text":"A type representing Tagged"},{"type":"text","text":", to statically represent the keychain’s Service."},{"text":" ","type":"text"},{"text":"This is done to be more type-safe than passing string parameters in all places.","type":"text"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychainservice/expressiblebyunicodescalarliteral-implementations.json b/docs/data/documentation/boutique/keychainservice/expressiblebyunicodescalarliteral-implementations.json new file mode 100644 index 0000000..68fd542 --- /dev/null +++ b/docs/data/documentation/boutique/keychainservice/expressiblebyunicodescalarliteral-implementations.json @@ -0,0 +1 @@ +{"sections":[],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainService"]]},"topicSections":[{"generated":true,"title":"Initializers","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/init(unicodeScalarLiteral:)"]}],"metadata":{"role":"collectionGroup","modules":[{"name":"Boutique"}],"title":"ExpressibleByUnicodeScalarLiteral Implementations","roleHeading":"API Collection"},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/keychainservice\/expressiblebyunicodescalarliteral-implementations"]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"kind":"article","identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/ExpressibleByUnicodeScalarLiteral-Implementations","interfaceLanguage":"swift"},"references":{"doc://Boutique/documentation/Boutique/KeychainService":{"kind":"symbol","title":"KeychainService","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"KeychainService"}],"navigatorTitle":[{"kind":"identifier","text":"KeychainService"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService","type":"topic","url":"\/documentation\/boutique\/keychainservice","abstract":[{"type":"text","text":"A type representing Tagged"},{"type":"text","text":", to statically represent the keychain’s Service."},{"text":" ","type":"text"},{"text":"This is done to be more type-safe than passing string parameters in all places.","type":"text"}]},"doc://Boutique/documentation/Boutique/KeychainService/init(unicodeScalarLiteral:)":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/init(unicodeScalarLiteral:)","title":"init(unicodeScalarLiteral:)","type":"topic","abstract":[],"role":"symbol","kind":"symbol","url":"\/documentation\/boutique\/keychainservice\/init(unicodescalarliteral:)","conformance":{"conformancePrefix":[{"type":"text","text":"Conforms when"}],"constraints":[{"code":"ExtendedGraphemeClusterLiteralType","type":"codeVoice"},{"type":"text","text":" is "},{"type":"codeVoice","code":"Self.UnicodeScalarLiteralType"},{"text":".","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}]},"fragments":[{"text":"init","kind":"identifier"},{"kind":"text","text":"("},{"text":"unicodeScalarLiteral","kind":"externalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Self"},{"kind":"text","text":"."},{"preciseIdentifier":"s:s43ExpressibleByExtendedGraphemeClusterLiteralP0cdeF4TypeQa","text":"ExtendedGraphemeClusterLiteralType","kind":"typeIdentifier"},{"text":")","kind":"text"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychainservice/init(extendedgraphemeclusterliteral:).json b/docs/data/documentation/boutique/keychainservice/init(extendedgraphemeclusterliteral:).json new file mode 100644 index 0000000..439703f --- /dev/null +++ b/docs/data/documentation/boutique/keychainservice/init(extendedgraphemeclusterliteral:).json @@ -0,0 +1 @@ +{"primaryContentSections":[{"declarations":[{"tokens":[{"text":"init","kind":"keyword"},{"text":"(","kind":"text"},{"text":"extendedGraphemeClusterLiteral","kind":"externalParam"},{"kind":"text","text":" "},{"kind":"internalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Self"},{"kind":"text","text":"."},{"text":"StringLiteralType","preciseIdentifier":"s:s26ExpressibleByStringLiteralP0cD4TypeQa","kind":"typeIdentifier"},{"text":")","kind":"text"}],"platforms":["macOS"],"languages":["swift"]}],"kind":"declarations"}],"schemaVersion":{"minor":3,"major":0,"patch":0},"metadata":{"title":"init(extendedGraphemeClusterLiteral:)","conformance":{"constraints":[{"type":"codeVoice","code":"ExtendedGraphemeClusterLiteralType"},{"text":" is ","type":"text"},{"type":"codeVoice","code":"Self.StringLiteralType"},{"type":"text","text":"."}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"type":"text","text":"Available when"}]},"role":"symbol","fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"extendedGraphemeClusterLiteral"},{"text":": ","kind":"text"},{"text":"Self","kind":"typeIdentifier"},{"text":".","kind":"text"},{"kind":"typeIdentifier","text":"StringLiteralType","preciseIdentifier":"s:s26ExpressibleByStringLiteralP0cD4TypeQa"},{"kind":"text","text":")"}],"externalID":"s:s26ExpressibleByStringLiteralPs0cD4TypeQz023ExtendedGraphemeClusterdE0RtzrlE08extendedghD0xAF_tcfc::SYNTHESIZED::s:8Boutique15KeychainServiceV","modules":[{"name":"Boutique","relatedModules":["Swift"]}],"roleHeading":"Initializer","symbolKind":"init","extendedModule":"Swift"},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/keychainservice\/init(extendedgraphemeclusterliteral:)"]}],"sections":[],"kind":"symbol","identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/init(extendedGraphemeClusterLiteral:)","interfaceLanguage":"swift"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainService","doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/ExpressibleByExtendedGraphemeClusterLiteral-Implementations"]]},"abstract":[{"type":"text","text":"Inherited from "},{"code":"ExpressibleByExtendedGraphemeClusterLiteral.init(extendedGraphemeClusterLiteral:)","type":"codeVoice"},{"type":"text","text":"."}],"references":{"doc://Boutique/documentation/Boutique/KeychainService/init(extendedGraphemeClusterLiteral:)":{"kind":"symbol","title":"init(extendedGraphemeClusterLiteral:)","role":"symbol","fragments":[{"kind":"identifier","text":"init"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"extendedGraphemeClusterLiteral"},{"text":": ","kind":"text"},{"text":"Self","kind":"typeIdentifier"},{"text":".","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:s26ExpressibleByStringLiteralP0cD4TypeQa","text":"StringLiteralType"},{"kind":"text","text":")"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/init(extendedGraphemeClusterLiteral:)","type":"topic","conformance":{"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"type":"codeVoice","code":"ExtendedGraphemeClusterLiteralType"},{"text":" is ","type":"text"},{"code":"Self.StringLiteralType","type":"codeVoice"},{"text":".","type":"text"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"url":"\/documentation\/boutique\/keychainservice\/init(extendedgraphemeclusterliteral:)","abstract":[]},"doc://Boutique/documentation/Boutique/KeychainService/ExpressibleByExtendedGraphemeClusterLiteral-Implementations":{"title":"ExpressibleByExtendedGraphemeClusterLiteral Implementations","kind":"article","role":"collectionGroup","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/ExpressibleByExtendedGraphemeClusterLiteral-Implementations","type":"topic","url":"\/documentation\/boutique\/keychainservice\/expressiblebyextendedgraphemeclusterliteral-implementations","abstract":[]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainService":{"kind":"symbol","title":"KeychainService","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"KeychainService"}],"navigatorTitle":[{"kind":"identifier","text":"KeychainService"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService","type":"topic","url":"\/documentation\/boutique\/keychainservice","abstract":[{"type":"text","text":"A type representing Tagged"},{"type":"text","text":", to statically represent the keychain’s Service."},{"text":" ","type":"text"},{"text":"This is done to be more type-safe than passing string parameters in all places.","type":"text"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychainservice/init(stringliteral:).json b/docs/data/documentation/boutique/keychainservice/init(stringliteral:).json new file mode 100644 index 0000000..4bd2be8 --- /dev/null +++ b/docs/data/documentation/boutique/keychainservice/init(stringliteral:).json @@ -0,0 +1 @@ +{"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"init"},{"text":"(","kind":"text"},{"text":"stringLiteral","kind":"externalParam"},{"kind":"text","text":" "},{"text":"value","kind":"internalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:s12StaticStringV","text":"StaticString"},{"text":")","kind":"text"}]}]}],"kind":"symbol","sections":[],"metadata":{"symbolKind":"init","roleHeading":"Initializer","modules":[{"name":"Boutique"}],"fragments":[{"kind":"identifier","text":"init"},{"text":"(","kind":"text"},{"text":"stringLiteral","kind":"externalParam"},{"text":": ","kind":"text"},{"text":"StaticString","kind":"typeIdentifier","preciseIdentifier":"s:s12StaticStringV"},{"kind":"text","text":")"}],"title":"init(stringLiteral:)","role":"symbol","externalID":"s:8Boutique15KeychainServiceV13stringLiteralACs12StaticStringV_tcfc"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainService"]]},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/keychainservice\/init(stringliteral:)"]}],"schemaVersion":{"minor":3,"patch":0,"major":0},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/init(stringLiteral:)","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Inherited from "},{"type":"codeVoice","code":"ExpressibleByStringLiteral.init(stringLiteral:)"},{"text":".","type":"text"}],"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainService/init(stringLiteral:)":{"fragments":[{"text":"init","kind":"identifier"},{"text":"(","kind":"text"},{"text":"stringLiteral","kind":"externalParam"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:s12StaticStringV","text":"StaticString","kind":"typeIdentifier"},{"text":")","kind":"text"}],"type":"topic","abstract":[],"kind":"symbol","role":"symbol","url":"\/documentation\/boutique\/keychainservice\/init(stringliteral:)","title":"init(stringLiteral:)","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/init(stringLiteral:)"},"doc://Boutique/documentation/Boutique/KeychainService":{"kind":"symbol","title":"KeychainService","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"KeychainService"}],"navigatorTitle":[{"kind":"identifier","text":"KeychainService"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService","type":"topic","url":"\/documentation\/boutique\/keychainservice","abstract":[{"type":"text","text":"A type representing Tagged"},{"type":"text","text":", to statically represent the keychain’s Service."},{"text":" ","type":"text"},{"text":"This is done to be more type-safe than passing string parameters in all places.","type":"text"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychainservice/init(unicodescalarliteral:).json b/docs/data/documentation/boutique/keychainservice/init(unicodescalarliteral:).json new file mode 100644 index 0000000..659be8f --- /dev/null +++ b/docs/data/documentation/boutique/keychainservice/init(unicodescalarliteral:).json @@ -0,0 +1 @@ +{"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/keychainservice\/init(unicodescalarliteral:)"]}],"metadata":{"fragments":[{"text":"init","kind":"identifier"},{"kind":"text","text":"("},{"text":"unicodeScalarLiteral","kind":"externalParam"},{"kind":"text","text":": "},{"text":"Self","kind":"typeIdentifier"},{"kind":"text","text":"."},{"kind":"typeIdentifier","text":"ExtendedGraphemeClusterLiteralType","preciseIdentifier":"s:s43ExpressibleByExtendedGraphemeClusterLiteralP0cdeF4TypeQa"},{"kind":"text","text":")"}],"title":"init(unicodeScalarLiteral:)","externalID":"s:s43ExpressibleByExtendedGraphemeClusterLiteralPs013UnicodeScalarF4TypeQz0cdefI0RtzrlE07unicodehF0xAF_tcfc::SYNTHESIZED::s:8Boutique15KeychainServiceV","extendedModule":"Swift","roleHeading":"Initializer","role":"symbol","symbolKind":"init","conformance":{"availabilityPrefix":[{"type":"text","text":"Available when"}],"constraints":[{"type":"codeVoice","code":"ExtendedGraphemeClusterLiteralType"},{"type":"text","text":" is "},{"code":"Self.UnicodeScalarLiteralType","type":"codeVoice"},{"text":".","type":"text"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"modules":[{"name":"Boutique","relatedModules":["Swift"]}]},"kind":"symbol","abstract":[{"text":"Inherited from ","type":"text"},{"code":"ExpressibleByUnicodeScalarLiteral.init(unicodeScalarLiteral:)","type":"codeVoice"},{"text":".","type":"text"}],"sections":[],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/init(unicodeScalarLiteral:)","interfaceLanguage":"swift"},"schemaVersion":{"minor":3,"major":0,"patch":0},"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"init"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"unicodeScalarLiteral"},{"kind":"text","text":" "},{"text":"value","kind":"internalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Self"},{"kind":"text","text":"."},{"preciseIdentifier":"s:s43ExpressibleByExtendedGraphemeClusterLiteralP0cdeF4TypeQa","text":"ExtendedGraphemeClusterLiteralType","kind":"typeIdentifier"},{"text":")","kind":"text"}],"platforms":["macOS"],"languages":["swift"]}]}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainService","doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/ExpressibleByUnicodeScalarLiteral-Implementations"]]},"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainService":{"kind":"symbol","title":"KeychainService","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"KeychainService"}],"navigatorTitle":[{"kind":"identifier","text":"KeychainService"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService","type":"topic","url":"\/documentation\/boutique\/keychainservice","abstract":[{"type":"text","text":"A type representing Tagged"},{"type":"text","text":", to statically represent the keychain’s Service."},{"text":" ","type":"text"},{"text":"This is done to be more type-safe than passing string parameters in all places.","type":"text"}]},"doc://Boutique/documentation/Boutique/KeychainService/ExpressibleByUnicodeScalarLiteral-Implementations":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/ExpressibleByUnicodeScalarLiteral-Implementations","title":"ExpressibleByUnicodeScalarLiteral Implementations","type":"topic","abstract":[],"role":"collectionGroup","kind":"article","url":"\/documentation\/boutique\/keychainservice\/expressiblebyunicodescalarliteral-implementations"},"doc://Boutique/documentation/Boutique/KeychainService/init(unicodeScalarLiteral:)":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/init(unicodeScalarLiteral:)","title":"init(unicodeScalarLiteral:)","type":"topic","abstract":[],"role":"symbol","kind":"symbol","url":"\/documentation\/boutique\/keychainservice\/init(unicodescalarliteral:)","conformance":{"conformancePrefix":[{"type":"text","text":"Conforms when"}],"constraints":[{"code":"ExtendedGraphemeClusterLiteralType","type":"codeVoice"},{"type":"text","text":" is "},{"type":"codeVoice","code":"Self.UnicodeScalarLiteralType"},{"text":".","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}]},"fragments":[{"text":"init","kind":"identifier"},{"kind":"text","text":"("},{"text":"unicodeScalarLiteral","kind":"externalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Self"},{"kind":"text","text":"."},{"preciseIdentifier":"s:s43ExpressibleByExtendedGraphemeClusterLiteralP0cdeF4TypeQa","text":"ExtendedGraphemeClusterLiteralType","kind":"typeIdentifier"},{"text":")","kind":"text"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychainservice/init(value:).json b/docs/data/documentation/boutique/keychainservice/init(value:).json new file mode 100644 index 0000000..6a9d782 --- /dev/null +++ b/docs/data/documentation/boutique/keychainservice/init(value:).json @@ -0,0 +1 @@ +{"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/keychainservice\/init(value:)"]}],"kind":"symbol","metadata":{"roleHeading":"Initializer","symbolKind":"init","externalID":"s:8Boutique15KeychainServiceV5valueACSS_tcfc","title":"init(value:)","modules":[{"name":"Boutique"}],"role":"symbol","fragments":[{"text":"init","kind":"identifier"},{"kind":"text","text":"("},{"kind":"externalParam","text":"value"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:SS","kind":"typeIdentifier","text":"String"},{"kind":"text","text":")"}]},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/init(value:)","interfaceLanguage":"swift"},"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"text":"init","kind":"keyword"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"value"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:SS","kind":"typeIdentifier","text":"String"},{"kind":"text","text":")"}],"platforms":["macOS"],"languages":["swift"]}]}],"sections":[],"schemaVersion":{"major":0,"minor":3,"patch":0},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainService"]]},"references":{"doc://Boutique/documentation/Boutique/KeychainService/init(value:)":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/init(value:)","abstract":[],"title":"init(value:)","role":"symbol","url":"\/documentation\/boutique\/keychainservice\/init(value:)","kind":"symbol","type":"topic","fragments":[{"kind":"identifier","text":"init"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"value"},{"kind":"text","text":": "},{"preciseIdentifier":"s:SS","kind":"typeIdentifier","text":"String"},{"text":")","kind":"text"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainService":{"kind":"symbol","title":"KeychainService","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"KeychainService"}],"navigatorTitle":[{"kind":"identifier","text":"KeychainService"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService","type":"topic","url":"\/documentation\/boutique\/keychainservice","abstract":[{"type":"text","text":"A type representing Tagged"},{"type":"text","text":", to statically represent the keychain’s Service."},{"text":" ","type":"text"},{"text":"This is done to be more type-safe than passing string parameters in all places.","type":"text"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/keychainservice/value.json b/docs/data/documentation/boutique/keychainservice/value.json new file mode 100644 index 0000000..2a42f94 --- /dev/null +++ b/docs/data/documentation/boutique/keychainservice/value.json @@ -0,0 +1 @@ +{"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/KeychainService"]]},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/value"},"sections":[],"schemaVersion":{"major":0,"patch":0,"minor":3},"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"value"},{"text":": ","kind":"text"},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"}],"languages":["swift"],"platforms":["macOS"]}]}],"kind":"symbol","variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/keychainservice\/value"]}],"metadata":{"modules":[{"name":"Boutique"}],"roleHeading":"Instance Property","title":"value","role":"symbol","symbolKind":"property","externalID":"s:8Boutique15KeychainServiceV5valueSSvp","fragments":[{"kind":"keyword","text":"let"},{"text":" ","kind":"text"},{"kind":"identifier","text":"value"},{"text":": ","kind":"text"},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"}]},"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainService":{"kind":"symbol","title":"KeychainService","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"KeychainService"}],"navigatorTitle":[{"kind":"identifier","text":"KeychainService"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService","type":"topic","url":"\/documentation\/boutique\/keychainservice","abstract":[{"type":"text","text":"A type representing Tagged"},{"type":"text","text":", to statically represent the keychain’s Service."},{"text":" ","type":"text"},{"text":"This is done to be more type-safe than passing string parameters in all places.","type":"text"}]},"doc://Boutique/documentation/Boutique/KeychainService/value":{"url":"\/documentation\/boutique\/keychainservice\/value","title":"value","role":"symbol","kind":"symbol","type":"topic","abstract":[],"fragments":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"value"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:SS","kind":"typeIdentifier","text":"String"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService\/value"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/securelystoredvalue.json b/docs/data/documentation/boutique/securelystoredvalue.json index 6940d81..a5ace53 100644 --- a/docs/data/documentation/boutique/securelystoredvalue.json +++ b/docs/data/documentation/boutique/securelystoredvalue.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"attribute","text":"@propertyWrapper"},{"kind":"text","text":" "},{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"SecurelyStoredValue"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Item"},{"kind":"text","text":"> "},{"kind":"keyword","text":"where"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Decodable","preciseIdentifier":"s:Se"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Encodable","preciseIdentifier":"s:SE"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"overview","level":2,"type":"heading","text":"Overview"},{"type":"paragraph","inlineContent":[{"type":"text","text":"You should use @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" rather than @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" when you need to store"},{"type":"text","text":" "},{"type":"text","text":"sensitive values such as passwords or auth tokens, since a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" will be persisted in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is fulfills the same needs as many other Keychain wrappers, but in a Boutique-like manner."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Values are delivered synchronously and are available on app launch, using the system "},{"type":"codeVoice","code":"Keychain"},{"type":"text","text":" "},{"type":"text","text":"as the backing store. If you wish to use your own "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" you can use @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Unlike @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" properties @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" properties cannot be provided a default value."}]},{"type":"codeListing","syntax":null,"code":["@SecurelyStoredValue(key: \"redPanda\")","private var redPanda"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Since keychain values may or may not exist, a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" is nullable by default."},{"type":"text","text":" "},{"type":"text","text":"Something to watch out for: You do not need to specify your type as nullable. If you do so"},{"type":"text","text":" "},{"type":"text","text":"the type will be a double optional ("},{"type":"codeVoice","code":"??"},{"type":"text","text":") rather than optional ("},{"type":"codeVoice","code":"?"},{"type":"text","text":")."}]},{"type":"codeListing","syntax":null,"code":["@SecurelyStoredValue(key: \"redPanda\")"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" is also straightforward, there are only two functions."},{"type":"text","text":" "},{"type":"text","text":"To change the value of the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":", you can use the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()"},{"type":"text","text":" functions."}]},{"type":"codeListing","syntax":null,"code":["$redPanda.set(RedPanda(cuteRating: 99)) \/\/ The @SecurelyStoredValue has a new red panda","$redPanda.remove() \/\/ The @SecurelyStoredValue is nil"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"One last bit of advice, when calling "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()"},{"type":"text","text":" don’t forget to put a "},{"type":"codeVoice","code":"$"},{"type":"text","text":" "},{"type":"text","text":"in front of the the "},{"type":"codeVoice","code":"$storedValue"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"See: "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()"},{"type":"text","text":" docs for a more in depth explanation."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/securelystoredvalue"],"traits":[{"interfaceLanguage":"swift"}]}],"relationshipsSections":[{"identifiers":["doc:\/\/Boutique\/s8SendableP"],"kind":"relationships","title":"Conforms To","type":"conformsTo"}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property wrapper automagically persists a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in the system "},{"type":"codeVoice","code":"Keychain"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"SecurelyStoredValue"}],"title":"SecurelyStoredValue","roleHeading":"Structure","role":"symbol","symbolKind":"struct","externalID":"s:8Boutique19SecurelyStoredValueV","modules":[{"name":"Boutique"}],"navigatorTitle":[{"kind":"identifier","text":"SecurelyStoredValue"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique"]]},"topicSections":[{"title":"Initializers","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/init(key:)"]},{"title":"Instance Properties","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/binding","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/projectedValue","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/publisher","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/wrappedValue"]},{"title":"Instance Methods","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/append(_:)","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/toggle()","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/update(key:value:)"]}],"references":{"doc://Boutique/documentation/Boutique/StoredValue":{"role":"symbol","title":"StoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"StoredValue"}],"url":"\/documentation\/boutique\/storedvalue"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/remove()":{"role":"symbol","title":"remove()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"() "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Removes the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/remove()"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/publisher":{"role":"symbol","title":"publisher","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"publisher"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?, "},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A Combine publisher that allows you to observe all changes to the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/publisher","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/publisher"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/toggle()":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" is "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"toggle()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"toggle"},{"kind":"text","text":"() "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"A function to toggle a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" that represent a "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/toggle()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/toggle()"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/append(_:)":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"append(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"append"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":") "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"A function to append a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" represented by an "},{"type":"codeVoice","code":"Array"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/append(_:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/append(_:)"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/init(key:)":{"role":"symbol","title":"init(key:)","fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":")"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/init(key:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/init(key:)"},"doc://Boutique/s8SendableP":{"type":"unresolvable","title":"Swift.Sendable","identifier":"doc:\/\/Boutique\/s8SendableP"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","title":"SecurelyStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"SecurelyStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property wrapper automagically persists a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in the system "},{"type":"codeVoice","code":"Keychain"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"SecurelyStoredValue"}],"url":"\/documentation\/boutique\/securelystoredvalue"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/set(_:)":{"role":"symbol","title":"set(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"set"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?) "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Sets a value for the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/set(_:)"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/projectedValue":{"role":"symbol","title":"projectedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"SecurelyStoredValue","preciseIdentifier":"s:8Boutique19SecurelyStoredValueV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" which exposes "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()"},{"type":"text","text":" functions alongside a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/publisher"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/projectedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/projectedvalue"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"role":"symbol","title":"AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}],"url":"\/documentation\/boutique\/asyncstoredvalue"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/binding":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"binding","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"binding"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Binding","preciseIdentifier":"s:7SwiftUI7BindingV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?>"}],"abstract":[{"type":"text","text":"A convenient way to create a "},{"type":"codeVoice","code":"Binding"},{"type":"text","text":" from a "},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/binding","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/binding"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/update(key:value:)":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"update(key:value:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"update"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Key"},{"kind":"text","text":", "},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":", "},{"kind":"externalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"?) "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"A function to set a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" represented by a "},{"type":"codeVoice","code":"Dictionary"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/update(key:value:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/update(key:value:)"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/wrappedValue":{"role":"symbol","title":"wrappedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?"}],"abstract":[{"type":"text","text":"The currently stored value"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/wrappedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/wrappedvalue"}}} \ No newline at end of file +{"abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper automagically persists a single "},{"code":"Item","type":"codeVoice"},{"type":"text","text":" in the system "},{"type":"codeVoice","code":"Keychain"},{"text":" ","type":"text"},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":" or using @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference","isActive":true},{"type":"text","text":"."}],"topicSections":[{"title":"Initializers","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/init(key:service:group:)"]},{"title":"Instance Properties","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/binding","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/projectedValue","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/publisher","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/wrappedValue"]},{"identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/append(_:)","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/toggle()","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/update(key:value:)"],"title":"Instance Methods"}],"variants":[{"paths":["\/documentation\/boutique\/securelystoredvalue"],"traits":[{"interfaceLanguage":"swift"}]}],"metadata":{"symbolKind":"struct","role":"symbol","modules":[{"name":"Boutique"}],"fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"SecurelyStoredValue"}],"roleHeading":"Structure","externalID":"s:8Boutique19SecurelyStoredValueV","navigatorTitle":[{"kind":"identifier","text":"SecurelyStoredValue"}],"title":"SecurelyStoredValue"},"kind":"symbol","schemaVersion":{"minor":3,"major":0,"patch":0},"sections":[],"primaryContentSections":[{"declarations":[{"tokens":[{"kind":"attribute","text":"@propertyWrapper"},{"kind":"text","text":" "},{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"SecurelyStoredValue","kind":"identifier"},{"kind":"text","text":"<"},{"text":"Item","kind":"genericParameter"},{"kind":"text","text":"> "},{"kind":"keyword","text":"where"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Item"},{"text":" : ","kind":"text"},{"preciseIdentifier":"s:Se","text":"Decodable","kind":"typeIdentifier"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Item"},{"text":" : ","kind":"text"},{"preciseIdentifier":"s:SE","text":"Encodable","kind":"typeIdentifier"}],"languages":["swift"],"platforms":["macOS"]}],"kind":"declarations"},{"kind":"content","content":[{"level":2,"anchor":"overview","text":"Overview","type":"heading"},{"type":"paragraph","inlineContent":[{"type":"text","text":"You should use @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"text":" rather than @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true},{"type":"text","text":" when you need to store"},{"type":"text","text":" "},{"text":"sensitive values such as passwords or auth tokens, since a @","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"text":" will be persisted in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":"."}]},{"inlineContent":[{"type":"text","text":"This is fulfills the same needs as many other Keychain wrappers, but in a Boutique-like manner."}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"Values are delivered synchronously and are available on app launch, using the system "},{"type":"codeVoice","code":"Keychain"},{"text":" ","type":"text"},{"text":"as the backing store. If you wish to use your own ","type":"text"},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" you can use @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"text":".","type":"text"}],"type":"paragraph"},{"inlineContent":[{"text":"Unlike @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"type":"text","text":" properties @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","type":"reference","isActive":true},{"type":"text","text":" properties cannot be provided a default value."}],"type":"paragraph"},{"code":["@SecurelyStoredValue(key: \"redPanda\")","private var redPanda"],"type":"codeListing","syntax":null},{"inlineContent":[{"type":"text","text":"Since keychain values may or may not exist, a @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true,"type":"reference"},{"type":"text","text":" is nullable by default."},{"text":" ","type":"text"},{"text":"Something to watch out for: You do not need to specify your type as nullable. If you do so","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"the type will be a double optional ("},{"type":"codeVoice","code":"??"},{"text":") rather than optional (","type":"text"},{"code":"?","type":"codeVoice"},{"type":"text","text":")."}],"type":"paragraph"},{"type":"codeListing","code":["@SecurelyStoredValue(key: \"redPanda\")"],"syntax":null},{"type":"paragraph","inlineContent":[{"text":"Using @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true,"type":"reference"},{"type":"text","text":" is also straightforward, there are only two functions."},{"text":" ","type":"text"},{"type":"text","text":"To change the value of the @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"type":"text","text":", you can use the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)","isActive":true},{"text":" and ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()","isActive":true},{"type":"text","text":" functions."}]},{"type":"codeListing","code":["$redPanda.set(RedPanda(cuteRating: 99)) \/\/ The @SecurelyStoredValue has a new red panda","$redPanda.remove() \/\/ The @SecurelyStoredValue is nil"],"syntax":null},{"type":"paragraph","inlineContent":[{"text":"One last bit of advice, when calling ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)"},{"text":" and ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()"},{"type":"text","text":" don’t forget to put a "},{"code":"$","type":"codeVoice"},{"type":"text","text":" "},{"type":"text","text":"in front of the the "},{"type":"codeVoice","code":"$storedValue"},{"type":"text","text":"."}]},{"inlineContent":[{"text":"See: ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)","isActive":true,"type":"reference"},{"type":"text","text":" and "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()","type":"reference","isActive":true},{"type":"text","text":" docs for a more in depth explanation."}],"type":"paragraph"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","interfaceLanguage":"swift"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique"]]},"references":{"doc://Boutique/documentation/Boutique/SecurelyStoredValue/toggle()":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/toggle()","type":"topic","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"toggle","kind":"identifier"},{"text":"() ","kind":"text"},{"text":"throws","kind":"keyword"}],"abstract":[{"type":"text","text":"A function to toggle a @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true,"type":"reference"},{"text":" that represent a ","type":"text"},{"code":"Bool","type":"codeVoice"},{"text":".","type":"text"}],"title":"toggle()","kind":"symbol","url":"\/documentation\/boutique\/securelystoredvalue\/toggle()","role":"symbol","conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" is "},{"code":"Bool","type":"codeVoice"},{"type":"text","text":"."}],"availabilityPrefix":[{"text":"Available when","type":"text"}]}},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue","navigatorTitle":[{"text":"AsyncStoredValue","kind":"identifier"}],"type":"topic","title":"AsyncStoredValue","abstract":[{"type":"text","text":"The @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":" "},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" or using @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"type":"text","text":"."}],"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AsyncStoredValue"}]},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/binding":{"abstract":[{"type":"text","text":"A convenient way to create a "},{"code":"Binding","type":"codeVoice"},{"text":" from a ","type":"text"},{"code":"SecurelyStoredValue","type":"codeVoice"},{"type":"text","text":"."}],"fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"kind":"identifier","text":"binding"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:7SwiftUI7BindingV","text":"Binding","kind":"typeIdentifier"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":"?>","kind":"text"}],"url":"\/documentation\/boutique\/securelystoredvalue\/binding","title":"binding","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/binding","role":"symbol","kind":"symbol","conformance":{"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"constraints":[{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}]},"type":"topic"},"doc://Boutique/documentation/Boutique/StoredValue":{"type":"topic","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"StoredValue","kind":"identifier"}],"navigatorTitle":[{"text":"StoredValue","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","url":"\/documentation\/boutique\/storedvalue","kind":"symbol","title":"StoredValue","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":" ","type":"text"},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" or using @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/update(key:value:)":{"type":"topic","abstract":[{"type":"text","text":"A function to set a @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" represented by a "},{"type":"codeVoice","code":"Dictionary"},{"text":" ","type":"text"},{"text":"without having to manually make an intermediate copy for every value update.","type":"text"}],"role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"update","kind":"identifier"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Key"},{"text":", ","kind":"text"},{"text":"Value","kind":"genericParameter"},{"text":">(","kind":"text"},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"text":"Key","kind":"typeIdentifier"},{"kind":"text","text":", "},{"kind":"externalParam","text":"value"},{"kind":"text","text":": "},{"text":"Value","kind":"typeIdentifier"},{"text":"?) ","kind":"text"},{"text":"throws","kind":"keyword"}],"url":"\/documentation\/boutique\/securelystoredvalue\/update(key:value:)","conformance":{"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":" and "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"title":"update(key:value:)","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/update(key:value:)","kind":"symbol"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/set(_:)":{"kind":"symbol","title":"set(_:)","role":"symbol","abstract":[{"text":"Sets a value for the @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"type":"text","text":" property."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)","fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"set"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":"?) ","kind":"text"},{"kind":"keyword","text":"throws"}],"url":"\/documentation\/boutique\/securelystoredvalue\/set(_:)","type":"topic"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/init(key:service:group:)":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/init(key:service:group:)","title":"init(key:service:group:)","type":"topic","abstract":[],"role":"symbol","kind":"symbol","url":"\/documentation\/boutique\/securelystoredvalue\/init(key:service:group:)","fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"text":"key","kind":"externalParam"},{"kind":"text","text":": "},{"text":"String","preciseIdentifier":"s:SS","kind":"typeIdentifier"},{"text":", ","kind":"text"},{"text":"service","kind":"externalParam"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:8Boutique15KeychainServiceV","text":"KeychainService","kind":"typeIdentifier"},{"kind":"text","text":"?, "},{"kind":"externalParam","text":"group"},{"kind":"text","text":": "},{"text":"KeychainGroup","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique13KeychainGroupV"},{"kind":"text","text":"?)"}]},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/wrappedValue":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/wrappedValue","kind":"symbol","fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"text":"wrappedValue","kind":"identifier"},{"text":": ","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"?","kind":"text"}],"type":"topic","title":"wrappedValue","url":"\/documentation\/boutique\/securelystoredvalue\/wrappedvalue","abstract":[{"text":"The currently stored value","type":"text"}]},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/append(_:)":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/append(_:)","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"append","kind":"identifier"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"text":"Value","kind":"typeIdentifier"},{"kind":"text","text":") "},{"text":"throws","kind":"keyword"}],"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"code":"Decodable","type":"codeVoice"},{"text":" and ","type":"text"},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":"."}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"title":"append(_:)","url":"\/documentation\/boutique\/securelystoredvalue\/append(_:)","kind":"symbol","role":"symbol","abstract":[{"type":"text","text":"A function to append a @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" represented by an "},{"type":"codeVoice","code":"Array"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"type":"topic"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/remove()":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()","kind":"symbol","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"text":"() ","kind":"text"},{"text":"throws","kind":"keyword"}],"type":"topic","title":"remove()","abstract":[{"text":"Removes the @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"text":".","type":"text"}],"url":"\/documentation\/boutique\/securelystoredvalue\/remove()"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/publisher":{"url":"\/documentation\/boutique\/securelystoredvalue\/publisher","title":"publisher","role":"symbol","kind":"symbol","type":"topic","abstract":[{"type":"text","text":"A Combine publisher that allows you to observe all changes to the @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true,"type":"reference"},{"text":".","type":"text"}],"fragments":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"text":"publisher","kind":"identifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":"?, ","kind":"text"},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"kind":"text","text":">"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/publisher"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/projectedValue":{"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" which exposes "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)","isActive":true},{"type":"text","text":" and "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()","isActive":true},{"text":" functions alongside a ","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/publisher"},{"text":".","type":"text"}],"url":"\/documentation\/boutique\/securelystoredvalue\/projectedvalue","role":"symbol","fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique19SecurelyStoredValueV","text":"SecurelyStoredValue"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">","kind":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/projectedValue","kind":"symbol","type":"topic","title":"projectedValue"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"SecurelyStoredValue"}],"type":"topic","navigatorTitle":[{"text":"SecurelyStoredValue","kind":"identifier"}],"title":"SecurelyStoredValue","url":"\/documentation\/boutique\/securelystoredvalue","abstract":[{"text":"The @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"text":" property wrapper automagically persists a single ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" in the system ","type":"text"},{"code":"Keychain","type":"codeVoice"},{"text":" ","type":"text"},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" or using @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/securelystoredvalue/append(_:).json b/docs/data/documentation/boutique/securelystoredvalue/append(_:).json index 6ba1dd8..b37105f 100644 --- a/docs/data/documentation/boutique/securelystoredvalue/append(_:).json +++ b/docs/data/documentation/boutique/securelystoredvalue/append(_:).json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"append"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":") "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" "},{"kind":"keyword","text":"where"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" == ["},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"], "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Decodable","preciseIdentifier":"s:Se"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Encodable","preciseIdentifier":"s:SE"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is meant to provide a simple ergonomic improvement, avoiding callsites like this."}]},{"type":"codeListing","syntax":null,"code":["var updatedRedPandaList = self.redPandaList","updatedRedPandaList.append(\"Pabu\")","self.$redPandaList.set(updatedRedPandaList)"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Instead this function provides a much simpler alternative."}]},{"type":"codeListing","syntax":null,"code":["try await self.$redPandaList.append(\"Pabu\")"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"To better match expected uses calling append on a currently nil SecurelyStoredValue"},{"type":"text","text":" "},{"type":"text","text":"will return a single element array of the passed in value,"},{"type":"text","text":" "},{"type":"text","text":"rather than returning nil or throwing an error."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/securelystoredvalue\/append(_:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/append(_:)","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A function to append a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" represented by an "},{"type":"codeVoice","code":"Array"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"append(_:)","roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"append"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":") "},{"kind":"keyword","text":"throws"}],"symbolKind":"method","externalID":"s:8Boutique19SecurelyStoredValueV6appendyyqd__KSayqd__GRszSeRd__SERd__lF","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","title":"SecurelyStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"SecurelyStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property wrapper automagically persists a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in the system "},{"type":"codeVoice","code":"Keychain"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"SecurelyStoredValue"}],"url":"\/documentation\/boutique\/securelystoredvalue"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/append(_:)":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"append(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"append"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":") "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"A function to append a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" represented by an "},{"type":"codeVoice","code":"Array"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/append(_:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/append(_:)"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file +{"sections":[],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/securelystoredvalue\/append(_:)"]}],"kind":"symbol","identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/append(_:)","interfaceLanguage":"swift"},"schemaVersion":{"patch":0,"major":0,"minor":3},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"languages":["swift"],"tokens":[{"text":"@","kind":"attribute"},{"kind":"attribute","text":"MainActor","preciseIdentifier":"s:ScM"},{"text":" ","kind":"text"},{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"append","kind":"identifier"},{"text":"<","kind":"text"},{"text":"Value","kind":"genericParameter"},{"kind":"text","text":">("},{"text":"_","kind":"externalParam"},{"kind":"text","text":" "},{"kind":"internalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"text":") ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" "},{"text":"where","kind":"keyword"},{"kind":"text","text":" "},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":" == ["},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"], "},{"text":"Value","kind":"typeIdentifier"},{"kind":"text","text":" : "},{"text":"Decodable","preciseIdentifier":"s:Se","kind":"typeIdentifier"},{"text":", ","kind":"text"},{"text":"Value","kind":"typeIdentifier"},{"text":" : ","kind":"text"},{"preciseIdentifier":"s:SE","kind":"typeIdentifier","text":"Encodable"}]}]},{"kind":"content","content":[{"level":2,"text":"Discussion","type":"heading","anchor":"discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is meant to provide a simple ergonomic improvement, avoiding callsites like this."}]},{"type":"codeListing","syntax":null,"code":["var updatedRedPandaList = self.redPandaList","updatedRedPandaList.append(\"Pabu\")","self.$redPandaList.set(updatedRedPandaList)"]},{"inlineContent":[{"type":"text","text":"Instead this function provides a much simpler alternative."}],"type":"paragraph"},{"syntax":null,"code":["try await self.$redPandaList.append(\"Pabu\")"],"type":"codeListing"},{"inlineContent":[{"type":"text","text":"To better match expected uses calling append on a currently nil SecurelyStoredValue"},{"type":"text","text":" "},{"type":"text","text":"will return a single element array of the passed in value,"},{"type":"text","text":" "},{"type":"text","text":"rather than returning nil or throwing an error."}],"type":"paragraph"}]}],"abstract":[{"type":"text","text":"A function to append a @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","type":"reference","isActive":true},{"type":"text","text":" represented by an "},{"type":"codeVoice","code":"Array"},{"text":" ","type":"text"},{"text":"without having to manually make an intermediate copy for every value update.","type":"text"}],"metadata":{"fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"append","kind":"identifier"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"typeIdentifier","text":"Value"},{"text":") ","kind":"text"},{"text":"throws","kind":"keyword"}],"extendedModule":"Boutique","symbolKind":"method","title":"append(_:)","conformance":{"availabilityPrefix":[{"type":"text","text":"Available when"}],"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"text":" and ","type":"text"},{"code":"Encodable","type":"codeVoice"},{"text":".","type":"text"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"roleHeading":"Instance Method","role":"symbol","externalID":"s:8Boutique19SecurelyStoredValueV6appendyyqd__KSayqd__GRszSeRd__SERd__lF","modules":[{"name":"Boutique"}]},"references":{"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"SecurelyStoredValue"}],"type":"topic","navigatorTitle":[{"text":"SecurelyStoredValue","kind":"identifier"}],"title":"SecurelyStoredValue","url":"\/documentation\/boutique\/securelystoredvalue","abstract":[{"text":"The @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"text":" property wrapper automagically persists a single ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" in the system ","type":"text"},{"code":"Keychain","type":"codeVoice"},{"text":" ","type":"text"},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" or using @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/append(_:)":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/append(_:)","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"append","kind":"identifier"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"text":"Value","kind":"typeIdentifier"},{"kind":"text","text":") "},{"text":"throws","kind":"keyword"}],"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"code":"Decodable","type":"codeVoice"},{"text":" and ","type":"text"},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":"."}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"title":"append(_:)","url":"\/documentation\/boutique\/securelystoredvalue\/append(_:)","kind":"symbol","role":"symbol","abstract":[{"type":"text","text":"A function to append a @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" represented by an "},{"type":"codeVoice","code":"Array"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"type":"topic"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/securelystoredvalue/binding.json b/docs/data/documentation/boutique/securelystoredvalue/binding.json index 716ad4f..a3fafc7 100644 --- a/docs/data/documentation/boutique/securelystoredvalue/binding.json +++ b/docs/data/documentation/boutique/securelystoredvalue/binding.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"binding"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Binding","preciseIdentifier":"s:7SwiftUI7BindingV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?> { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"return-value","level":2,"type":"heading","text":"Return Value"},{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"codeVoice","code":"Binding"},{"type":"text","text":" of the "},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":" provided."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/securelystoredvalue\/binding"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/binding","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A convenient way to create a "},{"type":"codeVoice","code":"Binding"},{"type":"text","text":" from a "},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"binding","roleHeading":"Instance Property","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"binding"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Binding","preciseIdentifier":"s:7SwiftUI7BindingV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?>"}],"symbolKind":"property","externalID":"s:8Boutique19SecurelyStoredValueV7binding7SwiftUI7BindingVyxSgGvp","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/binding":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"binding","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"binding"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Binding","preciseIdentifier":"s:7SwiftUI7BindingV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?>"}],"abstract":[{"type":"text","text":"A convenient way to create a "},{"type":"codeVoice","code":"Binding"},{"type":"text","text":" from a "},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/binding","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/binding"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","title":"SecurelyStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"SecurelyStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property wrapper automagically persists a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in the system "},{"type":"codeVoice","code":"Keychain"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"SecurelyStoredValue"}],"url":"\/documentation\/boutique\/securelystoredvalue"}}} \ No newline at end of file +{"metadata":{"modules":[{"name":"Boutique"}],"externalID":"s:8Boutique19SecurelyStoredValueV7binding7SwiftUI7BindingVyxSgGvp","extendedModule":"Boutique","fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"text":"binding","kind":"identifier"},{"kind":"text","text":": "},{"text":"Binding","kind":"typeIdentifier","preciseIdentifier":"s:7SwiftUI7BindingV"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":"?>","kind":"text"}],"roleHeading":"Instance Property","title":"binding","role":"symbol","symbolKind":"property","conformance":{"conformancePrefix":[{"type":"text","text":"Conforms when"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"code":"Decodable","type":"codeVoice"},{"text":" and ","type":"text"},{"code":"Encodable","type":"codeVoice"},{"text":".","type":"text"}],"availabilityPrefix":[{"type":"text","text":"Available when"}]}},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"kind":"symbol","schemaVersion":{"patch":0,"major":0,"minor":3},"sections":[],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/binding","interfaceLanguage":"swift"},"abstract":[{"text":"A convenient way to create a ","type":"text"},{"code":"Binding","type":"codeVoice"},{"text":" from a ","type":"text"},{"code":"SecurelyStoredValue","type":"codeVoice"},{"type":"text","text":"."}],"primaryContentSections":[{"declarations":[{"platforms":["macOS"],"tokens":[{"text":"@","kind":"attribute"},{"preciseIdentifier":"s:ScM","text":"MainActor","kind":"attribute"},{"text":" ","kind":"text"},{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"text":"binding","kind":"identifier"},{"kind":"text","text":": "},{"text":"Binding","kind":"typeIdentifier","preciseIdentifier":"s:7SwiftUI7BindingV"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"?> { ","kind":"text"},{"text":"get","kind":"keyword"},{"kind":"text","text":" }"}],"languages":["swift"]}],"kind":"declarations"},{"kind":"content","content":[{"type":"heading","text":"Return Value","anchor":"return-value","level":2},{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"code":"Binding","type":"codeVoice"},{"type":"text","text":" of the "},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":" provided."}]}]}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/securelystoredvalue\/binding"]}],"references":{"doc://Boutique/documentation/Boutique/SecurelyStoredValue/binding":{"abstract":[{"type":"text","text":"A convenient way to create a "},{"code":"Binding","type":"codeVoice"},{"text":" from a ","type":"text"},{"code":"SecurelyStoredValue","type":"codeVoice"},{"type":"text","text":"."}],"fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"kind":"identifier","text":"binding"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:7SwiftUI7BindingV","text":"Binding","kind":"typeIdentifier"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":"?>","kind":"text"}],"url":"\/documentation\/boutique\/securelystoredvalue\/binding","title":"binding","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/binding","role":"symbol","kind":"symbol","conformance":{"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"constraints":[{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}]},"type":"topic"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"SecurelyStoredValue"}],"type":"topic","navigatorTitle":[{"text":"SecurelyStoredValue","kind":"identifier"}],"title":"SecurelyStoredValue","url":"\/documentation\/boutique\/securelystoredvalue","abstract":[{"text":"The @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"text":" property wrapper automagically persists a single ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" in the system ","type":"text"},{"code":"Keychain","type":"codeVoice"},{"text":" ","type":"text"},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" or using @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":"."}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/securelystoredvalue/init(key:).json b/docs/data/documentation/boutique/securelystoredvalue/init(key:).json deleted file mode 100644 index c0b9bc1..0000000 --- a/docs/data/documentation/boutique/securelystoredvalue/init(key:).json +++ /dev/null @@ -1 +0,0 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":")"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/securelystoredvalue\/init(key:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/init(key:)","interfaceLanguage":"swift"},"kind":"symbol","metadata":{"fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":")"}],"title":"init(key:)","roleHeading":"Initializer","role":"symbol","symbolKind":"init","externalID":"s:8Boutique19SecurelyStoredValueV3keyACyxGSS_tcfc","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/SecurelyStoredValue/init(key:)":{"role":"symbol","title":"init(key:)","fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":")"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/init(key:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/init(key:)"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","title":"SecurelyStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"SecurelyStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property wrapper automagically persists a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in the system "},{"type":"codeVoice","code":"Keychain"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"SecurelyStoredValue"}],"url":"\/documentation\/boutique\/securelystoredvalue"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/securelystoredvalue/init(key:service:group:).json b/docs/data/documentation/boutique/securelystoredvalue/init(key:service:group:).json new file mode 100644 index 0000000..9356f0a --- /dev/null +++ b/docs/data/documentation/boutique/securelystoredvalue/init(key:service:group:).json @@ -0,0 +1 @@ +{"metadata":{"fragments":[{"text":"init","kind":"identifier"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"},{"text":", ","kind":"text"},{"text":"service","kind":"externalParam"},{"text":": ","kind":"text"},{"text":"KeychainService","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique15KeychainServiceV"},{"kind":"text","text":"?, "},{"text":"group","kind":"externalParam"},{"text":": ","kind":"text"},{"text":"KeychainGroup","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique13KeychainGroupV"},{"text":"?)","kind":"text"}],"title":"init(key:service:group:)","externalID":"s:8Boutique19SecurelyStoredValueV3key7service5groupACyxGSS_AA15KeychainServiceVSgAA0H5GroupVSgtcfc","role":"symbol","roleHeading":"Initializer","symbolKind":"init","modules":[{"name":"Boutique"}]},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/init(key:service:group:)","interfaceLanguage":"swift"},"variants":[{"paths":["\/documentation\/boutique\/securelystoredvalue\/init(key:service:group:)"],"traits":[{"interfaceLanguage":"swift"}]}],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"init"},{"kind":"text","text":"("},{"text":"key","kind":"externalParam"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":", "},{"text":"service","kind":"externalParam"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:8Boutique15KeychainServiceV","text":"KeychainService","kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService"},{"text":"? = nil, ","kind":"text"},{"text":"group","kind":"externalParam"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:8Boutique13KeychainGroupV","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup","kind":"typeIdentifier","text":"KeychainGroup"},{"kind":"text","text":"? = nil)"}],"languages":["swift"]}]}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"kind":"symbol","sections":[],"schemaVersion":{"patch":0,"minor":3,"major":0},"references":{"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"SecurelyStoredValue"}],"type":"topic","navigatorTitle":[{"text":"SecurelyStoredValue","kind":"identifier"}],"title":"SecurelyStoredValue","url":"\/documentation\/boutique\/securelystoredvalue","abstract":[{"text":"The @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"text":" property wrapper automagically persists a single ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" in the system ","type":"text"},{"code":"Keychain","type":"codeVoice"},{"text":" ","type":"text"},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" or using @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/KeychainService":{"kind":"symbol","title":"KeychainService","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"KeychainService"}],"navigatorTitle":[{"kind":"identifier","text":"KeychainService"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainService","type":"topic","url":"\/documentation\/boutique\/keychainservice","abstract":[{"type":"text","text":"A type representing Tagged"},{"type":"text","text":", to statically represent the keychain’s Service."},{"text":" ","type":"text"},{"text":"This is done to be more type-safe than passing string parameters in all places.","type":"text"}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/init(key:service:group:)":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/init(key:service:group:)","title":"init(key:service:group:)","type":"topic","abstract":[],"role":"symbol","kind":"symbol","url":"\/documentation\/boutique\/securelystoredvalue\/init(key:service:group:)","fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"text":"key","kind":"externalParam"},{"kind":"text","text":": "},{"text":"String","preciseIdentifier":"s:SS","kind":"typeIdentifier"},{"text":", ","kind":"text"},{"text":"service","kind":"externalParam"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:8Boutique15KeychainServiceV","text":"KeychainService","kind":"typeIdentifier"},{"kind":"text","text":"?, "},{"kind":"externalParam","text":"group"},{"kind":"text","text":": "},{"text":"KeychainGroup","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique13KeychainGroupV"},{"kind":"text","text":"?)"}]},"doc://Boutique/documentation/Boutique/KeychainGroup":{"type":"topic","abstract":[{"text":"A type representing Tagged","type":"text"},{"type":"text","text":", to statically represent the keychain’s Group."},{"type":"text","text":" "},{"type":"text","text":"This is done to be more type-safe than passing string parameters in all places."}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"text":"KeychainGroup","kind":"identifier"}],"url":"\/documentation\/boutique\/keychaingroup","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/KeychainGroup","title":"KeychainGroup","role":"symbol","navigatorTitle":[{"kind":"identifier","text":"KeychainGroup"}],"kind":"symbol"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/securelystoredvalue/projectedvalue.json b/docs/data/documentation/boutique/securelystoredvalue/projectedvalue.json index e3cc075..f2c5be5 100644 --- a/docs/data/documentation/boutique/securelystoredvalue/projectedvalue.json +++ b/docs/data/documentation/boutique/securelystoredvalue/projectedvalue.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","preciseIdentifier":"s:8Boutique19SecurelyStoredValueV","text":"SecurelyStoredValue"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"> { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/securelystoredvalue\/projectedvalue"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/projectedValue","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" which exposes "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()"},{"type":"text","text":" functions alongside a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/publisher"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"SecurelyStoredValue","preciseIdentifier":"s:8Boutique19SecurelyStoredValueV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"title":"projectedValue","roleHeading":"Instance Property","role":"symbol","symbolKind":"property","externalID":"s:8Boutique19SecurelyStoredValueV09projectedD0ACyxGvp","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/SecurelyStoredValue/publisher":{"role":"symbol","title":"publisher","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"publisher"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?, "},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A Combine publisher that allows you to observe all changes to the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/publisher","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/publisher"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","title":"SecurelyStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"SecurelyStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property wrapper automagically persists a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in the system "},{"type":"codeVoice","code":"Keychain"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"SecurelyStoredValue"}],"url":"\/documentation\/boutique\/securelystoredvalue"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/set(_:)":{"role":"symbol","title":"set(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"set"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?) "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Sets a value for the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/set(_:)"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/remove()":{"role":"symbol","title":"remove()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"() "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Removes the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/remove()"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/projectedValue":{"role":"symbol","title":"projectedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"SecurelyStoredValue","preciseIdentifier":"s:8Boutique19SecurelyStoredValueV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" which exposes "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()"},{"type":"text","text":" functions alongside a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/publisher"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/projectedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/projectedvalue"}}} \ No newline at end of file +{"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"abstract":[{"type":"text","text":"A "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"text":" which exposes ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)","type":"reference","isActive":true},{"text":" and ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()"},{"text":" functions alongside a ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/publisher","isActive":true},{"text":".","type":"text"}],"sections":[],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/projectedValue","interfaceLanguage":"swift"},"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"tokens":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","text":"SecurelyStoredValue","preciseIdentifier":"s:8Boutique19SecurelyStoredValueV"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":"> { ","kind":"text"},{"text":"get","kind":"keyword"},{"kind":"text","text":" }"}],"platforms":["macOS"]}]}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/securelystoredvalue\/projectedvalue"]}],"kind":"symbol","metadata":{"roleHeading":"Instance Property","externalID":"s:8Boutique19SecurelyStoredValueV09projectedD0ACyxGvp","role":"symbol","fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"text":"projectedValue","kind":"identifier"},{"text":": ","kind":"text"},{"text":"SecurelyStoredValue","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique19SecurelyStoredValueV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">","kind":"text"}],"modules":[{"name":"Boutique"}],"symbolKind":"property","title":"projectedValue"},"schemaVersion":{"major":0,"minor":3,"patch":0},"references":{"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"SecurelyStoredValue"}],"type":"topic","navigatorTitle":[{"text":"SecurelyStoredValue","kind":"identifier"}],"title":"SecurelyStoredValue","url":"\/documentation\/boutique\/securelystoredvalue","abstract":[{"text":"The @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"text":" property wrapper automagically persists a single ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" in the system ","type":"text"},{"code":"Keychain","type":"codeVoice"},{"text":" ","type":"text"},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" or using @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/projectedValue":{"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" which exposes "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)","isActive":true},{"type":"text","text":" and "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()","isActive":true},{"text":" functions alongside a ","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/publisher"},{"text":".","type":"text"}],"url":"\/documentation\/boutique\/securelystoredvalue\/projectedvalue","role":"symbol","fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique19SecurelyStoredValueV","text":"SecurelyStoredValue"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">","kind":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/projectedValue","kind":"symbol","type":"topic","title":"projectedValue"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/publisher":{"url":"\/documentation\/boutique\/securelystoredvalue\/publisher","title":"publisher","role":"symbol","kind":"symbol","type":"topic","abstract":[{"type":"text","text":"A Combine publisher that allows you to observe all changes to the @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true,"type":"reference"},{"text":".","type":"text"}],"fragments":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"text":"publisher","kind":"identifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":"?, ","kind":"text"},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"kind":"text","text":">"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/publisher"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/remove()":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()","kind":"symbol","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"text":"() ","kind":"text"},{"text":"throws","kind":"keyword"}],"type":"topic","title":"remove()","abstract":[{"text":"Removes the @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"text":".","type":"text"}],"url":"\/documentation\/boutique\/securelystoredvalue\/remove()"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/set(_:)":{"kind":"symbol","title":"set(_:)","role":"symbol","abstract":[{"text":"Sets a value for the @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"type":"text","text":" property."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)","fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"set"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":"?) ","kind":"text"},{"kind":"keyword","text":"throws"}],"url":"\/documentation\/boutique\/securelystoredvalue\/set(_:)","type":"topic"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/securelystoredvalue/publisher.json b/docs/data/documentation/boutique/securelystoredvalue/publisher.json index 8e60ef1..7199bb2 100644 --- a/docs/data/documentation/boutique/securelystoredvalue/publisher.json +++ b/docs/data/documentation/boutique/securelystoredvalue/publisher.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"publisher"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?, "},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"kind":"text","text":"> { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/securelystoredvalue\/publisher"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/publisher","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A Combine publisher that allows you to observe all changes to the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"publisher"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?, "},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"kind":"text","text":">"}],"title":"publisher","roleHeading":"Instance Property","role":"symbol","symbolKind":"property","externalID":"s:8Boutique19SecurelyStoredValueV9publisher7Combine12AnyPublisherVyxSgs5NeverOGvp","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","title":"SecurelyStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"SecurelyStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property wrapper automagically persists a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in the system "},{"type":"codeVoice","code":"Keychain"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"SecurelyStoredValue"}],"url":"\/documentation\/boutique\/securelystoredvalue"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/publisher":{"role":"symbol","title":"publisher","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"publisher"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?, "},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A Combine publisher that allows you to observe all changes to the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/publisher","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/publisher"}}} \ No newline at end of file +{"metadata":{"modules":[{"name":"Boutique"}],"roleHeading":"Instance Property","title":"publisher","role":"symbol","symbolKind":"property","externalID":"s:8Boutique19SecurelyStoredValueV9publisher7Combine12AnyPublisherVyxSgs5NeverOGvp","fragments":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"text":"publisher","kind":"identifier"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:7Combine12AnyPublisherV","kind":"typeIdentifier","text":"AnyPublisher"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"?, "},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"text":">","kind":"text"}]},"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"text":"publisher","kind":"identifier"},{"kind":"text","text":": "},{"preciseIdentifier":"s:7Combine12AnyPublisherV","kind":"typeIdentifier","text":"AnyPublisher"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"?, "},{"preciseIdentifier":"s:s5NeverO","text":"Never","kind":"typeIdentifier"},{"kind":"text","text":"> { "},{"text":"get","kind":"keyword"},{"text":" }","kind":"text"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"kind":"symbol","variants":[{"paths":["\/documentation\/boutique\/securelystoredvalue\/publisher"],"traits":[{"interfaceLanguage":"swift"}]}],"abstract":[{"type":"text","text":"A Combine publisher that allows you to observe all changes to the @"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","type":"reference"},{"type":"text","text":"."}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/publisher","interfaceLanguage":"swift"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"sections":[],"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/publisher":{"url":"\/documentation\/boutique\/securelystoredvalue\/publisher","title":"publisher","role":"symbol","kind":"symbol","type":"topic","abstract":[{"type":"text","text":"A Combine publisher that allows you to observe all changes to the @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true,"type":"reference"},{"text":".","type":"text"}],"fragments":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"text":"publisher","kind":"identifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":"?, ","kind":"text"},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"kind":"text","text":">"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/publisher"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"SecurelyStoredValue"}],"type":"topic","navigatorTitle":[{"text":"SecurelyStoredValue","kind":"identifier"}],"title":"SecurelyStoredValue","url":"\/documentation\/boutique\/securelystoredvalue","abstract":[{"text":"The @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"text":" property wrapper automagically persists a single ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" in the system ","type":"text"},{"code":"Keychain","type":"codeVoice"},{"text":" ","type":"text"},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" or using @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":"."}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/securelystoredvalue/remove().json b/docs/data/documentation/boutique/securelystoredvalue/remove().json index 9db36f4..7c1d18e 100644 --- a/docs/data/documentation/boutique/securelystoredvalue/remove().json +++ b/docs/data/documentation/boutique/securelystoredvalue/remove().json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"() "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"You may run into an error that says"}]},{"type":"codeListing","syntax":null,"code":["\"'remove' is inaccessible due to 'internal' protection level.\""]},{"type":"paragraph","inlineContent":[{"type":"text","text":"If that occurs the fix is straightforward. Rather than calling "},{"type":"codeVoice","code":"storedValue.remove()"},{"type":"text","text":" "},{"type":"text","text":"you need to call "},{"type":"codeVoice","code":"$storedValue.remove()"},{"type":"text","text":", with a dollar sign ($) in front of "},{"type":"codeVoice","code":"storedValue"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"When using a property wrapper the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/wrappedValue"},{"type":"text","text":" is an "},{"type":"codeVoice","code":"Item"},{"type":"text","text":", but the "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" "},{"type":"text","text":"is a "},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":". That means you are accessing the "},{"type":"codeVoice","code":"storedValue"},{"type":"text","text":" you’re interacting"},{"type":"text","text":" "},{"type":"text","text":"with, a value type "},{"type":"codeVoice","code":"Item"},{"type":"text","text":". But it is the "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" that is the "},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"text","text":"that property and has the ``set(_:) function."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This follows similar conventions to the "},{"type":"codeVoice","code":"@Published"},{"type":"text","text":" property wrapper."},{"type":"text","text":" "},{"type":"codeVoice","code":"@Published var items: [Item]"},{"type":"text","text":" allows you to use "},{"type":"codeVoice","code":"items"},{"type":"text","text":" as a regular "},{"type":"codeVoice","code":"[Item]"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"text","text":"but "},{"type":"codeVoice","code":"$items"},{"type":"text","text":" projects "},{"type":"codeVoice","code":"AnyPublisher<[Item], Never>"},{"type":"text","text":" so you can subscribe to changes items produces."},{"type":"text","text":" "},{"type":"text","text":"Within Boutique the @Stored property wrapper works very similarly."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/securelystoredvalue\/remove()"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Removes the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"() "},{"kind":"keyword","text":"throws"}],"title":"remove()","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique19SecurelyStoredValueV6removeyyKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/remove()":{"role":"symbol","title":"remove()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"() "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Removes the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/remove()"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","title":"SecurelyStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"SecurelyStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property wrapper automagically persists a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in the system "},{"type":"codeVoice","code":"Keychain"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"SecurelyStoredValue"}],"url":"\/documentation\/boutique\/securelystoredvalue"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/wrappedValue":{"role":"symbol","title":"wrappedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?"}],"abstract":[{"type":"text","text":"The currently stored value"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/wrappedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/wrappedvalue"}}} \ No newline at end of file +{"metadata":{"role":"symbol","symbolKind":"method","modules":[{"name":"Boutique"}],"fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"remove"},{"kind":"text","text":"() "},{"text":"throws","kind":"keyword"}],"title":"remove()","roleHeading":"Instance Method","externalID":"s:8Boutique19SecurelyStoredValueV6removeyyKF"},"abstract":[{"text":"Removes the @","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":"."}],"schemaVersion":{"major":0,"minor":3,"patch":0},"variants":[{"paths":["\/documentation\/boutique\/securelystoredvalue\/remove()"],"traits":[{"interfaceLanguage":"swift"}]}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"tokens":[{"kind":"attribute","text":"@"},{"kind":"attribute","text":"MainActor","preciseIdentifier":"s:ScM"},{"text":" ","kind":"text"},{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"throws"}],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"inlineContent":[{"type":"text","text":"You may run into an error that says"}],"type":"paragraph"},{"syntax":null,"code":["\"'remove' is inaccessible due to 'internal' protection level.\""],"type":"codeListing"},{"inlineContent":[{"type":"text","text":"If that occurs the fix is straightforward. Rather than calling "},{"type":"codeVoice","code":"storedValue.remove()"},{"type":"text","text":" "},{"text":"you need to call ","type":"text"},{"type":"codeVoice","code":"$storedValue.remove()"},{"text":", with a dollar sign ($) in front of ","type":"text"},{"type":"codeVoice","code":"storedValue"},{"text":".","type":"text"}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"When using a property wrapper the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/wrappedValue","isActive":true},{"type":"text","text":" is an "},{"type":"codeVoice","code":"Item"},{"text":", but the ","type":"text"},{"type":"codeVoice","code":"projectedValue"},{"text":" ","type":"text"},{"type":"text","text":"is a "},{"code":"SecurelyStoredValue","type":"codeVoice"},{"text":". That means you are accessing the ","type":"text"},{"code":"storedValue","type":"codeVoice"},{"text":" you’re interacting","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"with, a value type "},{"type":"codeVoice","code":"Item"},{"type":"text","text":". But it is the "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" that is the "},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":","},{"text":" ","type":"text"},{"type":"text","text":"that property and has the ``set(_:) function."}],"type":"paragraph"},{"inlineContent":[{"text":"This follows similar conventions to the ","type":"text"},{"code":"@Published","type":"codeVoice"},{"text":" property wrapper.","type":"text"},{"type":"text","text":" "},{"code":"@Published var items: [Item]","type":"codeVoice"},{"type":"text","text":" allows you to use "},{"type":"codeVoice","code":"items"},{"text":" as a regular ","type":"text"},{"type":"codeVoice","code":"[Item]"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"text","text":"but "},{"type":"codeVoice","code":"$items"},{"type":"text","text":" projects "},{"code":"AnyPublisher<[Item], Never>","type":"codeVoice"},{"type":"text","text":" so you can subscribe to changes items produces."},{"type":"text","text":" "},{"text":"Within Boutique the @Stored property wrapper works very similarly.","type":"text"}],"type":"paragraph"}]}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()"},"sections":[],"kind":"symbol","references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/wrappedValue":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/wrappedValue","kind":"symbol","fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"text":"wrappedValue","kind":"identifier"},{"text":": ","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"?","kind":"text"}],"type":"topic","title":"wrappedValue","url":"\/documentation\/boutique\/securelystoredvalue\/wrappedvalue","abstract":[{"text":"The currently stored value","type":"text"}]},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/remove()":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/remove()","kind":"symbol","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"text":"() ","kind":"text"},{"text":"throws","kind":"keyword"}],"type":"topic","title":"remove()","abstract":[{"text":"Removes the @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"text":".","type":"text"}],"url":"\/documentation\/boutique\/securelystoredvalue\/remove()"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"SecurelyStoredValue"}],"type":"topic","navigatorTitle":[{"text":"SecurelyStoredValue","kind":"identifier"}],"title":"SecurelyStoredValue","url":"\/documentation\/boutique\/securelystoredvalue","abstract":[{"text":"The @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"text":" property wrapper automagically persists a single ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" in the system ","type":"text"},{"code":"Keychain","type":"codeVoice"},{"text":" ","type":"text"},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" or using @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/securelystoredvalue/set(_:).json b/docs/data/documentation/boutique/securelystoredvalue/set(_:).json index 8cd9ac2..c5a46f1 100644 --- a/docs/data/documentation/boutique/securelystoredvalue/set(_:).json +++ b/docs/data/documentation/boutique/securelystoredvalue/set(_:).json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"set"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?) "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"value","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The value to set @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" to."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"You may run into an error that says"}]},{"type":"codeListing","syntax":null,"code":["\"'set' is inaccessible due to 'internal' protection level.\""]},{"type":"paragraph","inlineContent":[{"type":"text","text":"If that occurs the fix is straightforward. Rather than calling "},{"type":"codeVoice","code":"storedValue.set(newValue)"},{"type":"text","text":" "},{"type":"text","text":"you need to call "},{"type":"codeVoice","code":"$storedValue.set(newValue)"},{"type":"text","text":", with a dollar sign ($) in front of "},{"type":"codeVoice","code":"storedValue"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"When using a property wrapper the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/wrappedValue"},{"type":"text","text":" is an "},{"type":"codeVoice","code":"Item"},{"type":"text","text":", but the "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" "},{"type":"text","text":"is a "},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":". That means you are accessing the "},{"type":"codeVoice","code":"storedValue"},{"type":"text","text":" you’re interacting"},{"type":"text","text":" "},{"type":"text","text":"with, a value type "},{"type":"codeVoice","code":"Item"},{"type":"text","text":". But it is the "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" that is the "},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"text","text":"that property and has the ``set(_:) function."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This follows similar conventions to the "},{"type":"codeVoice","code":"@Published"},{"type":"text","text":" property wrapper."},{"type":"text","text":" "},{"type":"codeVoice","code":"@Published var items: [Item]"},{"type":"text","text":" allows you to use "},{"type":"codeVoice","code":"items"},{"type":"text","text":" as a regular "},{"type":"codeVoice","code":"[Item]"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"text","text":"but "},{"type":"codeVoice","code":"$items"},{"type":"text","text":" projects "},{"type":"codeVoice","code":"AnyPublisher<[Item], Never>"},{"type":"text","text":" so you can subscribe to changes items produces."},{"type":"text","text":" "},{"type":"text","text":"Within Boutique the @Stored property wrapper works very similarly."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/securelystoredvalue\/set(_:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Sets a value for the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"set"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?) "},{"kind":"keyword","text":"throws"}],"title":"set(_:)","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique19SecurelyStoredValueV3setyyxSgKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/SecurelyStoredValue/set(_:)":{"role":"symbol","title":"set(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"set"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?) "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Sets a value for the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/set(_:)"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","title":"SecurelyStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"SecurelyStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property wrapper automagically persists a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in the system "},{"type":"codeVoice","code":"Keychain"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"SecurelyStoredValue"}],"url":"\/documentation\/boutique\/securelystoredvalue"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/wrappedValue":{"role":"symbol","title":"wrappedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?"}],"abstract":[{"type":"text","text":"The currently stored value"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/wrappedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/wrappedvalue"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"}}} \ No newline at end of file +{"sections":[],"abstract":[{"type":"text","text":"Sets a value for the @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"text":" property.","type":"text"}],"variants":[{"paths":["\/documentation\/boutique\/securelystoredvalue\/set(_:)"],"traits":[{"interfaceLanguage":"swift"}]}],"metadata":{"modules":[{"name":"Boutique"}],"symbolKind":"method","title":"set(_:)","roleHeading":"Instance Method","role":"symbol","externalID":"s:8Boutique19SecurelyStoredValueV3setyyxSgKF","fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"set","kind":"identifier"},{"text":"(","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?) "},{"text":"throws","kind":"keyword"}]},"kind":"symbol","hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)","interfaceLanguage":"swift"},"schemaVersion":{"minor":3,"major":0,"patch":0},"primaryContentSections":[{"declarations":[{"platforms":["macOS"],"languages":["swift"],"tokens":[{"kind":"attribute","text":"@"},{"text":"MainActor","preciseIdentifier":"s:ScM","kind":"attribute"},{"kind":"text","text":" "},{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"set","kind":"identifier"},{"text":"(","kind":"text"},{"text":"_","kind":"externalParam"},{"kind":"text","text":" "},{"kind":"internalParam","text":"value"},{"kind":"text","text":": "},{"text":"Item","kind":"typeIdentifier"},{"text":"?) ","kind":"text"},{"text":"throws","kind":"keyword"}]}],"kind":"declarations"},{"parameters":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The value to set @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true,"type":"reference"},{"text":" to.","type":"text"}]}],"name":"value"}],"kind":"parameters"},{"kind":"content","content":[{"type":"heading","text":"Discussion","anchor":"discussion","level":2},{"type":"paragraph","inlineContent":[{"text":"You may run into an error that says","type":"text"}]},{"type":"codeListing","syntax":null,"code":["\"'set' is inaccessible due to 'internal' protection level.\""]},{"inlineContent":[{"text":"If that occurs the fix is straightforward. Rather than calling ","type":"text"},{"type":"codeVoice","code":"storedValue.set(newValue)"},{"type":"text","text":" "},{"text":"you need to call ","type":"text"},{"code":"$storedValue.set(newValue)","type":"codeVoice"},{"type":"text","text":", with a dollar sign ($) in front of "},{"code":"storedValue","type":"codeVoice"},{"type":"text","text":"."}],"type":"paragraph"},{"type":"paragraph","inlineContent":[{"text":"When using a property wrapper the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/wrappedValue","isActive":true},{"type":"text","text":" is an "},{"type":"codeVoice","code":"Item"},{"text":", but the ","type":"text"},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" "},{"type":"text","text":"is a "},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":". That means you are accessing the "},{"code":"storedValue","type":"codeVoice"},{"text":" you’re interacting","type":"text"},{"type":"text","text":" "},{"text":"with, a value type ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":". But it is the "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" that is the "},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":","},{"text":" ","type":"text"},{"text":"that property and has the ``set(_:) function.","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This follows similar conventions to the "},{"type":"codeVoice","code":"@Published"},{"type":"text","text":" property wrapper."},{"type":"text","text":" "},{"code":"@Published var items: [Item]","type":"codeVoice"},{"text":" allows you to use ","type":"text"},{"code":"items","type":"codeVoice"},{"type":"text","text":" as a regular "},{"code":"[Item]","type":"codeVoice"},{"text":",","type":"text"},{"type":"text","text":" "},{"text":"but ","type":"text"},{"type":"codeVoice","code":"$items"},{"text":" projects ","type":"text"},{"code":"AnyPublisher<[Item], Never>","type":"codeVoice"},{"text":" so you can subscribe to changes items produces.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"Within Boutique the @Stored property wrapper works very similarly."}]}]}],"references":{"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/wrappedValue":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/wrappedValue","kind":"symbol","fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"text":"wrappedValue","kind":"identifier"},{"text":": ","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"?","kind":"text"}],"type":"topic","title":"wrappedValue","url":"\/documentation\/boutique\/securelystoredvalue\/wrappedvalue","abstract":[{"text":"The currently stored value","type":"text"}]},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"SecurelyStoredValue"}],"type":"topic","navigatorTitle":[{"text":"SecurelyStoredValue","kind":"identifier"}],"title":"SecurelyStoredValue","url":"\/documentation\/boutique\/securelystoredvalue","abstract":[{"text":"The @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"text":" property wrapper automagically persists a single ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" in the system ","type":"text"},{"code":"Keychain","type":"codeVoice"},{"text":" ","type":"text"},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" or using @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/set(_:)":{"kind":"symbol","title":"set(_:)","role":"symbol","abstract":[{"text":"Sets a value for the @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"type":"text","text":" property."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/set(_:)","fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"set"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":"?) ","kind":"text"},{"kind":"keyword","text":"throws"}],"url":"\/documentation\/boutique\/securelystoredvalue\/set(_:)","type":"topic"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/securelystoredvalue/toggle().json b/docs/data/documentation/boutique/securelystoredvalue/toggle().json index ca78ec7..b71e1b9 100644 --- a/docs/data/documentation/boutique/securelystoredvalue/toggle().json +++ b/docs/data/documentation/boutique/securelystoredvalue/toggle().json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"toggle"},{"kind":"text","text":"() "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is meant to provide a simple ergonomic improvement, avoiding callsites like this."}]},{"type":"codeListing","syntax":null,"code":["self.appState.$isLoggedIn.set(!self.appState.proFeaturesEnabled)"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Instead having a much simpler simpler option."}]},{"type":"codeListing","syntax":null,"code":["self.appState.$isLoggedIn.toggle()"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/securelystoredvalue\/toggle()"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/toggle()","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A function to toggle a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" that represent a "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" is "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"toggle()","roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"toggle"},{"kind":"text","text":"() "},{"kind":"keyword","text":"throws"}],"symbolKind":"method","externalID":"s:8Boutique19SecurelyStoredValueVAASbRszrlE6toggleyyKF","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","title":"SecurelyStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"SecurelyStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property wrapper automagically persists a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in the system "},{"type":"codeVoice","code":"Keychain"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"SecurelyStoredValue"}],"url":"\/documentation\/boutique\/securelystoredvalue"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/toggle()":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" is "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"toggle()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"toggle"},{"kind":"text","text":"() "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"A function to toggle a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" that represent a "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/toggle()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/toggle()"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file +{"metadata":{"modules":[{"name":"Boutique"}],"symbolKind":"method","externalID":"s:8Boutique19SecurelyStoredValueVAASbRszrlE6toggleyyKF","fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"toggle"},{"kind":"text","text":"() "},{"kind":"keyword","text":"throws"}],"roleHeading":"Instance Method","title":"toggle()","extendedModule":"Boutique","role":"symbol","conformance":{"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" is "},{"code":"Bool","type":"codeVoice"},{"text":".","type":"text"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"type":"text","text":"Available when"}]}},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"abstract":[{"type":"text","text":"A function to toggle a @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" that represent a "},{"type":"codeVoice","code":"Bool"},{"text":".","type":"text"}],"sections":[],"schemaVersion":{"minor":3,"patch":0,"major":0},"primaryContentSections":[{"declarations":[{"tokens":[{"text":"@","kind":"attribute"},{"text":"MainActor","kind":"attribute","preciseIdentifier":"s:ScM"},{"kind":"text","text":" "},{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"toggle","kind":"identifier"},{"kind":"text","text":"() "},{"text":"throws","kind":"keyword"}],"languages":["swift"],"platforms":["macOS"]}],"kind":"declarations"},{"content":[{"anchor":"discussion","type":"heading","text":"Discussion","level":2},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is meant to provide a simple ergonomic improvement, avoiding callsites like this."}]},{"syntax":null,"type":"codeListing","code":["self.appState.$isLoggedIn.set(!self.appState.proFeaturesEnabled)"]},{"inlineContent":[{"text":"Instead having a much simpler simpler option.","type":"text"}],"type":"paragraph"},{"code":["self.appState.$isLoggedIn.toggle()"],"syntax":null,"type":"codeListing"}],"kind":"content"}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/toggle()"},"kind":"symbol","variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/securelystoredvalue\/toggle()"]}],"references":{"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"SecurelyStoredValue"}],"type":"topic","navigatorTitle":[{"text":"SecurelyStoredValue","kind":"identifier"}],"title":"SecurelyStoredValue","url":"\/documentation\/boutique\/securelystoredvalue","abstract":[{"text":"The @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"text":" property wrapper automagically persists a single ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" in the system ","type":"text"},{"code":"Keychain","type":"codeVoice"},{"text":" ","type":"text"},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" or using @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/toggle()":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/toggle()","type":"topic","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"toggle","kind":"identifier"},{"text":"() ","kind":"text"},{"text":"throws","kind":"keyword"}],"abstract":[{"type":"text","text":"A function to toggle a @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true,"type":"reference"},{"text":" that represent a ","type":"text"},{"code":"Bool","type":"codeVoice"},{"text":".","type":"text"}],"title":"toggle()","kind":"symbol","url":"\/documentation\/boutique\/securelystoredvalue\/toggle()","role":"symbol","conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" is "},{"code":"Bool","type":"codeVoice"},{"type":"text","text":"."}],"availabilityPrefix":[{"text":"Available when","type":"text"}]}},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/securelystoredvalue/update(key:value:).json b/docs/data/documentation/boutique/securelystoredvalue/update(key:value:).json index 42c35cf..f5848ba 100644 --- a/docs/data/documentation/boutique/securelystoredvalue/update(key:value:).json +++ b/docs/data/documentation/boutique/securelystoredvalue/update(key:value:).json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"update"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Key"},{"kind":"text","text":", "},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":", "},{"kind":"externalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"?) "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" "},{"kind":"keyword","text":"where"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" == ["},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"], "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Decodable","preciseIdentifier":"s:Se"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Encodable","preciseIdentifier":"s:SE"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Hashable","preciseIdentifier":"s:SH"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Decodable","preciseIdentifier":"s:Se"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Encodable","preciseIdentifier":"s:SE"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is meant to provide a simple ergonomic improvement, avoiding callsites like this."}]},{"type":"codeListing","syntax":null,"code":["var updatedRedPandaList = self.redPandaList","updatedRedPandaList[\"best\"] = \"Pabu\"","self.$redPandaList.set(updatedRedPandaList)"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Instead this function provides a much simpler alternative."}]},{"type":"codeListing","syntax":null,"code":["try await self.$redPandaList.update(key: \"best\", value: \"Pabu\")"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"To better match expected uses calling update on a currently nil SecurelyStoredValue"},{"type":"text","text":" "},{"type":"text","text":"will return a single element dictionary of the passed in key\/value,"},{"type":"text","text":" "},{"type":"text","text":"rather than returning nil or throwing an error."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/securelystoredvalue\/update(key:value:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/update(key:value:)","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A function to set a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" represented by a "},{"type":"codeVoice","code":"Dictionary"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"update(key:value:)","roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"update"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Key"},{"kind":"text","text":", "},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":", "},{"kind":"externalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"?) "},{"kind":"keyword","text":"throws"}],"symbolKind":"method","externalID":"s:8Boutique19SecurelyStoredValueV6update3key5valueyqd___qd_0_SgtKSDyqd__qd_0_GRszSeRd__SERd__SHRd__SeRd_0_SERd_0_r0_lF","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/update(key:value:)":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"update(key:value:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"update"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Key"},{"kind":"text","text":", "},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":", "},{"kind":"externalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"?) "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"A function to set a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" represented by a "},{"type":"codeVoice","code":"Dictionary"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/update(key:value:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/update(key:value:)"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","title":"SecurelyStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"SecurelyStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property wrapper automagically persists a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in the system "},{"type":"codeVoice","code":"Keychain"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"SecurelyStoredValue"}],"url":"\/documentation\/boutique\/securelystoredvalue"}}} \ No newline at end of file +{"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"abstract":[{"type":"text","text":"A function to set a @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"text":" represented by a ","type":"text"},{"type":"codeVoice","code":"Dictionary"},{"text":" ","type":"text"},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"metadata":{"symbolKind":"method","extendedModule":"Boutique","modules":[{"name":"Boutique"}],"role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"update","kind":"identifier"},{"kind":"text","text":"<"},{"text":"Key","kind":"genericParameter"},{"text":", ","kind":"text"},{"text":"Value","kind":"genericParameter"},{"text":">(","kind":"text"},{"text":"key","kind":"externalParam"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":", "},{"text":"value","kind":"externalParam"},{"text":": ","kind":"text"},{"text":"Value","kind":"typeIdentifier"},{"kind":"text","text":"?) "},{"kind":"keyword","text":"throws"}],"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":" and "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":"."}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"type":"text","text":"Available when"}]},"title":"update(key:value:)","externalID":"s:8Boutique19SecurelyStoredValueV6update3key5valueyqd___qd_0_SgtKSDyqd__qd_0_GRszSeRd__SERd__SHRd__SeRd_0_SERd_0_r0_lF","roleHeading":"Instance Method"},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/update(key:value:)","interfaceLanguage":"swift"},"kind":"symbol","primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"languages":["swift"],"tokens":[{"text":"@","kind":"attribute"},{"kind":"attribute","text":"MainActor","preciseIdentifier":"s:ScM"},{"kind":"text","text":" "},{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"update"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Key"},{"kind":"text","text":", "},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"text":"Key","kind":"typeIdentifier"},{"kind":"text","text":", "},{"kind":"externalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"?) "},{"kind":"keyword","text":"throws"},{"text":" ","kind":"text"},{"text":"where","kind":"keyword"},{"kind":"text","text":" "},{"text":"Item","kind":"typeIdentifier"},{"text":" == [","kind":"text"},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":" : "},{"text":"Value","kind":"typeIdentifier"},{"text":"], ","kind":"text"},{"text":"Key","kind":"typeIdentifier"},{"kind":"text","text":" : "},{"preciseIdentifier":"s:Se","kind":"typeIdentifier","text":"Decodable"},{"text":", ","kind":"text"},{"text":"Key","kind":"typeIdentifier"},{"kind":"text","text":" : "},{"preciseIdentifier":"s:SE","text":"Encodable","kind":"typeIdentifier"},{"text":", ","kind":"text"},{"kind":"typeIdentifier","text":"Key"},{"text":" : ","kind":"text"},{"text":"Hashable","preciseIdentifier":"s:SH","kind":"typeIdentifier"},{"text":", ","kind":"text"},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","preciseIdentifier":"s:Se","text":"Decodable"},{"text":", ","kind":"text"},{"text":"Value","kind":"typeIdentifier"},{"kind":"text","text":" : "},{"text":"Encodable","kind":"typeIdentifier","preciseIdentifier":"s:SE"}]}]},{"kind":"content","content":[{"type":"heading","text":"Discussion","level":2,"anchor":"discussion"},{"inlineContent":[{"text":"This is meant to provide a simple ergonomic improvement, avoiding callsites like this.","type":"text"}],"type":"paragraph"},{"syntax":null,"type":"codeListing","code":["var updatedRedPandaList = self.redPandaList","updatedRedPandaList[\"best\"] = \"Pabu\"","self.$redPandaList.set(updatedRedPandaList)"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Instead this function provides a much simpler alternative."}]},{"syntax":null,"code":["try await self.$redPandaList.update(key: \"best\", value: \"Pabu\")"],"type":"codeListing"},{"inlineContent":[{"type":"text","text":"To better match expected uses calling update on a currently nil SecurelyStoredValue"},{"type":"text","text":" "},{"text":"will return a single element dictionary of the passed in key\/value,","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"rather than returning nil or throwing an error."}],"type":"paragraph"}]}],"sections":[],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/securelystoredvalue\/update(key:value:)"]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"references":{"doc://Boutique/documentation/Boutique/SecurelyStoredValue/update(key:value:)":{"type":"topic","abstract":[{"type":"text","text":"A function to set a @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" represented by a "},{"type":"codeVoice","code":"Dictionary"},{"text":" ","type":"text"},{"text":"without having to manually make an intermediate copy for every value update.","type":"text"}],"role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"update","kind":"identifier"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Key"},{"text":", ","kind":"text"},{"text":"Value","kind":"genericParameter"},{"text":">(","kind":"text"},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"text":"Key","kind":"typeIdentifier"},{"kind":"text","text":", "},{"kind":"externalParam","text":"value"},{"kind":"text","text":": "},{"text":"Value","kind":"typeIdentifier"},{"text":"?) ","kind":"text"},{"text":"throws","kind":"keyword"}],"url":"\/documentation\/boutique\/securelystoredvalue\/update(key:value:)","conformance":{"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":" and "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"title":"update(key:value:)","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/update(key:value:)","kind":"symbol"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"SecurelyStoredValue"}],"type":"topic","navigatorTitle":[{"text":"SecurelyStoredValue","kind":"identifier"}],"title":"SecurelyStoredValue","url":"\/documentation\/boutique\/securelystoredvalue","abstract":[{"text":"The @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"text":" property wrapper automagically persists a single ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" in the system ","type":"text"},{"code":"Keychain","type":"codeVoice"},{"text":" ","type":"text"},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" or using @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/securelystoredvalue/wrappedvalue.json b/docs/data/documentation/boutique/securelystoredvalue/wrappedvalue.json index dccb371..47915d5 100644 --- a/docs/data/documentation/boutique/securelystoredvalue/wrappedvalue.json +++ b/docs/data/documentation/boutique/securelystoredvalue/wrappedvalue.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"? { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/securelystoredvalue\/wrappedvalue"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/wrappedValue","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"The currently stored value"}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?"}],"title":"wrappedValue","roleHeading":"Instance Property","role":"symbol","symbolKind":"property","externalID":"s:8Boutique19SecurelyStoredValueV07wrappedD0xSgvp","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","title":"SecurelyStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"SecurelyStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property wrapper automagically persists a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in the system "},{"type":"codeVoice","code":"Keychain"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"SecurelyStoredValue"}],"url":"\/documentation\/boutique\/securelystoredvalue"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/wrappedValue":{"role":"symbol","title":"wrappedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"?"}],"abstract":[{"type":"text","text":"The currently stored value"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/wrappedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/securelystoredvalue\/wrappedvalue"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"}}} \ No newline at end of file +{"variants":[{"paths":["\/documentation\/boutique\/securelystoredvalue\/wrappedvalue"],"traits":[{"interfaceLanguage":"swift"}]}],"abstract":[{"type":"text","text":"The currently stored value"}],"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"text":"wrappedValue","kind":"identifier"},{"text":": ","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"? { "},{"text":"get","kind":"keyword"},{"text":" }","kind":"text"}],"platforms":["macOS"],"languages":["swift"]}]}],"schemaVersion":{"major":0,"patch":0,"minor":3},"metadata":{"roleHeading":"Instance Property","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"text":": ","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"?"}],"externalID":"s:8Boutique19SecurelyStoredValueV07wrappedD0xSgvp","title":"wrappedValue","modules":[{"name":"Boutique"}],"symbolKind":"property","role":"symbol"},"kind":"symbol","identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/wrappedValue"},"sections":[],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue/wrappedValue":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue\/wrappedValue","kind":"symbol","fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"text":"wrappedValue","kind":"identifier"},{"text":": ","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"?","kind":"text"}],"type":"topic","title":"wrappedValue","url":"\/documentation\/boutique\/securelystoredvalue\/wrappedvalue","abstract":[{"text":"The currently stored value","type":"text"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"SecurelyStoredValue"}],"type":"topic","navigatorTitle":[{"text":"SecurelyStoredValue","kind":"identifier"}],"title":"SecurelyStoredValue","url":"\/documentation\/boutique\/securelystoredvalue","abstract":[{"text":"The @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"text":" property wrapper automagically persists a single ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" in the system ","type":"text"},{"code":"Keychain","type":"codeVoice"},{"text":" ","type":"text"},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" or using @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":"."}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store.json b/docs/data/documentation/boutique/store.json index 4214d0f..5b2a558 100644 --- a/docs/data/documentation/boutique/store.json +++ b/docs/data/documentation/boutique/store.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"final"},{"kind":"text","text":" "},{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Item"},{"kind":"text","text":"> "},{"kind":"keyword","text":"where"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Decodable","preciseIdentifier":"s:Se"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Encodable","preciseIdentifier":"s:SE"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Sendable","preciseIdentifier":"s:s8SendableP"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"overview","level":2,"type":"heading","text":"Overview"},{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for your app which provides you a dual-layered data architecture with a very simple API."},{"type":"text","text":" "},{"type":"text","text":"The "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" exposes a "},{"type":"codeVoice","code":"@Published"},{"type":"text","text":" property for your data, which allows you to read it’s data synchronously"},{"type":"text","text":" "},{"type":"text","text":"using "},{"type":"codeVoice","code":"store.items"},{"type":"text","text":", or subscribe to "},{"type":"codeVoice","code":"store.$items"},{"type":"text","text":" reactively for real-time changes and updates."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Under the hood the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" is doing the work of saving all changes to a persistence layer"},{"type":"text","text":" "},{"type":"text","text":"when you insert or remove items, which allows you to build an offline-first app"},{"type":"text","text":" "},{"type":"text","text":"for free, all inclusive, "},{"type":"emphasis","inlineContent":[{"type":"text","text":"no extra code required"}]},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"How The Store Works"}]}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" is a higher level abstraction than Bodega’s "},{"type":"codeVoice","code":"ObjectStorage"},{"type":"text","text":", containing and leveraging"},{"type":"text","text":" "},{"type":"text","text":"an in-memory store, the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" array, and a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" for it’s persistence layer."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" you initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" with (such as "},{"type":"codeVoice","code":"DiskStorageEngine"},{"type":"text","text":" or "},{"type":"codeVoice","code":"SQLiteStorageEngine"},{"type":"text","text":")"},{"type":"text","text":" "},{"type":"text","text":"will be where items are stored permanently. If you do not provide a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" parameter"},{"type":"text","text":" "},{"type":"text","text":"then the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" will default to using an Bodega’s SQLiteStorageEngine with a database"},{"type":"text","text":" "},{"type":"text","text":"located in the app’s "},{"type":"codeVoice","code":"defaultStorageDirectory"},{"type":"text","text":", in a “Data” subdirectory."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"As a user you will always be interacting with the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"s memory layer,"},{"type":"text","text":" "},{"type":"text","text":"represented by the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"’s array of "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":". This means after initializing a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" "},{"type":"text","text":"with a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" you never have to think about how the data is being saved."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"type":"codeVoice","code":"SQLiteStorageEngine"},{"type":"text","text":" is a safe, fast, and easy database to based on SQLite, a great default!"}]},{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"If you prefer to use your own persistence layer or want to save your items"},{"type":"text","text":" "},{"type":"text","text":"to another location, you can use the "},{"type":"codeVoice","code":"storage"},{"type":"text","text":" parameter like so"}]}]},{"type":"codeListing","syntax":null,"code":["SQLiteStorageEngine(directory: .documents(appendingPath: \"Assets\"))"]},{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"How Cache Identifiers Work"}]}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" generates a unique "},{"type":"codeVoice","code":"String"},{"type":"text","text":" representing a key for storing"},{"type":"text","text":" "},{"type":"text","text":"your item in the underlying persistence layer (the "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":")."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" is "},{"type":"codeVoice","code":"KeyPath"},{"type":"text","text":" rather than a "},{"type":"codeVoice","code":"String"},{"type":"text","text":", a good strategy for generating"},{"type":"text","text":" "},{"type":"text","text":"a stable and unique "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" is to conform to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":" and point to "},{"type":"codeVoice","code":"\\.id"},{"type":"text","text":"."},{"type":"text","text":" "},{"type":"text","text":"That is "},{"type":"emphasis","inlineContent":[{"type":"text","text":"not"}]},{"type":"text","text":" required though, and you are free to use any "},{"type":"codeVoice","code":"String"},{"type":"text","text":" property on your "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" "},{"type":"text","text":"or even a type which can be converted into a "},{"type":"codeVoice","code":"String"},{"type":"text","text":" such as "},{"type":"codeVoice","code":"\\.url.path"},{"type":"text","text":"."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store"],"traits":[{"interfaceLanguage":"swift"}]}],"relationshipsSections":[{"identifiers":["doc:\/\/Boutique\/7Combine16ObservableObjectP"],"kind":"relationships","title":"Conforms To","type":"conformsTo"}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A fancy persistence layer."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"title":"Store","roleHeading":"Class","role":"symbol","symbolKind":"class","externalID":"s:8Boutique5StoreC","modules":[{"name":"Boutique"}],"navigatorTitle":[{"kind":"identifier","text":"Store"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique"]]},"topicSections":[{"title":"Classes","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"]},{"title":"Structures","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/ItemRemovalStrategy"]},{"title":"Initializers","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-1dbuk","doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-2icz","doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-2zxc4","doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-8ky4y","doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:cacheIdentifier:)-11vez","doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:cacheIdentifier:)-1933a"]},{"title":"Instance Properties","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"]},{"title":"Instance Methods","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1ausm","doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1np7h","doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-8y0hf","doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-dfro","doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-2vg6j","doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-3j9hw","doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-9n4e3","doc:\/\/Boutique\/documentation\/Boutique\/Store\/itemsHaveLoaded()","doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-1w3lx","doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-3nzlq","doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-51ya6","doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-5dwyv","doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-9zfmy"]},{"title":"Type Methods","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:)-1azzy","doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:)-1zymp","doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:cacheIdentifier:)"]},{"title":"Default Implementations","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/ObservableObject-Implementations"],"generated":true}],"references":{"doc://Boutique/documentation/Boutique/Store/previewStore(items:)-1azzy":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"previewStore(items:)","fragments":[{"kind":"keyword","text":"static"},{"kind":"text","text":" "},{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"previewStore"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" to be used for SwiftUI Previews and only SwiftUI Previews!"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:)-1azzy","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/previewstore(items:)-1azzy"},"doc://Boutique/documentation/Boutique/Store/init(storage:)-2icz":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Item.ID"},{"type":"text","text":" is "},{"type":"codeVoice","code":"String"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"init(storage:)","fragments":[{"kind":"keyword","text":"convenience"},{"kind":"text","text":" "},{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth, and await for the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" to load."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-2icz","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/init(storage:)-2icz"},"doc://Boutique/documentation/Boutique/Store/Operation":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.Operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"abstract":[{"type":"text","text":"An operation is a type that allows you to stack "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"type":"text","text":" calls in a chained manner."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Operation"}],"url":"\/documentation\/boutique\/store\/operation"},"doc://Boutique/7Combine16ObservableObjectP":{"type":"unresolvable","title":"Combine.ObservableObject","identifier":"doc:\/\/Boutique\/7Combine16ObservableObjectP"},"doc://Boutique/documentation/Boutique/Store/init(storage:)-8ky4y":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Item.ID"},{"type":"text","text":" is "},{"type":"codeVoice","code":"UUID"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"init(storage:)","fragments":[{"kind":"keyword","text":"convenience"},{"kind":"text","text":" "},{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth, and await for the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" to load."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-8ky4y","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/init(storage:)-8ky4y"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/previewStore(items:cacheIdentifier:)":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"previewStore(items:cacheIdentifier:)","fragments":[{"kind":"keyword","text":"static"},{"kind":"text","text":" "},{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"previewStore"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"], "},{"kind":"externalParam","text":"cacheIdentifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"KeyPath","preciseIdentifier":"s:s7KeyPathC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":">) -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" to be used for SwiftUI Previews and only SwiftUI Previews!"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:cacheIdentifier:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/previewstore(items:cacheidentifier:)"},"doc://Boutique/documentation/Boutique/Store/ObservableObject-Implementations":{"role":"collectionGroup","title":"ObservableObject Implementations","abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/ObservableObject-Implementations","kind":"article","type":"topic","url":"\/documentation\/boutique\/store\/observableobject-implementations"},"doc://Boutique/documentation/Boutique/Store/previewStore(items:)-1zymp":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"previewStore(items:)","fragments":[{"kind":"keyword","text":"static"},{"kind":"text","text":" "},{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"previewStore"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" to be used for SwiftUI Previews and only SwiftUI Previews!"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:)-1zymp","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/previewstore(items:)-1zymp"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-5dwyv":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-5dwyv","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/remove(_:)-5dwyv"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-1w3lx":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-1w3lx","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/remove(_:)-1w3lx"},"doc://Boutique/documentation/Boutique/Store/ItemRemovalStrategy":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.ItemRemovalStrategy","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"ItemRemovalStrategy"}],"abstract":[{"type":"text","text":"An invalidation strategy for a "},{"type":"codeVoice","code":"Store"},{"type":"text","text":" instance."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/ItemRemovalStrategy","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"ItemRemovalStrategy"}],"url":"\/documentation\/boutique\/store\/itemremovalstrategy"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-2vg6j":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Inserts an array of items into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-2vg6j","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-2vg6j"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-9n4e3":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an array of items into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-9n4e3","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-9n4e3"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-3nzlq":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-3nzlq","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/remove(_:)-3nzlq"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-3j9hw":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Inserts an item into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-3j9hw","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-3j9hw"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"},"doc://Boutique/documentation/Boutique/Store/add(_:)-dfro":{"role":"symbol","title":"add(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Adds an item to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-dfro","kind":"symbol","type":"topic","deprecated":true,"url":"\/documentation\/boutique\/store\/add(_:)-dfro"},"doc://Boutique/documentation/Boutique/Store/add(_:)-1ausm":{"role":"symbol","title":"add(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Adds an item to the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1ausm","kind":"symbol","type":"topic","deprecated":true,"url":"\/documentation\/boutique\/store\/add(_:)-1ausm"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24"},"doc://Boutique/documentation/Boutique/Store/items":{"role":"symbol","title":"items","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]"}],"abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/items"},"doc://Boutique/documentation/Boutique/Store/add(_:)-8y0hf":{"role":"symbol","title":"add(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Adds an array of items to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-8y0hf","kind":"symbol","type":"topic","deprecated":true,"url":"\/documentation\/boutique\/store\/add(_:)-8y0hf"},"doc://Boutique/documentation/Boutique/Store/init(storage:)-1dbuk":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Item.ID"},{"type":"text","text":" is "},{"type":"codeVoice","code":"String"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"init(storage:)","fragments":[{"kind":"keyword","text":"convenience"},{"kind":"text","text":" "},{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":")"}],"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-1dbuk","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/init(storage:)-1dbuk"},"doc://Boutique/documentation/Boutique/Store/init(storage:cacheIdentifier:)-1933a":{"role":"symbol","title":"init(storage:cacheIdentifier:)","fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":", "},{"kind":"externalParam","text":"cacheIdentifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"KeyPath","preciseIdentifier":"s:s7KeyPathC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":">)"}],"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache"},{"type":"text","text":" "},{"type":"text","text":"and a storage engine, to act as a source of truth."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:cacheIdentifier:)-1933a","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/init(storage:cacheidentifier:)-1933a"},"doc://Boutique/documentation/Boutique/Store/add(_:)-1np7h":{"role":"symbol","title":"add(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Adds an array of items to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1np7h","kind":"symbol","type":"topic","deprecated":true,"url":"\/documentation\/boutique\/store\/add(_:)-1np7h"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-51ya6":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-51ya6","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/remove(_:)-51ya6"},"doc://Boutique/documentation/Boutique/Store/init(storage:cacheIdentifier:)-11vez":{"role":"symbol","title":"init(storage:cacheIdentifier:)","fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":", "},{"kind":"externalParam","text":"cacheIdentifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"KeyPath","preciseIdentifier":"s:s7KeyPathC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":">) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache"},{"type":"text","text":" "},{"type":"text","text":"and a storage engine, to act as a source of truth, and await for the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" to load."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:cacheIdentifier:)-11vez","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/init(storage:cacheidentifier:)-11vez"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/itemsHaveLoaded()":{"role":"symbol","title":"itemsHaveLoaded()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"itemsHaveLoaded"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Awaits for "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" to be loaded."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/itemsHaveLoaded()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/itemshaveloaded()"},"doc://Boutique/documentation/Boutique/Store/init(storage:)-2zxc4":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Item.ID"},{"type":"text","text":" is "},{"type":"codeVoice","code":"UUID"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"init(storage:)","fragments":[{"kind":"keyword","text":"convenience"},{"kind":"text","text":" "},{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":")"}],"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-2zxc4","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/init(storage:)-2zxc4"},"doc://Boutique/documentation/Boutique/Store/removeAll()-9zfmy":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-9zfmy","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-9zfmy"}}} \ No newline at end of file +{"kind":"symbol","metadata":{"roleHeading":"Class","externalID":"s:8Boutique5StoreC","role":"symbol","navigatorTitle":[{"kind":"identifier","text":"Store"}],"fragments":[{"text":"class","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"Store"}],"modules":[{"name":"Boutique"}],"symbolKind":"class","title":"Store"},"relationshipsSections":[{"type":"conformsTo","kind":"relationships","identifiers":["doc:\/\/Boutique\/7Combine16ObservableObjectP"],"title":"Conforms To"}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store","interfaceLanguage":"swift"},"topicSections":[{"title":"Classes","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"]},{"title":"Initializers","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-1dbuk","doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-2icz","doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-2zxc4","doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-8ky4y","doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:cacheIdentifier:)-11vez","doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:cacheIdentifier:)-1933a"]},{"identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"],"title":"Instance Properties"},{"identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1ausm","doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1np7h","doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-8y0hf","doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-dfro","doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-2vg6j","doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-3j9hw","doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-9n4e3","doc:\/\/Boutique\/documentation\/Boutique\/Store\/itemsHaveLoaded()","doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-1w3lx","doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-3nzlq","doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-51ya6","doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-5dwyv","doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-9zfmy"],"title":"Instance Methods"},{"identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:)-1azzy","doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:)-1zymp","doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:cacheIdentifier:)"],"title":"Type Methods"},{"title":"Default Implementations","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/ObservableObject-Implementations"],"generated":true}],"primaryContentSections":[{"declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"final"},{"text":" ","kind":"text"},{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"},{"kind":"text","text":"<"},{"text":"Item","kind":"genericParameter"},{"text":"> ","kind":"text"},{"kind":"keyword","text":"where"},{"kind":"text","text":" "},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Decodable","preciseIdentifier":"s:Se"},{"kind":"text","text":", "},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","preciseIdentifier":"s:SE","text":"Encodable"},{"kind":"text","text":", "},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Sendable","preciseIdentifier":"s:s8SendableP"}],"languages":["swift"]}],"kind":"declarations"},{"kind":"content","content":[{"anchor":"overview","text":"Overview","type":"heading","level":2},{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" for your app which provides you a dual-layered data architecture with a very simple API."},{"text":" ","type":"text"},{"text":"The ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" exposes a "},{"type":"codeVoice","code":"@Published"},{"text":" property for your data, which allows you to read it’s data synchronously","type":"text"},{"type":"text","text":" "},{"text":"using ","type":"text"},{"code":"store.items","type":"codeVoice"},{"type":"text","text":", or subscribe to "},{"type":"codeVoice","code":"store.$items"},{"text":" reactively for real-time changes and updates.","type":"text"}]},{"type":"paragraph","inlineContent":[{"text":"Under the hood the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":" is doing the work of saving all changes to a persistence layer","type":"text"},{"text":" ","type":"text"},{"text":"when you insert or remove items, which allows you to build an offline-first app","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"for free, all inclusive, "},{"inlineContent":[{"text":"no extra code required","type":"text"}],"type":"emphasis"},{"text":".","type":"text"}]},{"inlineContent":[{"inlineContent":[{"type":"text","text":"How The Store Works"}],"type":"strong"}],"type":"paragraph"},{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":" is a higher level abstraction than Bodega’s ","type":"text"},{"type":"codeVoice","code":"ObjectStorage"},{"type":"text","text":", containing and leveraging"},{"type":"text","text":" "},{"text":"an in-memory store, the ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" array, and a "},{"type":"codeVoice","code":"StorageEngine"},{"text":" for it’s persistence layer.","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" you initialize a "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":" with (such as ","type":"text"},{"code":"DiskStorageEngine","type":"codeVoice"},{"text":" or ","type":"text"},{"type":"codeVoice","code":"SQLiteStorageEngine"},{"text":")","type":"text"},{"type":"text","text":" "},{"type":"text","text":"will be where items are stored permanently. If you do not provide a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" parameter"},{"text":" ","type":"text"},{"type":"text","text":"then the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":" will default to using an Bodega’s SQLiteStorageEngine with a database","type":"text"},{"type":"text","text":" "},{"text":"located in the app’s ","type":"text"},{"code":"defaultStorageDirectory","type":"codeVoice"},{"text":", in a “Data” subdirectory.","type":"text"}]},{"inlineContent":[{"text":"As a user you will always be interacting with the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"s memory layer,"},{"text":" ","type":"text"},{"type":"text","text":"represented by the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"’s array of "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","type":"reference","isActive":true},{"type":"text","text":". This means after initializing a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"text":" ","type":"text"},{"type":"text","text":"with a "},{"type":"codeVoice","code":"StorageEngine"},{"text":" you never have to think about how the data is being saved.","type":"text"}],"type":"paragraph"},{"type":"paragraph","inlineContent":[{"text":"The ","type":"text"},{"code":"SQLiteStorageEngine","type":"codeVoice"},{"type":"text","text":" is a safe, fast, and easy database to based on SQLite, a great default!"}]},{"inlineContent":[{"type":"strong","inlineContent":[{"text":"If you prefer to use your own persistence layer or want to save your items","type":"text"},{"text":" ","type":"text"},{"text":"to another location, you can use the ","type":"text"},{"type":"codeVoice","code":"storage"},{"type":"text","text":" parameter like so"}]}],"type":"paragraph"},{"code":["SQLiteStorageEngine(directory: .documents(appendingPath: \"Assets\"))"],"syntax":null,"type":"codeListing"},{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"text":"How Cache Identifiers Work","type":"text"}]}]},{"inlineContent":[{"text":"The ","type":"text"},{"code":"cacheIdentifier","type":"codeVoice"},{"type":"text","text":" generates a unique "},{"code":"String","type":"codeVoice"},{"type":"text","text":" representing a key for storing"},{"text":" ","type":"text"},{"text":"your item in the underlying persistence layer (the ","type":"text"},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":")."}],"type":"paragraph"},{"inlineContent":[{"text":"The ","type":"text"},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" is "},{"type":"codeVoice","code":"KeyPath"},{"text":" rather than a ","type":"text"},{"type":"codeVoice","code":"String"},{"type":"text","text":", a good strategy for generating"},{"text":" ","type":"text"},{"type":"text","text":"a stable and unique "},{"code":"cacheIdentifier","type":"codeVoice"},{"type":"text","text":" is to conform to "},{"code":"Identifiable","type":"codeVoice"},{"type":"text","text":" and point to "},{"type":"codeVoice","code":"\\.id"},{"text":".","type":"text"},{"type":"text","text":" "},{"text":"That is ","type":"text"},{"inlineContent":[{"type":"text","text":"not"}],"type":"emphasis"},{"type":"text","text":" required though, and you are free to use any "},{"type":"codeVoice","code":"String"},{"type":"text","text":" property on your "},{"code":"Item","type":"codeVoice"},{"type":"text","text":" "},{"text":"or even a type which can be converted into a ","type":"text"},{"type":"codeVoice","code":"String"},{"text":" such as ","type":"text"},{"type":"codeVoice","code":"\\.url.path"},{"type":"text","text":"."}],"type":"paragraph"}]}],"sections":[],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store"]}],"schemaVersion":{"minor":3,"major":0,"patch":0},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique"]]},"abstract":[{"type":"text","text":"A fancy persistence layer."}],"references":{"doc://Boutique/documentation/Boutique/Store/insert(_:)-3j9hw":{"url":"\/documentation\/boutique\/store\/insert(_:)-3j9hw","type":"topic","title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-3j9hw","role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"insert","kind":"identifier"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Inserts an item into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Store/previewStore(items:)-1azzy":{"url":"\/documentation\/boutique\/store\/previewstore(items:)-1azzy","type":"topic","title":"previewStore(items:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:)-1azzy","role":"symbol","fragments":[{"kind":"keyword","text":"static"},{"text":" ","kind":"text"},{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"previewStore","kind":"identifier"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"text":": [","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">","kind":"text"}],"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Encodable"},{"text":", and ","type":"text"},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" to be used for SwiftUI Previews and only SwiftUI Previews!"}]},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique/Store/remove(_:)-5dwyv":{"kind":"symbol","title":"remove(_:)","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-5dwyv","role":"symbol","type":"topic","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"url":"\/documentation\/boutique\/store\/remove(_:)-5dwyv","abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Store/removeAll()-9zfmy":{"title":"removeAll()","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-9zfmy","url":"\/documentation\/boutique\/store\/removeall()-9zfmy","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"text":"() ","kind":"text"},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"kind":"symbol","role":"symbol","type":"topic"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-1w3lx":{"kind":"symbol","title":"remove(_:)","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-1w3lx","role":"symbol","type":"topic","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier"}],"url":"\/documentation\/boutique\/store\/remove(_:)-1w3lx","abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-3nzlq":{"title":"remove(_:)","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-3nzlq","url":"\/documentation\/boutique\/store\/remove(_:)-3nzlq","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","role":"symbol","type":"topic"},"doc://Boutique/documentation/Boutique/Store/ObservableObject-Implementations":{"url":"\/documentation\/boutique\/store\/observableobject-implementations","type":"topic","title":"ObservableObject Implementations","kind":"article","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/ObservableObject-Implementations","role":"collectionGroup","abstract":[]},"doc://Boutique/documentation/Boutique/Store/insert(_:)-9n4e3":{"url":"\/documentation\/boutique\/store\/insert(_:)-9n4e3","type":"topic","title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-9n4e3","role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"insert","kind":"identifier"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier"}],"abstract":[{"type":"text","text":"Inserts an array of items into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Store/init(storage:)-2zxc4":{"conformance":{"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"code":"Encodable","type":"codeVoice"},{"text":", ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"code":"Identifiable","type":"codeVoice"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Item.ID","type":"codeVoice"},{"type":"text","text":" is "},{"code":"UUID","type":"codeVoice"},{"type":"text","text":"."}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"type":"text","text":"Available when"}]},"url":"\/documentation\/boutique\/store\/init(storage:)-2zxc4","role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-2zxc4","abstract":[{"text":"Initializes a new ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" for persisting items to a memory cache and a storage engine, acting as a source of truth.","type":"text"}],"kind":"symbol","title":"init(storage:)","type":"topic","fragments":[{"text":"convenience","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"text":": any ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:6Bodega13StorageEngineP","text":"StorageEngine"},{"text":")","kind":"text"}]},"doc://Boutique/7Combine16ObservableObjectP":{"title":"Combine.ObservableObject","type":"unresolvable","identifier":"doc:\/\/Boutique\/7Combine16ObservableObjectP"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-51ya6":{"url":"\/documentation\/boutique\/store\/remove(_:)-51ya6","type":"topic","title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-51ya6","role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Store/add(_:)-8y0hf":{"url":"\/documentation\/boutique\/store\/add(_:)-8y0hf","type":"topic","title":"add(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-8y0hf","role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"add","kind":"identifier"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier"}],"abstract":[{"type":"text","text":"Adds an array of items to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"deprecated":true},"doc://Boutique/documentation/Boutique/Store/items":{"url":"\/documentation\/boutique\/store\/items","role":"symbol","abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","title":"items","type":"topic","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"text":": [","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"]","kind":"text"}]},"doc://Boutique/documentation/Boutique/Store/add(_:)-1ausm":{"url":"\/documentation\/boutique\/store\/add(_:)-1ausm","type":"topic","title":"add(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1ausm","role":"symbol","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"text":" -> ","kind":"text"},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"abstract":[{"type":"text","text":"Adds an item to the store."}],"deprecated":true},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","role":"symbol","abstract":[{"text":"Removes an item from the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/previewStore(items:)-1zymp":{"url":"\/documentation\/boutique\/store\/previewstore(items:)-1zymp","type":"topic","title":"previewStore(items:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:)-1zymp","role":"symbol","fragments":[{"kind":"keyword","text":"static"},{"text":" ","kind":"text"},{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"previewStore","kind":"identifier"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"text":": [","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">","kind":"text"}],"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Encodable"},{"text":", and ","type":"text"},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" to be used for SwiftUI Previews and only SwiftUI Previews!"}]},"doc://Boutique/documentation/Boutique/Store/insert(_:)-2vg6j":{"url":"\/documentation\/boutique\/store\/insert(_:)-2vg6j","type":"topic","title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-2vg6j","role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"insert","kind":"identifier"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Inserts an array of items into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Store/itemsHaveLoaded()":{"url":"\/documentation\/boutique\/store\/itemshaveloaded()","type":"topic","title":"itemsHaveLoaded()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/itemsHaveLoaded()","role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"itemsHaveLoaded","kind":"identifier"},{"text":"() ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Awaits for "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" to be loaded."}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/init(storage:cacheIdentifier:)-11vez":{"url":"\/documentation\/boutique\/store\/init(storage:cacheidentifier:)-11vez","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:cacheIdentifier:)-11vez","title":"init(storage:cacheIdentifier:)","fragments":[{"kind":"identifier","text":"init"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": any "},{"text":"StorageEngine","kind":"typeIdentifier","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"text":", ","kind":"text"},{"text":"cacheIdentifier","kind":"externalParam"},{"kind":"text","text":": "},{"text":"KeyPath","kind":"typeIdentifier","preciseIdentifier":"s:s7KeyPathC"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":", ","kind":"text"},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":">) "},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"text":"Initializes a new ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" for persisting items to a memory cache","type":"text"},{"type":"text","text":" "},{"text":"and a storage engine, to act as a source of truth, and await for the ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","isActive":true,"type":"reference"},{"type":"text","text":" to load."}],"kind":"symbol","role":"symbol","type":"topic"},"doc://Boutique/documentation/Boutique/Store/add(_:)-1np7h":{"title":"add(_:)","url":"\/documentation\/boutique\/store\/add(_:)-1np7h","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"add"},{"kind":"text","text":"(["},{"text":"Item","kind":"typeIdentifier"},{"text":"]) ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"type":"topic","deprecated":true,"role":"symbol","kind":"symbol","abstract":[{"type":"text","text":"Adds an array of items to the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1np7h"},"doc://Boutique/documentation/Boutique/Store/init(storage:cacheIdentifier:)-1933a":{"url":"\/documentation\/boutique\/store\/init(storage:cacheidentifier:)-1933a","type":"topic","title":"init(storage:cacheIdentifier:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:cacheIdentifier:)-1933a","role":"symbol","fragments":[{"text":"init","kind":"identifier"},{"text":"(","kind":"text"},{"text":"storage","kind":"externalParam"},{"kind":"text","text":": any "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"text":", ","kind":"text"},{"kind":"externalParam","text":"cacheIdentifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","preciseIdentifier":"s:s7KeyPathC","text":"KeyPath"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":", ","kind":"text"},{"preciseIdentifier":"s:SS","text":"String","kind":"typeIdentifier"},{"text":">)","kind":"text"}],"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache"},{"type":"text","text":" "},{"type":"text","text":"and a storage engine, to act as a source of truth."}]},"doc://Boutique/documentation/Boutique/Store/previewStore(items:cacheIdentifier:)":{"url":"\/documentation\/boutique\/store\/previewstore(items:cacheidentifier:)","type":"topic","title":"previewStore(items:cacheIdentifier:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:cacheIdentifier:)","role":"symbol","fragments":[{"kind":"keyword","text":"static"},{"text":" ","kind":"text"},{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"previewStore","kind":"identifier"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"text":": [","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"], "},{"kind":"externalParam","text":"cacheIdentifier"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:s7KeyPathC","text":"KeyPath"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":", ","kind":"text"},{"preciseIdentifier":"s:SS","text":"String","kind":"typeIdentifier"},{"text":">) -> ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">","kind":"text"}],"conformance":{"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"text":".","type":"text"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" to be used for SwiftUI Previews and only SwiftUI Previews!"}]},"doc://Boutique/documentation/Boutique/Store/Operation":{"title":"Store.Operation","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","role":"symbol","abstract":[{"text":"An operation is a type that allows you to stack ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","type":"reference","isActive":true},{"text":",","type":"text"},{"text":" ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"text":" calls in a chained manner.","type":"text"}],"conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}]},"type":"topic","url":"\/documentation\/boutique\/store\/operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"text":"Operation","kind":"identifier"}],"navigatorTitle":[{"kind":"identifier","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"title":"removeAll()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/init(storage:)-8ky4y":{"url":"\/documentation\/boutique\/store\/init(storage:)-8ky4y","type":"topic","title":"init(storage:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-8ky4y","role":"symbol","fragments":[{"text":"convenience","kind":"keyword"},{"text":" ","kind":"text"},{"text":"init","kind":"identifier"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"text":": any ","kind":"text"},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"conformance":{"availabilityPrefix":[{"text":"Available when","type":"text"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":", "},{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"code":"Encodable","type":"codeVoice"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Identifiable"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Sendable"},{"text":", and ","type":"text"},{"code":"Item.ID","type":"codeVoice"},{"type":"text","text":" is "},{"type":"codeVoice","code":"UUID"},{"text":".","type":"text"}]},"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth, and await for the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","isActive":true},{"type":"text","text":" to load."}]},"doc://Boutique/documentation/Boutique/Store/init(storage:)-1dbuk":{"url":"\/documentation\/boutique\/store\/init(storage:)-1dbuk","type":"topic","title":"init(storage:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-1dbuk","role":"symbol","fragments":[{"kind":"keyword","text":"convenience"},{"text":" ","kind":"text"},{"text":"init","kind":"identifier"},{"text":"(","kind":"text"},{"text":"storage","kind":"externalParam"},{"kind":"text","text":": any "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"text":")","kind":"text"}],"conformance":{"availabilityPrefix":[{"type":"text","text":"Available when"}],"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":", "},{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Identifiable"},{"text":", ","type":"text"},{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Item.ID","type":"codeVoice"},{"text":" is ","type":"text"},{"type":"codeVoice","code":"String"},{"type":"text","text":"."}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth."}]},"doc://Boutique/documentation/Boutique/Store/init(storage:)-2icz":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-2icz","title":"init(storage:)","type":"topic","abstract":[{"text":"Initializes a new ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth, and await for the "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"text":" to load.","type":"text"}],"role":"symbol","kind":"symbol","url":"\/documentation\/boutique\/store\/init(storage:)-2icz","conformance":{"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"code":"Encodable","type":"codeVoice"},{"text":", ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"code":"Identifiable","type":"codeVoice"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Sendable"},{"text":", and ","type":"text"},{"code":"Item.ID","type":"codeVoice"},{"type":"text","text":" is "},{"type":"codeVoice","code":"String"},{"type":"text","text":"."}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"fragments":[{"text":"convenience","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"text":"storage","kind":"externalParam"},{"kind":"text","text":": any "},{"text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP","kind":"typeIdentifier"},{"kind":"text","text":") "},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}]},"doc://Boutique/documentation/Boutique/Store/add(_:)-dfro":{"url":"\/documentation\/boutique\/store\/add(_:)-dfro","type":"topic","title":"add(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-dfro","role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"add","kind":"identifier"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Adds an item to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"deprecated":true}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/add(_:)-1ausm.json b/docs/data/documentation/boutique/store/add(_:)-1ausm.json index 8a5d9fa..3ac7dcc 100644 --- a/docs/data/documentation/boutique/store/add(_:)-1ausm.json +++ b/docs/data/documentation/boutique/store/add(_:)-1ausm.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"item"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"return-value","level":2,"type":"heading","text":"Return Value"},{"type":"paragraph","inlineContent":[{"type":"text","text":"An "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"},{"type":"text","text":" that can be used to add an item as part of a chain."}]}]},{"kind":"parameters","parameters":[{"name":"item","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The item you are adding to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"When an item is inserted with the same "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" as an item that already exists in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" "},{"type":"text","text":"the item being inserted will replace the item in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":". You can think of the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" as a bag"},{"type":"text","text":" "},{"type":"text","text":"of items, removing complexity when it comes to managing items, indices, and more,"},{"type":"text","text":" "},{"type":"text","text":"but it also means you need to choose well thought out and uniquely identifying "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":"s."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/add(_:)-1ausm"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1ausm","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Adds an item to the store."}],"kind":"symbol","metadata":{"role":"symbol","title":"add(_:)","roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"symbolKind":"method","externalID":"s:8Boutique5StoreC3addyAC9OperationCyx_GxYaKF","modules":[{"name":"Boutique"}],"platforms":[]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"deprecationSummary":[{"type":"paragraph","inlineContent":[{"type":"text","text":"This method is functionally equivalent to `insert` and will be removed in a future release. After using Boutique in practice for a while I decided that insert was a more semantically correct name for this operation on a Store, if you'd like to learn more you can see the discussion here. https:\/\/github.com\/mergesort\/Boutique\/discussions\/36"}]}],"references":{"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/Operation":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.Operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"abstract":[{"type":"text","text":"An operation is a type that allows you to stack "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"type":"text","text":" calls in a chained manner."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Operation"}],"url":"\/documentation\/boutique\/store\/operation"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/add(_:)-1ausm":{"role":"symbol","title":"add(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Adds an item to the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1ausm","kind":"symbol","type":"topic","deprecated":true,"url":"\/documentation\/boutique\/store\/add(_:)-1ausm"}}} \ No newline at end of file +{"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"tokens":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"add","kind":"identifier"},{"text":"(","kind":"text"},{"text":"_","kind":"externalParam"},{"kind":"text","text":" "},{"kind":"internalParam","text":"item"},{"text":": ","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"}],"platforms":["macOS"]}]},{"parameters":[{"content":[{"inlineContent":[{"text":"The item you are adding to the ","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"type":"paragraph"}],"name":"item"}],"kind":"parameters"},{"kind":"content","content":[{"level":2,"anchor":"return-value","text":"Return Value","type":"heading"},{"inlineContent":[{"text":"An ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","type":"reference","isActive":true},{"text":" that can be used to add an item as part of a chain.","type":"text"}],"type":"paragraph"}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"inlineContent":[{"type":"text","text":"When an item is inserted with the same "},{"code":"cacheIdentifier","type":"codeVoice"},{"type":"text","text":" as an item that already exists in the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" "},{"text":"the item being inserted will replace the item in the ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"type":"text","text":". You can think of the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"type":"text","text":" as a bag"},{"type":"text","text":" "},{"type":"text","text":"of items, removing complexity when it comes to managing items, indices, and more,"},{"type":"text","text":" "},{"text":"but it also means you need to choose well thought out and uniquely identifying ","type":"text"},{"code":"cacheIdentifier","type":"codeVoice"},{"type":"text","text":"s."}],"type":"paragraph"}]}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/add(_:)-1ausm"]}],"kind":"symbol","metadata":{"fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"add","kind":"identifier"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"text":" -> ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"title":"add(_:)","platforms":[],"externalID":"s:8Boutique5StoreC3addyAC9OperationCyx_GxYaKF","role":"symbol","roleHeading":"Instance Method","symbolKind":"method","modules":[{"name":"Boutique"}]},"schemaVersion":{"major":0,"patch":0,"minor":3},"deprecationSummary":[{"type":"paragraph","inlineContent":[{"text":"This method is functionally equivalent to `insert` and will be removed in a future release. After using Boutique in practice for a while I decided that insert was a more semantically correct name for this operation on a Store, if you'd like to learn more you can see the discussion here. https:\/\/github.com\/mergesort\/Boutique\/discussions\/36","type":"text"}]}],"sections":[],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1ausm","interfaceLanguage":"swift"},"abstract":[{"text":"Adds an item to the store.","type":"text"}],"references":{"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"title":"removeAll()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","role":"symbol","abstract":[{"text":"Removes an item from the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/Operation":{"title":"Store.Operation","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","role":"symbol","abstract":[{"text":"An operation is a type that allows you to stack ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","type":"reference","isActive":true},{"text":",","type":"text"},{"text":" ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"text":" calls in a chained manner.","type":"text"}],"conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}]},"type":"topic","url":"\/documentation\/boutique\/store\/operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"text":"Operation","kind":"identifier"}],"navigatorTitle":[{"kind":"identifier","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/add(_:)-1ausm":{"url":"\/documentation\/boutique\/store\/add(_:)-1ausm","type":"topic","title":"add(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1ausm","role":"symbol","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"text":" -> ","kind":"text"},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"abstract":[{"type":"text","text":"Adds an item to the store."}],"deprecated":true}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/add(_:)-1np7h.json b/docs/data/documentation/boutique/store/add(_:)-1np7h.json index 09af278..8a86f3b 100644 --- a/docs/data/documentation/boutique/store/add(_:)-1np7h.json +++ b/docs/data/documentation/boutique/store/add(_:)-1np7h.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"items","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The items to add to the store."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Prefer adding multiple items using this method instead of calling "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":" "},{"type":"text","text":"multiple times to avoid making multiple separate dispatches to the "},{"type":"codeVoice","code":"@MainActor"},{"type":"text","text":"."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/add(_:)-1np7h"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1np7h","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Adds an array of items to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"role":"symbol","title":"add(_:)","roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"symbolKind":"method","externalID":"s:8Boutique5StoreC3addyySayxGYaKF","modules":[{"name":"Boutique"}],"platforms":[]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"deprecationSummary":[{"type":"paragraph","inlineContent":[{"type":"text","text":"This method is functionally equivalent to `insert` and will be removed in a future release. After using Boutique in practice for a while I decided that insert was a more semantically correct name for this operation on a Store, if you'd like to learn more you can see the discussion here. https:\/\/github.com\/mergesort\/Boutique\/discussions\/36"}]}],"references":{"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"},"doc://Boutique/documentation/Boutique/Store/add(_:)-1np7h":{"role":"symbol","title":"add(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Adds an array of items to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1np7h","kind":"symbol","type":"topic","deprecated":true,"url":"\/documentation\/boutique\/store\/add(_:)-1np7h"}}} \ No newline at end of file +{"schemaVersion":{"minor":3,"major":0,"patch":0},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/add(_:)-1np7h"]}],"sections":[],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1np7h"},"abstract":[{"type":"text","text":"Adds an array of items to the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"type":"text","text":"."}],"metadata":{"modules":[{"name":"Boutique"}],"symbolKind":"method","platforms":[],"fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"add","kind":"identifier"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"text":"]) ","kind":"text"},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"roleHeading":"Instance Method","externalID":"s:8Boutique5StoreC3addyySayxGYaKF","role":"symbol","title":"add(_:)"},"kind":"symbol","hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"primaryContentSections":[{"declarations":[{"tokens":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"add","kind":"identifier"},{"text":"(","kind":"text"},{"text":"_","kind":"externalParam"},{"kind":"text","text":" "},{"kind":"internalParam","text":"items"},{"kind":"text","text":": ["},{"text":"Item","kind":"typeIdentifier"},{"text":"]) ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}],"kind":"declarations"},{"parameters":[{"content":[{"type":"paragraph","inlineContent":[{"text":"The items to add to the store.","type":"text"}]}],"name":"items"}],"kind":"parameters"},{"kind":"content","content":[{"type":"heading","level":2,"text":"Discussion","anchor":"discussion"},{"type":"paragraph","inlineContent":[{"text":"Prefer adding multiple items using this method instead of calling ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","isActive":true},{"type":"text","text":" "},{"text":"multiple times to avoid making multiple separate dispatches to the ","type":"text"},{"type":"codeVoice","code":"@MainActor"},{"type":"text","text":"."}]}]}],"deprecationSummary":[{"type":"paragraph","inlineContent":[{"type":"text","text":"This method is functionally equivalent to `insert` and will be removed in a future release. After using Boutique in practice for a while I decided that insert was a more semantically correct name for this operation on a Store, if you'd like to learn more you can see the discussion here. https:\/\/github.com\/mergesort\/Boutique\/discussions\/36"}]}],"references":{"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique/Store/add(_:)-1np7h":{"title":"add(_:)","url":"\/documentation\/boutique\/store\/add(_:)-1np7h","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"add"},{"kind":"text","text":"(["},{"text":"Item","kind":"typeIdentifier"},{"text":"]) ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"type":"topic","deprecated":true,"role":"symbol","kind":"symbol","abstract":[{"type":"text","text":"Adds an array of items to the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1np7h"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/add(_:)-8y0hf.json b/docs/data/documentation/boutique/store/add(_:)-8y0hf.json index 671d30e..88980d9 100644 --- a/docs/data/documentation/boutique/store/add(_:)-8y0hf.json +++ b/docs/data/documentation/boutique/store/add(_:)-8y0hf.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"return-value","level":2,"type":"heading","text":"Return Value"},{"type":"paragraph","inlineContent":[{"type":"text","text":"An "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"},{"type":"text","text":" that can be used to add items as part of a chain."}]}]},{"kind":"parameters","parameters":[{"name":"items","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The items to add to the store."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Prefer adding multiple items using this method instead of calling "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1ausm"},{"type":"text","text":" "},{"type":"text","text":"multiple times to avoid making multiple separate dispatches to the "},{"type":"codeVoice","code":"@MainActor"},{"type":"text","text":"."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/add(_:)-8y0hf"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-8y0hf","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Adds an array of items to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"role":"symbol","title":"add(_:)","roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"symbolKind":"method","externalID":"s:8Boutique5StoreC3addyAC9OperationCyx_GSayxGYaKF","modules":[{"name":"Boutique"}],"platforms":[]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"deprecationSummary":[{"type":"paragraph","inlineContent":[{"type":"text","text":"This method is functionally equivalent to `insert` and will be removed in a future release. After using Boutique in practice for a while I decided that insert was a more semantically correct name for this operation on a Store, if you'd like to learn more you can see the discussion here. https:\/\/github.com\/mergesort\/Boutique\/discussions\/36"}]}],"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/add(_:)-8y0hf":{"role":"symbol","title":"add(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Adds an array of items to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-8y0hf","kind":"symbol","type":"topic","deprecated":true,"url":"\/documentation\/boutique\/store\/add(_:)-8y0hf"},"doc://Boutique/documentation/Boutique/Store/Operation":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.Operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"abstract":[{"type":"text","text":"An operation is a type that allows you to stack "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"type":"text","text":" calls in a chained manner."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Operation"}],"url":"\/documentation\/boutique\/store\/operation"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"},"doc://Boutique/documentation/Boutique/Store/add(_:)-1ausm":{"role":"symbol","title":"add(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Adds an item to the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1ausm","kind":"symbol","type":"topic","deprecated":true,"url":"\/documentation\/boutique\/store\/add(_:)-1ausm"}}} \ No newline at end of file +{"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/add(_:)-8y0hf"]}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-8y0hf"},"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"add","kind":"identifier"},{"text":"(","kind":"text"},{"text":"_","kind":"externalParam"},{"text":" ","kind":"text"},{"text":"items","kind":"internalParam"},{"text":": [","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":"]) ","kind":"text"},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]}]},{"kind":"parameters","parameters":[{"name":"items","content":[{"inlineContent":[{"type":"text","text":"The items to add to the store."}],"type":"paragraph"}]}]},{"content":[{"level":2,"type":"heading","text":"Return Value","anchor":"return-value"},{"inlineContent":[{"type":"text","text":"An "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"},{"text":" that can be used to add items as part of a chain.","type":"text"}],"type":"paragraph"}],"kind":"content"},{"kind":"content","content":[{"anchor":"discussion","type":"heading","text":"Discussion","level":2},{"type":"paragraph","inlineContent":[{"type":"text","text":"Prefer adding multiple items using this method instead of calling "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1ausm"},{"type":"text","text":" "},{"type":"text","text":"multiple times to avoid making multiple separate dispatches to the "},{"code":"@MainActor","type":"codeVoice"},{"type":"text","text":"."}]}]}],"metadata":{"platforms":[],"fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"add"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"]) ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"text":" -> ","kind":"text"},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","kind":"typeIdentifier","text":"Operation"}],"externalID":"s:8Boutique5StoreC3addyAC9OperationCyx_GSayxGYaKF","symbolKind":"method","role":"symbol","title":"add(_:)","modules":[{"name":"Boutique"}],"roleHeading":"Instance Method"},"schemaVersion":{"patch":0,"major":0,"minor":3},"abstract":[{"type":"text","text":"Adds an array of items to the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"kind":"symbol","deprecationSummary":[{"type":"paragraph","inlineContent":[{"text":"This method is functionally equivalent to `insert` and will be removed in a future release. After using Boutique in practice for a while I decided that insert was a more semantically correct name for this operation on a Store, if you'd like to learn more you can see the discussion here. https:\/\/github.com\/mergesort\/Boutique\/discussions\/36","type":"text"}]}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"sections":[],"references":{"doc://Boutique/documentation/Boutique/Store/Operation":{"title":"Store.Operation","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","role":"symbol","abstract":[{"text":"An operation is a type that allows you to stack ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","type":"reference","isActive":true},{"text":",","type":"text"},{"text":" ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"text":" calls in a chained manner.","type":"text"}],"conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}]},"type":"topic","url":"\/documentation\/boutique\/store\/operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"text":"Operation","kind":"identifier"}],"navigatorTitle":[{"kind":"identifier","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/add(_:)-1ausm":{"url":"\/documentation\/boutique\/store\/add(_:)-1ausm","type":"topic","title":"add(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-1ausm","role":"symbol","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"text":" -> ","kind":"text"},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"abstract":[{"type":"text","text":"Adds an item to the store."}],"deprecated":true},"doc://Boutique/documentation/Boutique/Store/add(_:)-8y0hf":{"url":"\/documentation\/boutique\/store\/add(_:)-8y0hf","type":"topic","title":"add(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-8y0hf","role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"add","kind":"identifier"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier"}],"abstract":[{"type":"text","text":"Adds an array of items to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"deprecated":true},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"title":"removeAll()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","role":"symbol","abstract":[{"text":"Removes an item from the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/add(_:)-dfro.json b/docs/data/documentation/boutique/store/add(_:)-dfro.json index cd8ceb1..8fdfa33 100644 --- a/docs/data/documentation/boutique/store/add(_:)-dfro.json +++ b/docs/data/documentation/boutique/store/add(_:)-dfro.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"item"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"item","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The item you are adding to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"When an item is inserted with the same "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" as an item that already exists in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" "},{"type":"text","text":"the item being inserted will replace the item in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":". You can think of the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" as a bag"},{"type":"text","text":" "},{"type":"text","text":"of items, removing complexity when it comes to managing items, indices, and more,"},{"type":"text","text":" "},{"type":"text","text":"but it also means you need to choose well thought out and uniquely identifying "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":"s."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/add(_:)-dfro"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-dfro","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Adds an item to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"role":"symbol","title":"add(_:)","roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"symbolKind":"method","externalID":"s:8Boutique5StoreC3addyyxYaKF","modules":[{"name":"Boutique"}],"platforms":[]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"deprecationSummary":[{"type":"paragraph","inlineContent":[{"type":"text","text":"This method is functionally equivalent to `insert` and will be removed in a future release. After using Boutique in practice for a while I decided that insert was a more semantically correct name for this operation on a Store, if you'd like to learn more you can see the discussion here. https:\/\/github.com\/mergesort\/Boutique\/discussions\/36"}]}],"references":{"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/add(_:)-dfro":{"role":"symbol","title":"add(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Adds an item to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-dfro","kind":"symbol","type":"topic","deprecated":true,"url":"\/documentation\/boutique\/store\/add(_:)-dfro"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file +{"deprecationSummary":[{"inlineContent":[{"type":"text","text":"This method is functionally equivalent to `insert` and will be removed in a future release. After using Boutique in practice for a while I decided that insert was a more semantically correct name for this operation on a Store, if you'd like to learn more you can see the discussion here. https:\/\/github.com\/mergesort\/Boutique\/discussions\/36"}],"type":"paragraph"}],"abstract":[{"type":"text","text":"Adds an item to the "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":"."}],"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/add(_:)-dfro"],"traits":[{"interfaceLanguage":"swift"}]}],"schemaVersion":{"minor":3,"patch":0,"major":0},"metadata":{"externalID":"s:8Boutique5StoreC3addyyxYaKF","title":"add(_:)","platforms":[],"symbolKind":"method","roleHeading":"Instance Method","modules":[{"name":"Boutique"}],"role":"symbol","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"}]},"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"languages":["swift"],"tokens":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"text":"(","kind":"text"},{"text":"_","kind":"externalParam"},{"text":" ","kind":"text"},{"text":"item","kind":"internalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}]}]},{"parameters":[{"content":[{"type":"paragraph","inlineContent":[{"text":"The item you are adding to the ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":".","type":"text"}]}],"name":"item"}],"kind":"parameters"},{"kind":"content","content":[{"anchor":"discussion","text":"Discussion","type":"heading","level":2},{"type":"paragraph","inlineContent":[{"text":"When an item is inserted with the same ","type":"text"},{"type":"codeVoice","code":"cacheIdentifier"},{"text":" as an item that already exists in the ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" "},{"type":"text","text":"the item being inserted will replace the item in the "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":". You can think of the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":" as a bag","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"of items, removing complexity when it comes to managing items, indices, and more,"},{"type":"text","text":" "},{"type":"text","text":"but it also means you need to choose well thought out and uniquely identifying "},{"code":"cacheIdentifier","type":"codeVoice"},{"text":"s.","type":"text"}]}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-dfro","interfaceLanguage":"swift"},"kind":"symbol","hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/add(_:)-dfro":{"url":"\/documentation\/boutique\/store\/add(_:)-dfro","type":"topic","title":"add(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/add(_:)-dfro","role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"add","kind":"identifier"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Adds an item to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"deprecated":true}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/init(storage:)-1dbuk.json b/docs/data/documentation/boutique/store/init(storage:)-1dbuk.json index 20bc9f9..cbd1bba 100644 --- a/docs/data/documentation/boutique/store/init(storage:)-1dbuk.json +++ b/docs/data/documentation/boutique/store/init(storage:)-1dbuk.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"convenience"},{"kind":"text","text":" "},{"kind":"keyword","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":")"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"storage","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" to initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" instance with."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" will be loaded asynchronously in a background task."},{"type":"text","text":" "},{"type":"text","text":"If you are not using this with @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" and need to show"},{"type":"text","text":" "},{"type":"text","text":"the contents of the Store right away, you have two options."}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Move the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" initialization to an "},{"type":"codeVoice","code":"async"},{"type":"text","text":" context"},{"type":"text","text":" "},{"type":"text","text":"so "},{"type":"codeVoice","code":"init"},{"type":"text","text":" returns only once items have been loaded."}]}]}]},{"type":"codeListing","syntax":null,"code":["let store: Store","","init() async throws {"," store = try await Store(...)"," \/\/ Now the store will have `items` already loaded."," let items = await store.items","}"]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Alternatively you can use the synchronous initializer"},{"type":"text","text":" "},{"type":"text","text":"and then await for items to load before accessing them."}]}]}]},{"type":"codeListing","syntax":null,"code":["let store: Store = Store(...)","","func getItems() async -> [Item] {"," try await store.itemsHaveLoaded()"," return await store.items","}"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This initializer eschews providing a "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" when our "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":" "},{"type":"text","text":"with an "},{"type":"codeVoice","code":"id"},{"type":"text","text":" that is a "},{"type":"codeVoice","code":"String"},{"type":"text","text":". While it’s not required for your "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" to conform to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"text","text":"many SwiftUI-related objects do so this initializer provides a nice convenience."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/init(storage:)-1dbuk"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-1dbuk","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth."}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Item.ID"},{"type":"text","text":" is "},{"type":"codeVoice","code":"String"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"init(storage:)","roleHeading":"Initializer","fragments":[{"kind":"keyword","text":"convenience"},{"kind":"text","text":" "},{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":")"}],"symbolKind":"init","externalID":"s:8Boutique5StoreCAAs12IdentifiableRzSS2IDsADPRtzrlE7storageACyxG6Bodega13StorageEngine_p_tcfc","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Store/init(storage:)-1dbuk":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Item.ID"},{"type":"text","text":" is "},{"type":"codeVoice","code":"String"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"init(storage:)","fragments":[{"kind":"keyword","text":"convenience"},{"kind":"text","text":" "},{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":")"}],"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-1dbuk","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/init(storage:)-1dbuk"},"doc://Boutique/documentation/Boutique/Store/items":{"role":"symbol","title":"items","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]"}],"abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/items"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"}}} \ No newline at end of file +{"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth."}],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"convenience"},{"text":" ","kind":"text"},{"kind":"keyword","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"text":": any ","kind":"text"},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"text":")","kind":"text"}],"languages":["swift"]}]},{"parameters":[{"name":"storage","content":[{"inlineContent":[{"text":"A ","type":"text"},{"type":"codeVoice","code":"StorageEngine"},{"text":" to initialize a ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":" instance with.","type":"text"}],"type":"paragraph"}]}],"kind":"parameters"},{"content":[{"type":"heading","text":"Discussion","level":2,"anchor":"discussion"},{"type":"paragraph","inlineContent":[{"text":"The ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","isActive":true,"type":"reference"},{"text":" will be loaded asynchronously in a background task.","type":"text"},{"type":"text","text":" "},{"text":"If you are not using this with @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":" and need to show"},{"type":"text","text":" "},{"text":"the contents of the Store right away, you have two options.","type":"text"}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"text":"Move the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":" initialization to an ","type":"text"},{"type":"codeVoice","code":"async"},{"type":"text","text":" context"},{"text":" ","type":"text"},{"type":"text","text":"so "},{"type":"codeVoice","code":"init"},{"text":" returns only once items have been loaded.","type":"text"}]}]}]},{"type":"codeListing","code":["let store: Store","","init() async throws {"," store = try await Store(...)"," \/\/ Now the store will have `items` already loaded."," let items = await store.items","}"],"syntax":null},{"items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Alternatively you can use the synchronous initializer"},{"type":"text","text":" "},{"type":"text","text":"and then await for items to load before accessing them."}]}]}],"type":"unorderedList"},{"code":["let store: Store = Store(...)","","func getItems() async -> [Item] {"," try await store.itemsHaveLoaded()"," return await store.items","}"],"syntax":null,"type":"codeListing"},{"inlineContent":[{"type":"text","text":"This initializer eschews providing a "},{"type":"codeVoice","code":"cacheIdentifier"},{"text":" when our ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"text":" ","type":"text"},{"type":"text","text":"with an "},{"code":"id","type":"codeVoice"},{"text":" that is a ","type":"text"},{"code":"String","type":"codeVoice"},{"text":". While it’s not required for your ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" to conform to ","type":"text"},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":","},{"type":"text","text":" "},{"text":"many SwiftUI-related objects do so this initializer provides a nice convenience.","type":"text"}],"type":"paragraph"}],"kind":"content"}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"kind":"symbol","variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/init(storage:)-1dbuk"]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-1dbuk","interfaceLanguage":"swift"},"metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Encodable"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"code":"Identifiable","type":"codeVoice"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":", and "},{"code":"Item.ID","type":"codeVoice"},{"text":" is ","type":"text"},{"type":"codeVoice","code":"String"},{"type":"text","text":"."}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"type":"text","text":"Available when"}]},"fragments":[{"kind":"keyword","text":"convenience"},{"text":" ","kind":"text"},{"text":"init","kind":"identifier"},{"kind":"text","text":"("},{"text":"storage","kind":"externalParam"},{"text":": any ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:6Bodega13StorageEngineP","text":"StorageEngine"},{"text":")","kind":"text"}],"externalID":"s:8Boutique5StoreCAAs12IdentifiableRzSS2IDsADPRtzrlE7storageACyxG6Bodega13StorageEngine_p_tcfc","symbolKind":"init","title":"init(storage:)","extendedModule":"Boutique","modules":[{"name":"Boutique"}],"roleHeading":"Initializer","role":"symbol"},"sections":[],"schemaVersion":{"patch":0,"major":0,"minor":3},"references":{"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/items":{"url":"\/documentation\/boutique\/store\/items","role":"symbol","abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","title":"items","type":"topic","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"text":": [","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"]","kind":"text"}]},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/Store/init(storage:)-1dbuk":{"url":"\/documentation\/boutique\/store\/init(storage:)-1dbuk","type":"topic","title":"init(storage:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-1dbuk","role":"symbol","fragments":[{"kind":"keyword","text":"convenience"},{"text":" ","kind":"text"},{"text":"init","kind":"identifier"},{"text":"(","kind":"text"},{"text":"storage","kind":"externalParam"},{"kind":"text","text":": any "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"text":")","kind":"text"}],"conformance":{"availabilityPrefix":[{"type":"text","text":"Available when"}],"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":", "},{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Identifiable"},{"text":", ","type":"text"},{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Item.ID","type":"codeVoice"},{"text":" is ","type":"text"},{"type":"codeVoice","code":"String"},{"type":"text","text":"."}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth."}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/init(storage:)-2icz.json b/docs/data/documentation/boutique/store/init(storage:)-2icz.json index 0f797dd..4ee7e4d 100644 --- a/docs/data/documentation/boutique/store/init(storage:)-2icz.json +++ b/docs/data/documentation/boutique/store/init(storage:)-2icz.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"convenience"},{"kind":"text","text":" "},{"kind":"keyword","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"storage","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" to initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" instance with."}]}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/init(storage:)-2icz"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-2icz","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth, and await for the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" to load."}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Item.ID"},{"type":"text","text":" is "},{"type":"codeVoice","code":"String"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"init(storage:)","roleHeading":"Initializer","fragments":[{"kind":"keyword","text":"convenience"},{"kind":"text","text":" "},{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"symbolKind":"init","externalID":"s:8Boutique5StoreCAAs12IdentifiableRzSS2IDsADPRtzrlE7storageACyxG6Bodega13StorageEngine_p_tYaKcfc","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Store/items":{"role":"symbol","title":"items","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]"}],"abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/items"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/init(storage:)-2icz":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Item.ID"},{"type":"text","text":" is "},{"type":"codeVoice","code":"String"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"init(storage:)","fragments":[{"kind":"keyword","text":"convenience"},{"kind":"text","text":" "},{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth, and await for the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" to load."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-2icz","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/init(storage:)-2icz"}}} \ No newline at end of file +{"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/init(storage:)-2icz"]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"metadata":{"fragments":[{"text":"convenience","kind":"keyword"},{"kind":"text","text":" "},{"text":"init","kind":"identifier"},{"text":"(","kind":"text"},{"text":"storage","kind":"externalParam"},{"text":": any ","kind":"text"},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"text":") ","kind":"text"},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"}],"title":"init(storage:)","externalID":"s:8Boutique5StoreCAAs12IdentifiableRzSS2IDsADPRtzrlE7storageACyxG6Bodega13StorageEngine_p_tYaKcfc","role":"symbol","roleHeading":"Initializer","extendedModule":"Boutique","symbolKind":"init","conformance":{"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", "},{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":", "},{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Sendable"},{"text":", and ","type":"text"},{"type":"codeVoice","code":"Item.ID"},{"type":"text","text":" is "},{"code":"String","type":"codeVoice"},{"text":".","type":"text"}]},"modules":[{"name":"Boutique"}]},"sections":[],"primaryContentSections":[{"declarations":[{"tokens":[{"kind":"keyword","text":"convenience"},{"kind":"text","text":" "},{"text":"init","kind":"keyword"},{"kind":"text","text":"("},{"text":"storage","kind":"externalParam"},{"text":": any ","kind":"text"},{"preciseIdentifier":"s:6Bodega13StorageEngineP","text":"StorageEngine","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"}],"languages":["swift"],"platforms":["macOS"]}],"kind":"declarations"},{"kind":"parameters","parameters":[{"name":"storage","content":[{"type":"paragraph","inlineContent":[{"text":"A ","type":"text"},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" to initialize a "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" instance with."}]}]}]}],"kind":"symbol","abstract":[{"type":"text","text":"Initializes a new "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth, and await for the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","type":"reference","isActive":true},{"type":"text","text":" to load."}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-2icz","interfaceLanguage":"swift"},"references":{"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/items":{"url":"\/documentation\/boutique\/store\/items","role":"symbol","abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","title":"items","type":"topic","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"text":": [","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"]","kind":"text"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/init(storage:)-2icz":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-2icz","title":"init(storage:)","type":"topic","abstract":[{"text":"Initializes a new ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth, and await for the "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"text":" to load.","type":"text"}],"role":"symbol","kind":"symbol","url":"\/documentation\/boutique\/store\/init(storage:)-2icz","conformance":{"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"code":"Encodable","type":"codeVoice"},{"text":", ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"code":"Identifiable","type":"codeVoice"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Sendable"},{"text":", and ","type":"text"},{"code":"Item.ID","type":"codeVoice"},{"type":"text","text":" is "},{"type":"codeVoice","code":"String"},{"type":"text","text":"."}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"fragments":[{"text":"convenience","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"text":"storage","kind":"externalParam"},{"kind":"text","text":": any "},{"text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP","kind":"typeIdentifier"},{"kind":"text","text":") "},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/init(storage:)-2zxc4.json b/docs/data/documentation/boutique/store/init(storage:)-2zxc4.json index 4d7d3ad..cfcb7e4 100644 --- a/docs/data/documentation/boutique/store/init(storage:)-2zxc4.json +++ b/docs/data/documentation/boutique/store/init(storage:)-2zxc4.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"convenience"},{"kind":"text","text":" "},{"kind":"keyword","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":")"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"storage","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" to initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" instance with."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" will be loaded asynchronously in a background task."},{"type":"text","text":" "},{"type":"text","text":"If you are not using this with @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" and need to show"},{"type":"text","text":" "},{"type":"text","text":"the contents of the Store right away, you have two options."}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Move the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" initialization to an "},{"type":"codeVoice","code":"async"},{"type":"text","text":" context"},{"type":"text","text":" "},{"type":"text","text":"so "},{"type":"codeVoice","code":"init"},{"type":"text","text":" returns only once items have been loaded."}]}]}]},{"type":"codeListing","syntax":null,"code":["let store: Store","","init() async throws {"," store = try await Store(...)"," \/\/ Now the store will have `items` already loaded."," let items = await store.items","}"]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Alternatively you can use the synchronous initializer"},{"type":"text","text":" "},{"type":"text","text":"and then await for items to load before accessing them."},{"type":"text","text":" "},{"type":"text","text":" "}]}]}]},{"type":"codeListing","syntax":null,"code":["let store: Store = Store(...)","","func getItems() async -> [Item] {"," try await store.itemsHaveLoaded()"," return await store.items","}"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This initializer eschews providing a "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" when our "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":" "},{"type":"text","text":"with an "},{"type":"codeVoice","code":"id"},{"type":"text","text":" that is a "},{"type":"codeVoice","code":"UUID"},{"type":"text","text":". While it’s not required for your "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" to conform to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"text","text":"many SwiftUI-related objects do so this initializer provides a nice convenience."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/init(storage:)-2zxc4"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-2zxc4","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth."}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Item.ID"},{"type":"text","text":" is "},{"type":"codeVoice","code":"UUID"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"init(storage:)","roleHeading":"Initializer","fragments":[{"kind":"keyword","text":"convenience"},{"kind":"text","text":" "},{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":")"}],"symbolKind":"init","externalID":"s:8Boutique5StoreCAAs12IdentifiableRz10Foundation4UUIDV2IDsADPRtzrlE7storageACyxG6Bodega13StorageEngine_p_tcfc","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Store/items":{"role":"symbol","title":"items","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]"}],"abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/items"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/init(storage:)-2zxc4":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Item.ID"},{"type":"text","text":" is "},{"type":"codeVoice","code":"UUID"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"init(storage:)","fragments":[{"kind":"keyword","text":"convenience"},{"kind":"text","text":" "},{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":")"}],"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-2zxc4","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/init(storage:)-2zxc4"}}} \ No newline at end of file +{"kind":"symbol","metadata":{"conformance":{"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":", "},{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"code":"Identifiable","type":"codeVoice"},{"type":"text","text":", "},{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Sendable"},{"text":", and ","type":"text"},{"code":"Item.ID","type":"codeVoice"},{"text":" is ","type":"text"},{"type":"codeVoice","code":"UUID"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"extendedModule":"Boutique","role":"symbol","modules":[{"name":"Boutique"}],"roleHeading":"Initializer","title":"init(storage:)","externalID":"s:8Boutique5StoreCAAs12IdentifiableRz10Foundation4UUIDV2IDsADPRtzrlE7storageACyxG6Bodega13StorageEngine_p_tcfc","symbolKind":"init","fragments":[{"kind":"keyword","text":"convenience"},{"text":" ","kind":"text"},{"text":"init","kind":"identifier"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"storage"},{"text":": any ","kind":"text"},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":")"}]},"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":" for persisting items to a memory cache and a storage engine, acting as a source of truth.","type":"text"}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/init(storage:)-2zxc4"]}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-2zxc4"},"schemaVersion":{"minor":3,"patch":0,"major":0},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"sections":[],"primaryContentSections":[{"declarations":[{"tokens":[{"kind":"keyword","text":"convenience"},{"kind":"text","text":" "},{"text":"init","kind":"keyword"},{"text":"(","kind":"text"},{"text":"storage","kind":"externalParam"},{"kind":"text","text":": any "},{"kind":"typeIdentifier","preciseIdentifier":"s:6Bodega13StorageEngineP","text":"StorageEngine"},{"kind":"text","text":")"}],"platforms":["macOS"],"languages":["swift"]}],"kind":"declarations"},{"kind":"parameters","parameters":[{"name":"storage","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" to initialize a "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" instance with."}]}]}]},{"content":[{"level":2,"type":"heading","anchor":"discussion","text":"Discussion"},{"type":"paragraph","inlineContent":[{"text":"The ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","type":"reference","isActive":true},{"type":"text","text":" will be loaded asynchronously in a background task."},{"type":"text","text":" "},{"text":"If you are not using this with @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"text":" and need to show","type":"text"},{"text":" ","type":"text"},{"text":"the contents of the Store right away, you have two options.","type":"text"}]},{"type":"unorderedList","items":[{"content":[{"inlineContent":[{"type":"text","text":"Move the "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":" initialization to an ","type":"text"},{"code":"async","type":"codeVoice"},{"text":" context","type":"text"},{"type":"text","text":" "},{"type":"text","text":"so "},{"code":"init","type":"codeVoice"},{"type":"text","text":" returns only once items have been loaded."}],"type":"paragraph"}]}]},{"code":["let store: Store","","init() async throws {"," store = try await Store(...)"," \/\/ Now the store will have `items` already loaded."," let items = await store.items","}"],"syntax":null,"type":"codeListing"},{"items":[{"content":[{"type":"paragraph","inlineContent":[{"text":"Alternatively you can use the synchronous initializer","type":"text"},{"type":"text","text":" "},{"text":"and then await for items to load before accessing them.","type":"text"},{"text":" ","type":"text"},{"text":" ","type":"text"}]}]}],"type":"unorderedList"},{"syntax":null,"code":["let store: Store = Store(...)","","func getItems() async -> [Item] {"," try await store.itemsHaveLoaded()"," return await store.items","}"],"type":"codeListing"},{"inlineContent":[{"text":"This initializer eschews providing a ","type":"text"},{"code":"cacheIdentifier","type":"codeVoice"},{"type":"text","text":" when our "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"code":"Identifiable","type":"codeVoice"},{"type":"text","text":" "},{"type":"text","text":"with an "},{"code":"id","type":"codeVoice"},{"type":"text","text":" that is a "},{"type":"codeVoice","code":"UUID"},{"text":". While it’s not required for your ","type":"text"},{"code":"Item","type":"codeVoice"},{"type":"text","text":" to conform to "},{"code":"Identifiable","type":"codeVoice"},{"text":",","type":"text"},{"text":" ","type":"text"},{"text":"many SwiftUI-related objects do so this initializer provides a nice convenience.","type":"text"}],"type":"paragraph"}],"kind":"content"}],"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/init(storage:)-2zxc4":{"conformance":{"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"code":"Encodable","type":"codeVoice"},{"text":", ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"code":"Identifiable","type":"codeVoice"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Item.ID","type":"codeVoice"},{"type":"text","text":" is "},{"code":"UUID","type":"codeVoice"},{"type":"text","text":"."}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"type":"text","text":"Available when"}]},"url":"\/documentation\/boutique\/store\/init(storage:)-2zxc4","role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-2zxc4","abstract":[{"text":"Initializes a new ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" for persisting items to a memory cache and a storage engine, acting as a source of truth.","type":"text"}],"kind":"symbol","title":"init(storage:)","type":"topic","fragments":[{"text":"convenience","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"text":": any ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:6Bodega13StorageEngineP","text":"StorageEngine"},{"text":")","kind":"text"}]},"doc://Boutique/documentation/Boutique/Store/items":{"url":"\/documentation\/boutique\/store\/items","role":"symbol","abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","title":"items","type":"topic","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"text":": [","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"]","kind":"text"}]},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/init(storage:)-8ky4y.json b/docs/data/documentation/boutique/store/init(storage:)-8ky4y.json index 9c4d818..90dc5c3 100644 --- a/docs/data/documentation/boutique/store/init(storage:)-8ky4y.json +++ b/docs/data/documentation/boutique/store/init(storage:)-8ky4y.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"convenience"},{"kind":"text","text":" "},{"kind":"keyword","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"storage","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" to initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" instance with."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This initializer eschews providing a "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" when our "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":" "},{"type":"text","text":"with an "},{"type":"codeVoice","code":"id"},{"type":"text","text":" that is a "},{"type":"codeVoice","code":"UUID"},{"type":"text","text":". While it’s not required for your "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" to conform to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"text","text":"many SwiftUI-related objects do so this initializer provides a nice convenience."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/init(storage:)-8ky4y"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-8ky4y","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth, and await for the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" to load."}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Item.ID"},{"type":"text","text":" is "},{"type":"codeVoice","code":"UUID"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"init(storage:)","roleHeading":"Initializer","fragments":[{"kind":"keyword","text":"convenience"},{"kind":"text","text":" "},{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"symbolKind":"init","externalID":"s:8Boutique5StoreCAAs12IdentifiableRz10Foundation4UUIDV2IDsADPRtzrlE7storageACyxG6Bodega13StorageEngine_p_tYaKcfc","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/items":{"role":"symbol","title":"items","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]"}],"abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/items"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/init(storage:)-8ky4y":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Item.ID"},{"type":"text","text":" is "},{"type":"codeVoice","code":"UUID"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"init(storage:)","fragments":[{"kind":"keyword","text":"convenience"},{"kind":"text","text":" "},{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth, and await for the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" to load."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-8ky4y","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/init(storage:)-8ky4y"}}} \ No newline at end of file +{"schemaVersion":{"major":0,"minor":3,"patch":0},"abstract":[{"text":"Initializes a new ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth, and await for the "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" to load."}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"languages":["swift"],"tokens":[{"text":"convenience","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": any "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"}]}]},{"kind":"parameters","parameters":[{"name":"storage","content":[{"type":"paragraph","inlineContent":[{"text":"A ","type":"text"},{"type":"codeVoice","code":"StorageEngine"},{"text":" to initialize a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"text":" instance with.","type":"text"}]}]}]},{"kind":"content","content":[{"type":"heading","text":"Discussion","anchor":"discussion","level":2},{"inlineContent":[{"text":"This initializer eschews providing a ","type":"text"},{"code":"cacheIdentifier","type":"codeVoice"},{"text":" when our ","type":"text"},{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"code":"Identifiable","type":"codeVoice"},{"type":"text","text":" "},{"type":"text","text":"with an "},{"code":"id","type":"codeVoice"},{"type":"text","text":" that is a "},{"code":"UUID","type":"codeVoice"},{"type":"text","text":". While it’s not required for your "},{"code":"Item","type":"codeVoice"},{"type":"text","text":" to conform to "},{"code":"Identifiable","type":"codeVoice"},{"type":"text","text":","},{"text":" ","type":"text"},{"type":"text","text":"many SwiftUI-related objects do so this initializer provides a nice convenience."}],"type":"paragraph"}]}],"sections":[],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-8ky4y","interfaceLanguage":"swift"},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/init(storage:)-8ky4y"]}],"kind":"symbol","metadata":{"fragments":[{"text":"convenience","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"text":"storage","kind":"externalParam"},{"text":": any ","kind":"text"},{"preciseIdentifier":"s:6Bodega13StorageEngineP","kind":"typeIdentifier","text":"StorageEngine"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"roleHeading":"Initializer","symbolKind":"init","externalID":"s:8Boutique5StoreCAAs12IdentifiableRz10Foundation4UUIDV2IDsADPRtzrlE7storageACyxG6Bodega13StorageEngine_p_tYaKcfc","title":"init(storage:)","extendedModule":"Boutique","role":"symbol","conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"text":", ","type":"text"},{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"code":"Encodable","type":"codeVoice"},{"text":", ","type":"text"},{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"code":"Sendable","type":"codeVoice"},{"text":", and ","type":"text"},{"type":"codeVoice","code":"Item.ID"},{"type":"text","text":" is "},{"type":"codeVoice","code":"UUID"},{"type":"text","text":"."}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"modules":[{"name":"Boutique"}]},"references":{"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/items":{"url":"\/documentation\/boutique\/store\/items","role":"symbol","abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","title":"items","type":"topic","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"text":": [","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"]","kind":"text"}]},"doc://Boutique/documentation/Boutique/Store/init(storage:)-8ky4y":{"url":"\/documentation\/boutique\/store\/init(storage:)-8ky4y","type":"topic","title":"init(storage:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:)-8ky4y","role":"symbol","fragments":[{"text":"convenience","kind":"keyword"},{"text":" ","kind":"text"},{"text":"init","kind":"identifier"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"text":": any ","kind":"text"},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"conformance":{"availabilityPrefix":[{"text":"Available when","type":"text"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":", "},{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"code":"Encodable","type":"codeVoice"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Identifiable"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Sendable"},{"text":", and ","type":"text"},{"code":"Item.ID","type":"codeVoice"},{"type":"text","text":" is "},{"type":"codeVoice","code":"UUID"},{"text":".","type":"text"}]},"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache and a storage engine, acting as a source of truth, and await for the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","isActive":true},{"type":"text","text":" to load."}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/init(storage:cacheidentifier:)-11vez.json b/docs/data/documentation/boutique/store/init(storage:cacheidentifier:)-11vez.json index 3f649fd..f99a51a 100644 --- a/docs/data/documentation/boutique/store/init(storage:cacheidentifier:)-11vez.json +++ b/docs/data/documentation/boutique/store/init(storage:cacheidentifier:)-11vez.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":", "},{"kind":"externalParam","text":"cacheIdentifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"KeyPath","preciseIdentifier":"s:s7KeyPathC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":">) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"storage","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" to initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" instance with."}]}]},{"name":"cacheIdentifier","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"codeVoice","code":"KeyPath"},{"type":"text","text":" from the "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" pointing to a "},{"type":"codeVoice","code":"String"},{"type":"text","text":", which the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" "},{"type":"text","text":"will use to create a unique identifier for the item when it’s saved."}]}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/init(storage:cacheidentifier:)-11vez"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:cacheIdentifier:)-11vez","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache"},{"type":"text","text":" "},{"type":"text","text":"and a storage engine, to act as a source of truth, and await for the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" to load."}],"kind":"symbol","metadata":{"fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":", "},{"kind":"externalParam","text":"cacheIdentifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"KeyPath","preciseIdentifier":"s:s7KeyPathC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":">) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"title":"init(storage:cacheIdentifier:)","roleHeading":"Initializer","role":"symbol","symbolKind":"init","externalID":"s:8Boutique5StoreC7storage15cacheIdentifierACyxG6Bodega13StorageEngine_p_s7KeyPathCyxSSGtYaKcfc","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/init(storage:cacheIdentifier:)-11vez":{"role":"symbol","title":"init(storage:cacheIdentifier:)","fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":", "},{"kind":"externalParam","text":"cacheIdentifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"KeyPath","preciseIdentifier":"s:s7KeyPathC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":">) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache"},{"type":"text","text":" "},{"type":"text","text":"and a storage engine, to act as a source of truth, and await for the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" to load."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:cacheIdentifier:)-11vez","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/init(storage:cacheidentifier:)-11vez"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/items":{"role":"symbol","title":"items","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]"}],"abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/items"}}} \ No newline at end of file +{"variants":[{"paths":["\/documentation\/boutique\/store\/init(storage:cacheidentifier:)-11vez"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:cacheIdentifier:)-11vez","interfaceLanguage":"swift"},"kind":"symbol","metadata":{"roleHeading":"Initializer","symbolKind":"init","role":"symbol","fragments":[{"text":"init","kind":"identifier"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": any "},{"preciseIdentifier":"s:6Bodega13StorageEngineP","text":"StorageEngine","kind":"typeIdentifier"},{"kind":"text","text":", "},{"kind":"externalParam","text":"cacheIdentifier"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"KeyPath","preciseIdentifier":"s:s7KeyPathC"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":", ","kind":"text"},{"text":"String","preciseIdentifier":"s:SS","kind":"typeIdentifier"},{"kind":"text","text":">) "},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"}],"externalID":"s:8Boutique5StoreC7storage15cacheIdentifierACyxG6Bodega13StorageEngine_p_s7KeyPathCyxSSGtYaKcfc","title":"init(storage:cacheIdentifier:)","modules":[{"name":"Boutique"}]},"sections":[],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"languages":["swift"],"tokens":[{"text":"@","kind":"attribute"},{"preciseIdentifier":"s:ScM","text":"MainActor","kind":"attribute"},{"text":" ","kind":"text"},{"text":"init","kind":"keyword"},{"kind":"text","text":"("},{"text":"storage","kind":"externalParam"},{"text":": any ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:6Bodega13StorageEngineP","text":"StorageEngine"},{"text":", ","kind":"text"},{"text":"cacheIdentifier","kind":"externalParam"},{"kind":"text","text":": "},{"preciseIdentifier":"s:s7KeyPathC","text":"KeyPath","kind":"typeIdentifier"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":", ","kind":"text"},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"},{"kind":"text","text":">) "},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}]}]},{"kind":"parameters","parameters":[{"name":"storage","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":" to initialize a "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" instance with."}]}]},{"name":"cacheIdentifier","content":[{"type":"paragraph","inlineContent":[{"text":"A ","type":"text"},{"code":"KeyPath","type":"codeVoice"},{"text":" from the ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" pointing to a ","type":"text"},{"type":"codeVoice","code":"String"},{"type":"text","text":", which the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"text":" ","type":"text"},{"text":"will use to create a unique identifier for the item when it’s saved.","type":"text"}]}]}]}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"schemaVersion":{"patch":0,"major":0,"minor":3},"abstract":[{"type":"text","text":"Initializes a new "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"text":" for persisting items to a memory cache","type":"text"},{"type":"text","text":" "},{"text":"and a storage engine, to act as a source of truth, and await for the ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","type":"reference"},{"text":" to load.","type":"text"}],"references":{"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/init(storage:cacheIdentifier:)-11vez":{"url":"\/documentation\/boutique\/store\/init(storage:cacheidentifier:)-11vez","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:cacheIdentifier:)-11vez","title":"init(storage:cacheIdentifier:)","fragments":[{"kind":"identifier","text":"init"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": any "},{"text":"StorageEngine","kind":"typeIdentifier","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"text":", ","kind":"text"},{"text":"cacheIdentifier","kind":"externalParam"},{"kind":"text","text":": "},{"text":"KeyPath","kind":"typeIdentifier","preciseIdentifier":"s:s7KeyPathC"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":", ","kind":"text"},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":">) "},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"text":"Initializes a new ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" for persisting items to a memory cache","type":"text"},{"type":"text","text":" "},{"text":"and a storage engine, to act as a source of truth, and await for the ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","isActive":true,"type":"reference"},{"type":"text","text":" to load."}],"kind":"symbol","role":"symbol","type":"topic"},"doc://Boutique/documentation/Boutique/Store/items":{"url":"\/documentation\/boutique\/store\/items","role":"symbol","abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","title":"items","type":"topic","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"text":": [","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"]","kind":"text"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/init(storage:cacheidentifier:)-1933a.json b/docs/data/documentation/boutique/store/init(storage:cacheidentifier:)-1933a.json index 6cc5165..bbf2d85 100644 --- a/docs/data/documentation/boutique/store/init(storage:cacheidentifier:)-1933a.json +++ b/docs/data/documentation/boutique/store/init(storage:cacheidentifier:)-1933a.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":", "},{"kind":"externalParam","text":"cacheIdentifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"KeyPath","preciseIdentifier":"s:s7KeyPathC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":">)"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"storage","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" to initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" instance with."}]}]},{"name":"cacheIdentifier","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"codeVoice","code":"KeyPath"},{"type":"text","text":" from the "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" pointing to a "},{"type":"codeVoice","code":"String"},{"type":"text","text":", which the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" "},{"type":"text","text":"will use to create a unique identifier for the item when it’s saved."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" will be loaded asynchronously in a background task."},{"type":"text","text":" "},{"type":"text","text":"If you are not using this with @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" and need to show"},{"type":"text","text":" "},{"type":"text","text":"the contents of the Store right away, you have two options."}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Move the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" initialization to an "},{"type":"codeVoice","code":"async"},{"type":"text","text":" context"},{"type":"text","text":" "},{"type":"text","text":"so "},{"type":"codeVoice","code":"init"},{"type":"text","text":" returns only once items have been loaded."}]}]}]},{"type":"codeListing","syntax":null,"code":["let store: Store","","init() async throws {"," store = try await Store(...)"," \/\/ Now the store will have `items` already loaded."," let items = await store.items","}"]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Alternatively you can use the synchronous initializer"},{"type":"text","text":" "},{"type":"text","text":"and then await for items to load before accessing them."}]}]}]},{"type":"codeListing","syntax":null,"code":["let store: Store = Store(...)","","func getItems() async -> [Item] {"," try await store.itemsHaveLoaded()"," return await store.items","}"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/init(storage:cacheidentifier:)-1933a"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:cacheIdentifier:)-1933a","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache"},{"type":"text","text":" "},{"type":"text","text":"and a storage engine, to act as a source of truth."}],"kind":"symbol","metadata":{"fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":", "},{"kind":"externalParam","text":"cacheIdentifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"KeyPath","preciseIdentifier":"s:s7KeyPathC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":">)"}],"title":"init(storage:cacheIdentifier:)","roleHeading":"Initializer","role":"symbol","symbolKind":"init","externalID":"s:8Boutique5StoreC7storage15cacheIdentifierACyxG6Bodega13StorageEngine_p_s7KeyPathCyxSSGtcfc","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/Store/init(storage:cacheIdentifier:)-1933a":{"role":"symbol","title":"init(storage:cacheIdentifier:)","fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StorageEngine","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":", "},{"kind":"externalParam","text":"cacheIdentifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"KeyPath","preciseIdentifier":"s:s7KeyPathC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":">)"}],"abstract":[{"type":"text","text":"Initializes a new "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" for persisting items to a memory cache"},{"type":"text","text":" "},{"type":"text","text":"and a storage engine, to act as a source of truth."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:cacheIdentifier:)-1933a","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/init(storage:cacheidentifier:)-1933a"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/items":{"role":"symbol","title":"items","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]"}],"abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/items"}}} \ No newline at end of file +{"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"tokens":[{"text":"init","kind":"keyword"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"storage"},{"text":": any ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:6Bodega13StorageEngineP","text":"StorageEngine"},{"kind":"text","text":", "},{"text":"cacheIdentifier","kind":"externalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:s7KeyPathC","text":"KeyPath"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":", ","kind":"text"},{"preciseIdentifier":"s:SS","text":"String","kind":"typeIdentifier"},{"kind":"text","text":">)"}],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"storage","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"codeVoice","code":"StorageEngine"},{"text":" to initialize a ","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" instance with."}]}]},{"name":"cacheIdentifier","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"code":"KeyPath","type":"codeVoice"},{"type":"text","text":" from the "},{"code":"Item","type":"codeVoice"},{"type":"text","text":" pointing to a "},{"code":"String","type":"codeVoice"},{"type":"text","text":", which the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"type":"text","text":" "},{"text":"will use to create a unique identifier for the item when it’s saved.","type":"text"}]}]}]},{"kind":"content","content":[{"text":"Discussion","type":"heading","anchor":"discussion","level":2},{"type":"paragraph","inlineContent":[{"text":"The ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","type":"reference"},{"type":"text","text":" will be loaded asynchronously in a background task."},{"text":" ","type":"text"},{"type":"text","text":"If you are not using this with @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"text":" and need to show","type":"text"},{"type":"text","text":" "},{"type":"text","text":"the contents of the Store right away, you have two options."}]},{"type":"unorderedList","items":[{"content":[{"inlineContent":[{"type":"text","text":"Move the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"type":"text","text":" initialization to an "},{"code":"async","type":"codeVoice"},{"type":"text","text":" context"},{"type":"text","text":" "},{"text":"so ","type":"text"},{"code":"init","type":"codeVoice"},{"text":" returns only once items have been loaded.","type":"text"}],"type":"paragraph"}]}]},{"code":["let store: Store","","init() async throws {"," store = try await Store(...)"," \/\/ Now the store will have `items` already loaded."," let items = await store.items","}"],"syntax":null,"type":"codeListing"},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"text":"Alternatively you can use the synchronous initializer","type":"text"},{"type":"text","text":" "},{"type":"text","text":"and then await for items to load before accessing them."}]}]}]},{"syntax":null,"code":["let store: Store = Store(...)","","func getItems() async -> [Item] {"," try await store.itemsHaveLoaded()"," return await store.items","}"],"type":"codeListing"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:cacheIdentifier:)-1933a","interfaceLanguage":"swift"},"sections":[],"kind":"symbol","metadata":{"modules":[{"name":"Boutique"}],"roleHeading":"Initializer","title":"init(storage:cacheIdentifier:)","role":"symbol","symbolKind":"init","externalID":"s:8Boutique5StoreC7storage15cacheIdentifierACyxG6Bodega13StorageEngine_p_s7KeyPathCyxSSGtcfc","fragments":[{"text":"init","kind":"identifier"},{"kind":"text","text":"("},{"text":"storage","kind":"externalParam"},{"kind":"text","text":": any "},{"text":"StorageEngine","kind":"typeIdentifier","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"text":", ","kind":"text"},{"kind":"externalParam","text":"cacheIdentifier"},{"text":": ","kind":"text"},{"text":"KeyPath","preciseIdentifier":"s:s7KeyPathC","kind":"typeIdentifier"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":", ","kind":"text"},{"preciseIdentifier":"s:SS","kind":"typeIdentifier","text":"String"},{"text":">)","kind":"text"}]},"schemaVersion":{"minor":3,"major":0,"patch":0},"abstract":[{"type":"text","text":"Initializes a new "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"text":" for persisting items to a memory cache","type":"text"},{"text":" ","type":"text"},{"text":"and a storage engine, to act as a source of truth.","type":"text"}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"variants":[{"paths":["\/documentation\/boutique\/store\/init(storage:cacheidentifier:)-1933a"],"traits":[{"interfaceLanguage":"swift"}]}],"references":{"doc://Boutique/documentation/Boutique/Store/items":{"url":"\/documentation\/boutique\/store\/items","role":"symbol","abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","title":"items","type":"topic","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"text":": [","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"]","kind":"text"}]},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/Store/init(storage:cacheIdentifier:)-1933a":{"title":"init(storage:cacheIdentifier:)","url":"\/documentation\/boutique\/store\/init(storage:cacheidentifier:)-1933a","role":"symbol","kind":"symbol","type":"topic","abstract":[{"text":"Initializes a new ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" for persisting items to a memory cache","type":"text"},{"type":"text","text":" "},{"text":"and a storage engine, to act as a source of truth.","type":"text"}],"fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": any "},{"text":"StorageEngine","kind":"typeIdentifier","preciseIdentifier":"s:6Bodega13StorageEngineP"},{"kind":"text","text":", "},{"text":"cacheIdentifier","kind":"externalParam"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"KeyPath","preciseIdentifier":"s:s7KeyPathC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":", ","kind":"text"},{"preciseIdentifier":"s:SS","kind":"typeIdentifier","text":"String"},{"text":">)","kind":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/init(storage:cacheIdentifier:)-1933a"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/insert(_:)-2vg6j.json b/docs/data/documentation/boutique/store/insert(_:)-2vg6j.json index c0be951..893d2ab 100644 --- a/docs/data/documentation/boutique/store/insert(_:)-2vg6j.json +++ b/docs/data/documentation/boutique/store/insert(_:)-2vg6j.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"items","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The items to insert into the store."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Prefer inserting multiple items using this method instead of calling "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-3j9hw"},{"type":"text","text":" "},{"type":"text","text":"multiple times to avoid making multiple separate dispatches to the "},{"type":"codeVoice","code":"@MainActor"},{"type":"text","text":"."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/insert(_:)-2vg6j"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-2vg6j","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Inserts an array of items into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"title":"insert(_:)","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique5StoreC6insertyySayxGYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-2vg6j":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Inserts an array of items into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-2vg6j","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-2vg6j"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-3j9hw":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Inserts an item into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-3j9hw","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-3j9hw"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file +{"metadata":{"symbolKind":"method","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"insert","kind":"identifier"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"}],"title":"insert(_:)","externalID":"s:8Boutique5StoreC6insertyySayxGYaKF","modules":[{"name":"Boutique"}],"role":"symbol","roleHeading":"Instance Method"},"primaryContentSections":[{"declarations":[{"platforms":["macOS"],"tokens":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"insert","kind":"identifier"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"_"},{"text":" ","kind":"text"},{"kind":"internalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"text":"]) ","kind":"text"},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"}],"languages":["swift"]}],"kind":"declarations"},{"parameters":[{"name":"items","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The items to insert into the store."}]}]}],"kind":"parameters"},{"kind":"content","content":[{"anchor":"discussion","level":2,"text":"Discussion","type":"heading"},{"inlineContent":[{"type":"text","text":"Prefer inserting multiple items using this method instead of calling "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-3j9hw","type":"reference","isActive":true},{"type":"text","text":" "},{"type":"text","text":"multiple times to avoid making multiple separate dispatches to the "},{"code":"@MainActor","type":"codeVoice"},{"text":".","type":"text"}],"type":"paragraph"}]}],"schemaVersion":{"patch":0,"major":0,"minor":3},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"kind":"symbol","sections":[],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/insert(_:)-2vg6j"]}],"abstract":[{"text":"Inserts an array of items into the ","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-2vg6j"},"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-3j9hw":{"url":"\/documentation\/boutique\/store\/insert(_:)-3j9hw","type":"topic","title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-3j9hw","role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"insert","kind":"identifier"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Inserts an item into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Store/insert(_:)-2vg6j":{"url":"\/documentation\/boutique\/store\/insert(_:)-2vg6j","type":"topic","title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-2vg6j","role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"insert","kind":"identifier"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Inserts an array of items into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/insert(_:)-3j9hw.json b/docs/data/documentation/boutique/store/insert(_:)-3j9hw.json index abade32..3a86cc5 100644 --- a/docs/data/documentation/boutique/store/insert(_:)-3j9hw.json +++ b/docs/data/documentation/boutique/store/insert(_:)-3j9hw.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"item"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"item","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The item you are inserting into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"When an item is inserted with the same "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" as an item that already exists in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" "},{"type":"text","text":"the item being inserted will replace the item in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":". You can think of the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" as a bag"},{"type":"text","text":" "},{"type":"text","text":"of items, removing complexity when it comes to managing items, indices, and more,"},{"type":"text","text":" "},{"type":"text","text":"but it also means you need to choose well thought out and uniquely identifying "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":"s."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/insert(_:)-3j9hw"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-3j9hw","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Inserts an item into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"title":"insert(_:)","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique5StoreC6insertyyxYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-3j9hw":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Inserts an item into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-3j9hw","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-3j9hw"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file +{"metadata":{"externalID":"s:8Boutique5StoreC6insertyyxYaKF","title":"insert(_:)","symbolKind":"method","roleHeading":"Instance Method","modules":[{"name":"Boutique"}],"role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"insert","kind":"identifier"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"}]},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-3j9hw","interfaceLanguage":"swift"},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/insert(_:)-3j9hw"]}],"abstract":[{"text":"Inserts an item into the ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":".","type":"text"}],"primaryContentSections":[{"declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"insert","kind":"identifier"},{"kind":"text","text":"("},{"text":"_","kind":"externalParam"},{"kind":"text","text":" "},{"text":"item","kind":"internalParam"},{"kind":"text","text":": "},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"languages":["swift"]}],"kind":"declarations"},{"parameters":[{"name":"item","content":[{"inlineContent":[{"text":"The item you are inserting into the ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"text":".","type":"text"}],"type":"paragraph"}]}],"kind":"parameters"},{"kind":"content","content":[{"type":"heading","level":2,"text":"Discussion","anchor":"discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"When an item is inserted with the same "},{"type":"codeVoice","code":"cacheIdentifier"},{"text":" as an item that already exists in the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" "},{"type":"text","text":"the item being inserted will replace the item in the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"type":"text","text":". You can think of the "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" as a bag"},{"type":"text","text":" "},{"type":"text","text":"of items, removing complexity when it comes to managing items, indices, and more,"},{"type":"text","text":" "},{"type":"text","text":"but it also means you need to choose well thought out and uniquely identifying "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":"s."}]}]}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"kind":"symbol","sections":[],"schemaVersion":{"minor":3,"patch":0,"major":0},"references":{"doc://Boutique/documentation/Boutique/Store/insert(_:)-3j9hw":{"url":"\/documentation\/boutique\/store\/insert(_:)-3j9hw","type":"topic","title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-3j9hw","role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"insert","kind":"identifier"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Inserts an item into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/insert(_:)-7z2oe.json b/docs/data/documentation/boutique/store/insert(_:)-7z2oe.json index 7cec1a7..e81ac23 100644 --- a/docs/data/documentation/boutique/store/insert(_:)-7z2oe.json +++ b/docs/data/documentation/boutique/store/insert(_:)-7z2oe.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"item"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"return-value","level":2,"type":"heading","text":"Return Value"},{"type":"paragraph","inlineContent":[{"type":"text","text":"An "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"},{"type":"text","text":" that can be used to insert an item as part of a chain."}]}]},{"kind":"parameters","parameters":[{"name":"item","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The item you are inserting into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"When an item is inserted with the same "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" as an item that already exists in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" "},{"type":"text","text":"the item being inserted will replace the item in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":". You can think of the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" as a bag"},{"type":"text","text":" "},{"type":"text","text":"of items, removing complexity when it comes to managing items, indices, and more,"},{"type":"text","text":" "},{"type":"text","text":"but it also means you need to choose well thought out and uniquely identifying "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":"s."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/insert(_:)-7z2oe"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Inserts an item into the store."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"title":"insert(_:)","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique5StoreC6insertyAC9OperationCyx_GxYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/Operation":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.Operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"abstract":[{"type":"text","text":"An operation is a type that allows you to stack "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"type":"text","text":" calls in a chained manner."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Operation"}],"url":"\/documentation\/boutique\/store\/operation"}}} \ No newline at end of file +{"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"languages":["swift"],"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"insert","kind":"identifier"},{"text":"(","kind":"text"},{"text":"_","kind":"externalParam"},{"text":" ","kind":"text"},{"text":"item","kind":"internalParam"},{"text":": ","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","text":"Operation"}]}]},{"kind":"parameters","parameters":[{"name":"item","content":[{"inlineContent":[{"type":"text","text":"The item you are inserting into the "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":".","type":"text"}],"type":"paragraph"}]}]},{"content":[{"level":2,"text":"Return Value","anchor":"return-value","type":"heading"},{"type":"paragraph","inlineContent":[{"type":"text","text":"An "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","type":"reference"},{"type":"text","text":" that can be used to insert an item as part of a chain."}]}],"kind":"content"},{"kind":"content","content":[{"anchor":"discussion","type":"heading","text":"Discussion","level":2},{"inlineContent":[{"type":"text","text":"When an item is inserted with the same "},{"code":"cacheIdentifier","type":"codeVoice"},{"type":"text","text":" as an item that already exists in the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" ","type":"text"},{"type":"text","text":"the item being inserted will replace the item in the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":". You can think of the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" as a bag"},{"text":" ","type":"text"},{"text":"of items, removing complexity when it comes to managing items, indices, and more,","type":"text"},{"type":"text","text":" "},{"type":"text","text":"but it also means you need to choose well thought out and uniquely identifying "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":"s."}],"type":"paragraph"}]}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"variants":[{"paths":["\/documentation\/boutique\/store\/insert(_:)-7z2oe"],"traits":[{"interfaceLanguage":"swift"}]}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"sections":[],"schemaVersion":{"patch":0,"minor":3,"major":0},"metadata":{"modules":[{"name":"Boutique"}],"title":"insert(_:)","symbolKind":"method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"insert","kind":"identifier"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"role":"symbol","externalID":"s:8Boutique5StoreC6insertyAC9OperationCyx_GxYaKF","roleHeading":"Instance Method"},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","interfaceLanguage":"swift"},"kind":"symbol","references":{"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"title":"removeAll()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/Operation":{"title":"Store.Operation","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","role":"symbol","abstract":[{"text":"An operation is a type that allows you to stack ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","type":"reference","isActive":true},{"text":",","type":"text"},{"text":" ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"text":" calls in a chained manner.","type":"text"}],"conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}]},"type":"topic","url":"\/documentation\/boutique\/store\/operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"text":"Operation","kind":"identifier"}],"navigatorTitle":[{"kind":"identifier","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","role":"symbol","abstract":[{"text":"Removes an item from the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/insert(_:)-9n4e3.json b/docs/data/documentation/boutique/store/insert(_:)-9n4e3.json index 77ab209..0cc54df 100644 --- a/docs/data/documentation/boutique/store/insert(_:)-9n4e3.json +++ b/docs/data/documentation/boutique/store/insert(_:)-9n4e3.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"return-value","level":2,"type":"heading","text":"Return Value"},{"type":"paragraph","inlineContent":[{"type":"text","text":"An "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"},{"type":"text","text":" that can be used to insert items as part of a chain."}]}]},{"kind":"parameters","parameters":[{"name":"items","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The items to insert into the store."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Prefer inserting multiple items using this method instead of calling "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":" "},{"type":"text","text":"multiple times to avoid making multiple separate dispatches to the "},{"type":"codeVoice","code":"@MainActor"},{"type":"text","text":"."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/insert(_:)-9n4e3"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-9n4e3","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Inserts an array of items into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"title":"insert(_:)","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique5StoreC6insertyAC9OperationCyx_GSayxGYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24"},"doc://Boutique/documentation/Boutique/Store/Operation":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.Operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"abstract":[{"type":"text","text":"An operation is a type that allows you to stack "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"type":"text","text":" calls in a chained manner."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Operation"}],"url":"\/documentation\/boutique\/store\/operation"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-9n4e3":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an array of items into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-9n4e3","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-9n4e3"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"}}} \ No newline at end of file +{"metadata":{"fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"insert","kind":"identifier"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"]) ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"text":" -> ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"title":"insert(_:)","externalID":"s:8Boutique5StoreC6insertyAC9OperationCyx_GSayxGYaKF","role":"symbol","roleHeading":"Instance Method","symbolKind":"method","modules":[{"name":"Boutique"}]},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-9n4e3","interfaceLanguage":"swift"},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/insert(_:)-9n4e3"]}],"abstract":[{"text":"Inserts an array of items into the ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":".","type":"text"}],"primaryContentSections":[{"declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"insert","kind":"identifier"},{"text":"(","kind":"text"},{"text":"_","kind":"externalParam"},{"kind":"text","text":" "},{"text":"items","kind":"internalParam"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"text":"]) ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"typeIdentifier"}],"languages":["swift"],"platforms":["macOS"]}],"kind":"declarations"},{"parameters":[{"name":"items","content":[{"type":"paragraph","inlineContent":[{"text":"The items to insert into the store.","type":"text"}]}]}],"kind":"parameters"},{"content":[{"text":"Return Value","type":"heading","level":2,"anchor":"return-value"},{"inlineContent":[{"type":"text","text":"An "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"},{"text":" that can be used to insert items as part of a chain.","type":"text"}],"type":"paragraph"}],"kind":"content"},{"content":[{"text":"Discussion","anchor":"discussion","type":"heading","level":2},{"type":"paragraph","inlineContent":[{"text":"Prefer inserting multiple items using this method instead of calling ","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":" "},{"text":"multiple times to avoid making multiple separate dispatches to the ","type":"text"},{"code":"@MainActor","type":"codeVoice"},{"text":".","type":"text"}]}],"kind":"content"}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"kind":"symbol","sections":[],"schemaVersion":{"minor":3,"patch":0,"major":0},"references":{"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"title":"removeAll()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","role":"symbol","abstract":[{"text":"Removes an item from the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/insert(_:)-9n4e3":{"url":"\/documentation\/boutique\/store\/insert(_:)-9n4e3","type":"topic","title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-9n4e3","role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"insert","kind":"identifier"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier"}],"abstract":[{"type":"text","text":"Inserts an array of items into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Store/Operation":{"title":"Store.Operation","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","role":"symbol","abstract":[{"text":"An operation is a type that allows you to stack ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","type":"reference","isActive":true},{"text":",","type":"text"},{"text":" ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"text":" calls in a chained manner.","type":"text"}],"conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}]},"type":"topic","url":"\/documentation\/boutique\/store\/operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"text":"Operation","kind":"identifier"}],"navigatorTitle":[{"kind":"identifier","text":"Operation"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/itemremovalstrategy.json b/docs/data/documentation/boutique/store/itemremovalstrategy.json deleted file mode 100644 index d2c6285..0000000 --- a/docs/data/documentation/boutique/store/itemremovalstrategy.json +++ /dev/null @@ -1 +0,0 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"ItemRemovalStrategy"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"RemovedItem"},{"kind":"text","text":"> "},{"kind":"keyword","text":"where"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"RemovedItem"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Decodable","preciseIdentifier":"s:Se"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"RemovedItem"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Encodable","preciseIdentifier":"s:SE"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"overview","level":2,"type":"heading","text":"Overview"},{"type":"paragraph","inlineContent":[{"type":"text","text":"An "},{"type":"codeVoice","code":"ItemRemovalStrategy"},{"type":"text","text":" provides control over how items are removed from the "},{"type":"codeVoice","code":"Store"},{"type":"text","text":" "},{"type":"text","text":"and "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" cache when you are inserting new items into the "},{"type":"codeVoice","code":"Store"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This type used to be used publicly but now it’s only used internally. As a result you"},{"type":"text","text":" "},{"type":"text","text":"can no longer construct your own strategies, only "},{"type":"codeVoice","code":".all"},{"type":"text","text":" and "},{"type":"codeVoice","code":".items(_:)"},{"type":"text","text":" remain."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/itemremovalstrategy"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/ItemRemovalStrategy","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"An invalidation strategy for a "},{"type":"codeVoice","code":"Store"},{"type":"text","text":" instance."}],"kind":"symbol","metadata":{"navigatorTitle":[{"kind":"identifier","text":"ItemRemovalStrategy"}],"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.ItemRemovalStrategy","roleHeading":"Structure","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"ItemRemovalStrategy"}],"symbolKind":"struct","externalID":"s:8Boutique5StoreC19ItemRemovalStrategyV","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"topicSections":[{"title":"Initializers","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/ItemRemovalStrategy\/init(removedItems:)"]},{"title":"Instance Properties","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/ItemRemovalStrategy\/removedItems"]}],"references":{"doc://Boutique/documentation/Boutique/Store/ItemRemovalStrategy/removedItems":{"role":"symbol","title":"removedItems","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"removedItems"},{"kind":"text","text":": (["},{"kind":"typeIdentifier","text":"RemovedItem"},{"kind":"text","text":"]) -> ["},{"kind":"typeIdentifier","text":"RemovedItem"},{"kind":"text","text":"]"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/ItemRemovalStrategy\/removedItems","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/itemremovalstrategy\/removeditems"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/ItemRemovalStrategy/init(removedItems:)":{"role":"symbol","title":"init(removedItems:)","fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"removedItems"},{"kind":"text","text":": (["},{"kind":"typeIdentifier","text":"RemovedItem"},{"kind":"text","text":"]) -> ["},{"kind":"typeIdentifier","text":"RemovedItem"},{"kind":"text","text":"])"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/ItemRemovalStrategy\/init(removedItems:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/itemremovalstrategy\/init(removeditems:)"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/ItemRemovalStrategy":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.ItemRemovalStrategy","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"ItemRemovalStrategy"}],"abstract":[{"type":"text","text":"An invalidation strategy for a "},{"type":"codeVoice","code":"Store"},{"type":"text","text":" instance."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/ItemRemovalStrategy","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"ItemRemovalStrategy"}],"url":"\/documentation\/boutique\/store\/itemremovalstrategy"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/itemremovalstrategy/init(removeditems:).json b/docs/data/documentation/boutique/store/itemremovalstrategy/init(removeditems:).json deleted file mode 100644 index 1536ef2..0000000 --- a/docs/data/documentation/boutique/store/itemremovalstrategy/init(removeditems:).json +++ /dev/null @@ -1 +0,0 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"removedItems"},{"kind":"text","text":": "},{"kind":"keyword","text":"@escaping"},{"kind":"text","text":" (["},{"kind":"typeIdentifier","text":"RemovedItem"},{"kind":"text","text":"]) -> ["},{"kind":"typeIdentifier","text":"RemovedItem"},{"kind":"text","text":"])"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/itemremovalstrategy\/init(removeditems:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/ItemRemovalStrategy\/init(removedItems:)","interfaceLanguage":"swift"},"kind":"symbol","metadata":{"fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"removedItems"},{"kind":"text","text":": (["},{"kind":"typeIdentifier","text":"RemovedItem"},{"kind":"text","text":"]) -> ["},{"kind":"typeIdentifier","text":"RemovedItem"},{"kind":"text","text":"])"}],"title":"init(removedItems:)","roleHeading":"Initializer","role":"symbol","symbolKind":"init","externalID":"s:8Boutique5StoreC19ItemRemovalStrategyV12removedItemsAEyx_qd__GSayqd__GAHc_tcfc","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/ItemRemovalStrategy"]]},"references":{"doc://Boutique/documentation/Boutique/Store/ItemRemovalStrategy":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.ItemRemovalStrategy","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"ItemRemovalStrategy"}],"abstract":[{"type":"text","text":"An invalidation strategy for a "},{"type":"codeVoice","code":"Store"},{"type":"text","text":" instance."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/ItemRemovalStrategy","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"ItemRemovalStrategy"}],"url":"\/documentation\/boutique\/store\/itemremovalstrategy"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/ItemRemovalStrategy/init(removedItems:)":{"role":"symbol","title":"init(removedItems:)","fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"removedItems"},{"kind":"text","text":": (["},{"kind":"typeIdentifier","text":"RemovedItem"},{"kind":"text","text":"]) -> ["},{"kind":"typeIdentifier","text":"RemovedItem"},{"kind":"text","text":"])"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/ItemRemovalStrategy\/init(removedItems:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/itemremovalstrategy\/init(removeditems:)"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/itemremovalstrategy/removeditems.json b/docs/data/documentation/boutique/store/itemremovalstrategy/removeditems.json deleted file mode 100644 index cb7fbd3..0000000 --- a/docs/data/documentation/boutique/store/itemremovalstrategy/removeditems.json +++ /dev/null @@ -1 +0,0 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"removedItems"},{"kind":"text","text":": (["},{"kind":"typeIdentifier","text":"RemovedItem"},{"kind":"text","text":"]) -> ["},{"kind":"typeIdentifier","text":"RemovedItem"},{"kind":"text","text":"]"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/itemremovalstrategy\/removeditems"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/ItemRemovalStrategy\/removedItems","interfaceLanguage":"swift"},"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"removedItems"},{"kind":"text","text":": (["},{"kind":"typeIdentifier","text":"RemovedItem"},{"kind":"text","text":"]) -> ["},{"kind":"typeIdentifier","text":"RemovedItem"},{"kind":"text","text":"]"}],"title":"removedItems","roleHeading":"Instance Property","role":"symbol","symbolKind":"property","externalID":"s:8Boutique5StoreC19ItemRemovalStrategyV12removedItemsySayqd__GAGcvp","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/ItemRemovalStrategy"]]},"references":{"doc://Boutique/documentation/Boutique/Store/ItemRemovalStrategy":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.ItemRemovalStrategy","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"ItemRemovalStrategy"}],"abstract":[{"type":"text","text":"An invalidation strategy for a "},{"type":"codeVoice","code":"Store"},{"type":"text","text":" instance."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/ItemRemovalStrategy","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"ItemRemovalStrategy"}],"url":"\/documentation\/boutique\/store\/itemremovalstrategy"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/ItemRemovalStrategy/removedItems":{"role":"symbol","title":"removedItems","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"removedItems"},{"kind":"text","text":": (["},{"kind":"typeIdentifier","text":"RemovedItem"},{"kind":"text","text":"]) -> ["},{"kind":"typeIdentifier","text":"RemovedItem"},{"kind":"text","text":"]"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/ItemRemovalStrategy\/removedItems","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/itemremovalstrategy\/removeditems"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/items.json b/docs/data/documentation/boutique/store/items.json index 9ca01f8..cbf91f9 100644 --- a/docs/data/documentation/boutique/store/items.json +++ b/docs/data/documentation/boutique/store/items.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"] { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" "},{"kind":"keyword","text":"set"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"The user can read the state of "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" at any time"},{"type":"text","text":" "},{"type":"text","text":"or subscribe to it however they wish, but you desire making modifications to "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" "},{"type":"text","text":"you must use "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":", "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-3nzlq"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-9zfmy"},{"type":"text","text":"."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/items"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]"}],"title":"items","roleHeading":"Instance Property","role":"symbol","symbolKind":"property","externalID":"s:8Boutique5StoreC5itemsSayxGvp","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/items":{"role":"symbol","title":"items","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]"}],"abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/items"},"doc://Boutique/documentation/Boutique/Store/removeAll()-9zfmy":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-9zfmy","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-9zfmy"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-3nzlq":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-3nzlq","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/remove(_:)-3nzlq"}}} \ No newline at end of file +{"metadata":{"title":"items","roleHeading":"Instance Property","symbolKind":"property","fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"kind":"identifier","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]"}],"modules":[{"name":"Boutique"}],"externalID":"s:8Boutique5StoreC5itemsSayxGvp","role":"symbol"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"sections":[],"kind":"symbol","schemaVersion":{"major":0,"minor":3,"patch":0},"abstract":[{"text":"The items held onto by the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":".","type":"text"}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/items"]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","interfaceLanguage":"swift"},"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"attribute","text":"@"},{"text":"MainActor","preciseIdentifier":"s:ScM","kind":"attribute"},{"text":" ","kind":"text"},{"text":"@","kind":"attribute"},{"text":"Published","kind":"attribute","preciseIdentifier":"s:7Combine9PublishedV"},{"kind":"text","text":" "},{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"text":"items","kind":"identifier"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"text":"] { ","kind":"text"},{"kind":"keyword","text":"get"},{"text":" ","kind":"text"},{"kind":"keyword","text":"set"},{"kind":"text","text":" }"}],"platforms":["macOS"],"languages":["swift"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"inlineContent":[{"text":"The user can read the state of ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","type":"reference","isActive":true},{"type":"text","text":" at any time"},{"type":"text","text":" "},{"text":"or subscribe to it however they wish, but you desire making modifications to ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","isActive":true},{"text":" ","type":"text"},{"text":"you must use ","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":", "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-3nzlq","type":"reference","isActive":true},{"type":"text","text":", or "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-9zfmy"},{"type":"text","text":"."}],"type":"paragraph"}]}],"references":{"doc://Boutique/documentation/Boutique/Store/removeAll()-9zfmy":{"title":"removeAll()","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-9zfmy","url":"\/documentation\/boutique\/store\/removeall()-9zfmy","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"text":"() ","kind":"text"},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"kind":"symbol","role":"symbol","type":"topic"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-3nzlq":{"title":"remove(_:)","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-3nzlq","url":"\/documentation\/boutique\/store\/remove(_:)-3nzlq","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","role":"symbol","type":"topic"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/items":{"url":"\/documentation\/boutique\/store\/items","role":"symbol","abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","title":"items","type":"topic","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"text":": [","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"]","kind":"text"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/itemshaveloaded().json b/docs/data/documentation/boutique/store/itemshaveloaded().json index b50ec15..bc2c20f 100644 --- a/docs/data/documentation/boutique/store/itemshaveloaded().json +++ b/docs/data/documentation/boutique/store/itemshaveloaded().json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"itemsHaveLoaded"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"When initializing a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" in a non-async context, the items are loaded in a background task."},{"type":"text","text":" "},{"type":"text","text":"This functions provides a way to "},{"type":"codeVoice","code":"await"},{"type":"text","text":" its completion before accessing the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":"."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/itemshaveloaded()"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/itemsHaveLoaded()","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Awaits for "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" to be loaded."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"itemsHaveLoaded"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"title":"itemsHaveLoaded()","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique5StoreC15itemsHaveLoadedyyYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Store/itemsHaveLoaded()":{"role":"symbol","title":"itemsHaveLoaded()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"itemsHaveLoaded"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Awaits for "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" to be loaded."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/itemsHaveLoaded()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/itemshaveloaded()"},"doc://Boutique/documentation/Boutique/Store/items":{"role":"symbol","title":"items","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]"}],"abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/items"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"}}} \ No newline at end of file +{"primaryContentSections":[{"declarations":[{"languages":["swift"],"tokens":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"itemsHaveLoaded","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"}],"platforms":["macOS"]}],"kind":"declarations"},{"kind":"content","content":[{"level":2,"type":"heading","text":"Discussion","anchor":"discussion"},{"inlineContent":[{"type":"text","text":"When initializing a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"type":"text","text":" in a non-async context, the items are loaded in a background task."},{"type":"text","text":" "},{"type":"text","text":"This functions provides a way to "},{"type":"codeVoice","code":"await"},{"text":" its completion before accessing the ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"text":".","type":"text"}],"type":"paragraph"}]}],"kind":"symbol","sections":[],"metadata":{"roleHeading":"Instance Method","symbolKind":"method","modules":[{"name":"Boutique"}],"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"itemsHaveLoaded","kind":"identifier"},{"text":"() ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"}],"title":"itemsHaveLoaded()","role":"symbol","externalID":"s:8Boutique5StoreC15itemsHaveLoadedyyYaKF"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"variants":[{"paths":["\/documentation\/boutique\/store\/itemshaveloaded()"],"traits":[{"interfaceLanguage":"swift"}]}],"schemaVersion":{"patch":0,"minor":3,"major":0},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/itemsHaveLoaded()","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Awaits for "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" to be loaded."}],"references":{"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/itemsHaveLoaded()":{"url":"\/documentation\/boutique\/store\/itemshaveloaded()","type":"topic","title":"itemsHaveLoaded()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/itemsHaveLoaded()","role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"itemsHaveLoaded","kind":"identifier"},{"text":"() ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Awaits for "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" to be loaded."}]},"doc://Boutique/documentation/Boutique/Store/items":{"url":"\/documentation\/boutique\/store\/items","role":"symbol","abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","title":"items","type":"topic","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"text":": [","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"]","kind":"text"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/objectwillchange.json b/docs/data/documentation/boutique/store/objectwillchange.json index 8caa34c..ae7c0e2 100644 --- a/docs/data/documentation/boutique/store/objectwillchange.json +++ b/docs/data/documentation/boutique/store/objectwillchange.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"objectWillChange"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"ObservableObjectPublisher","preciseIdentifier":"s:7Combine25ObservableObjectPublisherC"},{"kind":"text","text":" { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/objectwillchange"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/objectWillChange","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Inherited from "},{"type":"codeVoice","code":"ObservableObject.objectWillChange"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"modules":[{"name":"Boutique"}],"conformance":{"constraints":[{"type":"codeVoice","code":"ObjectWillChangePublisher"},{"type":"text","text":" is "},{"type":"codeVoice","code":"ObservableObjectPublisher"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"objectWillChange","roleHeading":"Instance Property","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"objectWillChange"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"ObservableObjectPublisher","preciseIdentifier":"s:7Combine25ObservableObjectPublisherC"}],"symbolKind":"property","externalID":"s:7Combine16ObservableObjectPA2A0bC9PublisherC0c10WillChangeD0RtzrlE06objecteF0AEvp::SYNTHESIZED::s:8Boutique5StoreC","extendedModule":"Combine","platforms":[{"beta":false,"unavailable":false,"name":"iOS","introducedAt":"13.0","deprecated":false},{"beta":false,"unavailable":false,"name":"macOS","introducedAt":"10.15","deprecated":false},{"beta":false,"unavailable":false,"name":"tvOS","introducedAt":"13.0","deprecated":false},{"beta":false,"unavailable":false,"name":"watchOS","introducedAt":"6.0","deprecated":false}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/ObservableObject-Implementations"]]},"references":{"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/objectWillChange":{"conformance":{"constraints":[{"type":"codeVoice","code":"ObjectWillChangePublisher"},{"type":"text","text":" is "},{"type":"codeVoice","code":"ObservableObjectPublisher"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"objectWillChange","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"objectWillChange"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"ObservableObjectPublisher","preciseIdentifier":"s:7Combine25ObservableObjectPublisherC"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/objectWillChange","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/objectwillchange"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/ObservableObject-Implementations":{"role":"collectionGroup","title":"ObservableObject Implementations","abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/ObservableObject-Implementations","kind":"article","type":"topic","url":"\/documentation\/boutique\/store\/observableobject-implementations"}}} \ No newline at end of file +{"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/ObservableObject-Implementations"]]},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/objectWillChange"},"sections":[],"schemaVersion":{"minor":3,"patch":0,"major":0},"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"text":"objectWillChange","kind":"identifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"ObservableObjectPublisher","preciseIdentifier":"s:7Combine25ObservableObjectPublisherC"},{"kind":"text","text":" { "},{"text":"get","kind":"keyword"},{"kind":"text","text":" }"}]}]}],"kind":"symbol","abstract":[{"text":"Inherited from ","type":"text"},{"type":"codeVoice","code":"ObservableObject.objectWillChange"},{"type":"text","text":"."}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/objectwillchange"]}],"metadata":{"title":"objectWillChange","extendedModule":"Combine","modules":[{"name":"Boutique","relatedModules":["Combine"]}],"roleHeading":"Instance Property","symbolKind":"property","fragments":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"objectWillChange"},{"kind":"text","text":": "},{"text":"ObservableObjectPublisher","kind":"typeIdentifier","preciseIdentifier":"s:7Combine25ObservableObjectPublisherC"}],"role":"symbol","conformance":{"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"constraints":[{"type":"codeVoice","code":"ObjectWillChangePublisher"},{"type":"text","text":" is "},{"type":"codeVoice","code":"ObservableObjectPublisher"},{"type":"text","text":"."}]},"platforms":[{"deprecated":false,"introducedAt":"13.0","beta":false,"name":"iOS","unavailable":false},{"name":"macOS","introducedAt":"10.15","beta":false,"deprecated":false,"unavailable":false},{"deprecated":false,"name":"tvOS","introducedAt":"13.0","beta":false,"unavailable":false},{"unavailable":false,"beta":false,"introducedAt":"6.0","deprecated":false,"name":"watchOS"}],"externalID":"s:7Combine16ObservableObjectPA2A0bC9PublisherC0c10WillChangeD0RtzrlE06objecteF0AEvp::SYNTHESIZED::s:8Boutique5StoreC"},"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/ObservableObject-Implementations":{"url":"\/documentation\/boutique\/store\/observableobject-implementations","type":"topic","title":"ObservableObject Implementations","kind":"article","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/ObservableObject-Implementations","role":"collectionGroup","abstract":[]},"doc://Boutique/documentation/Boutique/Store/objectWillChange":{"conformance":{"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"constraints":[{"code":"ObjectWillChangePublisher","type":"codeVoice"},{"text":" is ","type":"text"},{"type":"codeVoice","code":"ObservableObjectPublisher"},{"type":"text","text":"."}]},"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/objectWillChange","kind":"symbol","fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"text":"objectWillChange","kind":"identifier"},{"text":": ","kind":"text"},{"text":"ObservableObjectPublisher","kind":"typeIdentifier","preciseIdentifier":"s:7Combine25ObservableObjectPublisherC"}],"type":"topic","url":"\/documentation\/boutique\/store\/objectwillchange","abstract":[],"title":"objectWillChange"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/observableobject-implementations.json b/docs/data/documentation/boutique/store/observableobject-implementations.json index 32d84f9..6d01e49 100644 --- a/docs/data/documentation/boutique/store/observableobject-implementations.json +++ b/docs/data/documentation/boutique/store/observableobject-implementations.json @@ -1 +1 @@ -{"variants":[{"paths":["\/documentation\/boutique\/store\/observableobject-implementations"],"traits":[{"interfaceLanguage":"swift"}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/ObservableObject-Implementations","interfaceLanguage":"swift"},"topicSections":[{"title":"Instance Properties","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/objectWillChange"],"generated":true}],"kind":"article","metadata":{"modules":[{"name":"Boutique"}],"role":"collectionGroup","title":"ObservableObject Implementations"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Store/objectWillChange":{"conformance":{"constraints":[{"type":"codeVoice","code":"ObjectWillChangePublisher"},{"type":"text","text":" is "},{"type":"codeVoice","code":"ObservableObjectPublisher"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"objectWillChange","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"objectWillChange"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"ObservableObjectPublisher","preciseIdentifier":"s:7Combine25ObservableObjectPublisherC"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/objectWillChange","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/objectwillchange"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file +{"sections":[],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/ObservableObject-Implementations","interfaceLanguage":"swift"},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/observableobject-implementations"]}],"topicSections":[{"title":"Instance Properties","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/objectWillChange"],"generated":true}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"kind":"article","metadata":{"modules":[{"name":"Boutique"}],"roleHeading":"API Collection","role":"collectionGroup","title":"ObservableObject Implementations"},"schemaVersion":{"major":0,"patch":0,"minor":3},"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/objectWillChange":{"conformance":{"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"constraints":[{"code":"ObjectWillChangePublisher","type":"codeVoice"},{"text":" is ","type":"text"},{"type":"codeVoice","code":"ObservableObjectPublisher"},{"type":"text","text":"."}]},"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/objectWillChange","kind":"symbol","fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"text":"objectWillChange","kind":"identifier"},{"text":": ","kind":"text"},{"text":"ObservableObjectPublisher","kind":"typeIdentifier","preciseIdentifier":"s:7Combine25ObservableObjectPublisherC"}],"type":"topic","url":"\/documentation\/boutique\/store\/objectwillchange","abstract":[],"title":"objectWillChange"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/operation.json b/docs/data/documentation/boutique/store/operation.json index 72d96bd..3e1aedb 100644 --- a/docs/data/documentation/boutique/store/operation.json +++ b/docs/data/documentation/boutique/store/operation.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"final"},{"kind":"text","text":" "},{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"overview","level":2,"type":"heading","text":"Overview"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This allows for simple fluent syntax such as "},{"type":"codeVoice","code":"store.removeAll().insert(items)"},{"type":"text","text":", rather than having"},{"type":"text","text":" "},{"type":"text","text":"them be split over two operations, and making two separate dispatches to the "},{"type":"codeVoice","code":"@MainActor"},{"type":"text","text":"."},{"type":"text","text":" "},{"type":"text","text":"(Dispatching to the main actor multiple times can lead to users seeing odd visual experiences"},{"type":"text","text":" "},{"type":"text","text":"in SwiftUI apps, which is why Boutique goes to great lengths to help avoid that.)"}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/operation"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"An operation is a type that allows you to stack "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"type":"text","text":" calls in a chained manner."}],"kind":"symbol","metadata":{"navigatorTitle":[{"kind":"identifier","text":"Operation"}],"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.Operation","roleHeading":"Class","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"symbolKind":"class","externalID":"s:8Boutique5StoreC9OperationC","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"topicSections":[{"title":"Instance Methods","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/add(_:)-70drz","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/add(_:)-82sdc","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-1nu61","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-32lwk","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-2tqlz","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/removeAll()","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/run()"]}],"references":{"doc://Boutique/documentation/Boutique/Store/Operation/run()":{"role":"symbol","title":"run()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"run"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"A function that runs a series of chained operations."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/run()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/run()"},"doc://Boutique/documentation/Boutique/Store/Operation/insert(_:)-1nu61":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-1nu61","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/insert(_:)-1nu61"},"doc://Boutique/documentation/Boutique/Store/Operation/add(_:)-82sdc":{"role":"symbol","title":"add(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Adds an item to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/add(_:)-82sdc","kind":"symbol","type":"topic","deprecated":true,"url":"\/documentation\/boutique\/store\/operation\/add(_:)-82sdc"},"doc://Boutique/documentation/Boutique/Store/Operation/insert(_:)-32lwk":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an array of items into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-32lwk","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/insert(_:)-32lwk"},"doc://Boutique/documentation/Boutique/Store/Operation/add(_:)-70drz":{"role":"symbol","title":"add(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Adds an array of items to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/add(_:)-70drz","kind":"symbol","type":"topic","deprecated":true,"url":"\/documentation\/boutique\/store\/operation\/add(_:)-70drz"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-2tqlz":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-2tqlz","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-2tqlz"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24"},"doc://Boutique/documentation/Boutique/Store/Operation/removeAll()":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"’s memory cache and StorageEngine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/removeAll()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/removeall()"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"},"doc://Boutique/documentation/Boutique/Store/Operation":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.Operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"abstract":[{"type":"text","text":"An operation is a type that allows you to stack "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"type":"text","text":" calls in a chained manner."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Operation"}],"url":"\/documentation\/boutique\/store\/operation"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"}}} \ No newline at end of file +{"sections":[],"topicSections":[{"title":"Instance Methods","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/add(_:)-70drz","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/add(_:)-82sdc","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-1nu61","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-32lwk","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-2tqlz","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/removeAll()","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/run()"]}],"variants":[{"paths":["\/documentation\/boutique\/store\/operation"],"traits":[{"interfaceLanguage":"swift"}]}],"metadata":{"roleHeading":"Class","extendedModule":"Boutique","externalID":"s:8Boutique5StoreC9OperationC","symbolKind":"class","title":"Store.Operation","modules":[{"name":"Boutique"}],"role":"symbol","conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"text":", and ","type":"text"},{"code":"Sendable","type":"codeVoice"},{"text":".","type":"text"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"type":"text","text":"Available when"}]},"navigatorTitle":[{"kind":"identifier","text":"Operation"}],"fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}]},"abstract":[{"text":"An operation is a type that allows you to stack ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","isActive":true,"type":"reference"},{"type":"text","text":","},{"type":"text","text":" "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","isActive":true,"type":"reference"},{"type":"text","text":" calls in a chained manner."}],"kind":"symbol","schemaVersion":{"minor":3,"major":0,"patch":0},"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"text":"final","kind":"keyword"},{"kind":"text","text":" "},{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Operation","kind":"identifier"}],"platforms":["macOS"],"languages":["swift"]}]},{"kind":"content","content":[{"anchor":"overview","type":"heading","level":2,"text":"Overview"},{"type":"paragraph","inlineContent":[{"text":"This allows for simple fluent syntax such as ","type":"text"},{"type":"codeVoice","code":"store.removeAll().insert(items)"},{"type":"text","text":", rather than having"},{"type":"text","text":" "},{"type":"text","text":"them be split over two operations, and making two separate dispatches to the "},{"type":"codeVoice","code":"@MainActor"},{"type":"text","text":"."},{"text":" ","type":"text"},{"type":"text","text":"(Dispatching to the main actor multiple times can lead to users seeing odd visual experiences"},{"type":"text","text":" "},{"type":"text","text":"in SwiftUI apps, which is why Boutique goes to great lengths to help avoid that.)"}]}]}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","interfaceLanguage":"swift"},"references":{"doc://Boutique/documentation/Boutique/Store/Operation/add(_:)-70drz":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/add(_:)-70drz","title":"add(_:)","type":"topic","abstract":[{"text":"Adds an array of items to the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":".","type":"text"}],"role":"symbol","kind":"symbol","url":"\/documentation\/boutique\/store\/operation\/add(_:)-70drz","deprecated":true,"fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-2tqlz":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-2tqlz","title":"remove(_:)","abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"role":"symbol","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-2tqlz","kind":"symbol","type":"topic","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","text":"Store","kind":"typeIdentifier"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique/Store/Operation/insert(_:)-32lwk":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-32lwk","role":"symbol","abstract":[{"text":"Inserts an array of items into the ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"text":".","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/insert(_:)-32lwk","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/Operation":{"title":"Store.Operation","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","role":"symbol","abstract":[{"text":"An operation is a type that allows you to stack ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","type":"reference","isActive":true},{"text":",","type":"text"},{"text":" ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"text":" calls in a chained manner.","type":"text"}],"conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}]},"type":"topic","url":"\/documentation\/boutique\/store\/operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"text":"Operation","kind":"identifier"}],"navigatorTitle":[{"kind":"identifier","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/Operation/removeAll()":{"title":"removeAll()","type":"topic","url":"\/documentation\/boutique\/store\/operation\/removeall()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/removeAll()","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"’s memory cache and StorageEngine."}],"fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"text":" -> ","kind":"text"},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","kind":"typeIdentifier","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/Operation/run()":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/run()","title":"run()","abstract":[{"text":"A function that runs a series of chained operations.","type":"text"}],"role":"symbol","url":"\/documentation\/boutique\/store\/operation\/run()","kind":"symbol","type":"topic","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"run"},{"text":"() ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}]},"doc://Boutique/documentation/Boutique/Store/Operation/insert(_:)-1nu61":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-1nu61","role":"symbol","abstract":[{"type":"text","text":"Inserts an item into the "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":".","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/insert(_:)-1nu61","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"text":" -> ","kind":"text"},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","role":"symbol","abstract":[{"text":"Removes an item from the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"title":"removeAll()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/Operation/add(_:)-82sdc":{"url":"\/documentation\/boutique\/store\/operation\/add(_:)-82sdc","title":"add(_:)","role":"symbol","kind":"symbol","deprecated":true,"type":"topic","abstract":[{"text":"Adds an item to the ","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":".","type":"text"}],"fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"add","kind":"identifier"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/add(_:)-82sdc"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/operation/add(_:)-70drz.json b/docs/data/documentation/boutique/store/operation/add(_:)-70drz.json index 625ee97..9337b88 100644 --- a/docs/data/documentation/boutique/store/operation/add(_:)-70drz.json +++ b/docs/data/documentation/boutique/store/operation/add(_:)-70drz.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"items","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The items to add to the store."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Prefer inserting multiple items using this method instead of calling "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-1nu61"},{"type":"text","text":" "},{"type":"text","text":"multiple times to avoid making multiple separate dispatches to the "},{"type":"codeVoice","code":"@MainActor"},{"type":"text","text":"."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/operation\/add(_:)-70drz"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/add(_:)-70drz","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Adds an array of items to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"role":"symbol","title":"add(_:)","roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"symbolKind":"method","externalID":"s:8Boutique5StoreC9OperationC3addyAEyx_GSayxGYaKF","modules":[{"name":"Boutique"}],"platforms":[]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"]]},"deprecationSummary":[{"type":"paragraph","inlineContent":[{"type":"text","text":"This method is functionally equivalent to `insert` and will be removed in a future release. After using Boutique in practice for a while I decided that insert was a more semantically correct name for this operation on a Store, if you'd like to learn more you can see the discussion here. https:\/\/github.com\/mergesort\/Boutique\/discussions\/36"}]}],"references":{"doc://Boutique/documentation/Boutique/Store/Operation/insert(_:)-1nu61":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-1nu61","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/insert(_:)-1nu61"},"doc://Boutique/documentation/Boutique/Store/Operation/add(_:)-70drz":{"role":"symbol","title":"add(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Adds an array of items to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/add(_:)-70drz","kind":"symbol","type":"topic","deprecated":true,"url":"\/documentation\/boutique\/store\/operation\/add(_:)-70drz"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/Operation":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.Operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"abstract":[{"type":"text","text":"An operation is a type that allows you to stack "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"type":"text","text":" calls in a chained manner."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Operation"}],"url":"\/documentation\/boutique\/store\/operation"}}} \ No newline at end of file +{"abstract":[{"text":"Adds an array of items to the ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":".","type":"text"}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"]]},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/add(_:)-70drz"},"deprecationSummary":[{"type":"paragraph","inlineContent":[{"type":"text","text":"This method is functionally equivalent to `insert` and will be removed in a future release. After using Boutique in practice for a while I decided that insert was a more semantically correct name for this operation on a Store, if you'd like to learn more you can see the discussion here. https:\/\/github.com\/mergesort\/Boutique\/discussions\/36"}]}],"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"tokens":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"add"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"items"},{"text":": [","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":"]) ","kind":"text"},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"text":" -> ","kind":"text"},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"text":"Operation","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","kind":"typeIdentifier"}],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"items","content":[{"type":"paragraph","inlineContent":[{"text":"The items to add to the store.","type":"text"}]}]}]},{"content":[{"text":"Discussion","anchor":"discussion","type":"heading","level":2},{"inlineContent":[{"type":"text","text":"Prefer inserting multiple items using this method instead of calling "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-1nu61","isActive":true,"type":"reference"},{"type":"text","text":" "},{"type":"text","text":"multiple times to avoid making multiple separate dispatches to the "},{"type":"codeVoice","code":"@MainActor"},{"text":".","type":"text"}],"type":"paragraph"}],"kind":"content"}],"schemaVersion":{"minor":3,"major":0,"patch":0},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/operation\/add(_:)-70drz"]}],"kind":"symbol","metadata":{"fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"add"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"title":"add(_:)","platforms":[],"externalID":"s:8Boutique5StoreC9OperationC3addyAEyx_GSayxGYaKF","role":"symbol","roleHeading":"Instance Method","symbolKind":"method","modules":[{"name":"Boutique"}]},"sections":[],"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"title":"removeAll()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/Operation/add(_:)-70drz":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/add(_:)-70drz","title":"add(_:)","type":"topic","abstract":[{"text":"Adds an array of items to the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":".","type":"text"}],"role":"symbol","kind":"symbol","url":"\/documentation\/boutique\/store\/operation\/add(_:)-70drz","deprecated":true,"fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier"}]},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","role":"symbol","abstract":[{"text":"Removes an item from the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/Operation":{"title":"Store.Operation","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","role":"symbol","abstract":[{"text":"An operation is a type that allows you to stack ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","type":"reference","isActive":true},{"text":",","type":"text"},{"text":" ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"text":" calls in a chained manner.","type":"text"}],"conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}]},"type":"topic","url":"\/documentation\/boutique\/store\/operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"text":"Operation","kind":"identifier"}],"navigatorTitle":[{"kind":"identifier","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/Operation/insert(_:)-1nu61":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-1nu61","role":"symbol","abstract":[{"type":"text","text":"Inserts an item into the "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":".","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/insert(_:)-1nu61","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"text":" -> ","kind":"text"},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/operation/add(_:)-82sdc.json b/docs/data/documentation/boutique/store/operation/add(_:)-82sdc.json index ec86264..496c928 100644 --- a/docs/data/documentation/boutique/store/operation/add(_:)-82sdc.json +++ b/docs/data/documentation/boutique/store/operation/add(_:)-82sdc.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"item"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"item","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The item you are adding to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"When an item is inserted with the same "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" as an item that already exists in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" "},{"type":"text","text":"the item being inserted will replace the item in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":". You can think of the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" as a bag"},{"type":"text","text":" "},{"type":"text","text":"of items, removing complexity when it comes to managing items, indices, and more,"},{"type":"text","text":" "},{"type":"text","text":"but it also means you need to choose well thought out and uniquely identifying "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":"s."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/operation\/add(_:)-82sdc"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/add(_:)-82sdc","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Adds an item to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"role":"symbol","title":"add(_:)","roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"symbolKind":"method","externalID":"s:8Boutique5StoreC9OperationC3addyAEyx_GxYaKF","modules":[{"name":"Boutique"}],"platforms":[]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"]]},"deprecationSummary":[{"type":"paragraph","inlineContent":[{"type":"text","text":"This method is functionally equivalent to `insert` and will be removed in a future release. After using Boutique in practice for a while I decided that insert was a more semantically correct name for this operation on a Store, if you'd like to learn more you can see the discussion here. https:\/\/github.com\/mergesort\/Boutique\/discussions\/36"}]}],"references":{"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24"},"doc://Boutique/documentation/Boutique/Store/Operation/add(_:)-82sdc":{"role":"symbol","title":"add(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Adds an item to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/add(_:)-82sdc","kind":"symbol","type":"topic","deprecated":true,"url":"\/documentation\/boutique\/store\/operation\/add(_:)-82sdc"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/Operation":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.Operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"abstract":[{"type":"text","text":"An operation is a type that allows you to stack "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"type":"text","text":" calls in a chained manner."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Operation"}],"url":"\/documentation\/boutique\/store\/operation"}}} \ No newline at end of file +{"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"languages":["swift"],"tokens":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"add","kind":"identifier"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"_"},{"text":" ","kind":"text"},{"kind":"internalParam","text":"item"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"text":" -> ","kind":"text"},{"text":"Store","preciseIdentifier":"s:8Boutique5StoreC","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"typeIdentifier"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"text":"Operation","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","kind":"typeIdentifier"}]}]},{"kind":"parameters","parameters":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The item you are adding to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":".","type":"text"}]}],"name":"item"}]},{"kind":"content","content":[{"type":"heading","anchor":"discussion","level":2,"text":"Discussion"},{"inlineContent":[{"text":"When an item is inserted with the same ","type":"text"},{"code":"cacheIdentifier","type":"codeVoice"},{"type":"text","text":" as an item that already exists in the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"type":"text","text":" "},{"type":"text","text":"the item being inserted will replace the item in the "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":". You can think of the ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" as a bag"},{"type":"text","text":" "},{"text":"of items, removing complexity when it comes to managing items, indices, and more,","type":"text"},{"type":"text","text":" "},{"type":"text","text":"but it also means you need to choose well thought out and uniquely identifying "},{"type":"codeVoice","code":"cacheIdentifier"},{"text":"s.","type":"text"}],"type":"paragraph"}]}],"sections":[],"schemaVersion":{"major":0,"patch":0,"minor":3},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/add(_:)-82sdc","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Adds an item to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":".","type":"text"}],"kind":"symbol","deprecationSummary":[{"type":"paragraph","inlineContent":[{"text":"This method is functionally equivalent to `insert` and will be removed in a future release. After using Boutique in practice for a while I decided that insert was a more semantically correct name for this operation on a Store, if you'd like to learn more you can see the discussion here. https:\/\/github.com\/mergesort\/Boutique\/discussions\/36","type":"text"}]}],"metadata":{"title":"add(_:)","role":"symbol","symbolKind":"method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"add"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"text":" -> ","kind":"text"},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier"}],"platforms":[],"modules":[{"name":"Boutique"}],"roleHeading":"Instance Method","externalID":"s:8Boutique5StoreC9OperationC3addyAEyx_GxYaKF"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"]]},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/operation\/add(_:)-82sdc"]}],"references":{"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","role":"symbol","abstract":[{"text":"Removes an item from the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/Operation/add(_:)-82sdc":{"url":"\/documentation\/boutique\/store\/operation\/add(_:)-82sdc","title":"add(_:)","role":"symbol","kind":"symbol","deprecated":true,"type":"topic","abstract":[{"text":"Adds an item to the ","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":".","type":"text"}],"fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"add","kind":"identifier"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/add(_:)-82sdc"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"title":"removeAll()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/Operation":{"title":"Store.Operation","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","role":"symbol","abstract":[{"text":"An operation is a type that allows you to stack ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","type":"reference","isActive":true},{"text":",","type":"text"},{"text":" ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"text":" calls in a chained manner.","type":"text"}],"conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}]},"type":"topic","url":"\/documentation\/boutique\/store\/operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"text":"Operation","kind":"identifier"}],"navigatorTitle":[{"kind":"identifier","text":"Operation"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/operation/insert(_:)-1nu61.json b/docs/data/documentation/boutique/store/operation/insert(_:)-1nu61.json index ac8520b..556135e 100644 --- a/docs/data/documentation/boutique/store/operation/insert(_:)-1nu61.json +++ b/docs/data/documentation/boutique/store/operation/insert(_:)-1nu61.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"item"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"item","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The item you are inserting into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"When an item is inserted with the same "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" as an item that already exists in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" "},{"type":"text","text":"the item being inserted will replace the item in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":". You can think of the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" as a bag"},{"type":"text","text":" "},{"type":"text","text":"of items, removing complexity when it comes to managing items, indices, and more,"},{"type":"text","text":" "},{"type":"text","text":"but it also means you need to choose well thought out and uniquely identifying "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":"s."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/operation\/insert(_:)-1nu61"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-1nu61","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Inserts an item into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"title":"insert(_:)","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique5StoreC9OperationC6insertyAEyx_GxYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"]]},"references":{"doc://Boutique/documentation/Boutique/Store/Operation/insert(_:)-1nu61":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-1nu61","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/insert(_:)-1nu61"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"},"doc://Boutique/documentation/Boutique/Store/Operation":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.Operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"abstract":[{"type":"text","text":"An operation is a type that allows you to stack "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"type":"text","text":" calls in a chained manner."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Operation"}],"url":"\/documentation\/boutique\/store\/operation"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file +{"kind":"symbol","metadata":{"externalID":"s:8Boutique5StoreC9OperationC6insertyAEyx_GxYaKF","symbolKind":"method","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"insert","kind":"identifier"},{"text":"(","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"modules":[{"name":"Boutique"}],"role":"symbol","title":"insert(_:)","roleHeading":"Instance Method"},"abstract":[{"type":"text","text":"Inserts an item into the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/operation\/insert(_:)-1nu61"]}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-1nu61"},"sections":[],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"]]},"schemaVersion":{"major":0,"patch":0,"minor":3},"primaryContentSections":[{"declarations":[{"tokens":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"insert"},{"text":"(","kind":"text"},{"text":"_","kind":"externalParam"},{"text":" ","kind":"text"},{"kind":"internalParam","text":"item"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","text":"Operation","kind":"typeIdentifier"}],"platforms":["macOS"],"languages":["swift"]}],"kind":"declarations"},{"parameters":[{"name":"item","content":[{"type":"paragraph","inlineContent":[{"text":"The item you are inserting into the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}]}]}],"kind":"parameters"},{"kind":"content","content":[{"type":"heading","level":2,"text":"Discussion","anchor":"discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"When an item is inserted with the same "},{"code":"cacheIdentifier","type":"codeVoice"},{"text":" as an item that already exists in the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" "},{"text":"the item being inserted will replace the item in the ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":". You can think of the ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" as a bag"},{"type":"text","text":" "},{"text":"of items, removing complexity when it comes to managing items, indices, and more,","type":"text"},{"type":"text","text":" "},{"type":"text","text":"but it also means you need to choose well thought out and uniquely identifying "},{"type":"codeVoice","code":"cacheIdentifier"},{"text":"s.","type":"text"}]}]}],"references":{"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","role":"symbol","abstract":[{"text":"Removes an item from the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"title":"removeAll()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/Operation/insert(_:)-1nu61":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-1nu61","role":"symbol","abstract":[{"type":"text","text":"Inserts an item into the "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":".","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/insert(_:)-1nu61","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"text":" -> ","kind":"text"},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique/Store/Operation":{"title":"Store.Operation","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","role":"symbol","abstract":[{"text":"An operation is a type that allows you to stack ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","type":"reference","isActive":true},{"text":",","type":"text"},{"text":" ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"text":" calls in a chained manner.","type":"text"}],"conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}]},"type":"topic","url":"\/documentation\/boutique\/store\/operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"text":"Operation","kind":"identifier"}],"navigatorTitle":[{"kind":"identifier","text":"Operation"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/operation/insert(_:)-32lwk.json b/docs/data/documentation/boutique/store/operation/insert(_:)-32lwk.json index 4d46624..816b4ad 100644 --- a/docs/data/documentation/boutique/store/operation/insert(_:)-32lwk.json +++ b/docs/data/documentation/boutique/store/operation/insert(_:)-32lwk.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"items","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The items to insert into the store."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Prefer inserting multiple items using this method instead of calling "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-1nu61"},{"type":"text","text":" "},{"type":"text","text":"multiple times to avoid making multiple separate dispatches to the "},{"type":"codeVoice","code":"@MainActor"},{"type":"text","text":"."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/operation\/insert(_:)-32lwk"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-32lwk","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Inserts an array of items into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"title":"insert(_:)","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique5StoreC9OperationC6insertyAEyx_GSayxGYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"]]},"references":{"doc://Boutique/documentation/Boutique/Store/Operation/insert(_:)-1nu61":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-1nu61","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/insert(_:)-1nu61"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"},"doc://Boutique/documentation/Boutique/Store/Operation/insert(_:)-32lwk":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an array of items into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-32lwk","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/insert(_:)-32lwk"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/Operation":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.Operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"abstract":[{"type":"text","text":"An operation is a type that allows you to stack "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"type":"text","text":" calls in a chained manner."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Operation"}],"url":"\/documentation\/boutique\/store\/operation"}}} \ No newline at end of file +{"abstract":[{"type":"text","text":"Inserts an array of items into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":".","type":"text"}],"metadata":{"role":"symbol","fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"insert"},{"text":"([","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":"]) ","kind":"text"},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"text":" -> ","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"symbolKind":"method","roleHeading":"Instance Method","title":"insert(_:)","externalID":"s:8Boutique5StoreC9OperationC6insertyAEyx_GSayxGYaKF","modules":[{"name":"Boutique"}]},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/operation\/insert(_:)-32lwk"]}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-32lwk"},"kind":"symbol","schemaVersion":{"major":0,"minor":3,"patch":0},"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"insert","kind":"identifier"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"items"},{"text":": [","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"}]}]},{"kind":"parameters","parameters":[{"name":"items","content":[{"inlineContent":[{"type":"text","text":"The items to insert into the store."}],"type":"paragraph"}]}]},{"kind":"content","content":[{"text":"Discussion","type":"heading","anchor":"discussion","level":2},{"inlineContent":[{"type":"text","text":"Prefer inserting multiple items using this method instead of calling "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-1nu61"},{"text":" ","type":"text"},{"text":"multiple times to avoid making multiple separate dispatches to the ","type":"text"},{"type":"codeVoice","code":"@MainActor"},{"text":".","type":"text"}],"type":"paragraph"}]}],"sections":[],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"]]},"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/Operation":{"title":"Store.Operation","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","role":"symbol","abstract":[{"text":"An operation is a type that allows you to stack ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","type":"reference","isActive":true},{"text":",","type":"text"},{"text":" ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"text":" calls in a chained manner.","type":"text"}],"conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}]},"type":"topic","url":"\/documentation\/boutique\/store\/operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"text":"Operation","kind":"identifier"}],"navigatorTitle":[{"kind":"identifier","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","role":"symbol","abstract":[{"text":"Removes an item from the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/Operation/insert(_:)-1nu61":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-1nu61","role":"symbol","abstract":[{"type":"text","text":"Inserts an item into the "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":".","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/insert(_:)-1nu61","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"text":" -> ","kind":"text"},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique/Store/Operation/insert(_:)-32lwk":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/insert(_:)-32lwk","role":"symbol","abstract":[{"text":"Inserts an array of items into the ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"text":".","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/insert(_:)-32lwk","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"title":"removeAll()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/operation/remove(_:)-2tqlz.json b/docs/data/documentation/boutique/store/operation/remove(_:)-2tqlz.json index 9ff3d57..e8ba6ba 100644 --- a/docs/data/documentation/boutique/store/operation/remove(_:)-2tqlz.json +++ b/docs/data/documentation/boutique/store/operation/remove(_:)-2tqlz.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"item","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The items you are removing from the "},{"type":"codeVoice","code":"Store"},{"type":"text","text":"."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Prefer removing multiple items using this method instead of calling "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":" "},{"type":"text","text":"multiple times to avoid making multiple separate dispatches to the "},{"type":"codeVoice","code":"@MainActor"},{"type":"text","text":"."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/operation\/remove(_:)-2tqlz"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-2tqlz","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"title":"remove(_:)","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique5StoreC9OperationC6removeyAEyx_GSayxGYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"]]},"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-2tqlz":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-2tqlz","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-2tqlz"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24"},"doc://Boutique/documentation/Boutique/Store/Operation":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.Operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"abstract":[{"type":"text","text":"An operation is a type that allows you to stack "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"type":"text","text":" calls in a chained manner."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Operation"}],"url":"\/documentation\/boutique\/store\/operation"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"}}} \ No newline at end of file +{"metadata":{"fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"text":"([","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":"]) ","kind":"text"},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","text":"Store","kind":"typeIdentifier"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"title":"remove(_:)","externalID":"s:8Boutique5StoreC9OperationC6removeyAEyx_GSayxGYaKF","role":"symbol","roleHeading":"Instance Method","symbolKind":"method","modules":[{"name":"Boutique"}]},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-2tqlz","interfaceLanguage":"swift"},"variants":[{"paths":["\/documentation\/boutique\/store\/operation\/remove(_:)-2tqlz"],"traits":[{"interfaceLanguage":"swift"}]}],"abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"text":"items","kind":"internalParam"},{"kind":"text","text":": ["},{"text":"Item","kind":"typeIdentifier"},{"text":"]) ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"text":" -> ","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC","text":"Store","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"typeIdentifier"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"typeIdentifier"}],"languages":["swift"]}]},{"kind":"parameters","parameters":[{"content":[{"inlineContent":[{"text":"The items you are removing from the ","type":"text"},{"type":"codeVoice","code":"Store"},{"text":".","type":"text"}],"type":"paragraph"}],"name":"item"}]},{"kind":"content","content":[{"type":"heading","level":2,"text":"Discussion","anchor":"discussion"},{"inlineContent":[{"type":"text","text":"Prefer removing multiple items using this method instead of calling "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":" "},{"type":"text","text":"multiple times to avoid making multiple separate dispatches to the "},{"type":"codeVoice","code":"@MainActor"},{"text":".","type":"text"}],"type":"paragraph"}]}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"]]},"kind":"symbol","sections":[],"schemaVersion":{"major":0,"minor":3,"patch":0},"references":{"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","role":"symbol","abstract":[{"text":"Removes an item from the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/Operation":{"title":"Store.Operation","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","role":"symbol","abstract":[{"text":"An operation is a type that allows you to stack ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","type":"reference","isActive":true},{"text":",","type":"text"},{"text":" ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"text":" calls in a chained manner.","type":"text"}],"conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}]},"type":"topic","url":"\/documentation\/boutique\/store\/operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"text":"Operation","kind":"identifier"}],"navigatorTitle":[{"kind":"identifier","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-2tqlz":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-2tqlz","title":"remove(_:)","abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"role":"symbol","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-2tqlz","kind":"symbol","type":"topic","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","text":"Store","kind":"typeIdentifier"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"title":"removeAll()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/operation/remove(_:)-8ufsb.json b/docs/data/documentation/boutique/store/operation/remove(_:)-8ufsb.json index d49b32a..0fbdb70 100644 --- a/docs/data/documentation/boutique/store/operation/remove(_:)-8ufsb.json +++ b/docs/data/documentation/boutique/store/operation/remove(_:)-8ufsb.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"item"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"item","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The item you are removing from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"title":"remove(_:)","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique5StoreC9OperationC6removeyAEyx_GxYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"]]},"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/Operation":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.Operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"abstract":[{"type":"text","text":"An operation is a type that allows you to stack "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"type":"text","text":" calls in a chained manner."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Operation"}],"url":"\/documentation\/boutique\/store\/operation"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24"}}} \ No newline at end of file +{"abstract":[{"type":"text","text":"Removes an item from the "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":".","type":"text"}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"]]},"kind":"symbol","variants":[{"paths":["\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"],"traits":[{"interfaceLanguage":"swift"}]}],"primaryContentSections":[{"declarations":[{"platforms":["macOS"],"tokens":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"_"},{"text":" ","kind":"text"},{"text":"item","kind":"internalParam"},{"kind":"text","text":": "},{"text":"Item","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"typeIdentifier"}],"languages":["swift"]}],"kind":"declarations"},{"kind":"parameters","parameters":[{"content":[{"type":"paragraph","inlineContent":[{"text":"The item you are removing from the ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":".","type":"text"}]}],"name":"item"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","interfaceLanguage":"swift"},"sections":[],"schemaVersion":{"patch":0,"minor":3,"major":0},"metadata":{"externalID":"s:8Boutique5StoreC9OperationC6removeyAEyx_GxYaKF","fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"text":"Store","preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","kind":"typeIdentifier"}],"roleHeading":"Instance Method","role":"symbol","title":"remove(_:)","symbolKind":"method","modules":[{"name":"Boutique"}]},"references":{"doc://Boutique/documentation/Boutique/Store/Operation":{"title":"Store.Operation","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","role":"symbol","abstract":[{"text":"An operation is a type that allows you to stack ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","type":"reference","isActive":true},{"text":",","type":"text"},{"text":" ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"text":" calls in a chained manner.","type":"text"}],"conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}]},"type":"topic","url":"\/documentation\/boutique\/store\/operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"text":"Operation","kind":"identifier"}],"navigatorTitle":[{"kind":"identifier","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","role":"symbol","abstract":[{"text":"Removes an item from the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"title":"removeAll()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/operation/removeall().json b/docs/data/documentation/boutique/store/operation/removeall().json index 730da52..f5cb774 100644 --- a/docs/data/documentation/boutique/store/operation/removeall().json +++ b/docs/data/documentation/boutique/store/operation/removeall().json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"A separate method you should use when removing all data rather than calling"},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":" or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-2tqlz"},{"type":"text","text":" multiple times."},{"type":"text","text":" "},{"type":"text","text":"This method handles removing all of the data in one operation rather than iterating over every item"},{"type":"text","text":" "},{"type":"text","text":"in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":", avoiding multiple dispatches to the "},{"type":"codeVoice","code":"@MainActor"},{"type":"text","text":", with far better performance."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/operation\/removeall()"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/removeAll()","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Removes all items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"’s memory cache and StorageEngine."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"title":"removeAll()","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique5StoreC9OperationC9removeAllAEyx_GyYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"]]},"references":{"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"},"doc://Boutique/documentation/Boutique/Store/Operation":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.Operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"abstract":[{"type":"text","text":"An operation is a type that allows you to stack "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"type":"text","text":" calls in a chained manner."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Operation"}],"url":"\/documentation\/boutique\/store\/operation"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-2tqlz":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-2tqlz","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-2tqlz"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/Operation/removeAll()":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"’s memory cache and StorageEngine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/removeAll()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/removeall()"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"}}} \ No newline at end of file +{"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"]]},"primaryContentSections":[{"declarations":[{"platforms":["macOS"],"languages":["swift"],"tokens":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"removeAll","kind":"identifier"},{"text":"() ","kind":"text"},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","text":"Store","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"typeIdentifier"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"}]}],"kind":"declarations"},{"kind":"content","content":[{"text":"Discussion","anchor":"discussion","level":2,"type":"heading"},{"type":"paragraph","inlineContent":[{"text":"A separate method you should use when removing all data rather than calling","type":"text"},{"text":" ","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"text":" or ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-2tqlz","isActive":true},{"type":"text","text":" multiple times."},{"type":"text","text":" "},{"type":"text","text":"This method handles removing all of the data in one operation rather than iterating over every item"},{"type":"text","text":" "},{"text":"in the ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":", avoiding multiple dispatches to the ","type":"text"},{"code":"@MainActor","type":"codeVoice"},{"type":"text","text":", with far better performance."}]}]}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/operation\/removeall()"]}],"schemaVersion":{"major":0,"patch":0,"minor":3},"kind":"symbol","metadata":{"fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","text":"Store","kind":"typeIdentifier"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"title":"removeAll()","externalID":"s:8Boutique5StoreC9OperationC9removeAllAEyx_GyYaKF","role":"symbol","roleHeading":"Instance Method","symbolKind":"method","modules":[{"name":"Boutique"}]},"sections":[],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/removeAll()","interfaceLanguage":"swift"},"abstract":[{"text":"Removes all items from the ","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"’s memory cache and StorageEngine."}],"references":{"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-2tqlz":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-2tqlz","title":"remove(_:)","abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"role":"symbol","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-2tqlz","kind":"symbol","type":"topic","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","text":"Store","kind":"typeIdentifier"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique/Store/Operation":{"title":"Store.Operation","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","role":"symbol","abstract":[{"text":"An operation is a type that allows you to stack ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","type":"reference","isActive":true},{"text":",","type":"text"},{"text":" ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"text":" calls in a chained manner.","type":"text"}],"conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}]},"type":"topic","url":"\/documentation\/boutique\/store\/operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"text":"Operation","kind":"identifier"}],"navigatorTitle":[{"kind":"identifier","text":"Operation"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"title":"removeAll()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","role":"symbol","abstract":[{"text":"Removes an item from the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique/Store/Operation/removeAll()":{"title":"removeAll()","type":"topic","url":"\/documentation\/boutique\/store\/operation\/removeall()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/removeAll()","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"’s memory cache and StorageEngine."}],"fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"text":" -> ","kind":"text"},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","kind":"typeIdentifier","text":"Operation"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/operation/run().json b/docs/data/documentation/boutique/store/operation/run().json index 0875108..b5af33a 100644 --- a/docs/data/documentation/boutique/store/operation/run().json +++ b/docs/data/documentation/boutique/store/operation/run().json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"run"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"If you create an "},{"type":"codeVoice","code":"Operation"},{"type":"text","text":" chain you must manually invoke "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/run()"},{"type":"text","text":" for the operations to execute."},{"type":"text","text":" "},{"type":"text","text":"If you do not then each "},{"type":"codeVoice","code":"Operation"},{"type":"text","text":" will be created, but not executed."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/operation\/run()"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/run()","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A function that runs a series of chained operations."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"run"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"title":"run()","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique5StoreC9OperationC3runyyYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"]]},"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"},"doc://Boutique/documentation/Boutique/Store/Operation":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.Operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"abstract":[{"type":"text","text":"An operation is a type that allows you to stack "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"type":"text","text":" calls in a chained manner."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Operation"}],"url":"\/documentation\/boutique\/store\/operation"},"doc://Boutique/documentation/Boutique/Store/Operation/run()":{"role":"symbol","title":"run()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"run"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"A function that runs a series of chained operations."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/run()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/run()"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24"}}} \ No newline at end of file +{"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/run()"},"sections":[],"kind":"symbol","hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store","doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"]]},"metadata":{"roleHeading":"Instance Method","externalID":"s:8Boutique5StoreC9OperationC3runyyYaKF","symbolKind":"method","title":"run()","role":"symbol","modules":[{"name":"Boutique"}],"fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"run"},{"text":"() ","kind":"text"},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}]},"schemaVersion":{"minor":3,"patch":0,"major":0},"abstract":[{"text":"A function that runs a series of chained operations.","type":"text"}],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"run","kind":"identifier"},{"text":"() ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"languages":["swift"]}]},{"kind":"content","content":[{"level":2,"text":"Discussion","anchor":"discussion","type":"heading"},{"inlineContent":[{"text":"If you create an ","type":"text"},{"type":"codeVoice","code":"Operation"},{"text":" chain you must manually invoke ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/run()","type":"reference","isActive":true},{"type":"text","text":" for the operations to execute."},{"text":" ","type":"text"},{"text":"If you do not then each ","type":"text"},{"code":"Operation","type":"codeVoice"},{"text":" will be created, but not executed.","type":"text"}],"type":"paragraph"}]}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/operation\/run()"]}],"references":{"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"title":"removeAll()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/Operation/run()":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/run()","title":"run()","abstract":[{"text":"A function that runs a series of chained operations.","type":"text"}],"role":"symbol","url":"\/documentation\/boutique\/store\/operation\/run()","kind":"symbol","type":"topic","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"run"},{"text":"() ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","role":"symbol","abstract":[{"text":"Removes an item from the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique/Store/Operation":{"title":"Store.Operation","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","role":"symbol","abstract":[{"text":"An operation is a type that allows you to stack ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","type":"reference","isActive":true},{"text":",","type":"text"},{"text":" ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"text":" calls in a chained manner.","type":"text"}],"conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}]},"type":"topic","url":"\/documentation\/boutique\/store\/operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"text":"Operation","kind":"identifier"}],"navigatorTitle":[{"kind":"identifier","text":"Operation"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/previewstore(items:)-1azzy.json b/docs/data/documentation/boutique/store/previewstore(items:)-1azzy.json index f46e312..9460bc4 100644 --- a/docs/data/documentation/boutique/store/previewstore(items:)-1azzy.json +++ b/docs/data/documentation/boutique/store/previewstore(items:)-1azzy.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"static"},{"kind":"text","text":" "},{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"previewStore"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"> "},{"kind":"keyword","text":"where"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Identifiable","preciseIdentifier":"s:s12IdentifiableP"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"."},{"kind":"typeIdentifier","text":"ID"},{"kind":"text","text":" == "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"return-value","level":2,"type":"heading","text":"Return Value"},{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" that populates items in memory so you can pass a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" to @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" in SwiftUI Previews."}]}]},{"kind":"parameters","parameters":[{"name":"items","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The items that the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" will be initialized with."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This version of a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" allows you to pass in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" you would like to render"},{"type":"text","text":" "},{"type":"text","text":"in a SwiftUI Preview. It will create a a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" that "},{"type":"strong","inlineContent":[{"type":"text","text":"only"}]},{"type":"text","text":" holds items in memory"},{"type":"text","text":" "},{"type":"text","text":"so it should not be used in production, nor will it compile for Release builds."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This function eschews providing a "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" when our "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":" "},{"type":"text","text":"with an "},{"type":"codeVoice","code":"id"},{"type":"text","text":" that is a "},{"type":"codeVoice","code":"String"},{"type":"text","text":". While it’s not required for your "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" to conform to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"text","text":"many SwiftUI-related objects do so this initializer provides a nice convenience."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/previewstore(items:)-1azzy"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:)-1azzy","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" to be used for SwiftUI Previews and only SwiftUI Previews!"}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"previewStore(items:)","roleHeading":"Type Method","fragments":[{"kind":"keyword","text":"static"},{"kind":"text","text":" "},{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"previewStore"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"symbolKind":"method","externalID":"s:8Boutique5StoreC07previewB05itemsACyxGSayxG_ts12IdentifiableRzSS2IDsAHPRtzrlFZ","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/previewStore(items:)-1azzy":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"previewStore(items:)","fragments":[{"kind":"keyword","text":"static"},{"kind":"text","text":" "},{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"previewStore"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" to be used for SwiftUI Previews and only SwiftUI Previews!"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:)-1azzy","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/previewstore(items:)-1azzy"},"doc://Boutique/documentation/Boutique/Store/items":{"role":"symbol","title":"items","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]"}],"abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/items"}}} \ No newline at end of file +{"kind":"symbol","schemaVersion":{"major":0,"patch":0,"minor":3},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:)-1azzy","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":" to be used for SwiftUI Previews and only SwiftUI Previews!","type":"text"}],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"text":"static","kind":"keyword"},{"text":" ","kind":"text"},{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"previewStore"},{"kind":"text","text":"("},{"text":"items","kind":"externalParam"},{"text":": [","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) -> "},{"kind":"typeIdentifier","text":"Store","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":"> ","kind":"text"},{"kind":"keyword","text":"where"},{"text":" ","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":" : ","kind":"text"},{"text":"Identifiable","kind":"typeIdentifier","preciseIdentifier":"s:s12IdentifiableP"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Item"},{"text":".","kind":"text"},{"kind":"typeIdentifier","text":"ID","preciseIdentifier":"s:s12IdentifiableP2IDQa"},{"text":" == ","kind":"text"},{"preciseIdentifier":"s:SS","kind":"typeIdentifier","text":"String"}],"languages":["swift"]}]},{"kind":"parameters","parameters":[{"name":"items","content":[{"type":"paragraph","inlineContent":[{"text":"The items that the ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" will be initialized with."}]}]}]},{"content":[{"text":"Return Value","level":2,"type":"heading","anchor":"return-value"},{"inlineContent":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" that populates items in memory so you can pass a "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" to @"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"text":" in SwiftUI Previews.","type":"text"}],"type":"paragraph"}],"kind":"content"},{"kind":"content","content":[{"level":2,"text":"Discussion","type":"heading","anchor":"discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This version of a "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" allows you to pass in the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","isActive":true},{"type":"text","text":" you would like to render"},{"type":"text","text":" "},{"type":"text","text":"in a SwiftUI Preview. It will create a a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"type":"text","text":" that "},{"inlineContent":[{"text":"only","type":"text"}],"type":"strong"},{"type":"text","text":" holds items in memory"},{"type":"text","text":" "},{"text":"so it should not be used in production, nor will it compile for Release builds.","type":"text"}]},{"type":"paragraph","inlineContent":[{"text":"This function eschews providing a ","type":"text"},{"code":"cacheIdentifier","type":"codeVoice"},{"type":"text","text":" when our "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"code":"Identifiable","type":"codeVoice"},{"text":" ","type":"text"},{"type":"text","text":"with an "},{"type":"codeVoice","code":"id"},{"text":" that is a ","type":"text"},{"code":"String","type":"codeVoice"},{"text":". While it’s not required for your ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" to conform to ","type":"text"},{"code":"Identifiable","type":"codeVoice"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"text","text":"many SwiftUI-related objects do so this initializer provides a nice convenience."}]}]}],"sections":[],"metadata":{"fragments":[{"text":"static","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"previewStore"},{"kind":"text","text":"("},{"text":"items","kind":"externalParam"},{"kind":"text","text":": ["},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) -> "},{"preciseIdentifier":"s:8Boutique5StoreC","text":"Store","kind":"typeIdentifier"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":">","kind":"text"}],"extendedModule":"Boutique","conformance":{"availabilityPrefix":[{"type":"text","text":"Available when"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"roleHeading":"Type Method","externalID":"s:8Boutique5StoreC07previewB05itemsACyxGSayxG_ts12IdentifiableRzSS2IDsAHPRtzrlFZ","role":"symbol","title":"previewStore(items:)","symbolKind":"method","modules":[{"name":"Boutique"}]},"variants":[{"paths":["\/documentation\/boutique\/store\/previewstore(items:)-1azzy"],"traits":[{"interfaceLanguage":"swift"}]}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/previewStore(items:)-1azzy":{"url":"\/documentation\/boutique\/store\/previewstore(items:)-1azzy","type":"topic","title":"previewStore(items:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:)-1azzy","role":"symbol","fragments":[{"kind":"keyword","text":"static"},{"text":" ","kind":"text"},{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"previewStore","kind":"identifier"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"text":": [","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">","kind":"text"}],"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Encodable"},{"text":", and ","type":"text"},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" to be used for SwiftUI Previews and only SwiftUI Previews!"}]},"doc://Boutique/documentation/Boutique/Store/items":{"url":"\/documentation\/boutique\/store\/items","role":"symbol","abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","title":"items","type":"topic","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"text":": [","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"]","kind":"text"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/previewstore(items:)-1zymp.json b/docs/data/documentation/boutique/store/previewstore(items:)-1zymp.json index e3e1aff..ea2cf96 100644 --- a/docs/data/documentation/boutique/store/previewstore(items:)-1zymp.json +++ b/docs/data/documentation/boutique/store/previewstore(items:)-1zymp.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"static"},{"kind":"text","text":" "},{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"previewStore"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"> "},{"kind":"keyword","text":"where"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Identifiable","preciseIdentifier":"s:s12IdentifiableP"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"."},{"kind":"typeIdentifier","text":"ID"},{"kind":"text","text":" == "},{"kind":"typeIdentifier","text":"UUID","preciseIdentifier":"s:10Foundation4UUIDV"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"return-value","level":2,"type":"heading","text":"Return Value"},{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" that populates items in memory so you can pass a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" to @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" in SwiftUI Previews."}]}]},{"kind":"parameters","parameters":[{"name":"items","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The items that the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" will be initialized with."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This version of a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" allows you to pass in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" you would like to render"},{"type":"text","text":" "},{"type":"text","text":"in a SwiftUI Preview. It will create a a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" that "},{"type":"strong","inlineContent":[{"type":"text","text":"only"}]},{"type":"text","text":" holds items in memory"},{"type":"text","text":" "},{"type":"text","text":"so it should not be used in production, nor will it compile for Release builds."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This function eschews providing a "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" when our "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":" "},{"type":"text","text":"with an "},{"type":"codeVoice","code":"id"},{"type":"text","text":" that is a "},{"type":"codeVoice","code":"UUID"},{"type":"text","text":". While it’s not required for your "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" to conform to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"text","text":"many SwiftUI-related objects do so this initializer provides a nice convenience."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/previewstore(items:)-1zymp"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:)-1zymp","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" to be used for SwiftUI Previews and only SwiftUI Previews!"}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"previewStore(items:)","roleHeading":"Type Method","fragments":[{"kind":"keyword","text":"static"},{"kind":"text","text":" "},{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"previewStore"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"symbolKind":"method","externalID":"s:8Boutique5StoreC07previewB05itemsACyxGSayxG_ts12IdentifiableRz10Foundation4UUIDV2IDsAHPRtzrlFZ","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Store/items":{"role":"symbol","title":"items","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]"}],"abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/items"},"doc://Boutique/documentation/Boutique/Store/previewStore(items:)-1zymp":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"previewStore(items:)","fragments":[{"kind":"keyword","text":"static"},{"kind":"text","text":" "},{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"previewStore"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" to be used for SwiftUI Previews and only SwiftUI Previews!"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:)-1zymp","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/previewstore(items:)-1zymp"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file +{"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/previewstore(items:)-1zymp"]}],"kind":"symbol","primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"static"},{"kind":"text","text":" "},{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"previewStore","kind":"identifier"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) -> "},{"text":"Store","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"> "},{"kind":"keyword","text":"where"},{"text":" ","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" : "},{"preciseIdentifier":"s:s12IdentifiableP","kind":"typeIdentifier","text":"Identifiable"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"."},{"preciseIdentifier":"s:s12IdentifiableP2IDQa","text":"ID","kind":"typeIdentifier"},{"text":" == ","kind":"text"},{"preciseIdentifier":"s:10Foundation4UUIDV","kind":"typeIdentifier","text":"UUID"}],"languages":["swift"]}]},{"kind":"parameters","parameters":[{"name":"items","content":[{"inlineContent":[{"type":"text","text":"The items that the "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" will be initialized with."}],"type":"paragraph"}]}]},{"content":[{"level":2,"anchor":"return-value","text":"Return Value","type":"heading"},{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":" that populates items in memory so you can pass a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"type":"text","text":" to @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" in SwiftUI Previews."}]}],"kind":"content"},{"kind":"content","content":[{"level":2,"type":"heading","text":"Discussion","anchor":"discussion"},{"type":"paragraph","inlineContent":[{"text":"This version of a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"text":" allows you to pass in the ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","type":"reference","isActive":true},{"text":" you would like to render","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"in a SwiftUI Preview. It will create a a "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" that "},{"inlineContent":[{"text":"only","type":"text"}],"type":"strong"},{"text":" holds items in memory","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"so it should not be used in production, nor will it compile for Release builds."}]},{"inlineContent":[{"text":"This function eschews providing a ","type":"text"},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" when our "},{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Identifiable"},{"text":" ","type":"text"},{"type":"text","text":"with an "},{"type":"codeVoice","code":"id"},{"type":"text","text":" that is a "},{"type":"codeVoice","code":"UUID"},{"type":"text","text":". While it’s not required for your "},{"type":"codeVoice","code":"Item"},{"text":" to conform to ","type":"text"},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":","},{"text":" ","type":"text"},{"type":"text","text":"many SwiftUI-related objects do so this initializer provides a nice convenience."}],"type":"paragraph"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:)-1zymp","interfaceLanguage":"swift"},"schemaVersion":{"minor":3,"major":0,"patch":0},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"sections":[],"metadata":{"role":"symbol","extendedModule":"Boutique","symbolKind":"method","roleHeading":"Type Method","conformance":{"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Encodable"},{"text":", and ","type":"text"},{"type":"codeVoice","code":"Sendable"},{"text":".","type":"text"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"fragments":[{"text":"static","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"previewStore","kind":"identifier"},{"kind":"text","text":"("},{"text":"items","kind":"externalParam"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"text":"]) -> ","kind":"text"},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">"}],"externalID":"s:8Boutique5StoreC07previewB05itemsACyxGSayxG_ts12IdentifiableRz10Foundation4UUIDV2IDsAHPRtzrlFZ","modules":[{"name":"Boutique"}],"title":"previewStore(items:)"},"abstract":[{"text":"A ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" to be used for SwiftUI Previews and only SwiftUI Previews!","type":"text"}],"references":{"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/previewStore(items:)-1zymp":{"url":"\/documentation\/boutique\/store\/previewstore(items:)-1zymp","type":"topic","title":"previewStore(items:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:)-1zymp","role":"symbol","fragments":[{"kind":"keyword","text":"static"},{"text":" ","kind":"text"},{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"previewStore","kind":"identifier"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"text":": [","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">","kind":"text"}],"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Encodable"},{"text":", and ","type":"text"},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" to be used for SwiftUI Previews and only SwiftUI Previews!"}]},"doc://Boutique/documentation/Boutique/Store/items":{"url":"\/documentation\/boutique\/store\/items","role":"symbol","abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","title":"items","type":"topic","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"text":": [","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"]","kind":"text"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/previewstore(items:cacheidentifier:).json b/docs/data/documentation/boutique/store/previewstore(items:cacheidentifier:).json index 3afc36a..892ee79 100644 --- a/docs/data/documentation/boutique/store/previewstore(items:cacheidentifier:).json +++ b/docs/data/documentation/boutique/store/previewstore(items:cacheidentifier:).json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"static"},{"kind":"text","text":" "},{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"previewStore"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"], "},{"kind":"externalParam","text":"cacheIdentifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"KeyPath","preciseIdentifier":"s:s7KeyPathC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":">) -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"return-value","level":2,"type":"heading","text":"Return Value"},{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" that populates items in memory so you can pass a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" to @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" in SwiftUI Previews."}]}]},{"kind":"parameters","parameters":[{"name":"items","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The items that the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" will be initialized with."}]}]},{"name":"cacheIdentifier","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"codeVoice","code":"KeyPath"},{"type":"text","text":" from the "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" pointing to a "},{"type":"codeVoice","code":"String"},{"type":"text","text":", which the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" "},{"type":"text","text":"will use to create a unique identifier for the item when it’s saved."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This version of a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" allows you to pass in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"type":"text","text":" you would like to render"},{"type":"text","text":" "},{"type":"text","text":"in a SwiftUI Preview. It will create a a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" that "},{"type":"strong","inlineContent":[{"type":"text","text":"only"}]},{"type":"text","text":" holds items in memory"},{"type":"text","text":" "},{"type":"text","text":"so it should not be used in production, nor will it compile for Release builds."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/previewstore(items:cacheidentifier:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:cacheIdentifier:)","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" to be used for SwiftUI Previews and only SwiftUI Previews!"}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"previewStore(items:cacheIdentifier:)","roleHeading":"Type Method","fragments":[{"kind":"keyword","text":"static"},{"kind":"text","text":" "},{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"previewStore"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"], "},{"kind":"externalParam","text":"cacheIdentifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"KeyPath","preciseIdentifier":"s:s7KeyPathC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":">) -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"symbolKind":"method","externalID":"s:8Boutique5StoreC07previewB05items15cacheIdentifierACyxGSayxG_s7KeyPathCyxSSGtFZ","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/items":{"role":"symbol","title":"items","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]"}],"abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/items"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/previewStore(items:cacheIdentifier:)":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"previewStore(items:cacheIdentifier:)","fragments":[{"kind":"keyword","text":"static"},{"kind":"text","text":" "},{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"previewStore"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"], "},{"kind":"externalParam","text":"cacheIdentifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"KeyPath","preciseIdentifier":"s:s7KeyPathC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":">) -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" to be used for SwiftUI Previews and only SwiftUI Previews!"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:cacheIdentifier:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/previewstore(items:cacheidentifier:)"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"}}} \ No newline at end of file +{"sections":[],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"metadata":{"symbolKind":"method","externalID":"s:8Boutique5StoreC07previewB05items15cacheIdentifierACyxGSayxG_s7KeyPathCyxSSGtFZ","roleHeading":"Type Method","fragments":[{"kind":"keyword","text":"static"},{"text":" ","kind":"text"},{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"previewStore","kind":"identifier"},{"text":"(","kind":"text"},{"text":"items","kind":"externalParam"},{"text":": [","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":"], ","kind":"text"},{"kind":"externalParam","text":"cacheIdentifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","preciseIdentifier":"s:s7KeyPathC","text":"KeyPath"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":", ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:SS","text":"String"},{"text":">) -> ","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"extendedModule":"Boutique","title":"previewStore(items:cacheIdentifier:)","role":"symbol","conformance":{"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"text":", ","type":"text"},{"code":"Encodable","type":"codeVoice"},{"text":", and ","type":"text"},{"type":"codeVoice","code":"Sendable"},{"text":".","type":"text"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"availabilityPrefix":[{"type":"text","text":"Available when"}]},"modules":[{"name":"Boutique"}]},"kind":"symbol","schemaVersion":{"minor":3,"patch":0,"major":0},"abstract":[{"type":"text","text":"A "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"text":" to be used for SwiftUI Previews and only SwiftUI Previews!","type":"text"}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/previewstore(items:cacheidentifier:)"]}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:cacheIdentifier:)"},"primaryContentSections":[{"declarations":[{"tokens":[{"text":"static","kind":"keyword"},{"text":" ","kind":"text"},{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"previewStore"},{"text":"(","kind":"text"},{"text":"items","kind":"externalParam"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"], "},{"text":"cacheIdentifier","kind":"externalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"KeyPath","preciseIdentifier":"s:s7KeyPathC"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":", ","kind":"text"},{"preciseIdentifier":"s:SS","text":"String","kind":"typeIdentifier"},{"text":">) -> ","kind":"text"},{"text":"Store","preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"platforms":["macOS"],"languages":["swift"]}],"kind":"declarations"},{"kind":"parameters","parameters":[{"content":[{"inlineContent":[{"type":"text","text":"The items that the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"type":"text","text":" will be initialized with."}],"type":"paragraph"}],"name":"items"},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"code":"KeyPath","type":"codeVoice"},{"type":"text","text":" from the "},{"type":"codeVoice","code":"Item"},{"text":" pointing to a ","type":"text"},{"code":"String","type":"codeVoice"},{"text":", which the ","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":" ","type":"text"},{"type":"text","text":"will use to create a unique identifier for the item when it’s saved."}]}],"name":"cacheIdentifier"}]},{"kind":"content","content":[{"text":"Return Value","level":2,"type":"heading","anchor":"return-value"},{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" that populates items in memory so you can pass a "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":" to @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" in SwiftUI Previews."}]}]},{"content":[{"text":"Discussion","level":2,"type":"heading","anchor":"discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This version of a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" allows you to pass in the ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items"},{"text":" you would like to render","type":"text"},{"type":"text","text":" "},{"type":"text","text":"in a SwiftUI Preview. It will create a a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" that ","type":"text"},{"inlineContent":[{"text":"only","type":"text"}],"type":"strong"},{"type":"text","text":" holds items in memory"},{"type":"text","text":" "},{"type":"text","text":"so it should not be used in production, nor will it compile for Release builds."}]}],"kind":"content"}],"references":{"doc://Boutique/documentation/Boutique/Store/previewStore(items:cacheIdentifier:)":{"url":"\/documentation\/boutique\/store\/previewstore(items:cacheidentifier:)","type":"topic","title":"previewStore(items:cacheIdentifier:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/previewStore(items:cacheIdentifier:)","role":"symbol","fragments":[{"kind":"keyword","text":"static"},{"text":" ","kind":"text"},{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"previewStore","kind":"identifier"},{"kind":"text","text":"("},{"kind":"externalParam","text":"items"},{"text":": [","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"], "},{"kind":"externalParam","text":"cacheIdentifier"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:s7KeyPathC","text":"KeyPath"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":", ","kind":"text"},{"preciseIdentifier":"s:SS","text":"String","kind":"typeIdentifier"},{"text":">) -> ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">","kind":"text"}],"conformance":{"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"text":", ","type":"text"},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"text":".","type":"text"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" to be used for SwiftUI Previews and only SwiftUI Previews!"}]},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/Store/items":{"url":"\/documentation\/boutique\/store\/items","role":"symbol","abstract":[{"type":"text","text":"The items held onto by the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/items","kind":"symbol","title":"items","type":"topic","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"items"},{"text":": [","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"]","kind":"text"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/remove(_:)-1w3lx.json b/docs/data/documentation/boutique/store/remove(_:)-1w3lx.json index 1e4dafd..937c278 100644 --- a/docs/data/documentation/boutique/store/remove(_:)-1w3lx.json +++ b/docs/data/documentation/boutique/store/remove(_:)-1w3lx.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"return-value","level":2,"type":"heading","text":"Return Value"},{"type":"paragraph","inlineContent":[{"type":"text","text":"An "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"},{"type":"text","text":" that can be used to remove items as part of a chain."}]}]},{"kind":"parameters","parameters":[{"name":"items","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The items you are removing from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Prefer removing multiple items using this method instead of calling "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-51ya6"},{"type":"text","text":" "},{"type":"text","text":"multiple times to avoid making multiple separate dispatches to the "},{"type":"codeVoice","code":"@MainActor"},{"type":"text","text":"."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/remove(_:)-1w3lx"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-1w3lx","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"title":"remove(_:)","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique5StoreC6removeyAC9OperationCyx_GSayxGYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"},"doc://Boutique/documentation/Boutique/Store/Operation":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.Operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"abstract":[{"type":"text","text":"An operation is a type that allows you to stack "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"type":"text","text":" calls in a chained manner."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Operation"}],"url":"\/documentation\/boutique\/store\/operation"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-1w3lx":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-1w3lx","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/remove(_:)-1w3lx"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-51ya6":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-51ya6","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/remove(_:)-51ya6"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24"}}} \ No newline at end of file +{"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-1w3lx","interfaceLanguage":"swift"},"sections":[],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/remove(_:)-1w3lx"]}],"schemaVersion":{"major":0,"patch":0,"minor":3},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"abstract":[{"type":"text","text":"Removes a list of items from the "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"metadata":{"fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"kind":"text","text":"(["},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"text":"Store","preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","kind":"typeIdentifier","text":"Operation"}],"symbolKind":"method","externalID":"s:8Boutique5StoreC6removeyAC9OperationCyx_GSayxGYaKF","title":"remove(_:)","role":"symbol","roleHeading":"Instance Method","modules":[{"name":"Boutique"}]},"kind":"symbol","primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"_"},{"text":" ","kind":"text"},{"text":"items","kind":"internalParam"},{"text":": [","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":"]) ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"text":" -> ","kind":"text"},{"text":"Store","preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","text":"Operation"}],"languages":["swift"]}]},{"kind":"parameters","parameters":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The items you are removing from the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"type":"text","text":"."}]}],"name":"items"}]},{"kind":"content","content":[{"type":"heading","anchor":"return-value","level":2,"text":"Return Value"},{"type":"paragraph","inlineContent":[{"text":"An ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","isActive":true},{"text":" that can be used to remove items as part of a chain.","type":"text"}]}]},{"kind":"content","content":[{"level":2,"anchor":"discussion","type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Prefer removing multiple items using this method instead of calling "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-51ya6","type":"reference"},{"text":" ","type":"text"},{"text":"multiple times to avoid making multiple separate dispatches to the ","type":"text"},{"type":"codeVoice","code":"@MainActor"},{"text":".","type":"text"}]}]}],"references":{"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique/Store/Operation":{"title":"Store.Operation","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","role":"symbol","abstract":[{"text":"An operation is a type that allows you to stack ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","type":"reference","isActive":true},{"text":",","type":"text"},{"text":" ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"text":" calls in a chained manner.","type":"text"}],"conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}]},"type":"topic","url":"\/documentation\/boutique\/store\/operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"text":"Operation","kind":"identifier"}],"navigatorTitle":[{"kind":"identifier","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"title":"removeAll()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-1w3lx":{"kind":"symbol","title":"remove(_:)","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-1w3lx","role":"symbol","type":"topic","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier"}],"url":"\/documentation\/boutique\/store\/remove(_:)-1w3lx","abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","role":"symbol","abstract":[{"text":"Removes an item from the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-51ya6":{"url":"\/documentation\/boutique\/store\/remove(_:)-51ya6","type":"topic","title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-51ya6","role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/remove(_:)-3nzlq.json b/docs/data/documentation/boutique/store/remove(_:)-3nzlq.json index a724d87..281080c 100644 --- a/docs/data/documentation/boutique/store/remove(_:)-3nzlq.json +++ b/docs/data/documentation/boutique/store/remove(_:)-3nzlq.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"item"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"item","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The item you are removing from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/remove(_:)-3nzlq"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-3nzlq","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"title":"remove(_:)","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique5StoreC6removeyyxYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-3nzlq":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-3nzlq","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/remove(_:)-3nzlq"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file +{"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"variants":[{"paths":["\/documentation\/boutique\/store\/remove(_:)-3nzlq"],"traits":[{"interfaceLanguage":"swift"}]}],"schemaVersion":{"patch":0,"minor":3,"major":0},"metadata":{"roleHeading":"Instance Method","externalID":"s:8Boutique5StoreC6removeyyxYaKF","symbolKind":"method","title":"remove(_:)","modules":[{"name":"Boutique"}],"role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}]},"sections":[],"primaryContentSections":[{"declarations":[{"platforms":["macOS"],"tokens":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"_"},{"text":" ","kind":"text"},{"text":"item","kind":"internalParam"},{"kind":"text","text":": "},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"}],"languages":["swift"]}],"kind":"declarations"},{"kind":"parameters","parameters":[{"name":"item","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The item you are removing from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]}]}]}],"kind":"symbol","abstract":[{"type":"text","text":"Removes an item from the "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":".","type":"text"}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-3nzlq","interfaceLanguage":"swift"},"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-3nzlq":{"title":"remove(_:)","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-3nzlq","url":"\/documentation\/boutique\/store\/remove(_:)-3nzlq","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","role":"symbol","type":"topic"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/remove(_:)-51ya6.json b/docs/data/documentation/boutique/store/remove(_:)-51ya6.json index 443c141..6e6aa73 100644 --- a/docs/data/documentation/boutique/store/remove(_:)-51ya6.json +++ b/docs/data/documentation/boutique/store/remove(_:)-51ya6.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"item"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"return-value","level":2,"type":"heading","text":"Return Value"},{"type":"paragraph","inlineContent":[{"type":"text","text":"An "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"},{"type":"text","text":" that can be used to remove an item as part of a chain."}]}]},{"kind":"parameters","parameters":[{"name":"item","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The item you are removing from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/remove(_:)-51ya6"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-51ya6","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"title":"remove(_:)","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique5StoreC6removeyAC9OperationCyx_GxYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Store/Operation":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.Operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"abstract":[{"type":"text","text":"An operation is a type that allows you to stack "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"type":"text","text":" calls in a chained manner."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Operation"}],"url":"\/documentation\/boutique\/store\/operation"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-51ya6":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-51ya6","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/remove(_:)-51ya6"}}} \ No newline at end of file +{"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/remove(_:)-51ya6"]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-51ya6","interfaceLanguage":"swift"},"primaryContentSections":[{"declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"text":"(","kind":"text"},{"text":"_","kind":"externalParam"},{"kind":"text","text":" "},{"text":"item","kind":"internalParam"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"text":" -> ","kind":"text"},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]}],"kind":"declarations"},{"kind":"parameters","parameters":[{"content":[{"type":"paragraph","inlineContent":[{"text":"The item you are removing from the ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"type":"text","text":"."}]}],"name":"item"}]},{"content":[{"level":2,"type":"heading","text":"Return Value","anchor":"return-value"},{"type":"paragraph","inlineContent":[{"text":"An ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","type":"reference","isActive":true},{"type":"text","text":" that can be used to remove an item as part of a chain."}]}],"kind":"content"}],"metadata":{"fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"text":" -> ","kind":"text"},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier"}],"symbolKind":"method","externalID":"s:8Boutique5StoreC6removeyAC9OperationCyx_GxYaKF","role":"symbol","title":"remove(_:)","modules":[{"name":"Boutique"}],"roleHeading":"Instance Method"},"schemaVersion":{"minor":3,"patch":0,"major":0},"abstract":[{"type":"text","text":"Removes an item from the "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"sections":[],"references":{"doc://Boutique/documentation/Boutique/Store/Operation":{"title":"Store.Operation","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","role":"symbol","abstract":[{"text":"An operation is a type that allows you to stack ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","type":"reference","isActive":true},{"text":",","type":"text"},{"text":" ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"text":" calls in a chained manner.","type":"text"}],"conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}]},"type":"topic","url":"\/documentation\/boutique\/store\/operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"text":"Operation","kind":"identifier"}],"navigatorTitle":[{"kind":"identifier","text":"Operation"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"title":"removeAll()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-51ya6":{"url":"\/documentation\/boutique\/store\/remove(_:)-51ya6","type":"topic","title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-51ya6","role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","role":"symbol","abstract":[{"text":"Removes an item from the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/remove(_:)-5dwyv.json b/docs/data/documentation/boutique/store/remove(_:)-5dwyv.json index eaf6ce0..bfe077f 100644 --- a/docs/data/documentation/boutique/store/remove(_:)-5dwyv.json +++ b/docs/data/documentation/boutique/store/remove(_:)-5dwyv.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"items"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"items","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The items you are removing from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Prefer removing multiple items using this method instead of calling "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-5dwyv"},{"type":"text","text":" "},{"type":"text","text":"multiple times to avoid making multiple separate dispatches to the "},{"type":"codeVoice","code":"@MainActor"},{"type":"text","text":"."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/remove(_:)-5dwyv"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-5dwyv","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"title":"remove(_:)","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique5StoreC6removeyySayxGYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-5dwyv":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-5dwyv","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/remove(_:)-5dwyv"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file +{"sections":[],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"kind":"symbol","variants":[{"paths":["\/documentation\/boutique\/store\/remove(_:)-5dwyv"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-5dwyv","interfaceLanguage":"swift"},"schemaVersion":{"major":0,"minor":3,"patch":0},"metadata":{"modules":[{"name":"Boutique"}],"role":"symbol","roleHeading":"Instance Method","fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"text":"([","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":"]) ","kind":"text"},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"symbolKind":"method","externalID":"s:8Boutique5StoreC6removeyySayxGYaKF","title":"remove(_:)"},"abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"text":"(","kind":"text"},{"kind":"externalParam","text":"_"},{"text":" ","kind":"text"},{"text":"items","kind":"internalParam"},{"text":": [","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"]) ","kind":"text"},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"}],"languages":["swift"]}]},{"kind":"parameters","parameters":[{"name":"items","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The items you are removing from the "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":".","type":"text"}]}]}]},{"content":[{"level":2,"text":"Discussion","anchor":"discussion","type":"heading"},{"inlineContent":[{"type":"text","text":"Prefer removing multiple items using this method instead of calling "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-5dwyv","isActive":true,"type":"reference"},{"type":"text","text":" "},{"type":"text","text":"multiple times to avoid making multiple separate dispatches to the "},{"type":"codeVoice","code":"@MainActor"},{"text":".","type":"text"}],"type":"paragraph"}],"kind":"content"}],"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-5dwyv":{"kind":"symbol","title":"remove(_:)","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-5dwyv","role":"symbol","type":"topic","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"url":"\/documentation\/boutique\/store\/remove(_:)-5dwyv","abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/removeall()-1xc24.json b/docs/data/documentation/boutique/store/removeall()-1xc24.json index 97f247f..0b38098 100644 --- a/docs/data/documentation/boutique/store/removeall()-1xc24.json +++ b/docs/data/documentation/boutique/store/removeall()-1xc24.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"return-value","level":2,"type":"heading","text":"Return Value"},{"type":"paragraph","inlineContent":[{"type":"text","text":"An "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"},{"type":"text","text":" that can be used to remove items as part of a chain."}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"A separate method you should use when removing all data rather than calling"},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-1w3lx"},{"type":"text","text":" or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-51ya6"},{"type":"text","text":" multiple times."},{"type":"text","text":" "},{"type":"text","text":"This method handles removing all of the data in one operation rather than iterating over every item"},{"type":"text","text":" "},{"type":"text","text":"in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":", avoiding multiple dispatches to the "},{"type":"codeVoice","code":"@MainActor"},{"type":"text","text":", with far better performance."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/removeall()-1xc24"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"title":"removeAll()","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique5StoreC9removeAllAC9OperationCyx_GyYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique/Store/remove(_:)-51ya6":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-51ya6","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/remove(_:)-51ya6"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-1w3lx":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-1w3lx","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/remove(_:)-1w3lx"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"role":"symbol","title":"insert(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}],"abstract":[{"type":"text","text":"Inserts an item into the store."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe"},"doc://Boutique/documentation/Boutique/Store/Operation":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":", and "},{"type":"codeVoice","code":"Sendable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"Store.Operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Operation"}],"abstract":[{"type":"text","text":"An operation is a type that allows you to stack "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"type":"text","text":" calls in a chained manner."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Operation"}],"url":"\/documentation\/boutique\/store\/operation"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file +{"abstract":[{"text":"Removes all items from the store’s memory cache and storage engine.","type":"text"}],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"languages":["swift"],"tokens":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","text":"Store","kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","text":"Operation","preciseIdentifier":"s:8Boutique5StoreC9OperationC","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"}]}]},{"kind":"content","content":[{"text":"Return Value","level":2,"anchor":"return-value","type":"heading"},{"type":"paragraph","inlineContent":[{"type":"text","text":"An "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation"},{"type":"text","text":" that can be used to remove items as part of a chain."}]}]},{"kind":"content","content":[{"type":"heading","anchor":"discussion","text":"Discussion","level":2},{"inlineContent":[{"type":"text","text":"A separate method you should use when removing all data rather than calling"},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-1w3lx"},{"text":" or ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-51ya6","type":"reference","isActive":true},{"type":"text","text":" multiple times."},{"text":" ","type":"text"},{"type":"text","text":"This method handles removing all of the data in one operation rather than iterating over every item"},{"text":" ","type":"text"},{"text":"in the ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":", avoiding multiple dispatches to the "},{"code":"@MainActor","type":"codeVoice"},{"text":", with far better performance.","type":"text"}],"type":"paragraph"}]}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"kind":"symbol","variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/store\/removeall()-1xc24"]}],"metadata":{"symbolKind":"method","externalID":"s:8Boutique5StoreC9removeAllAC9OperationCyx_GyYaKF","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"removeAll"},{"text":"() ","kind":"text"},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"text":" -> ","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","kind":"typeIdentifier","text":"Operation"}],"title":"removeAll()","role":"symbol","roleHeading":"Instance Method","modules":[{"name":"Boutique"}]},"sections":[],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","interfaceLanguage":"swift"},"schemaVersion":{"patch":0,"minor":3,"major":0},"references":{"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/removeAll()-1xc24":{"title":"removeAll()","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24","role":"symbol","abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"type":"topic","url":"\/documentation\/boutique\/store\/removeall()-1xc24","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/Operation/remove(_:)-8ufsb":{"title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb","role":"symbol","abstract":[{"text":"Removes an item from the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":"."}],"type":"topic","url":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">.","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation"}]},"doc://Boutique/documentation/Boutique/Store/remove(_:)-51ya6":{"url":"\/documentation\/boutique\/store\/remove(_:)-51ya6","type":"topic","title":"remove(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-51ya6","role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Store/insert(_:)-7z2oe":{"title":"insert(_:)","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","role":"symbol","abstract":[{"text":"Inserts an item into the store.","type":"text"}],"type":"topic","url":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"insert"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">."},{"text":"Operation","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC9OperationC"}]},"doc://Boutique/documentation/Boutique/Store/remove(_:)-1w3lx":{"kind":"symbol","title":"remove(_:)","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-1w3lx","role":"symbol","type":"topic","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":">.","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC9OperationC","text":"Operation","kind":"typeIdentifier"}],"url":"\/documentation\/boutique\/store\/remove(_:)-1w3lx","abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Store/Operation":{"title":"Store.Operation","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation","role":"symbol","abstract":[{"text":"An operation is a type that allows you to stack ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/insert(_:)-7z2oe","type":"reference","isActive":true},{"text":",","type":"text"},{"text":" ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/Operation\/remove(_:)-8ufsb"},{"type":"text","text":", or "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-1xc24"},{"text":" calls in a chained manner.","type":"text"}],"conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Sendable","type":"codeVoice"},{"type":"text","text":"."}]},"type":"topic","url":"\/documentation\/boutique\/store\/operation","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"text":"Operation","kind":"identifier"}],"navigatorTitle":[{"kind":"identifier","text":"Operation"}]}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/store/removeall()-9zfmy.json b/docs/data/documentation/boutique/store/removeall()-9zfmy.json index 503dbd7..492c648 100644 --- a/docs/data/documentation/boutique/store/removeall()-9zfmy.json +++ b/docs/data/documentation/boutique/store/removeall()-9zfmy.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"A separate method you should use when removing all data rather than calling"},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-5dwyv"},{"type":"text","text":" or "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-3nzlq"},{"type":"text","text":" multiple times."},{"type":"text","text":" "},{"type":"text","text":"This method handles removing all of the data in one operation rather than iterating over every item"},{"type":"text","text":" "},{"type":"text","text":"in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":", avoiding multiple dispatches to the "},{"type":"codeVoice","code":"@MainActor"},{"type":"text","text":", with far better performance."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/store\/removeall()-9zfmy"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-9zfmy","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"title":"removeAll()","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique5StoreC9removeAllyyYaKF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store/removeAll()-9zfmy":{"role":"symbol","title":"removeAll()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-9zfmy","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/removeall()-9zfmy"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-3nzlq":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-3nzlq","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/remove(_:)-3nzlq"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-5dwyv":{"role":"symbol","title":"remove(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"remove"},{"kind":"text","text":"(["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-5dwyv","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/store\/remove(_:)-5dwyv"}}} \ No newline at end of file +{"metadata":{"roleHeading":"Instance Method","externalID":"s:8Boutique5StoreC9removeAllyyYaKF","role":"symbol","fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"removeAll","kind":"identifier"},{"text":"() ","kind":"text"},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"}],"modules":[{"name":"Boutique"}],"symbolKind":"method","title":"removeAll()"},"variants":[{"paths":["\/documentation\/boutique\/store\/removeall()-9zfmy"],"traits":[{"interfaceLanguage":"swift"}]}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Store"]]},"kind":"symbol","abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"sections":[],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-9zfmy","interfaceLanguage":"swift"},"primaryContentSections":[{"declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"removeAll"},{"text":"() ","kind":"text"},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"}],"languages":["swift"],"platforms":["macOS"]}],"kind":"declarations"},{"kind":"content","content":[{"type":"heading","text":"Discussion","level":2,"anchor":"discussion"},{"inlineContent":[{"type":"text","text":"A separate method you should use when removing all data rather than calling"},{"type":"text","text":" "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-5dwyv"},{"text":" or ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-3nzlq","type":"reference"},{"text":" multiple times.","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"This method handles removing all of the data in one operation rather than iterating over every item"},{"text":" ","type":"text"},{"type":"text","text":"in the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"text":", avoiding multiple dispatches to the ","type":"text"},{"type":"codeVoice","code":"@MainActor"},{"type":"text","text":", with far better performance."}],"type":"paragraph"}]}],"schemaVersion":{"minor":3,"major":0,"patch":0},"references":{"doc://Boutique/documentation/Boutique/Store/remove(_:)-3nzlq":{"title":"remove(_:)","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-3nzlq","url":"\/documentation\/boutique\/store\/remove(_:)-3nzlq","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"kind":"text","text":"("},{"text":"Item","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"abstract":[{"type":"text","text":"Removes an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","role":"symbol","type":"topic"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Store/removeAll()-9zfmy":{"title":"removeAll()","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/removeAll()-9zfmy","url":"\/documentation\/boutique\/store\/removeall()-9zfmy","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"removeAll","kind":"identifier"},{"text":"() ","kind":"text"},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"}],"abstract":[{"type":"text","text":"Removes all items from the store’s memory cache and storage engine."}],"kind":"symbol","role":"symbol","type":"topic"},"doc://Boutique/documentation/Boutique/Store/remove(_:)-5dwyv":{"kind":"symbol","title":"remove(_:)","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store\/remove(_:)-5dwyv","role":"symbol","type":"topic","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"remove","kind":"identifier"},{"text":"([","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"]) "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"kind":"keyword","text":"throws"}],"url":"\/documentation\/boutique\/store\/remove(_:)-5dwyv","abstract":[{"type":"text","text":"Removes a list of items from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/stored.json b/docs/data/documentation/boutique/stored.json index 936295e..b7cf5af 100644 --- a/docs/data/documentation/boutique/stored.json +++ b/docs/data/documentation/boutique/stored.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"attribute","text":"@propertyWrapper"},{"kind":"text","text":" "},{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Item"},{"kind":"text","text":"> "},{"kind":"keyword","text":"where"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Decodable","preciseIdentifier":"s:Se"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Encodable","preciseIdentifier":"s:SE"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/stored"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"title":"Stored","roleHeading":"Structure","role":"symbol","symbolKind":"struct","externalID":"s:8Boutique6StoredV","modules":[{"name":"Boutique"}],"navigatorTitle":[{"kind":"identifier","text":"Stored"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique"]]},"topicSections":[{"title":"Initializers","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Stored\/init(in:)"]},{"title":"Instance Properties","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Stored\/projectedValue","doc:\/\/Boutique\/documentation\/Boutique\/Stored\/wrappedValue"]}],"references":{"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/Stored/projectedValue":{"role":"symbol","title":"projectedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored\/projectedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/stored\/projectedvalue"},"doc://Boutique/documentation/Boutique/Stored/init(in:)":{"role":"symbol","title":"init(in:)","fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"in"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">)"}],"abstract":[{"type":"text","text":"Initializes a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property that will be exposed as an "},{"type":"codeVoice","code":"[Item]"},{"type":"text","text":" and project a "},{"type":"codeVoice","code":"Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored\/init(in:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/stored\/init(in:)"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Stored/wrappedValue":{"role":"symbol","title":"wrappedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored\/wrappedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/stored\/wrappedvalue"}}} \ No newline at end of file +{"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"languages":["swift"],"tokens":[{"kind":"attribute","text":"@propertyWrapper"},{"kind":"text","text":" "},{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Item"},{"kind":"text","text":"> "},{"text":"where","kind":"keyword"},{"kind":"text","text":" "},{"text":"Item","kind":"typeIdentifier"},{"text":" : ","kind":"text"},{"preciseIdentifier":"s:Se","kind":"typeIdentifier","text":"Decodable"},{"text":", ","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":" : "},{"text":"Encodable","kind":"typeIdentifier","preciseIdentifier":"s:SE"}]}]}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique"]]},"schemaVersion":{"minor":3,"patch":0,"major":0},"metadata":{"modules":[{"name":"Boutique"}],"roleHeading":"Structure","title":"Stored","role":"symbol","symbolKind":"struct","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"externalID":"s:8Boutique6StoredV","fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}]},"abstract":[{"text":"The @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"type":"text","text":"."}],"topicSections":[{"title":"Initializers","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Stored\/init(in:)"]},{"identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/Stored\/projectedValue","doc:\/\/Boutique\/documentation\/Boutique\/Stored\/wrappedValue"],"title":"Instance Properties"}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/stored"]}],"sections":[],"kind":"symbol","references":{"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/Stored/wrappedValue":{"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored\/wrappedValue","title":"wrappedValue","type":"topic","url":"\/documentation\/boutique\/stored\/wrappedvalue","role":"symbol","kind":"symbol","fragments":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"text":"wrappedValue","kind":"identifier"},{"text":": [","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"]","kind":"text"}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Stored/init(in:)":{"title":"init(in:)","url":"\/documentation\/boutique\/stored\/init(in:)","role":"symbol","kind":"symbol","type":"topic","abstract":[{"type":"text","text":"Initializes a @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":" property that will be exposed as an "},{"type":"codeVoice","code":"[Item]"},{"text":" and project a ","type":"text"},{"type":"codeVoice","code":"Store"},{"text":".","type":"text"}],"fragments":[{"text":"init","kind":"identifier"},{"kind":"text","text":"("},{"kind":"externalParam","text":"in"},{"text":": ","kind":"text"},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">)"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored\/init(in:)"},"doc://Boutique/documentation/Boutique/Stored/projectedValue":{"title":"projectedValue","url":"\/documentation\/boutique\/stored\/projectedvalue","role":"symbol","kind":"symbol","type":"topic","abstract":[],"fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"kind":"identifier","text":"projectedValue"},{"text":": ","kind":"text"},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">","kind":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored\/projectedValue"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/stored/init(in:).json b/docs/data/documentation/boutique/stored/init(in:).json index 7c8d437..9f7f6c1 100644 --- a/docs/data/documentation/boutique/stored/init(in:).json +++ b/docs/data/documentation/boutique/stored/init(in:).json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"in"},{"kind":"text","text":" "},{"kind":"internalParam","text":"store"},{"kind":"text","text":": "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">)"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"store","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The store that will be wrapped to expose as an array."}]}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/stored\/init(in:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Stored\/init(in:)","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Initializes a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property that will be exposed as an "},{"type":"codeVoice","code":"[Item]"},{"type":"text","text":" and project a "},{"type":"codeVoice","code":"Store"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"in"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">)"}],"title":"init(in:)","roleHeading":"Initializer","role":"symbol","symbolKind":"init","externalID":"s:8Boutique6StoredV2inACyxGAA5StoreCyxG_tcfc","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Stored"]]},"references":{"doc://Boutique/documentation/Boutique/Stored/init(in:)":{"role":"symbol","title":"init(in:)","fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"in"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">)"}],"abstract":[{"type":"text","text":"Initializes a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property that will be exposed as an "},{"type":"codeVoice","code":"[Item]"},{"type":"text","text":" and project a "},{"type":"codeVoice","code":"Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored\/init(in:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/stored\/init(in:)"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"}}} \ No newline at end of file +{"metadata":{"fragments":[{"kind":"identifier","text":"init"},{"text":"(","kind":"text"},{"text":"in","kind":"externalParam"},{"kind":"text","text":": "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">)"}],"role":"symbol","symbolKind":"init","roleHeading":"Initializer","modules":[{"name":"Boutique"}],"title":"init(in:)","externalID":"s:8Boutique6StoredV2inACyxGAA5StoreCyxG_tcfc"},"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"languages":["swift"],"tokens":[{"text":"init","kind":"keyword"},{"kind":"text","text":"("},{"text":"in","kind":"externalParam"},{"text":" ","kind":"text"},{"kind":"internalParam","text":"store"},{"kind":"text","text":": "},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","text":"Store"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":">)","kind":"text"}]}]},{"kind":"parameters","parameters":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The store that will be wrapped to expose as an array."}]}],"name":"store"}]}],"schemaVersion":{"minor":3,"patch":0,"major":0},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Stored"]]},"kind":"symbol","sections":[],"variants":[{"paths":["\/documentation\/boutique\/stored\/init(in:)"],"traits":[{"interfaceLanguage":"swift"}]}],"abstract":[{"text":"Initializes a @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference","isActive":true},{"type":"text","text":" property that will be exposed as an "},{"type":"codeVoice","code":"[Item]"},{"type":"text","text":" and project a "},{"code":"Store","type":"codeVoice"},{"text":".","type":"text"}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/Stored\/init(in:)"},"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Stored/init(in:)":{"title":"init(in:)","url":"\/documentation\/boutique\/stored\/init(in:)","role":"symbol","kind":"symbol","type":"topic","abstract":[{"type":"text","text":"Initializes a @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":" property that will be exposed as an "},{"type":"codeVoice","code":"[Item]"},{"text":" and project a ","type":"text"},{"type":"codeVoice","code":"Store"},{"text":".","type":"text"}],"fragments":[{"text":"init","kind":"identifier"},{"kind":"text","text":"("},{"kind":"externalParam","text":"in"},{"text":": ","kind":"text"},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">)"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored\/init(in:)"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/stored/projectedvalue.json b/docs/data/documentation/boutique/stored/projectedvalue.json index e1ffa9f..f25b6ec 100644 --- a/docs/data/documentation/boutique/stored/projectedvalue.json +++ b/docs/data/documentation/boutique/stored/projectedvalue.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","preciseIdentifier":"s:8Boutique5StoreC","text":"Store"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"> { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/stored\/projectedvalue"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Stored\/projectedValue","interfaceLanguage":"swift"},"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"title":"projectedValue","roleHeading":"Instance Property","role":"symbol","symbolKind":"property","externalID":"s:8Boutique6StoredV14projectedValueAA5StoreCyxGvp","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Stored"]]},"references":{"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/Stored/projectedValue":{"role":"symbol","title":"projectedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored\/projectedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/stored\/projectedvalue"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"}}} \ No newline at end of file +{"schemaVersion":{"patch":0,"minor":3,"major":0},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Stored"]]},"sections":[],"metadata":{"fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"text":"projectedValue","kind":"identifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Store","preciseIdentifier":"s:8Boutique5StoreC"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":">","kind":"text"}],"title":"projectedValue","externalID":"s:8Boutique6StoredV14projectedValueAA5StoreCyxGvp","role":"symbol","roleHeading":"Instance Property","symbolKind":"property","modules":[{"name":"Boutique"}]},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/stored\/projectedvalue"]}],"kind":"symbol","primaryContentSections":[{"declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"projectedValue"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:8Boutique5StoreC","kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","text":"Store"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"> { "},{"kind":"keyword","text":"get"},{"text":" }","kind":"text"}],"languages":["swift"]}],"kind":"declarations"}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/Stored\/projectedValue"},"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Stored/projectedValue":{"title":"projectedValue","url":"\/documentation\/boutique\/stored\/projectedvalue","role":"symbol","kind":"symbol","type":"topic","abstract":[],"fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"kind":"identifier","text":"projectedValue"},{"text":": ","kind":"text"},{"text":"Store","kind":"typeIdentifier","preciseIdentifier":"s:8Boutique5StoreC"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":">","kind":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored\/projectedValue"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/stored/wrappedvalue.json b/docs/data/documentation/boutique/stored/wrappedvalue.json index 54f6ed2..d8468c8 100644 --- a/docs/data/documentation/boutique/stored/wrappedvalue.json +++ b/docs/data/documentation/boutique/stored/wrappedvalue.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"] { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/stored\/wrappedvalue"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Stored\/wrappedValue","interfaceLanguage":"swift"},"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]"}],"title":"wrappedValue","roleHeading":"Instance Property","role":"symbol","symbolKind":"property","externalID":"s:8Boutique6StoredV12wrappedValueSayxGvp","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Stored"]]},"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Stored/wrappedValue":{"role":"symbol","title":"wrappedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"]"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored\/wrappedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/stored\/wrappedvalue"}}} \ No newline at end of file +{"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"tokens":[{"text":"@","kind":"attribute"},{"kind":"attribute","text":"MainActor","preciseIdentifier":"s:ScM"},{"kind":"text","text":" "},{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": ["},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"] { "},{"text":"get","kind":"keyword"},{"kind":"text","text":" }"}],"platforms":["macOS"]}]}],"metadata":{"externalID":"s:8Boutique6StoredV12wrappedValueSayxGvp","title":"wrappedValue","roleHeading":"Instance Property","role":"symbol","modules":[{"name":"Boutique"}],"symbolKind":"property","fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"kind":"identifier","text":"wrappedValue"},{"text":": [","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"]","kind":"text"}]},"schemaVersion":{"major":0,"patch":0,"minor":3},"sections":[],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/Stored\/wrappedValue"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/Stored"]]},"kind":"symbol","variants":[{"paths":["\/documentation\/boutique\/stored\/wrappedvalue"],"traits":[{"interfaceLanguage":"swift"}]}],"references":{"doc://Boutique/documentation/Boutique/Stored/wrappedValue":{"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored\/wrappedValue","title":"wrappedValue","type":"topic","url":"\/documentation\/boutique\/stored\/wrappedvalue","role":"symbol","kind":"symbol","fragments":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"text":"wrappedValue","kind":"identifier"},{"text":": [","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"]","kind":"text"}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/storedvalue.json b/docs/data/documentation/boutique/storedvalue.json index 65d46ab..67d4203 100644 --- a/docs/data/documentation/boutique/storedvalue.json +++ b/docs/data/documentation/boutique/storedvalue.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"attribute","text":"@propertyWrapper"},{"kind":"text","text":" "},{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Item"},{"kind":"text","text":"> "},{"kind":"keyword","text":"where"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Decodable","preciseIdentifier":"s:Se"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Encodable","preciseIdentifier":"s:SE"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"overview","level":2,"type":"heading","text":"Overview"},{"type":"paragraph","inlineContent":[{"type":"text","text":"You should use a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" if you’re only storing a single item, as opposed to a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" "},{"type":"text","text":"which stores an array of items exposed as the "},{"type":"codeVoice","code":"items: [Item]"},{"type":"text","text":" property."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is useful for similar use cases as "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":", where it’s common to store only a single item"},{"type":"text","text":" "},{"type":"text","text":"such as the app’s "},{"type":"codeVoice","code":"lastOpenedDate"},{"type":"text","text":", an object of the user’s preferences, configurations, and more."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Values are delivered synchronously and are available on app launch, using "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" as the"},{"type":"text","text":" "},{"type":"text","text":"backing store to accomplish this. If you wish to use your own "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" you can use @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"You must initialize a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" with a default value like you would any other Swift property."}]},{"type":"codeListing","syntax":null,"code":["@StoredValue(key: \"redPanda\")","private var redPanda = RedPanda(cuteRating: 100)"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"A @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" can be nullable, but in that case you will have to specify the type as well."}]},{"type":"codeListing","syntax":null,"code":["@StoredValue(key: \"pandaRojo\")","private var spanishRedPanda = nil"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" is also straightforward, there are only two functions."},{"type":"text","text":" "},{"type":"text","text":"To change the value of the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":", you can use the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()"},{"type":"text","text":" functions."}]},{"type":"codeListing","syntax":null,"code":["$redPanda.set(RedPanda(cuteRating: 99)) \/\/ The @StoredValue has a new red panda","$redPanda.reset() \/\/ The @AsyncStoredValue is nil"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"One last bit of advice, when calling "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()"},{"type":"text","text":" don’t forget to put a "},{"type":"codeVoice","code":"$"},{"type":"text","text":" "},{"type":"text","text":"in front of the the "},{"type":"codeVoice","code":"$storedValue"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"See: "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()"},{"type":"text","text":" docs for a more in depth explanation."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/storedvalue"],"traits":[{"interfaceLanguage":"swift"}]}],"relationshipsSections":[{"identifiers":["doc:\/\/Boutique\/s8SendableP"],"kind":"relationships","title":"Conforms To","type":"conformsTo"}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"title":"StoredValue","roleHeading":"Structure","role":"symbol","symbolKind":"struct","externalID":"s:8Boutique11StoredValueV","modules":[{"name":"Boutique"}],"navigatorTitle":[{"kind":"identifier","text":"StoredValue"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique"]]},"topicSections":[{"title":"Initializers","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/init(wrappedValue:key:storage:)"]},{"title":"Instance Properties","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/binding","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/projectedValue","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/publisher","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/wrappedValue"]},{"title":"Instance Methods","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/append(_:)","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/toggle()","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/update(key:value:)"]}],"references":{"doc://Boutique/documentation/Boutique/StoredValue/binding":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"binding","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"binding"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Binding","preciseIdentifier":"s:7SwiftUI7BindingV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A convenient way to create a "},{"type":"codeVoice","code":"Binding"},{"type":"text","text":" from a "},{"type":"codeVoice","code":"StoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/binding","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/binding"},"doc://Boutique/s8SendableP":{"type":"unresolvable","title":"Swift.Sendable","identifier":"doc:\/\/Boutique\/s8SendableP"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"role":"symbol","title":"AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}],"url":"\/documentation\/boutique\/asyncstoredvalue"},"doc://Boutique/documentation/Boutique/StoredValue/set(_:)":{"role":"symbol","title":"set(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"set"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":")"}],"abstract":[{"type":"text","text":"Sets a value for the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/set(_:)"},"doc://Boutique/documentation/Boutique/StoredValue/publisher":{"role":"symbol","title":"publisher","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"publisher"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A Combine publisher that allows you to observe all changes to the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/publisher","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/publisher"},"doc://Boutique/documentation/Boutique/StoredValue/wrappedValue":{"role":"symbol","title":"wrappedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"}],"abstract":[{"type":"text","text":"The currently stored value"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/wrappedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/wrappedvalue"},"doc://Boutique/documentation/Boutique/StoredValue":{"role":"symbol","title":"StoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"StoredValue"}],"url":"\/documentation\/boutique\/storedvalue"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/StoredValue/projectedValue":{"role":"symbol","title":"projectedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StoredValue","preciseIdentifier":"s:8Boutique11StoredValueV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" which exposes "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()"},{"type":"text","text":" functions alongside a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/publisher"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/projectedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/projectedvalue"},"doc://Boutique/documentation/Boutique/StoredValue/init(wrappedValue:key:storage:)":{"role":"symbol","title":"init(wrappedValue:key:storage:)","fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":", "},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"UserDefaults","preciseIdentifier":"c:objc(cs)NSUserDefaults"},{"kind":"text","text":")"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/init(wrappedValue:key:storage:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/init(wrappedvalue:key:storage:)"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/StoredValue/update(key:value:)":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"update(key:value:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"update"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Key"},{"kind":"text","text":", "},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":", "},{"kind":"externalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"?)"}],"abstract":[{"type":"text","text":"A function to set a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" represented by a "},{"type":"codeVoice","code":"Dictionary"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/update(key:value:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/update(key:value:)"},"doc://Boutique/documentation/Boutique/StoredValue/toggle()":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" is "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"toggle()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"toggle"},{"kind":"text","text":"()"}],"abstract":[{"type":"text","text":"A function to toggle an @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" that represent a "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/toggle()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/toggle()"},"doc://Boutique/documentation/Boutique/StoredValue/reset()":{"role":"symbol","title":"reset()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"reset"},{"kind":"text","text":"()"}],"abstract":[{"type":"text","text":"Resets the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" to the default value."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/reset()"},"doc://Boutique/documentation/Boutique/StoredValue/append(_:)":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"append(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"append"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":")"}],"abstract":[{"type":"text","text":"A function to append a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" represented by an "},{"type":"codeVoice","code":"Array"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/append(_:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/append(_:)"}}} \ No newline at end of file +{"metadata":{"role":"symbol","roleHeading":"Structure","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"StoredValue"}],"symbolKind":"struct","modules":[{"name":"Boutique"}],"externalID":"s:8Boutique11StoredValueV","navigatorTitle":[{"text":"StoredValue","kind":"identifier"}],"title":"StoredValue"},"primaryContentSections":[{"declarations":[{"tokens":[{"text":"@propertyWrapper","kind":"attribute"},{"kind":"text","text":" "},{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"StoredValue","kind":"identifier"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Item"},{"text":"> ","kind":"text"},{"text":"where","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":" : ","kind":"text"},{"preciseIdentifier":"s:Se","text":"Decodable","kind":"typeIdentifier"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Encodable","preciseIdentifier":"s:SE"}],"platforms":["macOS"],"languages":["swift"]}],"kind":"declarations"},{"content":[{"type":"heading","text":"Overview","anchor":"overview","level":2},{"type":"paragraph","inlineContent":[{"type":"text","text":"You should use a @"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","type":"reference"},{"text":" if you’re only storing a single item, as opposed to a @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" "},{"text":"which stores an array of items exposed as the ","type":"text"},{"type":"codeVoice","code":"items: [Item]"},{"text":" property.","type":"text"}]},{"inlineContent":[{"type":"text","text":"This is useful for similar use cases as "},{"code":"UserDefaults","type":"codeVoice"},{"type":"text","text":", where it’s common to store only a single item"},{"type":"text","text":" "},{"type":"text","text":"such as the app’s "},{"type":"codeVoice","code":"lastOpenedDate"},{"type":"text","text":", an object of the user’s preferences, configurations, and more."}],"type":"paragraph"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Values are delivered synchronously and are available on app launch, using "},{"code":"UserDefaults","type":"codeVoice"},{"type":"text","text":" as the"},{"type":"text","text":" "},{"text":"backing store to accomplish this. If you wish to use your own ","type":"text"},{"code":"StorageEngine","type":"codeVoice"},{"text":" you can use @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true},{"text":".","type":"text"}]},{"inlineContent":[{"type":"text","text":"You must initialize a @"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","type":"reference"},{"text":" with a default value like you would any other Swift property.","type":"text"}],"type":"paragraph"},{"type":"codeListing","syntax":null,"code":["@StoredValue(key: \"redPanda\")","private var redPanda = RedPanda(cuteRating: 100)"]},{"inlineContent":[{"text":"A @","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" can be nullable, but in that case you will have to specify the type as well."}],"type":"paragraph"},{"type":"codeListing","syntax":null,"code":["@StoredValue(key: \"pandaRojo\")","private var spanishRedPanda = nil"]},{"inlineContent":[{"type":"text","text":"Using @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true},{"type":"text","text":" is also straightforward, there are only two functions."},{"type":"text","text":" "},{"type":"text","text":"To change the value of the @"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","type":"reference"},{"type":"text","text":", you can use the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)","isActive":true},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()"},{"text":" functions.","type":"text"}],"type":"paragraph"},{"type":"codeListing","syntax":null,"code":["$redPanda.set(RedPanda(cuteRating: 99)) \/\/ The @StoredValue has a new red panda","$redPanda.reset() \/\/ The @AsyncStoredValue is nil"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"One last bit of advice, when calling "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)","type":"reference"},{"text":" and ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()","type":"reference","isActive":true},{"text":" don’t forget to put a ","type":"text"},{"type":"codeVoice","code":"$"},{"type":"text","text":" "},{"type":"text","text":"in front of the the "},{"type":"codeVoice","code":"$storedValue"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"text":"See: ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)","type":"reference"},{"type":"text","text":" and "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()","type":"reference"},{"text":" docs for a more in depth explanation.","type":"text"}]}],"kind":"content"}],"sections":[],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique"]]},"abstract":[{"type":"text","text":"The @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true},{"text":" property wrapper to automagically persist a single ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" in ","type":"text"},{"code":"UserDefaults","type":"codeVoice"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"type":"text","text":" or using @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"text":".","type":"text"}],"topicSections":[{"title":"Initializers","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/init(wrappedValue:key:storage:)"]},{"title":"Instance Properties","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/binding","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/projectedValue","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/publisher","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/wrappedValue"]},{"title":"Instance Methods","identifiers":["doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/append(_:)","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/toggle()","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/togglePresence(_:)","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/update(key:value:)"]}],"variants":[{"paths":["\/documentation\/boutique\/storedvalue"],"traits":[{"interfaceLanguage":"swift"}]}],"kind":"symbol","schemaVersion":{"major":0,"minor":3,"patch":0},"references":{"doc://Boutique/documentation/Boutique/StoredValue/init(wrappedValue:key:storage:)":{"role":"symbol","url":"\/documentation\/boutique\/storedvalue\/init(wrappedvalue:key:storage:)","fragments":[{"kind":"identifier","text":"init"},{"text":"(","kind":"text"},{"text":"wrappedValue","kind":"externalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":", ","kind":"text"},{"text":"key","kind":"externalParam"},{"kind":"text","text":": "},{"preciseIdentifier":"s:SS","text":"String","kind":"typeIdentifier"},{"kind":"text","text":", "},{"text":"storage","kind":"externalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"UserDefaults","preciseIdentifier":"c:objc(cs)NSUserDefaults"},{"kind":"text","text":")"}],"kind":"symbol","abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/init(wrappedValue:key:storage:)","type":"topic","title":"init(wrappedValue:key:storage:)"},"doc://Boutique/documentation/Boutique/StoredValue/reset()":{"role":"symbol","url":"\/documentation\/boutique\/storedvalue\/reset()","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"reset","kind":"identifier"},{"kind":"text","text":"()"}],"kind":"symbol","abstract":[{"type":"text","text":"Resets the @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" to the default value."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()","type":"topic","title":"reset()"},"doc://Boutique/documentation/Boutique/StoredValue/set(_:)":{"role":"symbol","url":"\/documentation\/boutique\/storedvalue\/set(_:)","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"set"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":")","kind":"text"}],"kind":"symbol","abstract":[{"type":"text","text":"Sets a value for the @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)","type":"topic","title":"set(_:)"},"doc://Boutique/documentation/Boutique/StoredValue/toggle()":{"role":"symbol","conformance":{"availabilityPrefix":[{"text":"Available when","type":"text"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" is ","type":"text"},{"code":"Bool","type":"codeVoice"},{"text":".","type":"text"}]},"url":"\/documentation\/boutique\/storedvalue\/toggle()","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"toggle"},{"kind":"text","text":"()"}],"kind":"symbol","abstract":[{"type":"text","text":"A function to toggle an @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true},{"type":"text","text":" that represent a "},{"code":"Bool","type":"codeVoice"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/toggle()","type":"topic","title":"toggle()"},"doc://Boutique/documentation/Boutique/StoredValue":{"type":"topic","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"StoredValue","kind":"identifier"}],"navigatorTitle":[{"text":"StoredValue","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","url":"\/documentation\/boutique\/storedvalue","kind":"symbol","title":"StoredValue","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":" ","type":"text"},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" or using @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue","navigatorTitle":[{"text":"AsyncStoredValue","kind":"identifier"}],"type":"topic","title":"AsyncStoredValue","abstract":[{"type":"text","text":"The @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":" "},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" or using @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"type":"text","text":"."}],"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AsyncStoredValue"}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/StoredValue/binding":{"role":"symbol","conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"text":" and ","type":"text"},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"type":"text","text":"Available when"}]},"url":"\/documentation\/boutique\/storedvalue\/binding","fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"kind":"identifier","text":"binding"},{"text":": ","kind":"text"},{"text":"Binding","kind":"typeIdentifier","preciseIdentifier":"s:7SwiftUI7BindingV"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">"}],"kind":"symbol","abstract":[{"text":"A convenient way to create a ","type":"text"},{"type":"codeVoice","code":"Binding"},{"type":"text","text":" from a "},{"code":"StoredValue","type":"codeVoice"},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/binding","type":"topic","title":"binding"},"doc://Boutique/documentation/Boutique/StoredValue/projectedValue":{"role":"symbol","url":"\/documentation\/boutique\/storedvalue\/projectedvalue","fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"text":"projectedValue","kind":"identifier"},{"kind":"text","text":": "},{"text":"StoredValue","preciseIdentifier":"s:8Boutique11StoredValueV","kind":"typeIdentifier"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">"}],"kind":"symbol","abstract":[{"text":"A ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" which exposes "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)"},{"text":" and ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()","isActive":true,"type":"reference"},{"text":" functions alongside a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/publisher","type":"reference","isActive":true},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/projectedValue","type":"topic","title":"projectedValue"},"doc://Boutique/documentation/Boutique/StoredValue/update(key:value:)":{"fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"update","kind":"identifier"},{"kind":"text","text":"<"},{"text":"Key","kind":"genericParameter"},{"text":", ","kind":"text"},{"text":"Value","kind":"genericParameter"},{"text":">(","kind":"text"},{"kind":"externalParam","text":"key"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":", "},{"kind":"externalParam","text":"value"},{"text":": ","kind":"text"},{"text":"Value","kind":"typeIdentifier"},{"text":"?)","kind":"text"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/update(key:value:)","type":"topic","title":"update(key:value:)","url":"\/documentation\/boutique\/storedvalue\/update(key:value:)","role":"symbol","conformance":{"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"text":" and ","type":"text"},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"abstract":[{"type":"text","text":"A function to set a @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" represented by a "},{"type":"codeVoice","code":"Dictionary"},{"type":"text","text":" "},{"text":"without having to manually make an intermediate copy for every value update.","type":"text"}]},"doc://Boutique/documentation/Boutique/StoredValue/publisher":{"role":"symbol","url":"\/documentation\/boutique\/storedvalue\/publisher","fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"text":"publisher","kind":"identifier"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":", ","kind":"text"},{"preciseIdentifier":"s:s5NeverO","text":"Never","kind":"typeIdentifier"},{"text":">","kind":"text"}],"kind":"symbol","abstract":[{"text":"A Combine publisher that allows you to observe all changes to the @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","type":"reference","isActive":true},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/publisher","type":"topic","title":"publisher"},"doc://Boutique/documentation/Boutique/StoredValue/wrappedValue":{"kind":"symbol","abstract":[{"text":"The currently stored value","type":"text"}],"role":"symbol","url":"\/documentation\/boutique\/storedvalue\/wrappedvalue","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/wrappedValue","title":"wrappedValue","fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"text":"wrappedValue","kind":"identifier"},{"kind":"text","text":": "},{"text":"Item","kind":"typeIdentifier"}],"type":"topic"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/StoredValue/append(_:)":{"role":"symbol","conformance":{"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"type":"codeVoice","code":"RangeReplaceableCollection"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"url":"\/documentation\/boutique\/storedvalue\/append(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"append","kind":"identifier"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"."},{"kind":"typeIdentifier","preciseIdentifier":"s:ST7ElementQa","text":"Element"},{"text":")","kind":"text"}],"kind":"symbol","abstract":[{"type":"text","text":"A function to append a @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" represented by an ","type":"text"},{"type":"codeVoice","code":"Array"},{"text":" ","type":"text"},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/append(_:)","type":"topic","title":"append(_:)"},"doc://Boutique/documentation/Boutique/StoredValue/togglePresence(_:)":{"type":"topic","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"togglePresence"},{"kind":"text","text":"<"},{"text":"Value","kind":"genericParameter"},{"text":">(","kind":"text"},{"kind":"typeIdentifier","text":"Value"},{"text":")","kind":"text"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/togglePresence(_:)","url":"\/documentation\/boutique\/storedvalue\/togglepresence(_:)","abstract":[],"title":"togglePresence(_:)","role":"symbol","conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"RangeReplaceableCollection","type":"codeVoice"},{"text":".","type":"text"}]}},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/storedvalue/append(_:).json b/docs/data/documentation/boutique/storedvalue/append(_:).json index b7a9889..c510e66 100644 --- a/docs/data/documentation/boutique/storedvalue/append(_:).json +++ b/docs/data/documentation/boutique/storedvalue/append(_:).json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"append"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":") "},{"kind":"keyword","text":"where"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" == ["},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"], "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Decodable","preciseIdentifier":"s:Se"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Encodable","preciseIdentifier":"s:SE"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is meant to provide a simple ergonomic improvement, avoiding callsites like this."}]},{"type":"codeListing","syntax":null,"code":["var updatedRedPandaList = self.redPandaList","updatedRedPandaList.append(\"Pabu\")","self.$redPandaList.set(updatedRedPandaList)"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Instead this function provides a much simpler alternative."}]},{"type":"codeListing","syntax":null,"code":["try await self.$redPandaList.append(\"Pabu\")"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/storedvalue\/append(_:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/append(_:)","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A function to append a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" represented by an "},{"type":"codeVoice","code":"Array"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"append(_:)","roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"append"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":")"}],"symbolKind":"method","externalID":"s:8Boutique11StoredValueV6appendyyqd__Sayqd__GRszSeRd__SERd__lF","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/StoredValue":{"role":"symbol","title":"StoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"StoredValue"}],"url":"\/documentation\/boutique\/storedvalue"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/StoredValue/append(_:)":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"append(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"append"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":")"}],"abstract":[{"type":"text","text":"A function to append a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" represented by an "},{"type":"codeVoice","code":"Array"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/append(_:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/append(_:)"}}} \ No newline at end of file +{"kind":"symbol","metadata":{"conformance":{"conformancePrefix":[{"type":"text","text":"Conforms when"}],"constraints":[{"type":"codeVoice","code":"Item"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"type":"codeVoice","code":"RangeReplaceableCollection"},{"text":".","type":"text"}],"availabilityPrefix":[{"type":"text","text":"Available when"}]},"fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"append"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"text":".","kind":"text"},{"text":"Element","kind":"typeIdentifier","preciseIdentifier":"s:ST7ElementQa"},{"text":")","kind":"text"}],"externalID":"s:8Boutique11StoredValueVAASmRzrlE6appendyy7ElementSTQzF","symbolKind":"method","title":"append(_:)","extendedModule":"Boutique","roleHeading":"Instance Method","role":"symbol","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"kind":"attribute","text":"@"},{"text":"MainActor","kind":"attribute","preciseIdentifier":"s:ScM"},{"kind":"text","text":" "},{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"append"},{"text":"(","kind":"text"},{"text":"_","kind":"externalParam"},{"kind":"text","text":" "},{"text":"item","kind":"internalParam"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"."},{"text":"Element","kind":"typeIdentifier","preciseIdentifier":"s:ST7ElementQa"},{"text":")","kind":"text"}],"languages":["swift"]}]},{"kind":"content","content":[{"anchor":"discussion","type":"heading","text":"Discussion","level":2},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is meant to provide a simple ergonomic improvement, avoiding callsites like this."}]},{"code":["var updatedRedPandaList = self.redPandaList","updatedRedPandaList.append(\"Pabu\")","self.$redPandaList.set(updatedRedPandaList)"],"type":"codeListing","syntax":null},{"inlineContent":[{"type":"text","text":"Instead this function provides a much simpler alternative."}],"type":"paragraph"},{"type":"codeListing","syntax":null,"code":["try await self.$redPandaList.append(\"Pabu\")"]}]}],"variants":[{"paths":["\/documentation\/boutique\/storedvalue\/append(_:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/append(_:)","interfaceLanguage":"swift"},"schemaVersion":{"patch":0,"major":0,"minor":3},"abstract":[{"text":"A function to append a @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true},{"type":"text","text":" represented by an "},{"code":"Array","type":"codeVoice"},{"text":" ","type":"text"},{"text":"without having to manually make an intermediate copy for every value update.","type":"text"}],"sections":[],"references":{"doc://Boutique/documentation/Boutique/StoredValue/append(_:)":{"role":"symbol","conformance":{"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"type":"codeVoice","code":"RangeReplaceableCollection"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"url":"\/documentation\/boutique\/storedvalue\/append(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"text":"append","kind":"identifier"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":"."},{"kind":"typeIdentifier","preciseIdentifier":"s:ST7ElementQa","text":"Element"},{"text":")","kind":"text"}],"kind":"symbol","abstract":[{"type":"text","text":"A function to append a @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" represented by an ","type":"text"},{"type":"codeVoice","code":"Array"},{"text":" ","type":"text"},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/append(_:)","type":"topic","title":"append(_:)"},"doc://Boutique/documentation/Boutique/StoredValue":{"type":"topic","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"StoredValue","kind":"identifier"}],"navigatorTitle":[{"text":"StoredValue","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","url":"\/documentation\/boutique\/storedvalue","kind":"symbol","title":"StoredValue","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":" ","type":"text"},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" or using @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/storedvalue/binding.json b/docs/data/documentation/boutique/storedvalue/binding.json index ff519a5..1ecbb93 100644 --- a/docs/data/documentation/boutique/storedvalue/binding.json +++ b/docs/data/documentation/boutique/storedvalue/binding.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"binding"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Binding","preciseIdentifier":"s:7SwiftUI7BindingV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"> { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"return-value","level":2,"type":"heading","text":"Return Value"},{"type":"paragraph","inlineContent":[{"type":"text","text":"A "},{"type":"codeVoice","code":"Binding"},{"type":"text","text":" of the "},{"type":"codeVoice","code":"StoredValue"},{"type":"text","text":" provided."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/storedvalue\/binding"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/binding","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A convenient way to create a "},{"type":"codeVoice","code":"Binding"},{"type":"text","text":" from a "},{"type":"codeVoice","code":"StoredValue"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"binding","roleHeading":"Instance Property","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"binding"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Binding","preciseIdentifier":"s:7SwiftUI7BindingV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"symbolKind":"property","externalID":"s:8Boutique11StoredValueV7binding7SwiftUI7BindingVyxGvp","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/StoredValue":{"role":"symbol","title":"StoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"StoredValue"}],"url":"\/documentation\/boutique\/storedvalue"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/StoredValue/binding":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"binding","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"binding"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Binding","preciseIdentifier":"s:7SwiftUI7BindingV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A convenient way to create a "},{"type":"codeVoice","code":"Binding"},{"type":"text","text":" from a "},{"type":"codeVoice","code":"StoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/binding","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/binding"}}} \ No newline at end of file +{"metadata":{"roleHeading":"Instance Property","externalID":"s:8Boutique11StoredValueV7binding7SwiftUI7BindingVyxGvp","role":"symbol","conformance":{"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}],"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":"."}]},"fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"text":"binding","kind":"identifier"},{"kind":"text","text":": "},{"text":"Binding","kind":"typeIdentifier","preciseIdentifier":"s:7SwiftUI7BindingV"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"text":">","kind":"text"}],"modules":[{"name":"Boutique"}],"extendedModule":"Boutique","symbolKind":"property","title":"binding"},"abstract":[{"type":"text","text":"A convenient way to create a "},{"type":"codeVoice","code":"Binding"},{"type":"text","text":" from a "},{"code":"StoredValue","type":"codeVoice"},{"text":".","type":"text"}],"variants":[{"paths":["\/documentation\/boutique\/storedvalue\/binding"],"traits":[{"interfaceLanguage":"swift"}]}],"kind":"symbol","primaryContentSections":[{"declarations":[{"tokens":[{"text":"@","kind":"attribute"},{"preciseIdentifier":"s:ScM","kind":"attribute","text":"MainActor"},{"text":" ","kind":"text"},{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"text":"binding","kind":"identifier"},{"text":": ","kind":"text"},{"text":"Binding","preciseIdentifier":"s:7SwiftUI7BindingV","kind":"typeIdentifier"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":"> { ","kind":"text"},{"text":"get","kind":"keyword"},{"text":" }","kind":"text"}],"platforms":["macOS"],"languages":["swift"]}],"kind":"declarations"},{"content":[{"anchor":"return-value","text":"Return Value","type":"heading","level":2},{"type":"paragraph","inlineContent":[{"text":"A ","type":"text"},{"code":"Binding","type":"codeVoice"},{"type":"text","text":" of the "},{"type":"codeVoice","code":"StoredValue"},{"type":"text","text":" provided."}]}],"kind":"content"}],"schemaVersion":{"patch":0,"major":0,"minor":3},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/binding"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"sections":[],"references":{"doc://Boutique/documentation/Boutique/StoredValue/binding":{"role":"symbol","conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"text":" and ","type":"text"},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"type":"text","text":"Available when"}]},"url":"\/documentation\/boutique\/storedvalue\/binding","fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"kind":"identifier","text":"binding"},{"text":": ","kind":"text"},{"text":"Binding","kind":"typeIdentifier","preciseIdentifier":"s:7SwiftUI7BindingV"},{"kind":"text","text":"<"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">"}],"kind":"symbol","abstract":[{"text":"A convenient way to create a ","type":"text"},{"type":"codeVoice","code":"Binding"},{"type":"text","text":" from a "},{"code":"StoredValue","type":"codeVoice"},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/binding","type":"topic","title":"binding"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/StoredValue":{"type":"topic","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"StoredValue","kind":"identifier"}],"navigatorTitle":[{"text":"StoredValue","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","url":"\/documentation\/boutique\/storedvalue","kind":"symbol","title":"StoredValue","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":" ","type":"text"},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" or using @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/storedvalue/init(wrappedvalue:key:storage:).json b/docs/data/documentation/boutique/storedvalue/init(wrappedvalue:key:storage:).json index af911c9..7485fb7 100644 --- a/docs/data/documentation/boutique/storedvalue/init(wrappedvalue:key:storage:).json +++ b/docs/data/documentation/boutique/storedvalue/init(wrappedvalue:key:storage:).json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":", "},{"kind":"externalParam","text":"storage"},{"kind":"text","text":" "},{"kind":"internalParam","text":"userDefaults"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"UserDefaults","preciseIdentifier":"c:objc(cs)NSUserDefaults"},{"kind":"text","text":" = UserDefaults.standard)"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/storedvalue\/init(wrappedvalue:key:storage:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/init(wrappedValue:key:storage:)","interfaceLanguage":"swift"},"kind":"symbol","metadata":{"fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":", "},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"UserDefaults","preciseIdentifier":"c:objc(cs)NSUserDefaults"},{"kind":"text","text":")"}],"title":"init(wrappedValue:key:storage:)","roleHeading":"Initializer","role":"symbol","symbolKind":"init","externalID":"s:8Boutique11StoredValueV07wrappedC03key7storageACyxGx_SSSo14NSUserDefaultsCtcfc","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/StoredValue/init(wrappedValue:key:storage:)":{"role":"symbol","title":"init(wrappedValue:key:storage:)","fragments":[{"kind":"identifier","text":"init"},{"kind":"text","text":"("},{"kind":"externalParam","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":", "},{"kind":"externalParam","text":"storage"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"UserDefaults","preciseIdentifier":"c:objc(cs)NSUserDefaults"},{"kind":"text","text":")"}],"abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/init(wrappedValue:key:storage:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/init(wrappedvalue:key:storage:)"},"doc://Boutique/documentation/Boutique/StoredValue":{"role":"symbol","title":"StoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"StoredValue"}],"url":"\/documentation\/boutique\/storedvalue"}}} \ No newline at end of file +{"schemaVersion":{"minor":3,"major":0,"patch":0},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/storedvalue\/init(wrappedvalue:key:storage:)"]}],"sections":[],"metadata":{"fragments":[{"text":"init","kind":"identifier"},{"text":"(","kind":"text"},{"text":"wrappedValue","kind":"externalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"text":"key","kind":"externalParam"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":", "},{"text":"storage","kind":"externalParam"},{"kind":"text","text":": "},{"text":"UserDefaults","preciseIdentifier":"c:objc(cs)NSUserDefaults","kind":"typeIdentifier"},{"text":")","kind":"text"}],"symbolKind":"init","roleHeading":"Initializer","externalID":"s:8Boutique11StoredValueV07wrappedC03key7storageACyxGx_SSSo14NSUserDefaultsCtcfc","title":"init(wrappedValue:key:storage:)","role":"symbol","modules":[{"name":"Boutique"}]},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/init(wrappedValue:key:storage:)","interfaceLanguage":"swift"},"kind":"symbol","primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"init"},{"text":"(","kind":"text"},{"text":"wrappedValue","kind":"externalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"externalParam","text":"key"},{"text":": ","kind":"text"},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"},{"text":", ","kind":"text"},{"kind":"externalParam","text":"storage"},{"kind":"text","text":" "},{"kind":"internalParam","text":"userDefaults"},{"text":": ","kind":"text"},{"text":"UserDefaults","preciseIdentifier":"c:objc(cs)NSUserDefaults","kind":"typeIdentifier"},{"text":" = UserDefaults.standard)","kind":"text"}],"platforms":["macOS"],"languages":["swift"]}]}],"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/StoredValue":{"type":"topic","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"StoredValue","kind":"identifier"}],"navigatorTitle":[{"text":"StoredValue","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","url":"\/documentation\/boutique\/storedvalue","kind":"symbol","title":"StoredValue","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":" ","type":"text"},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" or using @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/StoredValue/init(wrappedValue:key:storage:)":{"role":"symbol","url":"\/documentation\/boutique\/storedvalue\/init(wrappedvalue:key:storage:)","fragments":[{"kind":"identifier","text":"init"},{"text":"(","kind":"text"},{"text":"wrappedValue","kind":"externalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":", ","kind":"text"},{"text":"key","kind":"externalParam"},{"kind":"text","text":": "},{"preciseIdentifier":"s:SS","text":"String","kind":"typeIdentifier"},{"kind":"text","text":", "},{"text":"storage","kind":"externalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"UserDefaults","preciseIdentifier":"c:objc(cs)NSUserDefaults"},{"kind":"text","text":")"}],"kind":"symbol","abstract":[],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/init(wrappedValue:key:storage:)","type":"topic","title":"init(wrappedValue:key:storage:)"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/storedvalue/projectedvalue.json b/docs/data/documentation/boutique/storedvalue/projectedvalue.json index b435bc8..86545db 100644 --- a/docs/data/documentation/boutique/storedvalue/projectedvalue.json +++ b/docs/data/documentation/boutique/storedvalue/projectedvalue.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","preciseIdentifier":"s:8Boutique11StoredValueV","text":"StoredValue"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":"> { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/storedvalue\/projectedvalue"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/projectedValue","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" which exposes "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()"},{"type":"text","text":" functions alongside a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/publisher"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StoredValue","preciseIdentifier":"s:8Boutique11StoredValueV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"title":"projectedValue","roleHeading":"Instance Property","role":"symbol","symbolKind":"property","externalID":"s:8Boutique11StoredValueV09projectedC0ACyxGvp","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/StoredValue/publisher":{"role":"symbol","title":"publisher","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"publisher"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A Combine publisher that allows you to observe all changes to the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/publisher","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/publisher"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/StoredValue/set(_:)":{"role":"symbol","title":"set(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"set"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":")"}],"abstract":[{"type":"text","text":"Sets a value for the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/set(_:)"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/StoredValue":{"role":"symbol","title":"StoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"StoredValue"}],"url":"\/documentation\/boutique\/storedvalue"},"doc://Boutique/documentation/Boutique/StoredValue/projectedValue":{"role":"symbol","title":"projectedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"StoredValue","preciseIdentifier":"s:8Boutique11StoredValueV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" which exposes "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)"},{"type":"text","text":" and "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()"},{"type":"text","text":" functions alongside a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/publisher"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/projectedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/projectedvalue"},"doc://Boutique/documentation/Boutique/StoredValue/reset()":{"role":"symbol","title":"reset()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"reset"},{"kind":"text","text":"()"}],"abstract":[{"type":"text","text":"Resets the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" to the default value."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/reset()"}}} \ No newline at end of file +{"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"tokens":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"kind":"identifier","text":"projectedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","preciseIdentifier":"s:8Boutique11StoredValueV","text":"StoredValue"},{"text":"<","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":"> { ","kind":"text"},{"text":"get","kind":"keyword"},{"kind":"text","text":" }"}],"platforms":["macOS"]}]}],"variants":[{"paths":["\/documentation\/boutique\/storedvalue\/projectedvalue"],"traits":[{"interfaceLanguage":"swift"}]}],"kind":"symbol","schemaVersion":{"major":0,"minor":3,"patch":0},"metadata":{"fragments":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"text":"projectedValue","kind":"identifier"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:8Boutique11StoredValueV","text":"StoredValue","kind":"typeIdentifier"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":">"}],"title":"projectedValue","externalID":"s:8Boutique11StoredValueV09projectedC0ACyxGvp","role":"symbol","roleHeading":"Instance Property","symbolKind":"property","modules":[{"name":"Boutique"}]},"sections":[],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/projectedValue","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true},{"type":"text","text":" which exposes "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)"},{"text":" and ","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()"},{"type":"text","text":" functions alongside a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/publisher","type":"reference","isActive":true},{"text":".","type":"text"}],"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/StoredValue/set(_:)":{"role":"symbol","url":"\/documentation\/boutique\/storedvalue\/set(_:)","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"set"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":")","kind":"text"}],"kind":"symbol","abstract":[{"type":"text","text":"Sets a value for the @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)","type":"topic","title":"set(_:)"},"doc://Boutique/documentation/Boutique/StoredValue":{"type":"topic","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"StoredValue","kind":"identifier"}],"navigatorTitle":[{"text":"StoredValue","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","url":"\/documentation\/boutique\/storedvalue","kind":"symbol","title":"StoredValue","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":" ","type":"text"},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" or using @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/StoredValue/publisher":{"role":"symbol","url":"\/documentation\/boutique\/storedvalue\/publisher","fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"text":"publisher","kind":"identifier"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":", ","kind":"text"},{"preciseIdentifier":"s:s5NeverO","text":"Never","kind":"typeIdentifier"},{"text":">","kind":"text"}],"kind":"symbol","abstract":[{"text":"A Combine publisher that allows you to observe all changes to the @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","type":"reference","isActive":true},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/publisher","type":"topic","title":"publisher"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/StoredValue/reset()":{"role":"symbol","url":"\/documentation\/boutique\/storedvalue\/reset()","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"reset","kind":"identifier"},{"kind":"text","text":"()"}],"kind":"symbol","abstract":[{"type":"text","text":"Resets the @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" to the default value."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()","type":"topic","title":"reset()"},"doc://Boutique/documentation/Boutique/StoredValue/projectedValue":{"role":"symbol","url":"\/documentation\/boutique\/storedvalue\/projectedvalue","fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"text":"projectedValue","kind":"identifier"},{"kind":"text","text":": "},{"text":"StoredValue","preciseIdentifier":"s:8Boutique11StoredValueV","kind":"typeIdentifier"},{"text":"<","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":">"}],"kind":"symbol","abstract":[{"text":"A ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" which exposes "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)"},{"text":" and ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()","isActive":true,"type":"reference"},{"text":" functions alongside a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/publisher","type":"reference","isActive":true},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/projectedValue","type":"topic","title":"projectedValue"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/storedvalue/publisher.json b/docs/data/documentation/boutique/storedvalue/publisher.json index 82bd9df..70775a6 100644 --- a/docs/data/documentation/boutique/storedvalue/publisher.json +++ b/docs/data/documentation/boutique/storedvalue/publisher.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"publisher"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"kind":"text","text":"> { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/storedvalue\/publisher"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/publisher","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A Combine publisher that allows you to observe all changes to the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"publisher"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"kind":"text","text":">"}],"title":"publisher","roleHeading":"Instance Property","role":"symbol","symbolKind":"property","externalID":"s:8Boutique11StoredValueV9publisher7Combine12AnyPublisherVyxs5NeverOGvp","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/StoredValue/publisher":{"role":"symbol","title":"publisher","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"publisher"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"kind":"text","text":">"}],"abstract":[{"type":"text","text":"A Combine publisher that allows you to observe all changes to the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/publisher","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/publisher"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/StoredValue":{"role":"symbol","title":"StoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"StoredValue"}],"url":"\/documentation\/boutique\/storedvalue"}}} \ No newline at end of file +{"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"sections":[],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/publisher","interfaceLanguage":"swift"},"schemaVersion":{"minor":3,"patch":0,"major":0},"primaryContentSections":[{"declarations":[{"tokens":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"publisher"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":", ","kind":"text"},{"kind":"typeIdentifier","text":"Never","preciseIdentifier":"s:s5NeverO"},{"text":"> { ","kind":"text"},{"text":"get","kind":"keyword"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}],"kind":"declarations"}],"kind":"symbol","abstract":[{"type":"text","text":"A Combine publisher that allows you to observe all changes to the @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","type":"reference","isActive":true},{"text":".","type":"text"}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/storedvalue\/publisher"]}],"metadata":{"modules":[{"name":"Boutique"}],"roleHeading":"Instance Property","title":"publisher","role":"symbol","symbolKind":"property","externalID":"s:8Boutique11StoredValueV9publisher7Combine12AnyPublisherVyxs5NeverOGvp","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"publisher"},{"text":": ","kind":"text"},{"text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV","kind":"typeIdentifier"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":", ","kind":"text"},{"preciseIdentifier":"s:s5NeverO","text":"Never","kind":"typeIdentifier"},{"kind":"text","text":">"}]},"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/StoredValue/publisher":{"role":"symbol","url":"\/documentation\/boutique\/storedvalue\/publisher","fragments":[{"kind":"keyword","text":"var"},{"text":" ","kind":"text"},{"text":"publisher","kind":"identifier"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"AnyPublisher","preciseIdentifier":"s:7Combine12AnyPublisherV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Item"},{"text":", ","kind":"text"},{"preciseIdentifier":"s:s5NeverO","text":"Never","kind":"typeIdentifier"},{"text":">","kind":"text"}],"kind":"symbol","abstract":[{"text":"A Combine publisher that allows you to observe all changes to the @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","type":"reference","isActive":true},{"text":".","type":"text"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/publisher","type":"topic","title":"publisher"},"doc://Boutique/documentation/Boutique/StoredValue":{"type":"topic","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"StoredValue","kind":"identifier"}],"navigatorTitle":[{"text":"StoredValue","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","url":"\/documentation\/boutique\/storedvalue","kind":"symbol","title":"StoredValue","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":" ","type":"text"},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" or using @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/storedvalue/reset().json b/docs/data/documentation/boutique/storedvalue/reset().json index d8ba5f1..317eba1 100644 --- a/docs/data/documentation/boutique/storedvalue/reset().json +++ b/docs/data/documentation/boutique/storedvalue/reset().json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"reset"},{"kind":"text","text":"()"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"You may run into an error that says"}]},{"type":"codeListing","syntax":null,"code":["\"'reset' is inaccessible due to 'internal' protection level.\""]},{"type":"paragraph","inlineContent":[{"type":"text","text":"If that occurs the fix is straightforward. Rather than calling "},{"type":"codeVoice","code":"storedValue.reset()"},{"type":"text","text":" "},{"type":"text","text":"you need to call "},{"type":"codeVoice","code":"$storedValue.reset()"},{"type":"text","text":", with a dollar sign ($) in front of "},{"type":"codeVoice","code":"storedValue"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"When using a property wrapper the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/wrappedValue"},{"type":"text","text":" is an "},{"type":"codeVoice","code":"Item"},{"type":"text","text":", but the "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" "},{"type":"text","text":"is a "},{"type":"codeVoice","code":"StoredValue"},{"type":"text","text":". That means when you access "},{"type":"codeVoice","code":"storedValue"},{"type":"text","text":" you’re interacting"},{"type":"text","text":" "},{"type":"text","text":"with the item itself, of type "},{"type":"codeVoice","code":"Item"},{"type":"text","text":". But it’s the "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" that is"},{"type":"text","text":" "},{"type":"text","text":"the "},{"type":"codeVoice","code":"StoredValue"},{"type":"text","text":" type, and has the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()"},{"type":"text","text":" function."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This follows similar conventions to the "},{"type":"codeVoice","code":"@Published"},{"type":"text","text":" property wrapper."},{"type":"text","text":" "},{"type":"codeVoice","code":"@Published var items: [Item]"},{"type":"text","text":" would let you use "},{"type":"codeVoice","code":"items"},{"type":"text","text":" as a regular "},{"type":"codeVoice","code":"[Item]"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"text","text":"but $items projects "},{"type":"codeVoice","code":"AnyPublisher<[Item], Never>"},{"type":"text","text":" so you can subscribe to changes items produces."},{"type":"text","text":" "},{"type":"text","text":"Within Boutique the @Stored property wrapper works very similarly."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/storedvalue\/reset()"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Resets the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" to the default value."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"reset"},{"kind":"text","text":"()"}],"title":"reset()","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique11StoredValueV5resetyyF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/StoredValue/reset()":{"role":"symbol","title":"reset()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"reset"},{"kind":"text","text":"()"}],"abstract":[{"type":"text","text":"Resets the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" to the default value."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/reset()"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/StoredValue":{"role":"symbol","title":"StoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"StoredValue"}],"url":"\/documentation\/boutique\/storedvalue"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/StoredValue/wrappedValue":{"role":"symbol","title":"wrappedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"}],"abstract":[{"type":"text","text":"The currently stored value"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/wrappedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/wrappedvalue"}}} \ No newline at end of file +{"metadata":{"externalID":"s:8Boutique11StoredValueV5resetyyF","title":"reset()","roleHeading":"Instance Method","role":"symbol","modules":[{"name":"Boutique"}],"symbolKind":"method","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"reset","kind":"identifier"},{"kind":"text","text":"()"}]},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()","interfaceLanguage":"swift"},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/storedvalue\/reset()"]}],"abstract":[{"text":"Resets the @","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"text":" to the default value.","type":"text"}],"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"text":"@","kind":"attribute"},{"kind":"attribute","text":"MainActor","preciseIdentifier":"s:ScM"},{"kind":"text","text":" "},{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"reset"},{"kind":"text","text":"()"}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"You may run into an error that says"}]},{"syntax":null,"code":["\"'reset' is inaccessible due to 'internal' protection level.\""],"type":"codeListing"},{"type":"paragraph","inlineContent":[{"text":"If that occurs the fix is straightforward. Rather than calling ","type":"text"},{"code":"storedValue.reset()","type":"codeVoice"},{"type":"text","text":" "},{"text":"you need to call ","type":"text"},{"code":"$storedValue.reset()","type":"codeVoice"},{"text":", with a dollar sign ($) in front of ","type":"text"},{"type":"codeVoice","code":"storedValue"},{"text":".","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"When using a property wrapper the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/wrappedValue","type":"reference","isActive":true},{"type":"text","text":" is an "},{"code":"Item","type":"codeVoice"},{"text":", but the ","type":"text"},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" "},{"text":"is a ","type":"text"},{"type":"codeVoice","code":"StoredValue"},{"type":"text","text":". That means when you access "},{"code":"storedValue","type":"codeVoice"},{"type":"text","text":" you’re interacting"},{"type":"text","text":" "},{"text":"with the item itself, of type ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":". But it’s the ","type":"text"},{"code":"projectedValue","type":"codeVoice"},{"type":"text","text":" that is"},{"type":"text","text":" "},{"text":"the ","type":"text"},{"type":"codeVoice","code":"StoredValue"},{"type":"text","text":" type, and has the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()"},{"text":" function.","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This follows similar conventions to the "},{"code":"@Published","type":"codeVoice"},{"type":"text","text":" property wrapper."},{"type":"text","text":" "},{"code":"@Published var items: [Item]","type":"codeVoice"},{"type":"text","text":" would let you use "},{"code":"items","type":"codeVoice"},{"text":" as a regular ","type":"text"},{"type":"codeVoice","code":"[Item]"},{"text":",","type":"text"},{"type":"text","text":" "},{"text":"but $items projects ","type":"text"},{"type":"codeVoice","code":"AnyPublisher<[Item], Never>"},{"type":"text","text":" so you can subscribe to changes items produces."},{"type":"text","text":" "},{"type":"text","text":"Within Boutique the @Stored property wrapper works very similarly."}]}]}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"kind":"symbol","sections":[],"schemaVersion":{"major":0,"patch":0,"minor":3},"references":{"doc://Boutique/documentation/Boutique/StoredValue":{"type":"topic","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"StoredValue","kind":"identifier"}],"navigatorTitle":[{"text":"StoredValue","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","url":"\/documentation\/boutique\/storedvalue","kind":"symbol","title":"StoredValue","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":" ","type":"text"},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" or using @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/StoredValue/wrappedValue":{"kind":"symbol","abstract":[{"text":"The currently stored value","type":"text"}],"role":"symbol","url":"\/documentation\/boutique\/storedvalue\/wrappedvalue","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/wrappedValue","title":"wrappedValue","fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"text":"wrappedValue","kind":"identifier"},{"kind":"text","text":": "},{"text":"Item","kind":"typeIdentifier"}],"type":"topic"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/StoredValue/reset()":{"role":"symbol","url":"\/documentation\/boutique\/storedvalue\/reset()","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"reset","kind":"identifier"},{"kind":"text","text":"()"}],"kind":"symbol","abstract":[{"type":"text","text":"Resets the @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" to the default value."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/reset()","type":"topic","title":"reset()"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/storedvalue/set(_:).json b/docs/data/documentation/boutique/storedvalue/set(_:).json index 89d6b9e..ad21679 100644 --- a/docs/data/documentation/boutique/storedvalue/set(_:).json +++ b/docs/data/documentation/boutique/storedvalue/set(_:).json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"set"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":")"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"value","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The value to set @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" to."}]}]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"You may run into an error that says"}]},{"type":"codeListing","syntax":null,"code":["\"'set' is inaccessible due to 'internal' protection level.\""]},{"type":"paragraph","inlineContent":[{"type":"text","text":"If that occurs the fix is straightforward. Rather than calling "},{"type":"codeVoice","code":"storedValue.set(newValue)"},{"type":"text","text":" "},{"type":"text","text":"you need to call "},{"type":"codeVoice","code":"$storedValue.set(newValue)"},{"type":"text","text":", with a dollar sign ($) in front of "},{"type":"codeVoice","code":"storedValue"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"When using a property wrapper the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/wrappedValue"},{"type":"text","text":" is an "},{"type":"codeVoice","code":"Item"},{"type":"text","text":", but the "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" "},{"type":"text","text":"is a "},{"type":"codeVoice","code":"StoredValue"},{"type":"text","text":". That means you are accessing the "},{"type":"codeVoice","code":"storedValue"},{"type":"text","text":" you’re interacting"},{"type":"text","text":" "},{"type":"text","text":"with, a value type "},{"type":"codeVoice","code":"Item"},{"type":"text","text":". But it is the "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" that is the "},{"type":"codeVoice","code":"StoredValue"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"text","text":"that property and has the ``set(_:) function."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This follows similar conventions to the "},{"type":"codeVoice","code":"@Published"},{"type":"text","text":" property wrapper."},{"type":"text","text":" "},{"type":"codeVoice","code":"@Published var items: [Item]"},{"type":"text","text":" allows you to use "},{"type":"codeVoice","code":"items"},{"type":"text","text":" as a regular "},{"type":"codeVoice","code":"[Item]"},{"type":"text","text":","},{"type":"text","text":" "},{"type":"text","text":"but "},{"type":"codeVoice","code":"$items"},{"type":"text","text":" projects "},{"type":"codeVoice","code":"AnyPublisher<[Item], Never>"},{"type":"text","text":" so you can subscribe to changes items produces."},{"type":"text","text":" "},{"type":"text","text":"Within Boutique the @Stored property wrapper works very similarly."}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/storedvalue\/set(_:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Sets a value for the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"set"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":")"}],"title":"set(_:)","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:8Boutique11StoredValueV3setyyxF","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/StoredValue/wrappedValue":{"role":"symbol","title":"wrappedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"}],"abstract":[{"type":"text","text":"The currently stored value"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/wrappedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/wrappedvalue"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/StoredValue/set(_:)":{"role":"symbol","title":"set(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"set"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":")"}],"abstract":[{"type":"text","text":"Sets a value for the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/set(_:)"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/StoredValue":{"role":"symbol","title":"StoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"StoredValue"}],"url":"\/documentation\/boutique\/storedvalue"}}} \ No newline at end of file +{"abstract":[{"text":"Sets a value for the @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true},{"text":" property.","type":"text"}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/storedvalue\/set(_:)"]}],"metadata":{"roleHeading":"Instance Method","externalID":"s:8Boutique11StoredValueV3setyyxF","role":"symbol","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"set"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":")","kind":"text"}],"modules":[{"name":"Boutique"}],"symbolKind":"method","title":"set(_:)"},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)","interfaceLanguage":"swift"},"kind":"symbol","sections":[],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"kind":"attribute","text":"@"},{"text":"MainActor","kind":"attribute","preciseIdentifier":"s:ScM"},{"text":" ","kind":"text"},{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"set","kind":"identifier"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"text":" ","kind":"text"},{"kind":"internalParam","text":"value"},{"kind":"text","text":": "},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":")"}],"languages":["swift"]}]},{"parameters":[{"content":[{"inlineContent":[{"type":"text","text":"The value to set @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" to."}],"type":"paragraph"}],"name":"value"}],"kind":"parameters"},{"kind":"content","content":[{"anchor":"discussion","text":"Discussion","type":"heading","level":2},{"type":"paragraph","inlineContent":[{"text":"You may run into an error that says","type":"text"}]},{"code":["\"'set' is inaccessible due to 'internal' protection level.\""],"syntax":null,"type":"codeListing"},{"inlineContent":[{"text":"If that occurs the fix is straightforward. Rather than calling ","type":"text"},{"code":"storedValue.set(newValue)","type":"codeVoice"},{"type":"text","text":" "},{"type":"text","text":"you need to call "},{"code":"$storedValue.set(newValue)","type":"codeVoice"},{"type":"text","text":", with a dollar sign ($) in front of "},{"type":"codeVoice","code":"storedValue"},{"type":"text","text":"."}],"type":"paragraph"},{"inlineContent":[{"text":"When using a property wrapper the ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/wrappedValue","isActive":true,"type":"reference"},{"type":"text","text":" is an "},{"type":"codeVoice","code":"Item"},{"type":"text","text":", but the "},{"type":"codeVoice","code":"projectedValue"},{"text":" ","type":"text"},{"type":"text","text":"is a "},{"type":"codeVoice","code":"StoredValue"},{"type":"text","text":". That means you are accessing the "},{"type":"codeVoice","code":"storedValue"},{"text":" you’re interacting","type":"text"},{"text":" ","type":"text"},{"type":"text","text":"with, a value type "},{"type":"codeVoice","code":"Item"},{"text":". But it is the ","type":"text"},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" that is the "},{"type":"codeVoice","code":"StoredValue"},{"text":",","type":"text"},{"type":"text","text":" "},{"type":"text","text":"that property and has the ``set(_:) function."}],"type":"paragraph"},{"inlineContent":[{"text":"This follows similar conventions to the ","type":"text"},{"code":"@Published","type":"codeVoice"},{"type":"text","text":" property wrapper."},{"type":"text","text":" "},{"code":"@Published var items: [Item]","type":"codeVoice"},{"type":"text","text":" allows you to use "},{"type":"codeVoice","code":"items"},{"text":" as a regular ","type":"text"},{"type":"codeVoice","code":"[Item]"},{"text":",","type":"text"},{"type":"text","text":" "},{"text":"but ","type":"text"},{"code":"$items","type":"codeVoice"},{"text":" projects ","type":"text"},{"type":"codeVoice","code":"AnyPublisher<[Item], Never>"},{"type":"text","text":" so you can subscribe to changes items produces."},{"text":" ","type":"text"},{"type":"text","text":"Within Boutique the @Stored property wrapper works very similarly."}],"type":"paragraph"}]}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"schemaVersion":{"patch":0,"major":0,"minor":3},"references":{"doc://Boutique/documentation/Boutique/StoredValue/wrappedValue":{"kind":"symbol","abstract":[{"text":"The currently stored value","type":"text"}],"role":"symbol","url":"\/documentation\/boutique\/storedvalue\/wrappedvalue","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/wrappedValue","title":"wrappedValue","fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"text":"wrappedValue","kind":"identifier"},{"kind":"text","text":": "},{"text":"Item","kind":"typeIdentifier"}],"type":"topic"},"doc://Boutique/documentation/Boutique/StoredValue":{"type":"topic","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"StoredValue","kind":"identifier"}],"navigatorTitle":[{"text":"StoredValue","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","url":"\/documentation\/boutique\/storedvalue","kind":"symbol","title":"StoredValue","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":" ","type":"text"},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" or using @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/StoredValue/set(_:)":{"role":"symbol","url":"\/documentation\/boutique\/storedvalue\/set(_:)","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"set"},{"text":"(","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"text":")","kind":"text"}],"kind":"symbol","abstract":[{"type":"text","text":"Sets a value for the @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/set(_:)","type":"topic","title":"set(_:)"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/storedvalue/toggle().json b/docs/data/documentation/boutique/storedvalue/toggle().json index 8267db4..f50d56a 100644 --- a/docs/data/documentation/boutique/storedvalue/toggle().json +++ b/docs/data/documentation/boutique/storedvalue/toggle().json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"toggle"},{"kind":"text","text":"()"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is meant to provide a simple ergonomic improvement, avoiding callsites like this."}]},{"type":"codeListing","syntax":null,"code":["self.appState.$proFeaturesEnabled.set(!self.appState.proFeaturesEnabled)"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Instead having a much simpler simpler option."}]},{"type":"codeListing","syntax":null,"code":["self.appState.$proFeaturesEnabled.toggle()"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/storedvalue\/toggle()"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/toggle()","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A function to toggle an @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" that represent a "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" is "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"toggle()","roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"toggle"},{"kind":"text","text":"()"}],"symbolKind":"method","externalID":"s:8Boutique11StoredValueVAASbRszrlE6toggleyyF","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/StoredValue/toggle()":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" is "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"toggle()","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"toggle"},{"kind":"text","text":"()"}],"abstract":[{"type":"text","text":"A function to toggle an @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" that represent a "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/toggle()","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/toggle()"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/StoredValue":{"role":"symbol","title":"StoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"StoredValue"}],"url":"\/documentation\/boutique\/storedvalue"}}} \ No newline at end of file +{"schemaVersion":{"major":0,"patch":0,"minor":3},"abstract":[{"text":"A function to toggle an @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true},{"type":"text","text":" that represent a "},{"code":"Bool","type":"codeVoice"},{"type":"text","text":"."}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"primaryContentSections":[{"declarations":[{"languages":["swift"],"tokens":[{"kind":"attribute","text":"@"},{"preciseIdentifier":"s:ScM","text":"MainActor","kind":"attribute"},{"text":" ","kind":"text"},{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"toggle"},{"kind":"text","text":"()"}],"platforms":["macOS"]}],"kind":"declarations"},{"kind":"content","content":[{"type":"heading","text":"Discussion","anchor":"discussion","level":2},{"inlineContent":[{"type":"text","text":"This is meant to provide a simple ergonomic improvement, avoiding callsites like this."}],"type":"paragraph"},{"type":"codeListing","syntax":null,"code":["self.appState.$proFeaturesEnabled.set(!self.appState.proFeaturesEnabled)"]},{"type":"paragraph","inlineContent":[{"text":"Instead having a much simpler simpler option.","type":"text"}]},{"code":["self.appState.$proFeaturesEnabled.toggle()"],"type":"codeListing","syntax":null}]}],"sections":[],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/toggle()","interfaceLanguage":"swift"},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/storedvalue\/toggle()"]}],"kind":"symbol","metadata":{"fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"toggle"},{"kind":"text","text":"()"}],"roleHeading":"Instance Method","symbolKind":"method","externalID":"s:8Boutique11StoredValueVAASbRszrlE6toggleyyF","title":"toggle()","extendedModule":"Boutique","role":"symbol","conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" is "},{"code":"Bool","type":"codeVoice"},{"text":".","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}]},"modules":[{"name":"Boutique"}]},"references":{"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/StoredValue/toggle()":{"role":"symbol","conformance":{"availabilityPrefix":[{"text":"Available when","type":"text"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" is ","type":"text"},{"code":"Bool","type":"codeVoice"},{"text":".","type":"text"}]},"url":"\/documentation\/boutique\/storedvalue\/toggle()","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"toggle"},{"kind":"text","text":"()"}],"kind":"symbol","abstract":[{"type":"text","text":"A function to toggle an @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true},{"type":"text","text":" that represent a "},{"code":"Bool","type":"codeVoice"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/toggle()","type":"topic","title":"toggle()"},"doc://Boutique/documentation/Boutique/StoredValue":{"type":"topic","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"StoredValue","kind":"identifier"}],"navigatorTitle":[{"text":"StoredValue","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","url":"\/documentation\/boutique\/storedvalue","kind":"symbol","title":"StoredValue","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":" ","type":"text"},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" or using @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/storedvalue/togglepresence(_:).json b/docs/data/documentation/boutique/storedvalue/togglepresence(_:).json new file mode 100644 index 0000000..9d504b7 --- /dev/null +++ b/docs/data/documentation/boutique/storedvalue/togglepresence(_:).json @@ -0,0 +1 @@ +{"kind":"symbol","schemaVersion":{"major":0,"patch":0,"minor":3},"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/togglePresence(_:)","interfaceLanguage":"swift"},"metadata":{"modules":[{"name":"Boutique"}],"title":"togglePresence(_:)","externalID":"s:8Boutique11StoredValueVAASmRzrlE14togglePresenceyyqd__Sayqd__GRszSeRd__SERd__SQRd__lF","roleHeading":"Instance Method","conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"text":", and ","type":"text"},{"type":"codeVoice","code":"RangeReplaceableCollection"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}]},"role":"symbol","extendedModule":"Boutique","fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"togglePresence"},{"text":"<","kind":"text"},{"text":"Value","kind":"genericParameter"},{"text":">(","kind":"text"},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":")"}],"symbolKind":"method"},"primaryContentSections":[{"declarations":[{"platforms":["macOS"],"languages":["swift"],"tokens":[{"text":"@","kind":"attribute"},{"preciseIdentifier":"s:ScM","text":"MainActor","kind":"attribute"},{"text":" ","kind":"text"},{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"togglePresence","kind":"identifier"},{"text":"<","kind":"text"},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"text":"_","kind":"externalParam"},{"text":" ","kind":"text"},{"text":"value","kind":"internalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":") "},{"kind":"keyword","text":"where"},{"text":" ","kind":"text"},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":" == ["},{"text":"Value","kind":"typeIdentifier"},{"kind":"text","text":"], "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":" : "},{"text":"Decodable","preciseIdentifier":"s:Se","kind":"typeIdentifier"},{"text":", ","kind":"text"},{"text":"Value","kind":"typeIdentifier"},{"text":" : ","kind":"text"},{"text":"Encodable","preciseIdentifier":"s:SE","kind":"typeIdentifier"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Value"},{"text":" : ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:SQ","text":"Equatable"}]}],"kind":"declarations"}],"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/storedvalue\/togglepresence(_:)"]}],"sections":[],"references":{"doc://Boutique/documentation/Boutique/StoredValue":{"type":"topic","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"StoredValue","kind":"identifier"}],"navigatorTitle":[{"text":"StoredValue","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","url":"\/documentation\/boutique\/storedvalue","kind":"symbol","title":"StoredValue","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":" ","type":"text"},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" or using @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/StoredValue/togglePresence(_:)":{"type":"topic","fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"togglePresence"},{"kind":"text","text":"<"},{"text":"Value","kind":"genericParameter"},{"text":">(","kind":"text"},{"kind":"typeIdentifier","text":"Value"},{"text":")","kind":"text"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/togglePresence(_:)","url":"\/documentation\/boutique\/storedvalue\/togglepresence(_:)","abstract":[],"title":"togglePresence(_:)","role":"symbol","conformance":{"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"code":"Decodable","type":"codeVoice"},{"type":"text","text":", "},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":", and "},{"code":"RangeReplaceableCollection","type":"codeVoice"},{"text":".","type":"text"}]}},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/storedvalue/update(key:value:).json b/docs/data/documentation/boutique/storedvalue/update(key:value:).json index 66a233a..3dfd665 100644 --- a/docs/data/documentation/boutique/storedvalue/update(key:value:).json +++ b/docs/data/documentation/boutique/storedvalue/update(key:value:).json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"update"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Key"},{"kind":"text","text":", "},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":", "},{"kind":"externalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"?) "},{"kind":"keyword","text":"where"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" == ["},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"], "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Decodable","preciseIdentifier":"s:Se"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Encodable","preciseIdentifier":"s:SE"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Hashable","preciseIdentifier":"s:SH"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Decodable","preciseIdentifier":"s:Se"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","text":"Encodable","preciseIdentifier":"s:SE"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"content","content":[{"anchor":"discussion","level":2,"type":"heading","text":"Discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is meant to provide a simple ergonomic improvement, avoiding callsites like this."}]},{"type":"codeListing","syntax":null,"code":["var updatedRedPandaList = self.redPandaList","updatedRedPandaList[\"best\"] = \"Pabu\"","self.$redPandaList.set(updatedRedPandaList)"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Instead this function provides a much simpler alternative."}]},{"type":"codeListing","syntax":null,"code":["try await self.$redPandaList.update(key: \"best\", value: \"Pabu\")"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/storedvalue\/update(key:value:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/update(key:value:)","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A function to set a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" represented by a "},{"type":"codeVoice","code":"Dictionary"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"kind":"symbol","metadata":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"update(key:value:)","roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"update"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Key"},{"kind":"text","text":", "},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":", "},{"kind":"externalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"?)"}],"symbolKind":"method","externalID":"s:8Boutique11StoredValueV6update3key5valueyqd___qd_0_SgtSDyqd__qd_0_GRszSeRd__SERd__SHRd__SeRd_0_SERd_0_r0_lF","extendedModule":"Boutique","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"references":{"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/StoredValue/update(key:value:)":{"conformance":{"constraints":[{"type":"codeVoice","code":"Item"},{"type":"text","text":" conforms to "},{"type":"codeVoice","code":"Decodable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Encodable"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"type":"text","text":"Conforms when"}]},"role":"symbol","title":"update(key:value:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"update"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"Key"},{"kind":"text","text":", "},{"kind":"genericParameter","text":"Value"},{"kind":"text","text":">("},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":", "},{"kind":"externalParam","text":"value"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Value"},{"kind":"text","text":"?)"}],"abstract":[{"type":"text","text":"A function to set a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" represented by a "},{"type":"codeVoice","code":"Dictionary"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/update(key:value:)","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/update(key:value:)"},"doc://Boutique/documentation/Boutique/StoredValue":{"role":"symbol","title":"StoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"StoredValue"}],"url":"\/documentation\/boutique\/storedvalue"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"}}} \ No newline at end of file +{"schemaVersion":{"major":0,"patch":0,"minor":3},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/storedvalue\/update(key:value:)"]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/update(key:value:)","interfaceLanguage":"swift"},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"kind":"symbol","abstract":[{"type":"text","text":"A function to set a @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true},{"type":"text","text":" represented by a "},{"type":"codeVoice","code":"Dictionary"},{"type":"text","text":" "},{"type":"text","text":"without having to manually make an intermediate copy for every value update."}],"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"text":"@","kind":"attribute"},{"kind":"attribute","text":"MainActor","preciseIdentifier":"s:ScM"},{"text":" ","kind":"text"},{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"update"},{"text":"<","kind":"text"},{"text":"Key","kind":"genericParameter"},{"kind":"text","text":", "},{"text":"Value","kind":"genericParameter"},{"kind":"text","text":">("},{"text":"key","kind":"externalParam"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":", "},{"text":"value","kind":"externalParam"},{"kind":"text","text":": "},{"text":"Value","kind":"typeIdentifier"},{"text":"?) ","kind":"text"},{"kind":"keyword","text":"where"},{"kind":"text","text":" "},{"text":"Item","kind":"typeIdentifier"},{"kind":"text","text":" == ["},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":" : "},{"text":"Value","kind":"typeIdentifier"},{"kind":"text","text":"], "},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":" : "},{"kind":"typeIdentifier","preciseIdentifier":"s:Se","text":"Decodable"},{"text":", ","kind":"text"},{"text":"Key","kind":"typeIdentifier"},{"text":" : ","kind":"text"},{"kind":"typeIdentifier","text":"Encodable","preciseIdentifier":"s:SE"},{"kind":"text","text":", "},{"text":"Key","kind":"typeIdentifier"},{"kind":"text","text":" : "},{"text":"Hashable","kind":"typeIdentifier","preciseIdentifier":"s:SH"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"Value"},{"text":" : ","kind":"text"},{"kind":"typeIdentifier","text":"Decodable","preciseIdentifier":"s:Se"},{"text":", ","kind":"text"},{"text":"Value","kind":"typeIdentifier"},{"text":" : ","kind":"text"},{"text":"Encodable","kind":"typeIdentifier","preciseIdentifier":"s:SE"}],"languages":["swift"],"platforms":["macOS"]}]},{"content":[{"type":"heading","text":"Discussion","level":2,"anchor":"discussion"},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is meant to provide a simple ergonomic improvement, avoiding callsites like this."}]},{"type":"codeListing","code":["var updatedRedPandaList = self.redPandaList","updatedRedPandaList[\"best\"] = \"Pabu\"","self.$redPandaList.set(updatedRedPandaList)"],"syntax":null},{"type":"paragraph","inlineContent":[{"text":"Instead this function provides a much simpler alternative.","type":"text"}]},{"syntax":null,"code":["try await self.$redPandaList.update(key: \"best\", value: \"Pabu\")"],"type":"codeListing"}],"kind":"content"}],"metadata":{"fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"update","kind":"identifier"},{"text":"<","kind":"text"},{"text":"Key","kind":"genericParameter"},{"kind":"text","text":", "},{"text":"Value","kind":"genericParameter"},{"kind":"text","text":">("},{"kind":"externalParam","text":"key"},{"kind":"text","text":": "},{"text":"Key","kind":"typeIdentifier"},{"kind":"text","text":", "},{"kind":"externalParam","text":"value"},{"text":": ","kind":"text"},{"text":"Value","kind":"typeIdentifier"},{"text":"?)","kind":"text"}],"roleHeading":"Instance Method","symbolKind":"method","externalID":"s:8Boutique11StoredValueV6update3key5valueyqd___qd_0_SgtSDyqd__qd_0_GRszSeRd__SERd__SHRd__SeRd_0_SERd_0_r0_lF","title":"update(key:value:)","extendedModule":"Boutique","role":"symbol","conformance":{"constraints":[{"code":"Item","type":"codeVoice"},{"type":"text","text":" conforms to "},{"code":"Decodable","type":"codeVoice"},{"text":" and ","type":"text"},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":"."}],"conformancePrefix":[{"text":"Conforms when","type":"text"}],"availabilityPrefix":[{"text":"Available when","type":"text"}]},"modules":[{"name":"Boutique"}]},"sections":[],"references":{"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/StoredValue/update(key:value:)":{"fragments":[{"text":"func","kind":"keyword"},{"kind":"text","text":" "},{"text":"update","kind":"identifier"},{"kind":"text","text":"<"},{"text":"Key","kind":"genericParameter"},{"text":", ","kind":"text"},{"text":"Value","kind":"genericParameter"},{"text":">(","kind":"text"},{"kind":"externalParam","text":"key"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Key"},{"kind":"text","text":", "},{"kind":"externalParam","text":"value"},{"text":": ","kind":"text"},{"text":"Value","kind":"typeIdentifier"},{"text":"?)","kind":"text"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/update(key:value:)","type":"topic","title":"update(key:value:)","url":"\/documentation\/boutique\/storedvalue\/update(key:value:)","role":"symbol","conformance":{"constraints":[{"code":"Item","type":"codeVoice"},{"text":" conforms to ","type":"text"},{"type":"codeVoice","code":"Decodable"},{"text":" and ","type":"text"},{"code":"Encodable","type":"codeVoice"},{"type":"text","text":"."}],"availabilityPrefix":[{"type":"text","text":"Available when"}],"conformancePrefix":[{"text":"Conforms when","type":"text"}]},"abstract":[{"type":"text","text":"A function to set a @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" represented by a "},{"type":"codeVoice","code":"Dictionary"},{"type":"text","text":" "},{"text":"without having to manually make an intermediate copy for every value update.","type":"text"}]},"doc://Boutique/documentation/Boutique/StoredValue":{"type":"topic","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"StoredValue","kind":"identifier"}],"navigatorTitle":[{"text":"StoredValue","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","url":"\/documentation\/boutique\/storedvalue","kind":"symbol","title":"StoredValue","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":" ","type":"text"},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" or using @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/storedvalue/wrappedvalue.json b/docs/data/documentation/boutique/storedvalue/wrappedvalue.json index 0e1b7d5..8b882c5 100644 --- a/docs/data/documentation/boutique/storedvalue/wrappedvalue.json +++ b/docs/data/documentation/boutique/storedvalue/wrappedvalue.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"},{"kind":"text","text":" { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/storedvalue\/wrappedvalue"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/wrappedValue","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"The currently stored value"}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"}],"title":"wrappedValue","roleHeading":"Instance Property","role":"symbol","symbolKind":"property","externalID":"s:8Boutique11StoredValueV07wrappedC0xvp","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"references":{"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/StoredValue":{"role":"symbol","title":"StoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"StoredValue"}],"url":"\/documentation\/boutique\/storedvalue"},"doc://Boutique/documentation/Boutique/StoredValue/wrappedValue":{"role":"symbol","title":"wrappedValue","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"wrappedValue"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Item"}],"abstract":[{"type":"text","text":"The currently stored value"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/wrappedValue","kind":"symbol","type":"topic","url":"\/documentation\/boutique\/storedvalue\/wrappedvalue"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"}}} \ No newline at end of file +{"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique","doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"]]},"kind":"symbol","sections":[],"abstract":[{"text":"The currently stored value","type":"text"}],"primaryContentSections":[{"declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"wrappedValue"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"Item"},{"text":" { ","kind":"text"},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}]}],"kind":"declarations"}],"metadata":{"roleHeading":"Instance Property","symbolKind":"property","externalID":"s:8Boutique11StoredValueV07wrappedC0xvp","role":"symbol","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"text":"wrappedValue","kind":"identifier"},{"kind":"text","text":": "},{"text":"Item","kind":"typeIdentifier"}],"title":"wrappedValue","modules":[{"name":"Boutique"}]},"variants":[{"paths":["\/documentation\/boutique\/storedvalue\/wrappedvalue"],"traits":[{"interfaceLanguage":"swift"}]}],"schemaVersion":{"patch":0,"major":0,"minor":3},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/wrappedValue"},"references":{"doc://Boutique/documentation/Boutique/StoredValue":{"type":"topic","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"StoredValue","kind":"identifier"}],"navigatorTitle":[{"text":"StoredValue","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","url":"\/documentation\/boutique\/storedvalue","kind":"symbol","title":"StoredValue","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":" ","type":"text"},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" or using @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/StoredValue/wrappedValue":{"kind":"symbol","abstract":[{"text":"The currently stored value","type":"text"}],"role":"symbol","url":"\/documentation\/boutique\/storedvalue\/wrappedvalue","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue\/wrappedValue","title":"wrappedValue","fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"text":"wrappedValue","kind":"identifier"},{"kind":"text","text":": "},{"text":"Item","kind":"typeIdentifier"}],"type":"topic"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/the-@stored-family-of-property-wrappers.json b/docs/data/documentation/boutique/the-@stored-family-of-property-wrappers.json index cc07fae..b5b7301 100644 --- a/docs/data/documentation/boutique/the-@stored-family-of-property-wrappers.json +++ b/docs/data/documentation/boutique/the-@stored-family-of-property-wrappers.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"content","content":[{"anchor":"Overview","level":2,"type":"heading","text":"Overview"},{"type":"paragraph","inlineContent":[{"type":"text","text":"In "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Using-Stores"},{"type":"text","text":" discussed how to initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":", and how to subsequently use it to insert and remove items from that "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":". All of the code treats the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" as an easier to use database, but what if we could remove that layer of abstraction?"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The promise of Boutique is that you work with regular Swift values and arrays, yet have your data persisted automatically. The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":", @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":", @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":", and @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrappers are what help Boutique deliver on that promise."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" provides a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" with array-like ergonomics, while @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":", @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":", and @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" offer similar support for storing single values rather than arrays."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"That’s a lot of words to discuss how @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" works under the hood, but seeing some code should make it clearer how to integrate a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" array into your app."}]},{"anchor":"The-Stored-Array","level":2,"type":"heading","text":"The @Stored Array"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Below we have a "},{"type":"codeVoice","code":"NotesController"},{"type":"text","text":", a data controller. It has common operations such as the ability to fetch our notes from an API, along with inserting, removing, and clearing them in our app."}]},{"type":"codeListing","syntax":"swift","code":["final class NotesController: ObservableObject {"," @Stored var notes: [Note]",""," init(store: Store) {"," self._notes = Stored(in: store)"," }",""," func fetchNotesFromAPI() -> [Note] {"," \/\/ Make an API call that fetches an array of notes from the server... "," self.$notes.insert(notes)"," }",""," func addNote(note: Note) {"," \/\/ Make an API call that inserts the note to the server... "," try await self.$notes.insert(note)"," }",""," func removeNote(note: Note) {"," \/\/ Make an API call that removes the note from the server... "," try await self.$notes.remove(note)"," }",""," func clearAllNotes() {"," \/\/ Make an API call that removes all the notes from the server... "," self.$notes.removeAll()"," }","}"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The functions in our "},{"type":"codeVoice","code":"NotesController"},{"type":"text","text":" look much like any other Swift object, so what we want to focus in on is the property "},{"type":"codeVoice","code":"@Stored var notes: [Note]"},{"type":"text","text":". Let’s break that line into it’s two parts, "},{"type":"codeVoice","code":"@Stored"},{"type":"text","text":" and "},{"type":"codeVoice","code":"var notes: [Note]"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The second part should look very familiar, it’s the same as every other array we work with in Swift. Any time we want to reference a "},{"type":"codeVoice","code":"NotesController"},{"type":"text","text":"’s "},{"type":"codeVoice","code":"notes"},{"type":"text","text":", it will be just a regular array."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"What we want to hone in on is @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":", and it’s "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"When we use a property wrapper such as @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" there is a "},{"type":"codeVoice","code":"wrappedValue"},{"type":"text","text":", and sometimes there will be a "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":". In this case the "},{"type":"codeVoice","code":"wrappedValue"},{"type":"text","text":" is what the property looks like when you are referring to "},{"type":"codeVoice","code":"self.notes"},{"type":"text","text":", and the "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" is what we refer to when we use "},{"type":"codeVoice","code":"self.$notes"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"We’ll use comparison to show how this works for "},{"type":"codeVoice","code":"@Published"},{"type":"text","text":", and what to expect with @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}]},{"type":"codeListing","syntax":"swift","code":["@Published var notes: [Note]","self.notes \/\/ The type of the `wrappedValue` is [Note]","self.$notes \/\/ The type of the `projectedValue` is AnyPublisher<[Note], Never>","","@Stored var notes: [Note]","self.notes \/\/ The type of the `wrappedValue` is [Note]","self.$notes \/\/ The type of the `projectedValue` is Store"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"By exposing a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" as the "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" we’re now able to call "},{"type":"codeVoice","code":"self.$notes.insert(note)"},{"type":"text","text":" to insert a note into the "},{"type":"codeVoice","code":"notes"},{"type":"text","text":" array, an array that is "},{"type":"codeVoice","code":"@Published public private(set)"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Since "},{"type":"codeVoice","code":"items"},{"type":"text","text":" is an "},{"type":"codeVoice","code":"@Published"},{"type":"text","text":" array that means every time the value is updated, the changes will propagate across our entire app. That’s how Boutique achieves it’s realtime updating, keeping your entire app in sync without any additional code."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Making the access control of "},{"type":"codeVoice","code":"items"},{"type":"text","text":" "},{"type":"codeVoice","code":"public private(set)"},{"type":"text","text":" makes the "},{"type":"codeVoice","code":"notes"},{"type":"text","text":" array read-only, letting us observe that array safely in our views."}]},{"type":"codeListing","syntax":"swift","code":["self.notes.insert(note) \/\/ Does not work because `notes` is a *read-only* array.","self.$notes.insert(note) \/\/ Works because $notes represents a `Store`"]},{"anchor":"Observing-a-Stores-values","level":2,"type":"heading","text":"Observing a Store’s values"},{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"type":"codeVoice","code":"items"},{"type":"text","text":" property of a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" is an array, and as we noted it’s a "},{"type":"codeVoice","code":"@Published"},{"type":"text","text":" array. If you subscribe to "},{"type":"codeVoice","code":"$items"},{"type":"text","text":" you can use Combine’s "},{"type":"codeVoice","code":"sink"},{"type":"text","text":" operator to observe the values chaning."}]},{"type":"codeListing","syntax":"swift","code":["store.$items.sink({ items in"," print(\"Items was updated\", items)","})"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Even more powerful is seeing how naturally @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" arrays integrate into SwiftUI. We’ll take our "},{"type":"codeVoice","code":"NotesController"},{"type":"text","text":" and let it be the data source for a SwiftUI view, watching our UI update in real time across all of our views whenever the data changes. While this example is one view, this technique will work in all your views that share the same data source, no matter how complex your views may be."}]},{"type":"codeListing","syntax":"swift","code":["struct NotesListView: View {"," @StateObject var notesController: NotesController"," @State private var notes: [Note] = []",""," var body: some View {"," VStack {"," ForEach(self.notes) { note in"," Text(note.text)"," .onTapGesture(perform: {"," notesController.removeNote(note)"," }"," }"," }"," .onReceive(notesController.$notes.$items, perform: {"," \/\/ We can even create complex pipelines, for example filtering all notes bigger than a tweet"," self.notes = $0.filter({ $0.length > 280 })"," })"," }","}"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"In the view above we’re subscribing to the original source of truth in the "},{"type":"codeVoice","code":"onReceive"},{"type":"text","text":" closure, "},{"type":"codeVoice","code":"notesController.$notes"},{"type":"text","text":". Any time "},{"type":"codeVoice","code":"notesController.notes"},{"type":"text","text":" from anywhere in our app, our "},{"type":"codeVoice","code":"NotesListView"},{"type":"text","text":" will update as well."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"There is still only one source of truth ("},{"type":"codeVoice","code":"notesController.notes"},{"type":"text","text":"), but each view will have it’s own local representation of the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" array. This allows us to perform transformations before choosing what to render and how to do it, in this case removing any notes that are too long to fit on Twitter."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Since the "},{"type":"codeVoice","code":"NotesController"},{"type":"text","text":" has a "},{"type":"codeVoice","code":"removeNote"},{"type":"text","text":" function we can even handle user interaction such as a user tapping on a note, all within a simple "},{"type":"codeVoice","code":"View"},{"type":"text","text":", with an additional benefit of removing the necessity for a ViewModel."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"You may be tempted to remove the extra array, building something that looks like this."}]},{"type":"codeListing","syntax":"swift","code":["struct NotesListView: View {"," @StateObject var notesController: NotesController",""," var body: some View {"," VStack {"," ForEach(notesController.notes.filter({ $0.length > 280 })) { note in"," Text(note.text)"," }"," }"," }","}"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This looks simpler, but it’s deceptively unperformant. Every time "},{"type":"codeVoice","code":"notesController.notes"},{"type":"text","text":" is modified, we will have to filter over every note to remove anything longer than a tweet. Each of those operations will trigger SwiftUI to re-render every subview, and while this would be a problem in any SwiftUI app Boutique makes your source of truth easy to access so I wanted to call it out to avoid potential performance pitfalls."}]},{"anchor":"StoredValue","level":2,"type":"heading","text":"@StoredValue"},{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" and @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" were created to store an array of data because most data apps render comes in the form of an array. But occasionally we need to store an individual value, that’s where @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":"@"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":", and @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" come in handy."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Whether you need to save an important piece of information for the next time your app is launched or if want to change how an app looks based on a user’s settings, those app configurations are individual values that you’ll want to persist."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Often times people will choose to store individual items like that in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":". If you’ve used "},{"type":"codeVoice","code":"@AppStorage"},{"type":"text","text":" then @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" will feel right at home, it has a very similar API with some additional features. A @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" will end up being stored in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":", but it also exposes a "},{"type":"codeVoice","code":"publisher"},{"type":"text","text":" so you can easily subscribe to changes."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Setting up a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" is simple"}]},{"type":"codeListing","syntax":"swift","code":["@StoredValue(key: \"hasHapticsEnabled\")","var hasHapticsEnabled = false"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"You can also store nil values"}]},{"type":"codeListing","syntax":"swift","code":["@StoredValue(key: \"lastOpenedDate\")","var lastOpenedDate: Date? = nil"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Or even an enum, as long as it conforms to "},{"type":"codeVoice","code":"Codable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Equatable"},{"type":"text","text":"."}]},{"type":"codeListing","syntax":"swift","code":["@StoredValue(key: \"currentTheme\")","var currentlySelectedTheme = .light"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"A more complex example for a hypothetical video player app may look something like this."}]},{"type":"codeListing","syntax":"swift","code":["struct UserPreferences: Codable, Equatable {"," var hasHapticsEnabled: Bool"," var prefersDarkMode: Bool"," var prefersWideScreen: Bool"," var spatialAudioEnabled: Bool","}","","@StoredValue(key: \"userPreferences\")","var preferences = UserPreferences()"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This looks a lot like @"},{"type":"codeVoice","code":"AppStorage"},{"type":"text","text":", some minimal API differences aside. Where @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" is different than @"},{"type":"codeVoice","code":"AppStorage"},{"type":"text","text":" is that it’s API more closely resembles working with a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" than "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"We’ll use the "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" of our @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" to set a new value. (Accessed by prepending a "},{"type":"codeVoice","code":"$"},{"type":"text","text":" dollar sign.)"}]},{"type":"codeListing","syntax":"swift","code":["$lastOpenedDate.set(.now) \/\/ Set the lastOpenedDate to now","$currentlySelectedTheme.set(.dark) \/\/ currentlySelected is now .dark"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"And we’ll use the "},{"type":"codeVoice","code":"profectedValue"},{"type":"text","text":" of our @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" to reset the values back to their default values."}]},{"type":"codeListing","syntax":"swift","code":["$lastOpenedDate.reset() \/\/ lastOpenedDate has been reset to it's initial value of nil again","$currentlySelectedTheme.reset() \/\/ currentlySelected has been reset to it's initial value of .light"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"One more handy function, if your @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" is a "},{"type":"codeVoice","code":"Bool"},{"type":"text","text":" you’ll also have access to a "},{"type":"codeVoice","code":".toggle()"},{"type":"text","text":" function."}]},{"type":"codeListing","syntax":"swift","code":["$hasHapticsEnabled.toggle()","","\/\/ Equivalent to but cleaner than","$hasHapticsEnabled.set(!hasHapticsEnabled)"]},{"anchor":"AsyncStoredValue","level":2,"type":"heading","text":"@AsyncStoredValue"},{"type":"paragraph","inlineContent":[{"type":"text","text":"An @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" is very similar to "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":", the main difference is that rather than storing individual values in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" an "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" is stored in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":", much like a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":". This allows you to build your own custom persistence layer for storing values, such as building a "},{"type":"codeVoice","code":"KeychainStorageEngine"},{"type":"text","text":" to store individual values in the keychain much the same way we can choose our own persistence layer for @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The API for using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" is identical to @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":", so the @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" examples above will work for @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":". The main difference is that values are received in an async manner, so you have to be prepared to not receive a value immediately or on demand. It may seem strange to have an async alternative to @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":", but if you have a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" based upon a remote service such as CloudKit or built atop your app’s server API, you’ll appreciate the ability to transparently store and persist individual values the same way you would any other data received from your API."}]},{"anchor":"SecurelyStoredValue","level":2,"type":"heading","text":"@SecurelyStoredValue"},{"type":"paragraph","inlineContent":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property wrapper automagically persists a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in the system "},{"type":"codeVoice","code":"Keychain"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property wrapper is very simple, but handles the complicated task of persisting values in the keychain. Traditionally storing values in the keychain requires using arcane C security APIs, but @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" makes this task incredibly easy. You should use @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" rather than @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" when you need to store sensitive values such as passwords or auth tokens, since a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" will be persisted in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":". @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" is not a full keychain library replacement, instead the property wrapper provides a drop-dead simple alternative for the most common use case."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Creating a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" is very simple."}]},{"type":"codeListing","syntax":"swift","code":["@SecurelyStoredValue(key: \"redPanda\")","private var redPanda"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Unlike @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" properties @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" properties cannot be provided a default value. Since keychain values may or may not exist, a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" is nullable by default. Something to watch out for: You do not need to specify your type as nullable. If you do so the type will be a double optional ("},{"type":"codeVoice","code":"??"},{"type":"text","text":") rather than optional ("},{"type":"codeVoice","code":"?"},{"type":"text","text":")."}]},{"type":"codeListing","syntax":"swift","code":["\/\/ The type here is not `RedPanda?`, but `RedPanda??`","@SecurelyStoredValue(key: \"redPanda\")"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Using a @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" is the same as a regular @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":", the only difference is that the two methods are "},{"type":"codeVoice","code":"set(_:)"},{"type":"text","text":" and "},{"type":"codeVoice","code":"remove()"},{"type":"text","text":", rather than "},{"type":"codeVoice","code":"set(_:)"},{"type":"text","text":" and "},{"type":"codeVoice","code":"reset()"}]},{"type":"codeListing","syntax":"swift","code":["try self.$storedPassword.set(\"p@ssw0rd\") \/\/ self.storedPassword is now set to \"p@assw0rd\" ","try self.$storedPassword.remove() \/\/ self.storedPassword is now nil"]},{"anchor":"Further-Exploration","level":2,"type":"heading","text":"Further Exploration"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Now that we’ve covered @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":", @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":", @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":", and @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" we can see how these property wrappers enable your app to work with regular Swift values and arrays, but have your app available offline with realtime state updates easier than ever. There isn’t much left to learn about using Boutique, but if you want to explore further you can start using Boutique in one of your apps!"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"As a reminder you can always play around with the code yourself."}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"reference","isActive":true,"identifier":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo"}]}]}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Or read through an in-depth technical walkthrough of Boutique, and how it powers the Model View Controller Store architecture."}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"reference","isActive":true,"identifier":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store"}]}]}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/the-@stored-family-of-property-wrappers"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/The-@Stored-Family-Of-Property-Wrappers","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Property Wrappers that take the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" and make it magical. ✨"}],"kind":"article","metadata":{"roleHeading":"Article","title":"The @Stored Family Of Property Wrappers","role":"article","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique"]]},"references":{"doc://Boutique/documentation/Boutique/Using-Stores":{"role":"article","title":"Using Stores","abstract":[{"type":"text","text":"The "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" is at the heart of what makes Boutique, Boutique."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Using-Stores","kind":"article","type":"topic","url":"\/documentation\/boutique\/using-stores"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","title":"SecurelyStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"SecurelyStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property wrapper automagically persists a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in the system "},{"type":"codeVoice","code":"Keychain"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"SecurelyStoredValue"}],"url":"\/documentation\/boutique\/securelystoredvalue"},"https://github.com/mergesort/Boutique/tree/main/Demo":{"title":"A Boutique Demo App","titleInlineContent":[{"type":"text","text":"A Boutique Demo App"}],"type":"link","identifier":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo","url":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"role":"symbol","title":"AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}],"url":"\/documentation\/boutique\/asyncstoredvalue"},"doc://Boutique/documentation/Boutique/StoredValue":{"role":"symbol","title":"StoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"StoredValue"}],"url":"\/documentation\/boutique\/storedvalue"},"https://build.ms/2022/06/22/model-view-controller-store":{"title":"Model View Controller Store: Reinventing MVC for SwiftUI with Boutique","titleInlineContent":[{"type":"text","text":"Model View Controller Store: Reinventing MVC for SwiftUI with Boutique"}],"type":"link","identifier":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store","url":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store"}}} +{"metadata":{"roleHeading":"Article","title":"The @Stored Family Of Property Wrappers","role":"article","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique"]]},"primaryContentSections":[{"content":[{"text":"Overview","level":2,"type":"heading","anchor":"Overview"},{"type":"paragraph","inlineContent":[{"text":"In ","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Using-Stores"},{"type":"text","text":" discussed how to initialize a "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":", and how to subsequently use it to insert and remove items from that "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"text":". All of the code treats the ","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" as an easier to use database, but what if we could remove that layer of abstraction?"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The promise of Boutique is that you work with regular Swift values and arrays, yet have your data persisted automatically. The @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"text":", @","type":"text"},{"code":"StoredValue","type":"codeVoice"},{"type":"text","text":", @"},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":", and @"},{"code":"AsyncStoredValue","type":"codeVoice"},{"type":"text","text":" property wrappers are what help Boutique deliver on that promise."}]},{"type":"paragraph","inlineContent":[{"text":"Using @","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"text":" provides a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" with array-like ergonomics, while @","type":"text"},{"code":"StoredValue","type":"codeVoice"},{"text":", @","type":"text"},{"type":"codeVoice","code":"SecurelyStoredValue"},{"text":", and @","type":"text"},{"code":"AsyncStoredValue","type":"codeVoice"},{"text":" offer similar support for storing single values rather than arrays.","type":"text"}]},{"type":"paragraph","inlineContent":[{"text":"That’s a lot of words to discuss how @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"text":" works under the hood, but seeing some code should make it clearer how to integrate a @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":" array into your app."}]},{"level":2,"type":"heading","text":"The @Stored Array","anchor":"The-Stored-Array"},{"inlineContent":[{"type":"text","text":"Below we have a "},{"type":"codeVoice","code":"NotesController"},{"type":"text","text":", a data controller. It has common operations such as the ability to fetch our notes from an API, along with inserting, removing, and clearing them in our app."}],"type":"paragraph"},{"syntax":"swift","type":"codeListing","code":["final class NotesController: ObservableObject {"," @Stored var notes: [Note]",""," init(store: Store) {"," self._notes = Stored(in: store)"," }",""," func fetchNotesFromAPI() -> [Note] {"," \/\/ Make an API call that fetches an array of notes from the server... "," self.$notes.insert(notes)"," }",""," func addNote(note: Note) {"," \/\/ Make an API call that inserts the note to the server... "," try await self.$notes.insert(note)"," }",""," func removeNote(note: Note) {"," \/\/ Make an API call that removes the note from the server... "," try await self.$notes.remove(note)"," }",""," func clearAllNotes() {"," \/\/ Make an API call that removes all the notes from the server... "," self.$notes.removeAll()"," }","}"]},{"inlineContent":[{"type":"text","text":"The functions in our "},{"code":"NotesController","type":"codeVoice"},{"type":"text","text":" look much like any other Swift object, so what we want to focus in on is the property "},{"type":"codeVoice","code":"@Stored var notes: [Note]"},{"type":"text","text":". Let’s break that line into it’s two parts, "},{"code":"@Stored","type":"codeVoice"},{"text":" and ","type":"text"},{"type":"codeVoice","code":"var notes: [Note]"},{"text":".","type":"text"}],"type":"paragraph"},{"type":"paragraph","inlineContent":[{"type":"text","text":"The second part should look very familiar, it’s the same as every other array we work with in Swift. Any time we want to reference a "},{"type":"codeVoice","code":"NotesController"},{"text":"’s ","type":"text"},{"type":"codeVoice","code":"notes"},{"type":"text","text":", it will be just a regular array."}]},{"inlineContent":[{"text":"What we want to hone in on is @","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"text":", and it’s ","type":"text"},{"code":"projectedValue","type":"codeVoice"},{"text":".","type":"text"}],"type":"paragraph"},{"inlineContent":[{"text":"When we use a property wrapper such as @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"text":" there is a ","type":"text"},{"code":"wrappedValue","type":"codeVoice"},{"text":", and sometimes there will be a ","type":"text"},{"code":"projectedValue","type":"codeVoice"},{"text":". In this case the ","type":"text"},{"type":"codeVoice","code":"wrappedValue"},{"text":" is what the property looks like when you are referring to ","type":"text"},{"type":"codeVoice","code":"self.notes"},{"text":", and the ","type":"text"},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" is what we refer to when we use "},{"type":"codeVoice","code":"self.$notes"},{"type":"text","text":"."}],"type":"paragraph"},{"inlineContent":[{"text":"We’ll use comparison to show how this works for ","type":"text"},{"code":"@Published","type":"codeVoice"},{"type":"text","text":", and what to expect with @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference","isActive":true},{"text":".","type":"text"}],"type":"paragraph"},{"type":"codeListing","syntax":"swift","code":["@Published var notes: [Note]","self.notes \/\/ The type of the `wrappedValue` is [Note]","self.$notes \/\/ The type of the `projectedValue` is AnyPublisher<[Note], Never>","","@Stored var notes: [Note]","self.notes \/\/ The type of the `wrappedValue` is [Note]","self.$notes \/\/ The type of the `projectedValue` is Store"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"By exposing a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"type":"text","text":" as the "},{"type":"codeVoice","code":"projectedValue"},{"type":"text","text":" we’re now able to call "},{"code":"self.$notes.insert(note)","type":"codeVoice"},{"type":"text","text":" to insert a note into the "},{"code":"notes","type":"codeVoice"},{"type":"text","text":" array, an array that is "},{"code":"@Published public private(set)","type":"codeVoice"},{"text":".","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Since "},{"code":"items","type":"codeVoice"},{"text":" is an ","type":"text"},{"code":"@Published","type":"codeVoice"},{"type":"text","text":" array that means every time the value is updated, the changes will propagate across our entire app. That’s how Boutique achieves it’s realtime updating, keeping your entire app in sync without any additional code."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Making the access control of "},{"type":"codeVoice","code":"items"},{"type":"text","text":" "},{"type":"codeVoice","code":"public private(set)"},{"text":" makes the ","type":"text"},{"type":"codeVoice","code":"notes"},{"text":" array read-only, letting us observe that array safely in our views.","type":"text"}]},{"syntax":"swift","type":"codeListing","code":["self.notes.insert(note) \/\/ Does not work because `notes` is a *read-only* array.","self.$notes.insert(note) \/\/ Works because $notes represents a `Store`"]},{"level":2,"anchor":"Observing-a-Stores-values","type":"heading","text":"Observing a Store’s values"},{"inlineContent":[{"type":"text","text":"The "},{"code":"items","type":"codeVoice"},{"type":"text","text":" property of a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":" is an array, and as we noted it’s a ","type":"text"},{"type":"codeVoice","code":"@Published"},{"text":" array. If you subscribe to ","type":"text"},{"code":"$items","type":"codeVoice"},{"text":" you can use Combine’s ","type":"text"},{"type":"codeVoice","code":"sink"},{"type":"text","text":" operator to observe the values chaning."}],"type":"paragraph"},{"code":["store.$items.sink({ items in"," print(\"Items was updated\", items)","})"],"type":"codeListing","syntax":"swift"},{"type":"paragraph","inlineContent":[{"text":"Even more powerful is seeing how naturally @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"text":" arrays integrate into SwiftUI. We’ll take our ","type":"text"},{"code":"NotesController","type":"codeVoice"},{"type":"text","text":" and let it be the data source for a SwiftUI view, watching our UI update in real time across all of our views whenever the data changes. While this example is one view, this technique will work in all your views that share the same data source, no matter how complex your views may be."}]},{"type":"codeListing","code":["struct NotesListView: View {"," @StateObject var notesController: NotesController"," @State private var notes: [Note] = []",""," var body: some View {"," VStack {"," ForEach(self.notes) { note in"," Text(note.text)"," .onTapGesture(perform: {"," notesController.removeNote(note)"," }"," }"," }"," .onReceive(notesController.$notes.$items, perform: {"," \/\/ We can even create complex pipelines, for example filtering all notes bigger than a tweet"," self.notes = $0.filter({ $0.length > 280 })"," })"," }","}"],"syntax":"swift"},{"type":"paragraph","inlineContent":[{"text":"In the view above we’re subscribing to the original source of truth in the ","type":"text"},{"type":"codeVoice","code":"onReceive"},{"text":" closure, ","type":"text"},{"type":"codeVoice","code":"notesController.$notes"},{"text":". Any time ","type":"text"},{"type":"codeVoice","code":"notesController.notes"},{"text":" from anywhere in our app, our ","type":"text"},{"code":"NotesListView","type":"codeVoice"},{"text":" will update as well.","type":"text"}]},{"inlineContent":[{"type":"text","text":"There is still only one source of truth ("},{"type":"codeVoice","code":"notesController.notes"},{"type":"text","text":"), but each view will have it’s own local representation of the @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"text":" array. This allows us to perform transformations before choosing what to render and how to do it, in this case removing any notes that are too long to fit on Twitter.","type":"text"}],"type":"paragraph"},{"type":"paragraph","inlineContent":[{"text":"Since the ","type":"text"},{"type":"codeVoice","code":"NotesController"},{"text":" has a ","type":"text"},{"code":"removeNote","type":"codeVoice"},{"type":"text","text":" function we can even handle user interaction such as a user tapping on a note, all within a simple "},{"code":"View","type":"codeVoice"},{"type":"text","text":", with an additional benefit of removing the necessity for a ViewModel."}]},{"inlineContent":[{"type":"text","text":"You may be tempted to remove the extra array, building something that looks like this."}],"type":"paragraph"},{"code":["struct NotesListView: View {"," @StateObject var notesController: NotesController",""," var body: some View {"," VStack {"," ForEach(notesController.notes.filter({ $0.length > 280 })) { note in"," Text(note.text)"," }"," }"," }","}"],"type":"codeListing","syntax":"swift"},{"inlineContent":[{"text":"This looks simpler, but it’s deceptively unperformant. Every time ","type":"text"},{"type":"codeVoice","code":"notesController.notes"},{"text":" is modified, we will have to filter over every note to remove anything longer than a tweet. Each of those operations will trigger SwiftUI to re-render every subview, and while this would be a problem in any SwiftUI app Boutique makes your source of truth easy to access so I wanted to call it out to avoid potential performance pitfalls.","type":"text"}],"type":"paragraph"},{"text":"@StoredValue","anchor":"StoredValue","type":"heading","level":2},{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":" and @","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"text":" were created to store an array of data because most data apps render comes in the form of an array. But occasionally we need to store an individual value, that’s where @","type":"text"},{"code":"StoredValue","type":"codeVoice"},{"type":"text","text":"@"},{"code":"SecurelyStoredValue","type":"codeVoice"},{"type":"text","text":", and @"},{"type":"codeVoice","code":"AsyncStoredValue"},{"type":"text","text":" come in handy."}]},{"inlineContent":[{"text":"Whether you need to save an important piece of information for the next time your app is launched or if want to change how an app looks based on a user’s settings, those app configurations are individual values that you’ll want to persist.","type":"text"}],"type":"paragraph"},{"type":"paragraph","inlineContent":[{"text":"Often times people will choose to store individual items like that in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":". If you’ve used ","type":"text"},{"type":"codeVoice","code":"@AppStorage"},{"type":"text","text":" then @"},{"code":"StoredValue","type":"codeVoice"},{"type":"text","text":" will feel right at home, it has a very similar API with some additional features. A @"},{"type":"codeVoice","code":"StoredValue"},{"text":" will end up being stored in ","type":"text"},{"code":"UserDefaults","type":"codeVoice"},{"text":", but it also exposes a ","type":"text"},{"code":"publisher","type":"codeVoice"},{"type":"text","text":" so you can easily subscribe to changes."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Setting up a @"},{"code":"StoredValue","type":"codeVoice"},{"text":" is simple","type":"text"}]},{"code":["@StoredValue(key: \"hasHapticsEnabled\")","var hasHapticsEnabled = false"],"syntax":"swift","type":"codeListing"},{"inlineContent":[{"text":"You can also store nil values","type":"text"}],"type":"paragraph"},{"type":"codeListing","code":["@StoredValue(key: \"lastOpenedDate\")","var lastOpenedDate: Date? = nil"],"syntax":"swift"},{"inlineContent":[{"type":"text","text":"Or even an enum, as long as it conforms to "},{"type":"codeVoice","code":"Codable"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Equatable"},{"text":".","type":"text"}],"type":"paragraph"},{"type":"codeListing","syntax":"swift","code":["@StoredValue(key: \"currentTheme\")","var currentlySelectedTheme = .light"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"A more complex example for a hypothetical video player app may look something like this."}]},{"type":"codeListing","syntax":"swift","code":["struct UserPreferences: Codable, Equatable {"," var hasHapticsEnabled: Bool"," var prefersDarkMode: Bool"," var prefersWideScreen: Bool"," var spatialAudioEnabled: Bool","}","","@StoredValue(key: \"userPreferences\")","var preferences = UserPreferences()"]},{"inlineContent":[{"type":"text","text":"This looks a lot like @"},{"type":"codeVoice","code":"AppStorage"},{"text":", some minimal API differences aside. Where @","type":"text"},{"type":"codeVoice","code":"StoredValue"},{"text":" is different than @","type":"text"},{"code":"AppStorage","type":"codeVoice"},{"type":"text","text":" is that it’s API more closely resembles working with a "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" than "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":"."}],"type":"paragraph"},{"type":"paragraph","inlineContent":[{"type":"text","text":"We’ll use the "},{"code":"projectedValue","type":"codeVoice"},{"type":"text","text":" of our @"},{"type":"codeVoice","code":"StoredValue"},{"text":" to set a new value. (Accessed by prepending a ","type":"text"},{"type":"codeVoice","code":"$"},{"type":"text","text":" dollar sign.)"}]},{"syntax":"swift","code":["$lastOpenedDate.set(.now) \/\/ Set the lastOpenedDate to now","$currentlySelectedTheme.set(.dark) \/\/ currentlySelected is now .dark"],"type":"codeListing"},{"inlineContent":[{"text":"And we’ll use the ","type":"text"},{"type":"codeVoice","code":"profectedValue"},{"type":"text","text":" of our @"},{"code":"StoredValue","type":"codeVoice"},{"type":"text","text":" to reset the values back to their default values."}],"type":"paragraph"},{"syntax":"swift","type":"codeListing","code":["$lastOpenedDate.reset() \/\/ lastOpenedDate has been reset to it's initial value of nil again","$currentlySelectedTheme.reset() \/\/ currentlySelected has been reset to it's initial value of .light"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"One more handy function, if your @"},{"type":"codeVoice","code":"StoredValue"},{"text":" is a ","type":"text"},{"type":"codeVoice","code":"Bool"},{"text":" you’ll also have access to a ","type":"text"},{"code":".toggle()","type":"codeVoice"},{"type":"text","text":" function."}]},{"syntax":"swift","code":["$hasHapticsEnabled.toggle()","","\/\/ Equivalent to but cleaner than","$hasHapticsEnabled.set(!hasHapticsEnabled)"],"type":"codeListing"},{"text":"@AsyncStoredValue","anchor":"AsyncStoredValue","level":2,"type":"heading"},{"inlineContent":[{"text":"An @","type":"text"},{"type":"codeVoice","code":"AsyncStoredValue"},{"type":"text","text":" is very similar to "},{"code":"StoredValue","type":"codeVoice"},{"text":", the main difference is that rather than storing individual values in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":" an ","type":"text"},{"type":"codeVoice","code":"AsyncStoredValue"},{"text":" is stored in a ","type":"text"},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":", much like a "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":". This allows you to build your own custom persistence layer for storing values, such as building a ","type":"text"},{"code":"KeychainStorageEngine","type":"codeVoice"},{"type":"text","text":" to store individual values in the keychain much the same way we can choose our own persistence layer for @"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"text":".","type":"text"}],"type":"paragraph"},{"inlineContent":[{"text":"The API for using @","type":"text"},{"type":"codeVoice","code":"AsyncStoredValue"},{"type":"text","text":" is identical to @"},{"type":"codeVoice","code":"StoredValue"},{"type":"text","text":", so the @"},{"type":"codeVoice","code":"StoredValue"},{"text":" examples above will work for @","type":"text"},{"type":"codeVoice","code":"AsyncStoredValue"},{"type":"text","text":". The main difference is that values are received in an async manner, so you have to be prepared to not receive a value immediately or on demand. It may seem strange to have an async alternative to @"},{"type":"codeVoice","code":"StoredValue"},{"text":", but if you have a ","type":"text"},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":" based upon a remote service such as CloudKit or built atop your app’s server API, you’ll appreciate the ability to transparently store and persist individual values the same way you would any other data received from your API."}],"type":"paragraph"},{"text":"@SecurelyStoredValue","level":2,"type":"heading","anchor":"SecurelyStoredValue"},{"inlineContent":[{"text":"The @","type":"text"},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":" property wrapper automagically persists a single "},{"type":"codeVoice","code":"Item"},{"text":" in the system ","type":"text"},{"type":"codeVoice","code":"Keychain"}],"type":"paragraph"},{"inlineContent":[{"text":"The @","type":"text"},{"code":"SecurelyStoredValue","type":"codeVoice"},{"text":" property wrapper is very simple, but handles the complicated task of persisting values in the keychain. Traditionally storing values in the keychain requires using arcane C security APIs, but @","type":"text"},{"type":"codeVoice","code":"SecurelyStoredValue"},{"text":" makes this task incredibly easy. You should use @","type":"text"},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":" rather than @"},{"type":"codeVoice","code":"StoredValue"},{"text":" when you need to store sensitive values such as passwords or auth tokens, since a @","type":"text"},{"type":"codeVoice","code":"StoredValue"},{"text":" will be persisted in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":". @","type":"text"},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":" is not a full keychain library replacement, instead the property wrapper provides a drop-dead simple alternative for the most common use case."}],"type":"paragraph"},{"type":"paragraph","inlineContent":[{"text":"Creating a @","type":"text"},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":" is very simple."}]},{"type":"codeListing","syntax":"swift","code":["@SecurelyStoredValue(key: \"redPanda\")","private var redPanda"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Unlike @"},{"code":"StoredValue","type":"codeVoice"},{"type":"text","text":" properties @"},{"type":"codeVoice","code":"SecurelyStoredValue"},{"text":" properties cannot be provided a default value. Since keychain values may or may not exist, a @","type":"text"},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":" is nullable by default. Something to watch out for: You do not need to specify your type as nullable. If you do so the type will be a double optional ("},{"code":"??","type":"codeVoice"},{"text":") rather than optional (","type":"text"},{"code":"?","type":"codeVoice"},{"text":").","type":"text"}]},{"type":"codeListing","code":["\/\/ The type here is not `RedPanda?`, but `RedPanda??`","@SecurelyStoredValue(key: \"redPanda\")"],"syntax":"swift"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Using a @"},{"type":"codeVoice","code":"SecurelyStoredValue"},{"type":"text","text":" is the same as a regular @"},{"code":"StoredValue","type":"codeVoice"},{"text":", the only difference is that the two methods are ","type":"text"},{"code":"set(_:)","type":"codeVoice"},{"type":"text","text":" and "},{"code":"remove()","type":"codeVoice"},{"text":", rather than ","type":"text"},{"code":"set(_:)","type":"codeVoice"},{"type":"text","text":" and "},{"code":"reset()","type":"codeVoice"}]},{"type":"codeListing","code":["try self.$storedPassword.set(\"p@ssw0rd\") \/\/ self.storedPassword is now set to \"p@assw0rd\" ","try self.$storedPassword.remove() \/\/ self.storedPassword is now nil"],"syntax":"swift"},{"anchor":"Further-Exploration","type":"heading","text":"Further Exploration","level":2},{"inlineContent":[{"type":"text","text":"Now that we’ve covered @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"text":", @","type":"text"},{"code":"StoredValue","type":"codeVoice"},{"type":"text","text":", @"},{"type":"codeVoice","code":"SecurelyStoredValue"},{"text":", and @","type":"text"},{"type":"codeVoice","code":"AsyncStoredValue"},{"type":"text","text":" we can see how these property wrappers enable your app to work with regular Swift values and arrays, but have your app available offline with realtime state updates easier than ever. There isn’t much left to learn about using Boutique, but if you want to explore further you can start using Boutique in one of your apps!"}],"type":"paragraph"},{"type":"paragraph","inlineContent":[{"type":"text","text":"As a reminder you can always play around with the code yourself."}]},{"items":[{"content":[{"type":"paragraph","inlineContent":[{"isActive":true,"type":"reference","identifier":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo"}]}]}],"type":"unorderedList"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Or read through an in-depth technical walkthrough of Boutique, and how it powers the Model View Controller Store architecture."}]},{"type":"unorderedList","items":[{"content":[{"inlineContent":[{"type":"reference","isActive":true,"identifier":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store"}],"type":"paragraph"}]}]}],"kind":"content"}],"kind":"article","sections":[],"abstract":[{"text":"Property Wrappers that take the ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"text":" and make it magical. ✨","type":"text"}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/The-@Stored-Family-Of-Property-Wrappers","interfaceLanguage":"swift"},"variants":[{"paths":["\/documentation\/boutique\/the-@stored-family-of-property-wrappers"],"traits":[{"interfaceLanguage":"swift"}]}],"schemaVersion":{"major":0,"patch":0,"minor":3},"references":{"https://build.ms/2022/06/22/model-view-controller-store":{"identifier":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store","url":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store","titleInlineContent":[{"type":"text","text":"Model View Controller Store: Reinventing MVC for SwiftUI with Boutique"}],"title":"Model View Controller Store: Reinventing MVC for SwiftUI with Boutique","type":"link"},"https://github.com/mergesort/Boutique/tree/main/Demo":{"url":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo","type":"link","titleInlineContent":[{"type":"text","text":"A Boutique Demo App"}],"title":"A Boutique Demo App","identifier":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Using-Stores":{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Using-Stores","title":"Using Stores","type":"topic","abstract":[{"type":"text","text":"The "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" is at the heart of what makes Boutique, Boutique."}],"role":"article","kind":"article","url":"\/documentation\/boutique\/using-stores"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"}}} \ No newline at end of file diff --git a/docs/data/documentation/boutique/using-stores.json b/docs/data/documentation/boutique/using-stores.json index 57759c3..3a4b4c7 100644 --- a/docs/data/documentation/boutique/using-stores.json +++ b/docs/data/documentation/boutique/using-stores.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"content","content":[{"anchor":"Overview","level":2,"type":"heading","text":"Overview"},{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" is the data storage primitive of a Boutique app, providing two layers of persistence. For every item you save to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" there will be an item saved to memory, and that same item will be saved to your "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":". The "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" is a concept from "},{"type":"reference","isActive":true,"identifier":"https:\/\/github.com\/mergesort\/Boutique"},{"type":"text","text":", representing any data storage mechanism that persists data. If you’re looking into a library like Boutique chances are you’ve used a database, saved files to disk, or stored values in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":", and Boutique aims to streamline that process. If you’re using a database like CoreData, Realm, or even CloudKit, you can build a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" tailored to your needs, but Bodega comes with a few built in options you can use. The default suggestion is to use "},{"type":"codeVoice","code":"SQLiteStorageEngine"},{"type":"text","text":", a simple and fast way to save data to a database in your app."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Once you setup your "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" you’ll never have to think about your persistence layer ever again. Rather than interacting with a database and making queries, you’ll always be using Boutique’s memory layer. That may sound complex, but all that means is you’ll be saving to and reading from an array. Because you’re working with a regular array you won’t have to make changes to your app to accommodate the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":", everything you’ve come to expect will work out the box, no changes required."}]},{"anchor":"Initializing-a-Store","level":2,"type":"heading","text":"Initializing a Store"},{"type":"paragraph","inlineContent":[{"type":"text","text":"To start working with a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":", you’ll first need to initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" with a "},{"type":"codeVoice","code":"StorageEngine"}]},{"type":"codeListing","syntax":"swift","code":["let store = Store("," storage: SQLiteStorageEngine(directory: .defaultStorageDirectory(appendingPath: \"Items\")),"," cacheIdentifier: \\.id",")"]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"type":"codeVoice","code":"storage"},{"type":"text","text":" parameter is populated with a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":", you can read more about it in "},{"type":"reference","isActive":true,"identifier":"https:\/\/mergesort.github.io\/Bodega\/documentation\/bodega\/using-storageengines"},{"type":"text","text":". Our SQLite database will be created in the platform’s default storage directory, nested in an "},{"type":"codeVoice","code":"Items"},{"type":"text","text":" subdirectory. On macOS this will be the "},{"type":"codeVoice","code":"Application Support"},{"type":"text","text":" directory, and on every other platform such as iOS this will be the "},{"type":"codeVoice","code":"Documents"},{"type":"text","text":" directory. If you need finer control over the location you can specify a "},{"type":"codeVoice","code":"FileManager.Directory"},{"type":"text","text":" such as "},{"type":"codeVoice","code":".documents"},{"type":"text","text":", "},{"type":"codeVoice","code":".caches"},{"type":"text","text":", "},{"type":"codeVoice","code":".temporary"},{"type":"text","text":", or even provide your own URL, also explored in "},{"overridingTitleInlineContent":[{"type":"text","text":"Bodega’s StorageEngine documentation"}],"isActive":true,"type":"reference","identifier":"https:\/\/mergesort.github.io\/Bodega\/documentation\/bodega\/using-storageengines","overridingTitle":"Bodega’s StorageEngine documentation"},{"type":"text","text":"."}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" is a "},{"type":"codeVoice","code":"KeyPath"},{"type":"text","text":" that your model must provide. That may seem unconventional at first, so let’s break it down. Much like how protocols enforce a contract, the KeyPath is doing the same for our model. To be inserted into our "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" and saved to disk our models must conform to "},{"type":"codeVoice","code":"Codable & Equatable"},{"type":"text","text":", both of which are reasonable constraints given the data has to be serializable and searchable. But what we’re trying to avoid is making our models have to conform to a specialized caching protocol, we want to be able to save any ol’ object you already have in your app. Instead of creating a protocol like "},{"type":"codeVoice","code":"Storable"},{"type":"text","text":", we instead ask the model to tell us how we can derive a unique string which will be used as a key when storing the item."}]}]}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"If your model (in this case "},{"type":"codeVoice","code":"Item"},{"type":"text","text":") already conforms to "},{"type":"codeVoice","code":"Identifiable"},{"type":"text","text":", we can simplify our initializer by eschewing the "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" parameter."}]},{"type":"codeListing","syntax":"swift","code":["let store = Store("," storage: SQLiteStorageEngine(directory: .defaultStorageDirectory(appendingPath: \"Items\"))",")"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"And since "},{"type":"codeVoice","code":"SQLiteStorageEngine"},{"type":"text","text":" is provided to Boutique by Bodega, Bodega exposes a "},{"type":"codeVoice","code":"default(appendingPath:)"},{"type":"text","text":" initializer we can use."}]},{"type":"codeListing","syntax":"swift","code":["static let store = Store("," storage: SQLiteStorageEngine.default(appendingPath: \"Items\")",")"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is how simple it is to create a full database-backed persistence layer, only one line of code for something that can take hundreds of lines to implement otherwise."}]},{"anchor":"How-Are-Items-Stored","level":2,"type":"heading","text":"How Are Items Stored?"},{"type":"paragraph","inlineContent":[{"type":"text","text":"We’ll explore how to use "},{"type":"codeVoice","code":".insert(item: Item)"},{"type":"text","text":" to save items, but it’s worth taking a minute to discuss how items are stored in the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":". When an item is saved to a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":", that item is added to an array of "},{"type":"codeVoice","code":"items"},{"type":"text","text":", and it is also persisted by the "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":". If we use "},{"type":"codeVoice","code":"DiskStorageEngine"},{"type":"text","text":" the item will be saved to a disk, or if we use "},{"type":"codeVoice","code":"SQLiteStorageEngine"},{"type":"text","text":" the item will be saved to a database. The items are saved to the directory specified in the "},{"type":"codeVoice","code":"DiskStorageEngine"},{"type":"text","text":" or "},{"type":"codeVoice","code":"SQLiteStorageEngine"},{"type":"text","text":" initializer, and each item will be stored uniquely based on it’s "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" key."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" provides a mechanism for disambiguating objects, guaranteeing uniqueness of the items in our "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":". You never have to think about whether the item needs to be added or inserted (overwriting a matching item), or what index to insert an item at. Since we have a "},{"type":"codeVoice","code":"cacheIdentifier"},{"type":"text","text":" for every item we will know when an item should be added or overwritten inside of the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":". This behavior means the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" operates more like a "},{"type":"codeVoice","code":"Set"},{"type":"text","text":" than an "},{"type":"codeVoice","code":"Array"},{"type":"text","text":", because we are inserting items into a bag of objects, and don’t care in what order."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"As a result the only operations you have to know are "},{"type":"codeVoice","code":".insert"},{"type":"text","text":", "},{"type":"codeVoice","code":".remove"},{"type":"text","text":", and "},{"type":"codeVoice","code":".removeAll"},{"type":"text","text":", all of which are explored in the "},{"type":"strong","inlineContent":[{"type":"text","text":"Store Operations"}]},{"type":"text","text":" section below. If you do need to sort the items into a particular order, for example if you’re displaying the items alphabetically, you can always use the "},{"type":"codeVoice","code":"items"},{"type":"text","text":" property of a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" and sort, filter, map, or transform it as you would any other array."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"To see how this looks I would highly recommend checking out the "},{"type":"reference","isActive":true,"identifier":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo"},{"type":"text","text":", as it shows off more complex examples of what Boutique and the Store can do. There’s even an example of how to sort items in a View based on time of creation "},{"type":"reference","isActive":true,"identifier":"https:\/\/github.com\/mergesort\/Boutique\/blob\/main\/Demo\/Demo\/Components\/FavoritesCarouselView.swift#L152-L154"},{"type":"text","text":"."}]},{"anchor":"Store-Operations","level":2,"type":"heading","text":"Store Operations"},{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"type":"codeVoice","code":"items"},{"type":"text","text":" property of a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" has an access control of "},{"type":"codeVoice","code":"public private (set)"},{"type":"text","text":", preventing the direct modification of the "},{"type":"codeVoice","code":"items"},{"type":"text","text":" array. If you want to mutate the "},{"type":"codeVoice","code":"items"},{"type":"text","text":" of a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" you need to use the three functions the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" exposes. The API surface area is very small though, there are only three functions you need to know."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Inserts an item into the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"}]},{"type":"codeListing","syntax":"swift","code":["let coat = Item(name: \"coat\")","try await store.insert(coat)"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Remove an item from the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"}]},{"type":"codeListing","syntax":"swift","code":["try await store.remove(coat)"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Remove all the items a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"}]},{"type":"codeListing","syntax":"swift","code":["try await store.removeAll()"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"You can even chain operations using the "},{"type":"codeVoice","code":".run()"},{"type":"text","text":" function, executing them in the order they are appended to the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":". This is really useful for situations where you want to clear your "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" before adding new items, such as downloading a fresh set of data from a server."}]},{"type":"codeListing","syntax":"swift","code":["try await store"," .removeAll()"," .insert(coat)"," .run()"]},{"anchor":"Sync-or-Async","level":2,"type":"heading","text":"Sync or Async?"},{"type":"paragraph","inlineContent":[{"type":"text","text":"To work with @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" or alternative property wrappers the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" must be initialized synchronously. This means that the "},{"type":"codeVoice","code":"items"},{"type":"text","text":" of your "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" will be loaded in the background, and may not be available immediately. However this can be an issue if you are using the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" directly and need to show the contents of the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" immediately, such as on your app’s launch’. The "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" provides you with two options to handle a scenario like this."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"By using the "},{"type":"codeVoice","code":"async"},{"type":"text","text":" overload of the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" initializer your "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" will be returned once all of the "},{"type":"codeVoice","code":"items"},{"type":"text","text":" are loaded."}]},{"type":"codeListing","syntax":"swift","code":["let store: Store","","init() async throws {"," store = try await Store(...)"," \/\/ Now the store will have `items` already loaded."," let items = await store.items","}"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Alternatively you can use the synchronous initializer, and then await for items to load before accessing them."}]},{"type":"codeListing","syntax":"swift","code":["let store: Store = Store(...)","","func getItems() async -> [Item] {"," try await store.itemsHaveLoaded() "," return await store.items","}"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The synchronous initializer is a sensible default, but if your app’s needs dictate displaying data only once you’ve loaded all of the necessary items the asynchronous initializers are there to help."}]},{"anchor":"Further-Exploration-Stored-And-More","level":2,"type":"heading","text":"Further Exploration, @Stored And More"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Building an app using the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" can be really powerful because it leans into SwiftUI’s state-driven architecture, while providing you with offline-first capabilities, realtime updates across your app, with almost no additional code required."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"We’ve introduced the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":", but the real power lies when you start to use Boutique’s property wrappers, @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":", @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":", @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":", and @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":". These property wrappers help deliver on the promise of working with regular Swift values and arrays yet having data persisted automatically, without ever having to think about the concept of a database."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The next step is to explore how they work, with a small example SwiftUI app."}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/The-@Stored-Family-Of-Property-Wrappers"}]}]}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"As a reminder you can always play around with the code yourself."}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"overridingTitleInlineContent":[{"type":"text","text":"A Boutique Demo App"}],"isActive":true,"type":"reference","identifier":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo","overridingTitle":"A Boutique Demo App"}]}]}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Or read through an in-depth technical walkthrough of Boutique, and how it powers the Model View Controller Store architecture."}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"reference","isActive":true,"identifier":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store"}]}]}]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/boutique\/using-stores"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/Boutique\/documentation\/Boutique\/Using-Stores","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"The "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" is at the heart of what makes Boutique, Boutique."}],"kind":"article","metadata":{"roleHeading":"Article","title":"Using Stores","role":"article","modules":[{"name":"Boutique"}]},"hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique"]]},"references":{"https://github.com/mergesort/Boutique/tree/main/Demo":{"title":"Boutique demo app","titleInlineContent":[{"type":"text","text":"Boutique demo app"}],"type":"link","identifier":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo","url":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo"},"https://github.com/mergesort/Boutique/blob/main/Demo/Demo/Components/FavoritesCarouselView.swift#L152-L154":{"title":"here","titleInlineContent":[{"type":"text","text":"here"}],"type":"link","identifier":"https:\/\/github.com\/mergesort\/Boutique\/blob\/main\/Demo\/Demo\/Components\/FavoritesCarouselView.swift#L152-L154","url":"https:\/\/github.com\/mergesort\/Boutique\/blob\/main\/Demo\/Demo\/Components\/FavoritesCarouselView.swift#L152-L154"},"https://mergesort.github.io/Bodega/documentation/bodega/using-storageengines":{"title":"Bodega’s StorageEngine documentation","titleInlineContent":[{"type":"text","text":"Bodega’s StorageEngine documentation"}],"type":"link","identifier":"https:\/\/mergesort.github.io\/Bodega\/documentation\/bodega\/using-storageengines","url":"https:\/\/mergesort.github.io\/Bodega\/documentation\/bodega\/using-storageengines"},"https://github.com/mergesort/Boutique":{"title":"Bodega","titleInlineContent":[{"type":"text","text":"Bodega"}],"type":"link","identifier":"https:\/\/github.com\/mergesort\/Boutique","url":"https:\/\/github.com\/mergesort\/Boutique"},"https://build.ms/2022/06/22/model-view-controller-store":{"title":"Model View Controller Store: Reinventing MVC for SwiftUI with Boutique","titleInlineContent":[{"type":"text","text":"Model View Controller Store: Reinventing MVC for SwiftUI with Boutique"}],"type":"link","identifier":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store","url":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store"},"doc://Boutique/documentation/Boutique":{"role":"collection","title":"Boutique","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique","kind":"symbol","type":"topic","url":"\/documentation\/boutique"},"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","title":"SecurelyStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"SecurelyStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":" property wrapper automagically persists a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in the system "},{"type":"codeVoice","code":"Keychain"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"SecurelyStoredValue"}],"url":"\/documentation\/boutique\/securelystoredvalue"},"doc://Boutique/documentation/Boutique/The-@Stored-Family-Of-Property-Wrappers":{"role":"article","title":"The @Stored Family Of Property Wrappers","abstract":[{"type":"text","text":"Property Wrappers that take the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" and make it magical. ✨"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/The-@Stored-Family-Of-Property-Wrappers","kind":"article","type":"topic","url":"\/documentation\/boutique\/the-@stored-family-of-property-wrappers"},"doc://Boutique/documentation/Boutique/StoredValue":{"role":"symbol","title":"StoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"StoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in "},{"type":"codeVoice","code":"UserDefaults"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"StoredValue"}],"url":"\/documentation\/boutique\/storedvalue"},"doc://Boutique/documentation/Boutique/Store":{"role":"symbol","title":"Store","fragments":[{"kind":"keyword","text":"class"},{"kind":"text","text":" "},{"kind":"identifier","text":"Store"}],"abstract":[{"type":"text","text":"A fancy persistence layer."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Store"}],"url":"\/documentation\/boutique\/store"},"doc://Boutique/documentation/Boutique/Stored":{"role":"symbol","title":"Stored","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Stored"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":" property wrapper to automagically initialize a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"Stored"}],"url":"\/documentation\/boutique\/stored"},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"role":"symbol","title":"AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AsyncStoredValue"}],"abstract":[{"type":"text","text":"The @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue"},{"type":"text","text":" property wrapper to automagically persist a single "},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" "},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" or using @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored"},{"type":"text","text":"."}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"AsyncStoredValue"}],"url":"\/documentation\/boutique\/asyncstoredvalue"}}} \ No newline at end of file +{"abstract":[{"type":"text","text":"The "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" is at the heart of what makes Boutique, Boutique.","type":"text"}],"sections":[],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/boutique\/using-stores"]}],"schemaVersion":{"patch":0,"major":0,"minor":3},"metadata":{"roleHeading":"Article","title":"Using Stores","role":"article","modules":[{"name":"Boutique"}]},"primaryContentSections":[{"kind":"content","content":[{"type":"heading","text":"Overview","level":2,"anchor":"Overview"},{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" is the data storage primitive of a Boutique app, providing two layers of persistence. For every item you save to the "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" there will be an item saved to memory, and that same item will be saved to your "},{"type":"codeVoice","code":"StorageEngine"},{"text":". The ","type":"text"},{"type":"codeVoice","code":"StorageEngine"},{"type":"text","text":" is a concept from "},{"isActive":true,"identifier":"https:\/\/github.com\/mergesort\/Boutique","type":"reference"},{"type":"text","text":", representing any data storage mechanism that persists data. If you’re looking into a library like Boutique chances are you’ve used a database, saved files to disk, or stored values in "},{"type":"codeVoice","code":"UserDefaults"},{"text":", and Boutique aims to streamline that process. If you’re using a database like CoreData, Realm, or even CloudKit, you can build a ","type":"text"},{"code":"StorageEngine","type":"codeVoice"},{"text":" tailored to your needs, but Bodega comes with a few built in options you can use. The default suggestion is to use ","type":"text"},{"code":"SQLiteStorageEngine","type":"codeVoice"},{"text":", a simple and fast way to save data to a database in your app.","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Once you setup your "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" you’ll never have to think about your persistence layer ever again. Rather than interacting with a database and making queries, you’ll always be using Boutique’s memory layer. That may sound complex, but all that means is you’ll be saving to and reading from an array. Because you’re working with a regular array you won’t have to make changes to your app to accommodate the "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":", everything you’ve come to expect will work out the box, no changes required.","type":"text"}]},{"text":"Initializing a Store","anchor":"Initializing-a-Store","type":"heading","level":2},{"inlineContent":[{"type":"text","text":"To start working with a "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":", you’ll first need to initialize a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"type":"text","text":" with a "},{"code":"StorageEngine","type":"codeVoice"}],"type":"paragraph"},{"code":["let store = Store("," storage: SQLiteStorageEngine(directory: .defaultStorageDirectory(appendingPath: \"Items\")),"," cacheIdentifier: \\.id",")"],"type":"codeListing","syntax":"swift"},{"items":[{"content":[{"inlineContent":[{"type":"text","text":"The "},{"type":"codeVoice","code":"storage"},{"text":" parameter is populated with a ","type":"text"},{"type":"codeVoice","code":"StorageEngine"},{"text":", you can read more about it in ","type":"text"},{"isActive":true,"identifier":"https:\/\/mergesort.github.io\/Bodega\/documentation\/bodega\/using-storageengines","type":"reference"},{"text":". Our SQLite database will be created in the platform’s default storage directory, nested in an ","type":"text"},{"code":"Items","type":"codeVoice"},{"type":"text","text":" subdirectory. On macOS this will be the "},{"code":"Application Support","type":"codeVoice"},{"type":"text","text":" directory, and on every other platform such as iOS this will be the "},{"type":"codeVoice","code":"Documents"},{"type":"text","text":" directory. If you need finer control over the location you can specify a "},{"type":"codeVoice","code":"FileManager.Directory"},{"type":"text","text":" such as "},{"type":"codeVoice","code":".documents"},{"type":"text","text":", "},{"type":"codeVoice","code":".caches"},{"text":", ","type":"text"},{"type":"codeVoice","code":".temporary"},{"type":"text","text":", or even provide your own URL, also explored in "},{"type":"reference","identifier":"https:\/\/mergesort.github.io\/Bodega\/documentation\/bodega\/using-storageengines","isActive":true,"overridingTitle":"Bodega’s StorageEngine documentation","overridingTitleInlineContent":[{"type":"text","text":"Bodega’s StorageEngine documentation"}]},{"text":".","type":"text"}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"The ","type":"text"},{"code":"cacheIdentifier","type":"codeVoice"},{"text":" is a ","type":"text"},{"type":"codeVoice","code":"KeyPath"},{"type":"text","text":" that your model must provide. That may seem unconventional at first, so let’s break it down. Much like how protocols enforce a contract, the KeyPath is doing the same for our model. To be inserted into our "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":" and saved to disk our models must conform to ","type":"text"},{"type":"codeVoice","code":"Codable & Equatable"},{"text":", both of which are reasonable constraints given the data has to be serializable and searchable. But what we’re trying to avoid is making our models have to conform to a specialized caching protocol, we want to be able to save any ol’ object you already have in your app. Instead of creating a protocol like ","type":"text"},{"type":"codeVoice","code":"Storable"},{"text":", we instead ask the model to tell us how we can derive a unique string which will be used as a key when storing the item.","type":"text"}]}]}],"type":"unorderedList"},{"inlineContent":[{"text":"If your model (in this case ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":") already conforms to "},{"type":"codeVoice","code":"Identifiable"},{"text":", we can simplify our initializer by eschewing the ","type":"text"},{"code":"cacheIdentifier","type":"codeVoice"},{"text":" parameter.","type":"text"}],"type":"paragraph"},{"syntax":"swift","code":["let store = Store("," storage: SQLiteStorageEngine(directory: .defaultStorageDirectory(appendingPath: \"Items\"))",")"],"type":"codeListing"},{"inlineContent":[{"text":"And since ","type":"text"},{"code":"SQLiteStorageEngine","type":"codeVoice"},{"text":" is provided to Boutique by Bodega, Bodega exposes a ","type":"text"},{"code":"default(appendingPath:)","type":"codeVoice"},{"type":"text","text":" initializer we can use."}],"type":"paragraph"},{"type":"codeListing","syntax":"swift","code":["static let store = Store("," storage: SQLiteStorageEngine.default(appendingPath: \"Items\")",")"]},{"type":"paragraph","inlineContent":[{"text":"This is how simple it is to create a full database-backed persistence layer, only one line of code for something that can take hundreds of lines to implement otherwise.","type":"text"}]},{"anchor":"How-Are-Items-Stored","level":2,"type":"heading","text":"How Are Items Stored?"},{"type":"paragraph","inlineContent":[{"type":"text","text":"We’ll explore how to use "},{"code":".insert(item: Item)","type":"codeVoice"},{"text":" to save items, but it’s worth taking a minute to discuss how items are stored in the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":". When an item is saved to a ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":", that item is added to an array of "},{"type":"codeVoice","code":"items"},{"type":"text","text":", and it is also persisted by the "},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":". If we use "},{"type":"codeVoice","code":"DiskStorageEngine"},{"type":"text","text":" the item will be saved to a disk, or if we use "},{"code":"SQLiteStorageEngine","type":"codeVoice"},{"type":"text","text":" the item will be saved to a database. The items are saved to the directory specified in the "},{"type":"codeVoice","code":"DiskStorageEngine"},{"type":"text","text":" or "},{"code":"SQLiteStorageEngine","type":"codeVoice"},{"text":" initializer, and each item will be stored uniquely based on it’s ","type":"text"},{"code":"cacheIdentifier","type":"codeVoice"},{"text":" key.","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"code":"cacheIdentifier","type":"codeVoice"},{"type":"text","text":" provides a mechanism for disambiguating objects, guaranteeing uniqueness of the items in our "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"type":"text","text":". You never have to think about whether the item needs to be added or inserted (overwriting a matching item), or what index to insert an item at. Since we have a "},{"code":"cacheIdentifier","type":"codeVoice"},{"text":" for every item we will know when an item should be added or overwritten inside of the ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"type":"text","text":". This behavior means the "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" operates more like a ","type":"text"},{"code":"Set","type":"codeVoice"},{"type":"text","text":" than an "},{"type":"codeVoice","code":"Array"},{"type":"text","text":", because we are inserting items into a bag of objects, and don’t care in what order."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"As a result the only operations you have to know are "},{"type":"codeVoice","code":".insert"},{"text":", ","type":"text"},{"code":".remove","type":"codeVoice"},{"text":", and ","type":"text"},{"code":".removeAll","type":"codeVoice"},{"type":"text","text":", all of which are explored in the "},{"type":"strong","inlineContent":[{"type":"text","text":"Store Operations"}]},{"text":" section below. If you do need to sort the items into a particular order, for example if you’re displaying the items alphabetically, you can always use the ","type":"text"},{"code":"items","type":"codeVoice"},{"type":"text","text":" property of a "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" and sort, filter, map, or transform it as you would any other array."}]},{"inlineContent":[{"text":"To see how this looks I would highly recommend checking out the ","type":"text"},{"isActive":true,"identifier":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo","type":"reference"},{"type":"text","text":", as it shows off more complex examples of what Boutique and the Store can do. There’s even an example of how to sort items in a View based on time of creation "},{"isActive":true,"type":"reference","identifier":"https:\/\/github.com\/mergesort\/Boutique\/blob\/main\/Demo\/Demo\/Components\/FavoritesCarouselView.swift#L152-L154"},{"text":".","type":"text"}],"type":"paragraph"},{"text":"Store Operations","type":"heading","anchor":"Store-Operations","level":2},{"inlineContent":[{"text":"The ","type":"text"},{"code":"items","type":"codeVoice"},{"type":"text","text":" property of a "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":" has an access control of ","type":"text"},{"type":"codeVoice","code":"public private (set)"},{"text":", preventing the direct modification of the ","type":"text"},{"type":"codeVoice","code":"items"},{"type":"text","text":" array. If you want to mutate the "},{"type":"codeVoice","code":"items"},{"text":" of a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" you need to use the three functions the ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" exposes. The API surface area is very small though, there are only three functions you need to know."}],"type":"paragraph"},{"type":"paragraph","inlineContent":[{"text":"Inserts an item into the ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"}]},{"type":"codeListing","syntax":"swift","code":["let coat = Item(name: \"coat\")","try await store.insert(coat)"]},{"inlineContent":[{"text":"Remove an item from the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true}],"type":"paragraph"},{"code":["try await store.remove(coat)"],"type":"codeListing","syntax":"swift"},{"inlineContent":[{"text":"Remove all the items a ","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"}],"type":"paragraph"},{"syntax":"swift","type":"codeListing","code":["try await store.removeAll()"]},{"inlineContent":[{"type":"text","text":"You can even chain operations using the "},{"type":"codeVoice","code":".run()"},{"text":" function, executing them in the order they are appended to the ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":". This is really useful for situations where you want to clear your ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":" before adding new items, such as downloading a fresh set of data from a server.","type":"text"}],"type":"paragraph"},{"code":["try await store"," .removeAll()"," .insert(coat)"," .run()"],"syntax":"swift","type":"codeListing"},{"anchor":"Sync-or-Async","level":2,"type":"heading","text":"Sync or Async?"},{"type":"paragraph","inlineContent":[{"type":"text","text":"To work with @"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"type":"text","text":" or alternative property wrappers the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"type":"text","text":" must be initialized synchronously. This means that the "},{"type":"codeVoice","code":"items"},{"type":"text","text":" of your "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" will be loaded in the background, and may not be available immediately. However this can be an issue if you are using the "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true,"type":"reference"},{"type":"text","text":" directly and need to show the contents of the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" immediately, such as on your app’s launch’. The "},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" provides you with two options to handle a scenario like this."}]},{"type":"paragraph","inlineContent":[{"text":"By using the ","type":"text"},{"type":"codeVoice","code":"async"},{"text":" overload of the ","type":"text"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":" initializer your ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":" will be returned once all of the ","type":"text"},{"code":"items","type":"codeVoice"},{"text":" are loaded.","type":"text"}]},{"syntax":"swift","code":["let store: Store","","init() async throws {"," store = try await Store(...)"," \/\/ Now the store will have `items` already loaded."," let items = await store.items","}"],"type":"codeListing"},{"inlineContent":[{"type":"text","text":"Alternatively you can use the synchronous initializer, and then await for items to load before accessing them."}],"type":"paragraph"},{"syntax":"swift","type":"codeListing","code":["let store: Store = Store(...)","","func getItems() async -> [Item] {"," try await store.itemsHaveLoaded() "," return await store.items","}"]},{"inlineContent":[{"type":"text","text":"The synchronous initializer is a sensible default, but if your app’s needs dictate displaying data only once you’ve loaded all of the necessary items the asynchronous initializers are there to help."}],"type":"paragraph"},{"level":2,"type":"heading","text":"Observing Store Loading State","anchor":"Observing-Store-Loading-State"},{"type":"paragraph","inlineContent":[{"type":"text","text":"You can manually observe the loading state of a "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" as we do in ","type":"text"},{"code":"getItems()","type":"codeVoice"},{"text":" above, but Boutique also provides a ","type":"text"},{"type":"codeVoice","code":"onStoreDidLoad"},{"text":" function to observe the loading state of a ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"text":" in SwiftUI.","type":"text"}]},{"syntax":"swift","type":"codeListing","code":["struct ContentView: View {"," @Stored var items: [Item]"," @State var itemsHaveLoaded = false",""," var body: some View {"," VStack {"," AlwaysVisibleBanner()",""," if self.itemsHaveLoaded {"," if self.items.isEmpty {"," EmptyStateView()"," } else {"," ItemsView(items: self.items)"," }"," } else {"," LoadingStateView()"," }"," }"," .onStoreDidLoad("," self.$items,"," update: $itemsHaveLoaded,"," onError: { error in"," log.error(\"Failed to load items\", error)"," }"," )"," }","}"]},{"inlineContent":[{"type":"text","text":"This allows for a clean separation of Views to display across three different states:"}],"type":"paragraph"},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"text":"When the Store has finished loading and has items","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"When the Store has finished loading and has no items"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"When the Store is loading (and implicitly has no items)"}]}]}]},{"type":"paragraph","inlineContent":[{"text":"You can also choose to use the closure-oriented variant of ","type":"text"},{"type":"codeVoice","code":"onStoreDidLoad"},{"type":"text","text":" to perform any additional logic when the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":" has finished loading. Patterns like MVVM choose to isolate this logic ViewModel, and you can still choose to do that, but exposing this method on a View provides more flexibility to work with your preferred architecture. In the example below we will filter the items in a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"type":"text","text":" based on some criteria, to display only the relevant items in our View."}]},{"type":"codeListing","syntax":"swift","code":[".onStoreDidLoad("," self.$items,"," onLoad: {"," self.items = self.filteredItems(self.items)"," },"," onError: { error in"," log.error(\"Failed to load items\", error)"," }",")"]},{"level":2,"type":"heading","anchor":"Further-Exploration-Stored-And-More","text":"Further Exploration, @Stored And More"},{"type":"paragraph","inlineContent":[{"text":"Building an app using the ","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","isActive":true},{"type":"text","text":" can be really powerful because it leans into SwiftUI’s state-driven architecture, while providing you with offline-first capabilities, realtime updates across your app, with almost no additional code required."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"We’ve introduced the "},{"isActive":true,"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"text":", but the real power lies when you start to use Boutique’s property wrappers, @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"type":"text","text":", @"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","type":"reference"},{"type":"text","text":", @"},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue"},{"type":"text","text":", and @"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true},{"type":"text","text":". These property wrappers help deliver on the promise of working with regular Swift values and arrays yet having data persisted automatically, without ever having to think about the concept of a database."}]},{"inlineContent":[{"text":"The next step is to explore how they work, with a small example SwiftUI app.","type":"text"}],"type":"paragraph"},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/The-@Stored-Family-Of-Property-Wrappers"}]}]}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"As a reminder you can always play around with the code yourself."}]},{"items":[{"content":[{"inlineContent":[{"isActive":true,"overridingTitle":"A Boutique Demo App","type":"reference","overridingTitleInlineContent":[{"text":"A Boutique Demo App","type":"text"}],"identifier":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo"}],"type":"paragraph"}]}],"type":"unorderedList"},{"inlineContent":[{"type":"text","text":"Or read through an in-depth technical walkthrough of Boutique, and how it powers the Model View Controller Store architecture."}],"type":"paragraph"},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"isActive":true,"identifier":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store","type":"reference"}]}]}]}]}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Boutique\/documentation\/Boutique\/Using-Stores"},"kind":"article","hierarchy":{"paths":[["doc:\/\/Boutique\/documentation\/Boutique"]]},"references":{"doc://Boutique/documentation/Boutique/SecurelyStoredValue":{"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","kind":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"SecurelyStoredValue"}],"type":"topic","navigatorTitle":[{"text":"SecurelyStoredValue","kind":"identifier"}],"title":"SecurelyStoredValue","url":"\/documentation\/boutique\/securelystoredvalue","abstract":[{"text":"The @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/SecurelyStoredValue","isActive":true},{"text":" property wrapper automagically persists a single ","type":"text"},{"code":"Item","type":"codeVoice"},{"text":" in the system ","type":"text"},{"code":"Keychain","type":"codeVoice"},{"text":" ","type":"text"},{"type":"text","text":"rather than an array of items that would be persisted in a "},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"type":"text","text":" or using @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/StoredValue":{"type":"topic","role":"symbol","fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"StoredValue","kind":"identifier"}],"navigatorTitle":[{"text":"StoredValue","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","url":"\/documentation\/boutique\/storedvalue","kind":"symbol","title":"StoredValue","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/StoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"text":" in ","type":"text"},{"type":"codeVoice","code":"UserDefaults"},{"text":" ","type":"text"},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":" or using @","type":"text"},{"type":"reference","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true},{"type":"text","text":"."}]},"doc://Boutique/documentation/Boutique/AsyncStoredValue":{"kind":"symbol","url":"\/documentation\/boutique\/asyncstoredvalue","navigatorTitle":[{"text":"AsyncStoredValue","kind":"identifier"}],"type":"topic","title":"AsyncStoredValue","abstract":[{"type":"text","text":"The @"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","isActive":true,"type":"reference"},{"text":" property wrapper to automagically persist a single ","type":"text"},{"type":"codeVoice","code":"Item"},{"type":"text","text":" in a "},{"code":"StorageEngine","type":"codeVoice"},{"type":"text","text":" "},{"text":"rather than an array of items that would be persisted in a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference"},{"text":" or using @","type":"text"},{"isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","type":"reference"},{"type":"text","text":"."}],"role":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/AsyncStoredValue","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AsyncStoredValue"}]},"https://github.com/mergesort/Boutique/blob/main/Demo/Demo/Components/FavoritesCarouselView.swift#L152-L154":{"type":"link","title":"here","identifier":"https:\/\/github.com\/mergesort\/Boutique\/blob\/main\/Demo\/Demo\/Components\/FavoritesCarouselView.swift#L152-L154","titleInlineContent":[{"type":"text","text":"here"}],"url":"https:\/\/github.com\/mergesort\/Boutique\/blob\/main\/Demo\/Demo\/Components\/FavoritesCarouselView.swift#L152-L154"},"https://mergesort.github.io/Bodega/documentation/bodega/using-storageengines":{"title":"Bodega’s StorageEngine documentation","type":"link","identifier":"https:\/\/mergesort.github.io\/Bodega\/documentation\/bodega\/using-storageengines","titleInlineContent":[{"type":"text","text":"Bodega’s StorageEngine documentation"}],"url":"https:\/\/mergesort.github.io\/Bodega\/documentation\/bodega\/using-storageengines"},"https://github.com/mergesort/Boutique/tree/main/Demo":{"type":"link","title":"Boutique demo app","identifier":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo","titleInlineContent":[{"type":"text","text":"Boutique demo app"}],"url":"https:\/\/github.com\/mergesort\/Boutique\/tree\/main\/Demo"},"doc://Boutique/documentation/Boutique/Store":{"type":"topic","fragments":[{"text":"class","kind":"keyword"},{"kind":"text","text":" "},{"text":"Store","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","navigatorTitle":[{"text":"Store","kind":"identifier"}],"url":"\/documentation\/boutique\/store","abstract":[{"text":"A fancy persistence layer.","type":"text"}],"title":"Store","role":"symbol"},"doc://Boutique/documentation/Boutique/Stored":{"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Stored","kind":"identifier"}],"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","url":"\/documentation\/boutique\/stored","navigatorTitle":[{"text":"Stored","kind":"identifier"}],"type":"topic","role":"symbol","kind":"symbol","abstract":[{"text":"The @","type":"text"},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Stored","isActive":true,"type":"reference"},{"type":"text","text":" property wrapper to automagically initialize a "},{"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store","type":"reference","isActive":true},{"text":".","type":"text"}],"title":"Stored"},"doc://Boutique/documentation/Boutique":{"title":"Boutique","kind":"symbol","identifier":"doc:\/\/Boutique\/documentation\/Boutique","role":"collection","abstract":[{"type":"text","text":"A simple but surprisingly fancy data store and so much more"}],"type":"topic","url":"\/documentation\/boutique"},"https://github.com/mergesort/Boutique":{"title":"Bodega","type":"link","identifier":"https:\/\/github.com\/mergesort\/Boutique","titleInlineContent":[{"type":"text","text":"Bodega"}],"url":"https:\/\/github.com\/mergesort\/Boutique"},"https://build.ms/2022/06/22/model-view-controller-store":{"type":"link","url":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store","title":"Model View Controller Store: Reinventing MVC for SwiftUI with Boutique","identifier":"https:\/\/build.ms\/2022\/06\/22\/model-view-controller-store","titleInlineContent":[{"type":"text","text":"Model View Controller Store: Reinventing MVC for SwiftUI with Boutique"}]},"doc://Boutique/documentation/Boutique/The-@Stored-Family-Of-Property-Wrappers":{"abstract":[{"type":"text","text":"Property Wrappers that take the "},{"type":"reference","isActive":true,"identifier":"doc:\/\/Boutique\/documentation\/Boutique\/Store"},{"type":"text","text":" and make it magical. ✨"}],"url":"\/documentation\/boutique\/the-@stored-family-of-property-wrappers","role":"article","identifier":"doc:\/\/Boutique\/documentation\/Boutique\/The-@Stored-Family-Of-Property-Wrappers","kind":"article","type":"topic","title":"The @Stored Family Of Property Wrappers"}}} \ No newline at end of file diff --git a/docs/documentation/boutique/asyncstoredvalue/append(_:)/index.html b/docs/documentation/boutique/asyncstoredvalue/append(_:)/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/asyncstoredvalue/append(_:)/index.html +++ b/docs/documentation/boutique/asyncstoredvalue/append(_:)/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/asyncstoredvalue/binding/index.html b/docs/documentation/boutique/asyncstoredvalue/binding/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/asyncstoredvalue/binding/index.html +++ b/docs/documentation/boutique/asyncstoredvalue/binding/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/asyncstoredvalue/index.html b/docs/documentation/boutique/asyncstoredvalue/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/asyncstoredvalue/index.html +++ b/docs/documentation/boutique/asyncstoredvalue/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/asyncstoredvalue/init(wrappedvalue:storage:)/index.html b/docs/documentation/boutique/asyncstoredvalue/init(wrappedvalue:storage:)/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/asyncstoredvalue/init(wrappedvalue:storage:)/index.html +++ b/docs/documentation/boutique/asyncstoredvalue/init(wrappedvalue:storage:)/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/asyncstoredvalue/projectedvalue/index.html b/docs/documentation/boutique/asyncstoredvalue/projectedvalue/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/asyncstoredvalue/projectedvalue/index.html +++ b/docs/documentation/boutique/asyncstoredvalue/projectedvalue/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/asyncstoredvalue/publisher/index.html b/docs/documentation/boutique/asyncstoredvalue/publisher/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/asyncstoredvalue/publisher/index.html +++ b/docs/documentation/boutique/asyncstoredvalue/publisher/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/asyncstoredvalue/reset()/index.html b/docs/documentation/boutique/asyncstoredvalue/reset()/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/asyncstoredvalue/reset()/index.html +++ b/docs/documentation/boutique/asyncstoredvalue/reset()/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/asyncstoredvalue/set(_:)/index.html b/docs/documentation/boutique/asyncstoredvalue/set(_:)/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/asyncstoredvalue/set(_:)/index.html +++ b/docs/documentation/boutique/asyncstoredvalue/set(_:)/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/asyncstoredvalue/toggle()/index.html b/docs/documentation/boutique/asyncstoredvalue/toggle()/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/asyncstoredvalue/toggle()/index.html +++ b/docs/documentation/boutique/asyncstoredvalue/toggle()/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/asyncstoredvalue/togglepresence(_:)/index.html b/docs/documentation/boutique/asyncstoredvalue/togglepresence(_:)/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/asyncstoredvalue/togglepresence(_:)/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/asyncstoredvalue/update(key:value:)/index.html b/docs/documentation/boutique/asyncstoredvalue/update(key:value:)/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/asyncstoredvalue/update(key:value:)/index.html +++ b/docs/documentation/boutique/asyncstoredvalue/update(key:value:)/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/asyncstoredvalue/wrappedvalue/index.html b/docs/documentation/boutique/asyncstoredvalue/wrappedvalue/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/asyncstoredvalue/wrappedvalue/index.html +++ b/docs/documentation/boutique/asyncstoredvalue/wrappedvalue/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/index.html b/docs/documentation/boutique/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/index.html +++ b/docs/documentation/boutique/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychainerror/couldnotaccesskeychain/index.html b/docs/documentation/boutique/keychainerror/couldnotaccesskeychain/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/keychainerror/couldnotaccesskeychain/index.html +++ b/docs/documentation/boutique/keychainerror/couldnotaccesskeychain/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychainerror/error-implementations/index.html b/docs/documentation/boutique/keychainerror/error-implementations/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/keychainerror/error-implementations/index.html +++ b/docs/documentation/boutique/keychainerror/error-implementations/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychainerror/errorwithstatus(status:)/index.html b/docs/documentation/boutique/keychainerror/errorwithstatus(status:)/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/keychainerror/errorwithstatus(status:)/index.html +++ b/docs/documentation/boutique/keychainerror/errorwithstatus(status:)/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychainerror/index.html b/docs/documentation/boutique/keychainerror/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/keychainerror/index.html +++ b/docs/documentation/boutique/keychainerror/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychainerror/itemnotfound/index.html b/docs/documentation/boutique/keychainerror/itemnotfound/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/keychainerror/itemnotfound/index.html +++ b/docs/documentation/boutique/keychainerror/itemnotfound/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychainerror/localizeddescription/index.html b/docs/documentation/boutique/keychainerror/localizeddescription/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/keychainerror/localizeddescription/index.html +++ b/docs/documentation/boutique/keychainerror/localizeddescription/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychainerror/missingentitlement/index.html b/docs/documentation/boutique/keychainerror/missingentitlement/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/keychainerror/missingentitlement/index.html +++ b/docs/documentation/boutique/keychainerror/missingentitlement/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychaingroup/expressiblebyextendedgraphemeclusterliteral-implementations/index.html b/docs/documentation/boutique/keychaingroup/expressiblebyextendedgraphemeclusterliteral-implementations/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/keychaingroup/expressiblebyextendedgraphemeclusterliteral-implementations/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychaingroup/expressiblebyunicodescalarliteral-implementations/index.html b/docs/documentation/boutique/keychaingroup/expressiblebyunicodescalarliteral-implementations/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/keychaingroup/expressiblebyunicodescalarliteral-implementations/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychaingroup/index.html b/docs/documentation/boutique/keychaingroup/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/keychaingroup/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychaingroup/init(extendedgraphemeclusterliteral:)/index.html b/docs/documentation/boutique/keychaingroup/init(extendedgraphemeclusterliteral:)/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/keychaingroup/init(extendedgraphemeclusterliteral:)/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychaingroup/init(stringliteral:)/index.html b/docs/documentation/boutique/keychaingroup/init(stringliteral:)/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/keychaingroup/init(stringliteral:)/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychaingroup/init(unicodescalarliteral:)/index.html b/docs/documentation/boutique/keychaingroup/init(unicodescalarliteral:)/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/keychaingroup/init(unicodescalarliteral:)/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychaingroup/init(value:)/index.html b/docs/documentation/boutique/keychaingroup/init(value:)/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/keychaingroup/init(value:)/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychaingroup/value/index.html b/docs/documentation/boutique/keychaingroup/value/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/keychaingroup/value/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychainservice/expressiblebyextendedgraphemeclusterliteral-implementations/index.html b/docs/documentation/boutique/keychainservice/expressiblebyextendedgraphemeclusterliteral-implementations/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/keychainservice/expressiblebyextendedgraphemeclusterliteral-implementations/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychainservice/expressiblebyunicodescalarliteral-implementations/index.html b/docs/documentation/boutique/keychainservice/expressiblebyunicodescalarliteral-implementations/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/keychainservice/expressiblebyunicodescalarliteral-implementations/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychainservice/index.html b/docs/documentation/boutique/keychainservice/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/keychainservice/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychainservice/init(extendedgraphemeclusterliteral:)/index.html b/docs/documentation/boutique/keychainservice/init(extendedgraphemeclusterliteral:)/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/keychainservice/init(extendedgraphemeclusterliteral:)/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychainservice/init(stringliteral:)/index.html b/docs/documentation/boutique/keychainservice/init(stringliteral:)/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/keychainservice/init(stringliteral:)/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychainservice/init(unicodescalarliteral:)/index.html b/docs/documentation/boutique/keychainservice/init(unicodescalarliteral:)/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/keychainservice/init(unicodescalarliteral:)/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychainservice/init(value:)/index.html b/docs/documentation/boutique/keychainservice/init(value:)/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/keychainservice/init(value:)/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/keychainservice/value/index.html b/docs/documentation/boutique/keychainservice/value/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/keychainservice/value/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/securelystoredvalue/append(_:)/index.html b/docs/documentation/boutique/securelystoredvalue/append(_:)/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/securelystoredvalue/append(_:)/index.html +++ b/docs/documentation/boutique/securelystoredvalue/append(_:)/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/securelystoredvalue/binding/index.html b/docs/documentation/boutique/securelystoredvalue/binding/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/securelystoredvalue/binding/index.html +++ b/docs/documentation/boutique/securelystoredvalue/binding/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/securelystoredvalue/index.html b/docs/documentation/boutique/securelystoredvalue/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/securelystoredvalue/index.html +++ b/docs/documentation/boutique/securelystoredvalue/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/securelystoredvalue/init(key:)/index.html b/docs/documentation/boutique/securelystoredvalue/init(key:)/index.html deleted file mode 100644 index 8949581..0000000 --- a/docs/documentation/boutique/securelystoredvalue/init(key:)/index.html +++ /dev/null @@ -1 +0,0 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file diff --git a/docs/documentation/boutique/securelystoredvalue/init(key:service:group:)/index.html b/docs/documentation/boutique/securelystoredvalue/init(key:service:group:)/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/securelystoredvalue/init(key:service:group:)/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/securelystoredvalue/projectedvalue/index.html b/docs/documentation/boutique/securelystoredvalue/projectedvalue/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/securelystoredvalue/projectedvalue/index.html +++ b/docs/documentation/boutique/securelystoredvalue/projectedvalue/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/securelystoredvalue/publisher/index.html b/docs/documentation/boutique/securelystoredvalue/publisher/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/securelystoredvalue/publisher/index.html +++ b/docs/documentation/boutique/securelystoredvalue/publisher/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/securelystoredvalue/remove()/index.html b/docs/documentation/boutique/securelystoredvalue/remove()/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/securelystoredvalue/remove()/index.html +++ b/docs/documentation/boutique/securelystoredvalue/remove()/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/securelystoredvalue/set(_:)/index.html b/docs/documentation/boutique/securelystoredvalue/set(_:)/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/securelystoredvalue/set(_:)/index.html +++ b/docs/documentation/boutique/securelystoredvalue/set(_:)/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/securelystoredvalue/toggle()/index.html b/docs/documentation/boutique/securelystoredvalue/toggle()/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/securelystoredvalue/toggle()/index.html +++ b/docs/documentation/boutique/securelystoredvalue/toggle()/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/securelystoredvalue/update(key:value:)/index.html b/docs/documentation/boutique/securelystoredvalue/update(key:value:)/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/securelystoredvalue/update(key:value:)/index.html +++ b/docs/documentation/boutique/securelystoredvalue/update(key:value:)/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/securelystoredvalue/wrappedvalue/index.html b/docs/documentation/boutique/securelystoredvalue/wrappedvalue/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/securelystoredvalue/wrappedvalue/index.html +++ b/docs/documentation/boutique/securelystoredvalue/wrappedvalue/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/add(_:)-1ausm/index.html b/docs/documentation/boutique/store/add(_:)-1ausm/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/add(_:)-1ausm/index.html +++ b/docs/documentation/boutique/store/add(_:)-1ausm/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/add(_:)-1np7h/index.html b/docs/documentation/boutique/store/add(_:)-1np7h/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/add(_:)-1np7h/index.html +++ b/docs/documentation/boutique/store/add(_:)-1np7h/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/add(_:)-8y0hf/index.html b/docs/documentation/boutique/store/add(_:)-8y0hf/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/add(_:)-8y0hf/index.html +++ b/docs/documentation/boutique/store/add(_:)-8y0hf/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/add(_:)-dfro/index.html b/docs/documentation/boutique/store/add(_:)-dfro/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/add(_:)-dfro/index.html +++ b/docs/documentation/boutique/store/add(_:)-dfro/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/index.html b/docs/documentation/boutique/store/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/index.html +++ b/docs/documentation/boutique/store/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/init(storage:)-1dbuk/index.html b/docs/documentation/boutique/store/init(storage:)-1dbuk/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/init(storage:)-1dbuk/index.html +++ b/docs/documentation/boutique/store/init(storage:)-1dbuk/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/init(storage:)-2icz/index.html b/docs/documentation/boutique/store/init(storage:)-2icz/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/init(storage:)-2icz/index.html +++ b/docs/documentation/boutique/store/init(storage:)-2icz/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/init(storage:)-2zxc4/index.html b/docs/documentation/boutique/store/init(storage:)-2zxc4/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/init(storage:)-2zxc4/index.html +++ b/docs/documentation/boutique/store/init(storage:)-2zxc4/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/init(storage:)-8ky4y/index.html b/docs/documentation/boutique/store/init(storage:)-8ky4y/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/init(storage:)-8ky4y/index.html +++ b/docs/documentation/boutique/store/init(storage:)-8ky4y/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/init(storage:cacheidentifier:)-11vez/index.html b/docs/documentation/boutique/store/init(storage:cacheidentifier:)-11vez/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/init(storage:cacheidentifier:)-11vez/index.html +++ b/docs/documentation/boutique/store/init(storage:cacheidentifier:)-11vez/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/init(storage:cacheidentifier:)-1933a/index.html b/docs/documentation/boutique/store/init(storage:cacheidentifier:)-1933a/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/init(storage:cacheidentifier:)-1933a/index.html +++ b/docs/documentation/boutique/store/init(storage:cacheidentifier:)-1933a/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/insert(_:)-2vg6j/index.html b/docs/documentation/boutique/store/insert(_:)-2vg6j/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/insert(_:)-2vg6j/index.html +++ b/docs/documentation/boutique/store/insert(_:)-2vg6j/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/insert(_:)-3j9hw/index.html b/docs/documentation/boutique/store/insert(_:)-3j9hw/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/insert(_:)-3j9hw/index.html +++ b/docs/documentation/boutique/store/insert(_:)-3j9hw/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/insert(_:)-7z2oe/index.html b/docs/documentation/boutique/store/insert(_:)-7z2oe/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/insert(_:)-7z2oe/index.html +++ b/docs/documentation/boutique/store/insert(_:)-7z2oe/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/insert(_:)-9n4e3/index.html b/docs/documentation/boutique/store/insert(_:)-9n4e3/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/insert(_:)-9n4e3/index.html +++ b/docs/documentation/boutique/store/insert(_:)-9n4e3/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/itemremovalstrategy/index.html b/docs/documentation/boutique/store/itemremovalstrategy/index.html deleted file mode 100644 index 8949581..0000000 --- a/docs/documentation/boutique/store/itemremovalstrategy/index.html +++ /dev/null @@ -1 +0,0 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file diff --git a/docs/documentation/boutique/store/itemremovalstrategy/init(removeditems:)/index.html b/docs/documentation/boutique/store/itemremovalstrategy/init(removeditems:)/index.html deleted file mode 100644 index 8949581..0000000 --- a/docs/documentation/boutique/store/itemremovalstrategy/init(removeditems:)/index.html +++ /dev/null @@ -1 +0,0 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file diff --git a/docs/documentation/boutique/store/itemremovalstrategy/removeditems/index.html b/docs/documentation/boutique/store/itemremovalstrategy/removeditems/index.html deleted file mode 100644 index 8949581..0000000 --- a/docs/documentation/boutique/store/itemremovalstrategy/removeditems/index.html +++ /dev/null @@ -1 +0,0 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file diff --git a/docs/documentation/boutique/store/items/index.html b/docs/documentation/boutique/store/items/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/items/index.html +++ b/docs/documentation/boutique/store/items/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/itemshaveloaded()/index.html b/docs/documentation/boutique/store/itemshaveloaded()/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/itemshaveloaded()/index.html +++ b/docs/documentation/boutique/store/itemshaveloaded()/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/objectwillchange/index.html b/docs/documentation/boutique/store/objectwillchange/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/objectwillchange/index.html +++ b/docs/documentation/boutique/store/objectwillchange/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/observableobject-implementations/index.html b/docs/documentation/boutique/store/observableobject-implementations/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/observableobject-implementations/index.html +++ b/docs/documentation/boutique/store/observableobject-implementations/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/operation/add(_:)-70drz/index.html b/docs/documentation/boutique/store/operation/add(_:)-70drz/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/operation/add(_:)-70drz/index.html +++ b/docs/documentation/boutique/store/operation/add(_:)-70drz/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/operation/add(_:)-82sdc/index.html b/docs/documentation/boutique/store/operation/add(_:)-82sdc/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/operation/add(_:)-82sdc/index.html +++ b/docs/documentation/boutique/store/operation/add(_:)-82sdc/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/operation/index.html b/docs/documentation/boutique/store/operation/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/operation/index.html +++ b/docs/documentation/boutique/store/operation/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/operation/insert(_:)-1nu61/index.html b/docs/documentation/boutique/store/operation/insert(_:)-1nu61/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/operation/insert(_:)-1nu61/index.html +++ b/docs/documentation/boutique/store/operation/insert(_:)-1nu61/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/operation/insert(_:)-32lwk/index.html b/docs/documentation/boutique/store/operation/insert(_:)-32lwk/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/operation/insert(_:)-32lwk/index.html +++ b/docs/documentation/boutique/store/operation/insert(_:)-32lwk/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/operation/remove(_:)-2tqlz/index.html b/docs/documentation/boutique/store/operation/remove(_:)-2tqlz/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/operation/remove(_:)-2tqlz/index.html +++ b/docs/documentation/boutique/store/operation/remove(_:)-2tqlz/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/operation/remove(_:)-8ufsb/index.html b/docs/documentation/boutique/store/operation/remove(_:)-8ufsb/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/operation/remove(_:)-8ufsb/index.html +++ b/docs/documentation/boutique/store/operation/remove(_:)-8ufsb/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/operation/removeall()/index.html b/docs/documentation/boutique/store/operation/removeall()/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/operation/removeall()/index.html +++ b/docs/documentation/boutique/store/operation/removeall()/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/operation/run()/index.html b/docs/documentation/boutique/store/operation/run()/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/operation/run()/index.html +++ b/docs/documentation/boutique/store/operation/run()/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/previewstore(items:)-1azzy/index.html b/docs/documentation/boutique/store/previewstore(items:)-1azzy/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/previewstore(items:)-1azzy/index.html +++ b/docs/documentation/boutique/store/previewstore(items:)-1azzy/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/previewstore(items:)-1zymp/index.html b/docs/documentation/boutique/store/previewstore(items:)-1zymp/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/previewstore(items:)-1zymp/index.html +++ b/docs/documentation/boutique/store/previewstore(items:)-1zymp/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/previewstore(items:cacheidentifier:)/index.html b/docs/documentation/boutique/store/previewstore(items:cacheidentifier:)/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/previewstore(items:cacheidentifier:)/index.html +++ b/docs/documentation/boutique/store/previewstore(items:cacheidentifier:)/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/remove(_:)-1w3lx/index.html b/docs/documentation/boutique/store/remove(_:)-1w3lx/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/remove(_:)-1w3lx/index.html +++ b/docs/documentation/boutique/store/remove(_:)-1w3lx/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/remove(_:)-3nzlq/index.html b/docs/documentation/boutique/store/remove(_:)-3nzlq/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/remove(_:)-3nzlq/index.html +++ b/docs/documentation/boutique/store/remove(_:)-3nzlq/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/remove(_:)-51ya6/index.html b/docs/documentation/boutique/store/remove(_:)-51ya6/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/remove(_:)-51ya6/index.html +++ b/docs/documentation/boutique/store/remove(_:)-51ya6/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/remove(_:)-5dwyv/index.html b/docs/documentation/boutique/store/remove(_:)-5dwyv/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/remove(_:)-5dwyv/index.html +++ b/docs/documentation/boutique/store/remove(_:)-5dwyv/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/removeall()-1xc24/index.html b/docs/documentation/boutique/store/removeall()-1xc24/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/removeall()-1xc24/index.html +++ b/docs/documentation/boutique/store/removeall()-1xc24/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/store/removeall()-9zfmy/index.html b/docs/documentation/boutique/store/removeall()-9zfmy/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/store/removeall()-9zfmy/index.html +++ b/docs/documentation/boutique/store/removeall()-9zfmy/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/stored/index.html b/docs/documentation/boutique/stored/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/stored/index.html +++ b/docs/documentation/boutique/stored/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/stored/init(in:)/index.html b/docs/documentation/boutique/stored/init(in:)/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/stored/init(in:)/index.html +++ b/docs/documentation/boutique/stored/init(in:)/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/stored/projectedvalue/index.html b/docs/documentation/boutique/stored/projectedvalue/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/stored/projectedvalue/index.html +++ b/docs/documentation/boutique/stored/projectedvalue/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/stored/wrappedvalue/index.html b/docs/documentation/boutique/stored/wrappedvalue/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/stored/wrappedvalue/index.html +++ b/docs/documentation/boutique/stored/wrappedvalue/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/storedvalue/append(_:)/index.html b/docs/documentation/boutique/storedvalue/append(_:)/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/storedvalue/append(_:)/index.html +++ b/docs/documentation/boutique/storedvalue/append(_:)/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/storedvalue/binding/index.html b/docs/documentation/boutique/storedvalue/binding/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/storedvalue/binding/index.html +++ b/docs/documentation/boutique/storedvalue/binding/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/storedvalue/index.html b/docs/documentation/boutique/storedvalue/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/storedvalue/index.html +++ b/docs/documentation/boutique/storedvalue/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/storedvalue/init(wrappedvalue:key:storage:)/index.html b/docs/documentation/boutique/storedvalue/init(wrappedvalue:key:storage:)/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/storedvalue/init(wrappedvalue:key:storage:)/index.html +++ b/docs/documentation/boutique/storedvalue/init(wrappedvalue:key:storage:)/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/storedvalue/projectedvalue/index.html b/docs/documentation/boutique/storedvalue/projectedvalue/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/storedvalue/projectedvalue/index.html +++ b/docs/documentation/boutique/storedvalue/projectedvalue/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/storedvalue/publisher/index.html b/docs/documentation/boutique/storedvalue/publisher/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/storedvalue/publisher/index.html +++ b/docs/documentation/boutique/storedvalue/publisher/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/storedvalue/reset()/index.html b/docs/documentation/boutique/storedvalue/reset()/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/storedvalue/reset()/index.html +++ b/docs/documentation/boutique/storedvalue/reset()/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/storedvalue/set(_:)/index.html b/docs/documentation/boutique/storedvalue/set(_:)/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/storedvalue/set(_:)/index.html +++ b/docs/documentation/boutique/storedvalue/set(_:)/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/storedvalue/toggle()/index.html b/docs/documentation/boutique/storedvalue/toggle()/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/storedvalue/toggle()/index.html +++ b/docs/documentation/boutique/storedvalue/toggle()/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/storedvalue/togglepresence(_:)/index.html b/docs/documentation/boutique/storedvalue/togglepresence(_:)/index.html new file mode 100644 index 0000000..4329eb3 --- /dev/null +++ b/docs/documentation/boutique/storedvalue/togglepresence(_:)/index.html @@ -0,0 +1 @@ +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/storedvalue/update(key:value:)/index.html b/docs/documentation/boutique/storedvalue/update(key:value:)/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/storedvalue/update(key:value:)/index.html +++ b/docs/documentation/boutique/storedvalue/update(key:value:)/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/storedvalue/wrappedvalue/index.html b/docs/documentation/boutique/storedvalue/wrappedvalue/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/storedvalue/wrappedvalue/index.html +++ b/docs/documentation/boutique/storedvalue/wrappedvalue/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/the-@stored-family-of-property-wrappers/index.html b/docs/documentation/boutique/the-@stored-family-of-property-wrappers/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/the-@stored-family-of-property-wrappers/index.html +++ b/docs/documentation/boutique/the-@stored-family-of-property-wrappers/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/documentation/boutique/using-stores/index.html b/docs/documentation/boutique/using-stores/index.html index 8949581..4329eb3 100644 --- a/docs/documentation/boutique/using-stores/index.html +++ b/docs/documentation/boutique/using-stores/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/img/added-icon.d6f7e47d.svg b/docs/img/added-icon.832a5d2c.svg similarity index 100% rename from docs/img/added-icon.d6f7e47d.svg rename to docs/img/added-icon.832a5d2c.svg diff --git a/docs/img/deprecated-icon.015b4f17.svg b/docs/img/deprecated-icon.7bf1740a.svg similarity index 100% rename from docs/img/deprecated-icon.015b4f17.svg rename to docs/img/deprecated-icon.7bf1740a.svg diff --git a/docs/img/modified-icon.f496e73d.svg b/docs/img/modified-icon.efb2697d.svg similarity index 100% rename from docs/img/modified-icon.f496e73d.svg rename to docs/img/modified-icon.efb2697d.svg diff --git a/docs/img/no-image@2x.df2a0a50.png b/docs/img/no-image@2x.df2a0a50.png deleted file mode 100644 index 041394e..0000000 Binary files a/docs/img/no-image@2x.df2a0a50.png and /dev/null differ diff --git a/docs/index.html b/docs/index.html index 8949581..4329eb3 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1 +1 @@ -DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. \ No newline at end of file +Documentation[object Module] \ No newline at end of file diff --git a/docs/index/index.json b/docs/index/index.json index fc455cb..a86e58e 100644 --- a/docs/index/index.json +++ b/docs/index/index.json @@ -1 +1 @@ -{"interfaceLanguages":{"swift":[{"children":[{"title":"Articles","type":"groupMarker"},{"path":"\/documentation\/boutique\/the-@stored-family-of-property-wrappers","title":"The @Stored Family Of Property Wrappers","type":"article"},{"path":"\/documentation\/boutique\/using-stores","title":"Using Stores","type":"article"},{"title":"Classes","type":"groupMarker"},{"children":[{"title":"Classes","type":"groupMarker"},{"children":[{"title":"Instance Methods","type":"groupMarker"},{"path":"\/documentation\/boutique\/store\/operation\/add(_:)-70drz","title":"func add([Item]) async throws -> Store.Operation","type":"method"},{"path":"\/documentation\/boutique\/store\/operation\/add(_:)-82sdc","title":"func add(Item) async throws -> Store.Operation","type":"method"},{"path":"\/documentation\/boutique\/store\/operation\/insert(_:)-1nu61","title":"func insert(Item) async throws -> Store.Operation","type":"method"},{"path":"\/documentation\/boutique\/store\/operation\/insert(_:)-32lwk","title":"func insert([Item]) async throws -> Store.Operation","type":"method"},{"path":"\/documentation\/boutique\/store\/operation\/remove(_:)-2tqlz","title":"func remove([Item]) async throws -> Store.Operation","type":"method"},{"path":"\/documentation\/boutique\/store\/operation\/remove(_:)-8ufsb","title":"func remove(Item) async throws -> Store.Operation","type":"method"},{"path":"\/documentation\/boutique\/store\/operation\/removeall()","title":"func removeAll() async throws -> Store.Operation","type":"method"},{"path":"\/documentation\/boutique\/store\/operation\/run()","title":"func run() async throws","type":"method"}],"path":"\/documentation\/boutique\/store\/operation","title":"Store.Operation","type":"class"},{"title":"Structures","type":"groupMarker"},{"children":[{"title":"Initializers","type":"groupMarker"},{"path":"\/documentation\/boutique\/store\/itemremovalstrategy\/init(removeditems:)","title":"init(removedItems: ([RemovedItem]) -> [RemovedItem])","type":"init"},{"title":"Instance Properties","type":"groupMarker"},{"path":"\/documentation\/boutique\/store\/itemremovalstrategy\/removeditems","title":"var removedItems: ([RemovedItem]) -> [RemovedItem]","type":"property"}],"path":"\/documentation\/boutique\/store\/itemremovalstrategy","title":"Store.ItemRemovalStrategy","type":"struct"},{"title":"Initializers","type":"groupMarker"},{"path":"\/documentation\/boutique\/store\/init(storage:)-1dbuk","title":"convenience init(storage: StorageEngine)","type":"init"},{"path":"\/documentation\/boutique\/store\/init(storage:)-2icz","title":"convenience init(storage: StorageEngine) async throws","type":"init"},{"path":"\/documentation\/boutique\/store\/init(storage:)-2zxc4","title":"convenience init(storage: StorageEngine)","type":"init"},{"path":"\/documentation\/boutique\/store\/init(storage:)-8ky4y","title":"convenience init(storage: StorageEngine) async throws","type":"init"},{"path":"\/documentation\/boutique\/store\/init(storage:cacheidentifier:)-11vez","title":"init(storage: StorageEngine, cacheIdentifier: KeyPath) async throws","type":"init"},{"path":"\/documentation\/boutique\/store\/init(storage:cacheidentifier:)-1933a","title":"init(storage: StorageEngine, cacheIdentifier: KeyPath)","type":"init"},{"title":"Instance Properties","type":"groupMarker"},{"path":"\/documentation\/boutique\/store\/items","title":"var items: [Item]","type":"property"},{"title":"Instance Methods","type":"groupMarker"},{"path":"\/documentation\/boutique\/store\/add(_:)-1ausm","title":"func add(Item) async throws -> Store.Operation","type":"method"},{"path":"\/documentation\/boutique\/store\/add(_:)-1np7h","title":"func add([Item]) async throws","type":"method"},{"path":"\/documentation\/boutique\/store\/add(_:)-8y0hf","title":"func add([Item]) async throws -> Store.Operation","type":"method"},{"path":"\/documentation\/boutique\/store\/add(_:)-dfro","title":"func add(Item) async throws","type":"method"},{"path":"\/documentation\/boutique\/store\/insert(_:)-2vg6j","title":"func insert([Item]) async throws","type":"method"},{"path":"\/documentation\/boutique\/store\/insert(_:)-3j9hw","title":"func insert(Item) async throws","type":"method"},{"path":"\/documentation\/boutique\/store\/insert(_:)-7z2oe","title":"func insert(Item) async throws -> Store.Operation","type":"method"},{"path":"\/documentation\/boutique\/store\/insert(_:)-9n4e3","title":"func insert([Item]) async throws -> Store.Operation","type":"method"},{"path":"\/documentation\/boutique\/store\/itemshaveloaded()","title":"func itemsHaveLoaded() async throws","type":"method"},{"path":"\/documentation\/boutique\/store\/remove(_:)-1w3lx","title":"func remove([Item]) async throws -> Store.Operation","type":"method"},{"path":"\/documentation\/boutique\/store\/remove(_:)-3nzlq","title":"func remove(Item) async throws","type":"method"},{"path":"\/documentation\/boutique\/store\/remove(_:)-51ya6","title":"func remove(Item) async throws -> Store.Operation","type":"method"},{"path":"\/documentation\/boutique\/store\/remove(_:)-5dwyv","title":"func remove([Item]) async throws","type":"method"},{"path":"\/documentation\/boutique\/store\/removeall()-1xc24","title":"func removeAll() async throws -> Store.Operation","type":"method"},{"path":"\/documentation\/boutique\/store\/removeall()-9zfmy","title":"func removeAll() async throws","type":"method"},{"title":"Type Methods","type":"groupMarker"},{"path":"\/documentation\/boutique\/store\/previewstore(items:)-1azzy","title":"static func previewStore(items: [Item]) -> Store","type":"method"},{"path":"\/documentation\/boutique\/store\/previewstore(items:)-1zymp","title":"static func previewStore(items: [Item]) -> Store","type":"method"},{"path":"\/documentation\/boutique\/store\/previewstore(items:cacheidentifier:)","title":"static func previewStore(items: [Item], cacheIdentifier: KeyPath
Please turn on JavaScript in your browser and refresh the page to view its content.