Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Copyright © 2021 LoganDark
- --
- -- Permission is hereby granted, free of charge, to any person obtaining a copy
- -- of this software and associated documentation files (the "Software"), to deal
- -- in the Software without restriction, including without limitation the rights
- -- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- -- copies of the Software, and to permit persons to whom the Software is
- -- furnished to do so, subject to the following conditions:
- --
- -- The above copyright notice and this permission notice shall be included in
- -- all copies or substantial portions of the Software.
- --
- -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- -- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- -- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- -- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- -- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- -- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- -- SOFTWARE.
- local next = next
- local type = type
- return function(start, callback)
- local stack = {
- data = {start, next(start)},
- len = 1,
- seen = {[start] = true}
- }
- while stack.len > 0 do
- local tblIdx = stack.len * 2 - 1
- local keyIdx = tblIdx + 1
- local tbl = stack.data[tblIdx]
- local key = stack.data[keyIdx]
- if key == nil then
- stack.len = stack.len - 1
- stack.data[stack.len * 2 + 1] = nil
- if stack.len > 0 then
- stack.data[keyIdx - 2] = next(stack.data[tblIdx - 2], stack.data[keyIdx - 2])
- end
- else
- local value = tbl[key]
- callback(value, key, tbl, stack)
- if type(value) == 'table' and not stack.seen[value] then
- stack.seen[value] = true
- stack.data[stack.len * 2 + 1] = value
- stack.data[stack.len * 2 + 2] = next(value)
- stack.len = stack.len + 1
- else
- stack.data[keyIdx] = next(tbl, key)
- end
- end
- end
- end
- --[[ Example usage:
- local traverse = require('traverse')
- traverse(_G, function(v, k, tbl, stack)
- local keys = {}
- for i = 2, stack.len * 2, 2 do
- keys[i / 2] = stack.data[i]
- end
- print(table.unpack(keys, 1, stack.len))
- os.sleep(0.05)
- end) ]]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement