wip
This commit is contained in:
parent
2608249672
commit
0700d78fbd
|
@ -18,7 +18,7 @@ final class StateManager: ObservableObject {
|
|||
private init() { }
|
||||
static let shared = StateManager()
|
||||
|
||||
@Published var state = State.a
|
||||
@Published var state = State.a //b(["eins", "2", "III"])
|
||||
}
|
||||
|
||||
struct ContentView: View {
|
||||
|
|
|
@ -130,8 +130,15 @@ extension FiberReconciler {
|
|||
// Create the node and its element.
|
||||
var nextValue = nextValue
|
||||
|
||||
print("TreeReducer visiting view \(nextValue)")
|
||||
|
||||
let resultChild: Result
|
||||
if let existing = partialResult.nextExisting {
|
||||
print("updating existing \(existing)")
|
||||
let elementParent = partialResult.fiber?.element != nil
|
||||
? partialResult.fiber
|
||||
: partialResult.fiber?.elementParent
|
||||
existing.elementParent = elementParent
|
||||
// If a fiber already exists, simply update it with the new view.
|
||||
let key: ObjectIdentifier?
|
||||
if let elementParent = existing.elementParent {
|
||||
|
@ -145,6 +152,11 @@ extension FiberReconciler {
|
|||
key.map { partialResult.elementIndices[$0, default: 0] },
|
||||
partialResult.nextTraits
|
||||
)
|
||||
|
||||
if let n = newContent {
|
||||
existing.element = .init(from: n)
|
||||
}
|
||||
|
||||
resultChild = Result(
|
||||
fiber: existing,
|
||||
visitChildren: visitChildren(partialResult.fiber?.reconciler, nextValue),
|
||||
|
@ -158,6 +170,7 @@ extension FiberReconciler {
|
|||
partialResult.nextExisting = existing.sibling
|
||||
partialResult.nextExistingAlternate = partialResult.nextExistingAlternate?.sibling
|
||||
} else {
|
||||
print("creating new")
|
||||
let elementParent = partialResult.fiber?.element != nil
|
||||
? partialResult.fiber
|
||||
: partialResult.fiber?.elementParent
|
||||
|
|
|
@ -243,12 +243,12 @@ public final class FiberReconciler<Renderer: FiberRenderer> {
|
|||
///
|
||||
/// A `reconcile()` call is queued from `fiberChanged` once per run loop.
|
||||
func reconcile() {
|
||||
print("xxx============== BEFORE\n\(current.recursiveDescription)\n\nxxx============== AFTER\n\(alternate.recursiveDescription)")
|
||||
print("reconcile(), changedFibers: \(changedFibers)")
|
||||
|
||||
isReconciling = true
|
||||
let changedFibers = changedFibers
|
||||
self.changedFibers.removeAll()
|
||||
// Create a list of mutations.
|
||||
print(changedFibers)
|
||||
let visitor = ReconcilerVisitor(root: current, changedFibers: changedFibers, reconciler: self)
|
||||
switch current.content {
|
||||
case let .view(_, visit):
|
||||
|
@ -269,11 +269,12 @@ public final class FiberReconciler<Renderer: FiberRenderer> {
|
|||
// and leaving the current available to be the work in progress
|
||||
// on our next update.
|
||||
|
||||
print("============== BEFORE\n\(current.recursiveDescription)\n\n============== AFTER\n\(alternate.recursiveDescription)")
|
||||
let alternate = alternate
|
||||
self.alternate = current
|
||||
current = alternate
|
||||
|
||||
print("============== reconcile done, current is now:\n\(current.recursiveDescription)")
|
||||
|
||||
isReconciling = false
|
||||
|
||||
for action in afterReconcileActions {
|
||||
|
|
|
@ -72,7 +72,6 @@ struct ReconcilePass: FiberReconcilerPass {
|
|||
var shouldReconcile = false
|
||||
|
||||
while true {
|
||||
print(node.fiber as Any)
|
||||
if !shouldReconcile {
|
||||
if let fiber = node.fiber,
|
||||
changedFibers.contains(ObjectIdentifier(fiber))
|
||||
|
@ -85,6 +84,8 @@ struct ReconcilePass: FiberReconcilerPass {
|
|||
}
|
||||
}
|
||||
|
||||
print("run(...) iteration, shouldReconcile: \(shouldReconcile), node:", node.fiber ?? "<nil>")
|
||||
|
||||
// If this fiber has an element, set its `elementIndex`
|
||||
// and increment the `elementIndices` value for its `elementParent`.
|
||||
if node.fiber?.element != nil,
|
||||
|
@ -118,6 +119,7 @@ struct ReconcilePass: FiberReconcilerPass {
|
|||
// Update `DynamicProperty`s before accessing the `View`'s body.
|
||||
node.fiber?.updateDynamicProperties()
|
||||
// Compute the children of the node.
|
||||
print("run(...): reducing tree")
|
||||
let reducer = FiberReconciler<R>.TreeReducer.SceneVisitor(initialResult: node)
|
||||
node.visitChildren(reducer)
|
||||
|
||||
|
@ -230,16 +232,16 @@ struct ReconcilePass: FiberReconcilerPass {
|
|||
in reconciler: FiberReconciler<R>,
|
||||
caches: FiberReconciler<R>.Caches
|
||||
) -> Mutation<R>? {
|
||||
print("rec node:", node.fiber?.typeInfo?.type, node.fiber?.alternate?.typeInfo?.type)
|
||||
print("reconcile(...), node:", node.fiber ?? "<nil>", "alternate:", node.fiber?.alternate ?? "<nil>")
|
||||
if let element = node.fiber?.element,
|
||||
let index = node.fiber?.elementIndex,
|
||||
let parent = node.fiber?.elementParent?.element
|
||||
{
|
||||
print("actually do it")
|
||||
if node.fiber?.alternate == nil { // This didn't exist before (no alternate)
|
||||
if node.fiber?.alternate?.element == nil { // This didn't exist before (no alternate)
|
||||
if let fiber = node.fiber {
|
||||
invalidateCache(for: fiber, in: reconciler, caches: caches)
|
||||
}
|
||||
print(" -> .insert")
|
||||
return .insert(element: element, parent: parent, index: index)
|
||||
} else if node.fiber?.typeInfo?.type != node.fiber?.alternate?.typeInfo?.type,
|
||||
let previous = node.fiber?.alternate?.element
|
||||
|
@ -247,6 +249,7 @@ struct ReconcilePass: FiberReconcilerPass {
|
|||
if let fiber = node.fiber {
|
||||
invalidateCache(for: fiber, in: reconciler, caches: caches)
|
||||
}
|
||||
print(" -> .replace")
|
||||
// This is a completely different type of view.
|
||||
return .replace(parent: parent, previous: previous, replacement: element)
|
||||
} else if let newContent = node.newContent,
|
||||
|
@ -255,6 +258,7 @@ struct ReconcilePass: FiberReconcilerPass {
|
|||
if let fiber = node.fiber {
|
||||
invalidateCache(for: fiber, in: reconciler, caches: caches)
|
||||
}
|
||||
print(" -> .update")
|
||||
// This is the same type of view, but its backing data has changed.
|
||||
return .update(
|
||||
previous: element,
|
||||
|
@ -267,7 +271,7 @@ struct ReconcilePass: FiberReconcilerPass {
|
|||
)
|
||||
}
|
||||
}
|
||||
print("nvm el", node.fiber?.element != nil, "ind", node.fiber?.elementIndex != nil, "par", node.fiber?.elementParent?.element != nil)
|
||||
print(" -> nil, element", node.fiber?.element != nil, "elementIndex", node.fiber?.elementIndex != nil, "elementParent", node.fiber?.elementParent?.element != nil)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue