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