diff options
Diffstat (limited to 'script/vm/node.lua')
-rw-r--r-- | script/vm/node.lua | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/script/vm/node.lua b/script/vm/node.lua new file mode 100644 index 00000000..79a4d2cb --- /dev/null +++ b/script/vm/node.lua @@ -0,0 +1,56 @@ +local union = require 'vm.union' + +---@alias vm.node parser.object | vm.node.union | vm.node.global | vm.node.generic + +local m = {} + +---@type table<parser.object, vm.node> +m.nodeCache = {} + +---@param a vm.node +---@param b vm.node +function m.mergeNode(a, b) + if not b then + return a + end + if a.type == 'union' then + a:merge(b) + return a + end + return union(a, b) +end + +function m.setNode(source, node) + if not node then + return + end + local me = m.nodeCache[source] + if not me then + m.nodeCache[source] = node + return + end + if me == node then + return + end + m.nodeCache[source] = m.mergeNode(me, node) +end + +function m.eachNode(node) + if node.type == 'union' then + return node:eachNode() + end + local first = true + return function () + if first then + first = false + return node + end + return nil + end +end + +function m.clearNodeCache() + m.nodeCache = {} +end + +return m |