1 type MeshFile = 2 val names = List<String>.new 3 val name_memory = Map<String, MeshMemory>.new 4 5 def discard = 6 for _, memory in name_memory do 7 memory.discard 8 9 is Discard 10 11 object MeshFile = 12 let create (items : List<(String, MeshMemory)>) = 13 let file = MeshFile.new 14 for name, memory in items do 15 file.names.add name 16 file.name_memory.add name memory 17 18 file 19 20 type MeshFile 21 def contains (name : String) = 22 name_memory.contains name 23 24 def try_memory (name : String) = name_memory.try_get name 25 def memory (name : String) = name_memory[name] 26 27 let swap self (file : MeshFile) = 28 for name in self.names do 29 if file.contains name then 30 let should_swap = 31 let memory = self.try_memory name 32 let file_memory = file.try_memory name 33 case (memory, file_memory) of 34 Some u, Some v -> u.equals v 35 else -> false 36 37 if should_swap then 38 let memory = self.name_memory[name] 39 let file_memory = file.name_memory[name] 40 self.name_memory[name] = file_memory 41 file.name_memory[name] = memory 42 43 module file 44 45 def get (path : String) (maybe_prev_file : Option<MeshFile>) = 46 let text = fs/read_text path 47 let file = MeshFile.create (gltf/parse text) 48 if maybe_prev_file ? Some prev_file then 49 file.swap prev_file 50 51 file 52