Skip to content

Commit

Permalink
Update VersionSeed implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
Kyle-Ye committed Jan 5, 2024
1 parent 6734af4 commit 8e71743
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
// Status: Complete

protocol PreferenceKeyVisitor {
func visit<Key: PreferenceKey>(key: Key.Type)
mutating func visit<Key: PreferenceKey>(key: Key.Type)
}
Original file line number Diff line number Diff line change
@@ -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<Key: PreferenceKey>(_ keyType: Key.Type) -> Value<Key.Value> {
get { fatalError("TODO") }
set { fatalError("TODO") }
}
}

extension PreferenceList {
struct Value<V> {
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")
}
}
70 changes: 70 additions & 0 deletions Sources/OpenSwiftUI/Internal/Graph/VersionSeed.swift
Original file line number Diff line number Diff line change
@@ -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<Key: HostPreferenceKey> {
var seed: VersionSeed
}

struct VersionSeedSetTracker {
private var values: [Value]

func addPreference<Key: HostPreferenceKey>(_ 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: 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: Key.Type) where Key : PreferenceKey {
seed = preferences[key].seed
}
}
}
21 changes: 21 additions & 0 deletions Tests/OpenSwiftUITests/Internal/VersionSeed/VersionSeedTests.swift
Original file line number Diff line number Diff line change
@@ -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)
}
}

0 comments on commit 8e71743

Please sign in to comment.