Skip to content

Commit 80b63f8

Browse files
committed
Update VersionSeed implementation
1 parent 6734af4 commit 80b63f8

File tree

4 files changed

+126
-2
lines changed

4 files changed

+126
-2
lines changed

Sources/OpenSwiftUI/DataAndStorage/Preferences/Internal/PreferenceKeyVisitor.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@
77
// Status: Complete
88

99
protocol PreferenceKeyVisitor {
10-
func visit<Key: PreferenceKey>(key: Key.Type)
10+
mutating func visit<Key: PreferenceKey>(key: Key.Type)
1111
}
Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,34 @@
1-
struct PreferenceList {}
1+
//
2+
// PreferenceList.swift
3+
// OpenSwiftUI
4+
//
5+
// Created by Kyle on 2023/1/5.
6+
// Lastest Version: iOS 15.5
7+
// Status: WIP
8+
9+
struct PreferenceList {
10+
private var first: PreferenceNode?
11+
12+
subscript<Key: PreferenceKey>(_ keyType: Key.Type) -> Value<Key.Value> {
13+
get { fatalError("TODO") }
14+
set { fatalError("TODO") }
15+
}
16+
}
17+
18+
extension PreferenceList {
19+
struct Value<V> {
20+
var value: V
21+
var seed: VersionSeed
22+
}
23+
}
24+
25+
private class PreferenceNode {
26+
let keyType: Any.Type
27+
let seed: VersionSeed
28+
let mergedSeed: VersionSeed
29+
let next: PreferenceNode?
30+
31+
init(keyType: Any.Type, seed: VersionSeed, next: PreferenceNode?) {
32+
fatalError("TODO")
33+
}
34+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
//
2+
// VersionSeed.swift
3+
// OpenSwiftUI
4+
//
5+
// Created by Kyle on 2024/1/5.
6+
// Lastest Version: iOS 15.5
7+
// Status: WIP
8+
// ID: 1B00D77CE2C80F9C0F5A59FDEA30ED6B
9+
10+
struct VersionSeed: CustomStringConvertible {
11+
var value: UInt32
12+
13+
var description: String {
14+
switch value {
15+
case VersionSeed.zero.value: "empty"
16+
case VersionSeed.invalid.value: "invalid"
17+
default: value.description
18+
}
19+
}
20+
21+
static var zero: VersionSeed { VersionSeed(value: .zero) }
22+
static var invalid: VersionSeed { VersionSeed(value: .max) }
23+
24+
var isValid: Bool { value != VersionSeed.invalid.value }
25+
}
26+
27+
struct VersionSeedTracker<Key: HostPreferenceKey> {
28+
var seed: VersionSeed
29+
}
30+
31+
struct VersionSeedSetTracker {
32+
private var values: [Value]
33+
34+
func addPreference<Key: HostPreferenceKey>(_ keyType: Key.Type) {
35+
36+
}
37+
38+
func updateSeeds(to: PreferenceList) {
39+
40+
}
41+
}
42+
43+
extension VersionSeedSetTracker {
44+
private struct Value {
45+
var key: AnyPreferenceKey.Type
46+
var seed: VersionSeed
47+
}
48+
}
49+
50+
extension VersionSeedSetTracker {
51+
private struct HasChangesVisitor: PreferenceKeyVisitor {
52+
let preferences: PreferenceList
53+
var seed: VersionSeed
54+
var matches: Bool?
55+
56+
mutating func visit<Key>(key: Key.Type) where Key : PreferenceKey {
57+
let valueSeed = preferences[key].seed
58+
matches = seed.isValid && valueSeed.isValid && seed.value == valueSeed.value
59+
}
60+
}
61+
62+
private struct UpdateSeedVisitor: PreferenceKeyVisitor {
63+
let preferences: PreferenceList
64+
var seed: VersionSeed?
65+
66+
mutating func visit<Key>(key: Key.Type) where Key : PreferenceKey {
67+
seed = preferences[key].seed
68+
}
69+
}
70+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//
2+
// VersionSeedTests.swift
3+
//
4+
//
5+
// Created by Kyle on 2024/1/5.
6+
//
7+
8+
@testable import OpenSwiftUI
9+
import Testing
10+
11+
struct VersionSeedTests {
12+
@Test(arguments: [
13+
(0, "empty"),
14+
(UInt32.max, "invalid"),
15+
(2, "2"),
16+
])
17+
func description(value: UInt32, expectedDescription: String) {
18+
let seed = VersionSeed(value: value)
19+
#expect(seed.description == expectedDescription)
20+
}
21+
}

0 commit comments

Comments
 (0)