mirror of
https://github.com/centau/vide.git
synced 2026-08-20 14:41:37 +00:00
perf: no longer store needs_queue_children, queue directly on evaluate_node
This commit is contained in:
parent
ecbdae6389
commit
b282a02bfe
1 changed files with 12 additions and 17 deletions
|
|
@ -3,18 +3,17 @@ local update_id = 0
|
||||||
|
|
||||||
export type SourceNode<T> = {
|
export type SourceNode<T> = {
|
||||||
cache: T,
|
cache: T,
|
||||||
needs_queue_children: boolean,
|
|
||||||
[number]: Node<T>
|
[number]: Node<T>
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Node<T> = {
|
export type Node<T> = {
|
||||||
cache: T,
|
cache: T,
|
||||||
|
effect: ((T) -> T) | false,
|
||||||
|
|
||||||
higher_parent_update_id: number,
|
higher_parent_update_id: number,
|
||||||
last_eval_update_id: number,
|
last_eval_update_id: number,
|
||||||
needs_queue_children: boolean,
|
|
||||||
effect: ((T) -> T) | false,
|
|
||||||
cleanups: { () -> () } | false,
|
|
||||||
|
|
||||||
|
cleanups: { () -> () } | false,
|
||||||
context: { [number]: unknown } | false,
|
context: { [number]: unknown } | false,
|
||||||
|
|
||||||
owned: { Node<T> } | false,
|
owned: { Node<T> } | false,
|
||||||
|
|
@ -159,9 +158,10 @@ local function destroy_owned<T>(node: Node<T>)
|
||||||
end
|
end
|
||||||
|
|
||||||
local update_queue = { n = 0 } :: { n: number, [number]: Node<any> }
|
local update_queue = { n = 0 } :: { n: number, [number]: Node<any> }
|
||||||
|
local queue_children_for_update
|
||||||
|
|
||||||
local function evaluate_node<T>(node: Node<T>)
|
local function evaluate_node<T>(node: Node<T>)
|
||||||
if node.higher_parent_update_id == node.last_eval_update_id then return node.needs_queue_children end
|
if node.higher_parent_update_id == node.last_eval_update_id then return end
|
||||||
node.last_eval_update_id = update_id
|
node.last_eval_update_id = update_id
|
||||||
|
|
||||||
local cur_value = node.cache
|
local cur_value = node.cache
|
||||||
|
|
@ -179,15 +179,13 @@ local function evaluate_node<T>(node: Node<T>)
|
||||||
error(`effect error:\n{new_value}`, 0)
|
error(`effect error:\n{new_value}`, 0)
|
||||||
end
|
end
|
||||||
|
|
||||||
local needs_queue_children = not is_similar(cur_value, new_value)
|
|
||||||
node.needs_queue_children = needs_queue_children
|
|
||||||
node.cache = new_value
|
node.cache = new_value
|
||||||
|
if not is_similar(cur_value, new_value) then
|
||||||
return needs_queue_children
|
queue_children_for_update(node)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function queue_children_for_update<T>(node: SourceNode<T>)
|
function queue_children_for_update<T>(node: SourceNode<T>)
|
||||||
node.needs_queue_children = false
|
|
||||||
local queue_index = update_queue.n
|
local queue_index = update_queue.n
|
||||||
local child_index = 1
|
local child_index = 1
|
||||||
|
|
||||||
|
|
@ -218,9 +216,7 @@ local function flush_update_queue(from: number)
|
||||||
local node = update_queue[i]
|
local node = update_queue[i]
|
||||||
--assert(node.effect)
|
--assert(node.effect)
|
||||||
|
|
||||||
if node.owner and evaluate_node(node) then
|
if node.owner then evaluate_node(node) end
|
||||||
queue_children_for_update(node)
|
|
||||||
end
|
|
||||||
|
|
||||||
update_queue[i] = false :: any
|
update_queue[i] = false :: any
|
||||||
i += 1
|
i += 1
|
||||||
|
|
@ -249,11 +245,10 @@ local function create_node<T>(owner: false | Node<any>, effect: false | (T) -> T
|
||||||
cache = value,
|
cache = value,
|
||||||
effect = effect,
|
effect = effect,
|
||||||
cleanups = false,
|
cleanups = false,
|
||||||
|
context = false,
|
||||||
|
|
||||||
needs_queue_children = false,
|
|
||||||
higher_parent_update_id = update_id,
|
higher_parent_update_id = update_id,
|
||||||
last_eval_update_id = -1,
|
last_eval_update_id = -1,
|
||||||
context = false,
|
|
||||||
|
|
||||||
owner = owner,
|
owner = owner,
|
||||||
owned = false,
|
owned = false,
|
||||||
|
|
@ -273,7 +268,7 @@ local function create_node<T>(owner: false | Node<any>, effect: false | (T) -> T
|
||||||
end
|
end
|
||||||
|
|
||||||
local function create_source_node<T>(value: T): SourceNode<T>
|
local function create_source_node<T>(value: T): SourceNode<T>
|
||||||
return { cache = value, needs_queue_children = false }
|
return { cache = value }
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_children<T>(node: Node<T>): { Node<unknown> }
|
local function get_children<T>(node: Node<T>): { Node<unknown> }
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue