class ViewModel::GarbageCollection
def garbage_collect_references!(serialization)
def garbage_collect_references!(serialization) return unless serialization.has_key?('references') roots = serialization.except('references') references = serialization['references'] worklist = Set.new(collect_references(roots)) visited = Set.new while (live = worklist.first) worklist.delete(live) visited << live collect_references(references[live]) do |ref| worklist << ref unless visited.include?(ref) end end references.keep_if { |ref, _val| visited.include?(ref) } end