From 8e717431222b196cb6f03849e6a8a536b65a4357 Mon Sep 17 00:00:00 2001 From: Kyle Date: Fri, 5 Jan 2024 16:02:27 +0800 Subject: [PATCH] Update VersionSeed implementation --- .../Internal/PreferenceKeyVisitor.swift | 2 +- .../Preferences/Internal/PreferenceList.swift | 35 +++++++++- .../Internal/Graph/VersionSeed.swift | 70 +++++++++++++++++++ .../VersionSeed/VersionSeedTests.swift | 21 ++++++ 4 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 Sources/OpenSwiftUI/Internal/Graph/VersionSeed.swift create mode 100644 Tests/OpenSwiftUITests/Internal/VersionSeed/VersionSeedTests.swift diff --git a/Sources/OpenSwiftUI/DataAndStorage/Preferences/Internal/PreferenceKeyVisitor.swift b/Sources/OpenSwiftUI/DataAndStorage/Preferences/Internal/PreferenceKeyVisitor.swift index 0d45a00..56e7dea 100644 --- a/Sources/OpenSwiftUI/DataAndStorage/Preferences/Internal/PreferenceKeyVisitor.swift +++ b/Sources/OpenSwiftUI/DataAndStorage/Preferences/Internal/PreferenceKeyVisitor.swift @@ -7,5 +7,5 @@ // Status: Complete protocol PreferenceKeyVisitor { - func visit(key: Key.Type) + mutating func visit(key: Key.Type) } diff --git a/Sources/OpenSwiftUI/DataAndStorage/Preferences/Internal/PreferenceList.swift b/Sources/OpenSwiftUI/DataAndStorage/Preferences/Internal/PreferenceList.swift index 5ffcb74..916b463 100644 --- a/Sources/OpenSwiftUI/DataAndStorage/Preferences/Internal/PreferenceList.swift +++ b/Sources/OpenSwiftUI/DataAndStorage/Preferences/Internal/PreferenceList.swift @@ -1 +1,34 @@ -struct PreferenceList {} +// +// PreferenceList.swift +// OpenSwiftUI +// +// Created by Kyle on 2023/1/5. +// Lastest Version: iOS 15.5 +// Status: WIP + +struct PreferenceList { + private var first: PreferenceNode? + + subscript(_ keyType: Key.Type) -> Value { + get { fatalError("TODO") } + set { fatalError("TODO") } + } +} + +extension PreferenceList { + struct Value { + var value: V + var seed: VersionSeed + } +} + +private class PreferenceNode { + let keyType: Any.Type + let seed: VersionSeed + let mergedSeed: VersionSeed + let next: PreferenceNode? + + init(keyType: Any.Type, seed: VersionSeed, next: PreferenceNode?) { + fatalError("TODO") + } +} diff --git a/Sources/OpenSwiftUI/Internal/Graph/VersionSeed.swift b/Sources/OpenSwiftUI/Internal/Graph/VersionSeed.swift new file mode 100644 index 0000000..02ca882 --- /dev/null +++ b/Sources/OpenSwiftUI/Internal/Graph/VersionSeed.swift @@ -0,0 +1,70 @@ +// +// VersionSeed.swift +// OpenSwiftUI +// +// Created by Kyle on 2024/1/5. +// Lastest Version: iOS 15.5 +// Status: WIP +// ID: 1B00D77CE2C80F9C0F5A59FDEA30ED6B + +struct VersionSeed: CustomStringConvertible { + var value: UInt32 + + var description: String { + switch value { + case VersionSeed.zero.value: "empty" + case VersionSeed.invalid.value: "invalid" + default: value.description + } + } + + static var zero: VersionSeed { VersionSeed(value: .zero) } + static var invalid: VersionSeed { VersionSeed(value: .max) } + + var isValid: Bool { value != VersionSeed.invalid.value } +} + +struct VersionSeedTracker { + var seed: VersionSeed +} + +struct VersionSeedSetTracker { + private var values: [Value] + + func addPreference(_ keyType: Key.Type) { + + } + + func updateSeeds(to: PreferenceList) { + + } +} + +extension VersionSeedSetTracker { + private struct Value { + var key: AnyPreferenceKey.Type + var seed: VersionSeed + } +} + +extension VersionSeedSetTracker { + private struct HasChangesVisitor: PreferenceKeyVisitor { + let preferences: PreferenceList + var seed: VersionSeed + var matches: Bool? + + mutating func visit(key: Key.Type) where Key : PreferenceKey { + let valueSeed = preferences[key].seed + matches = seed.isValid && valueSeed.isValid && seed.value == valueSeed.value + } + } + + private struct UpdateSeedVisitor: PreferenceKeyVisitor { + let preferences: PreferenceList + var seed: VersionSeed? + + mutating func visit(key: Key.Type) where Key : PreferenceKey { + seed = preferences[key].seed + } + } +} diff --git a/Tests/OpenSwiftUITests/Internal/VersionSeed/VersionSeedTests.swift b/Tests/OpenSwiftUITests/Internal/VersionSeed/VersionSeedTests.swift new file mode 100644 index 0000000..1e82241 --- /dev/null +++ b/Tests/OpenSwiftUITests/Internal/VersionSeed/VersionSeedTests.swift @@ -0,0 +1,21 @@ +// +// VersionSeedTests.swift +// +// +// Created by Kyle on 2024/1/5. +// + +@testable import OpenSwiftUI +import Testing + +struct VersionSeedTests { + @Test(arguments: [ + (0, ""), + (UInt32.max, ""), + (2, "2"), + ]) + func description(value: UInt32, expectedDescription: String) { + let seed = VersionSeed(value: value) + #expect(seed.description == expectedDescription) + } +}