1    local save_order (directory : FileItem) =
2        assert directory.is_directory
3        let sb = StringBuilder.new
4        for item in directory.items do
5            sb.append item.name
6            sb.append '\n'
7    
8        let text = sb.create
9        directory.order_text = text
10       let path = "${directory.path}/.order"
11       fs/write_file path text
12   
13   local try_remove_order_file (path : String) =
14       let names = fs/list_files path
15       let count = names.size
16       if count > 1 then
17           fail path
18   
19       else if count == 1 then
20           let name = names[0]
21           assert name == ".order"
22           let file_path = "$path/.order"
23           fs/remove_file file_path
24   
25   local restore_order (directory : FileItem) =
26       let items = directory.items
27       let find_item (from : u32) (s : String) =
28           for i = from until items.size do
29               if items[i].name == s then
30                   return i
31   
32           fail s
33   
34       let mut index = 0
35       for line in directory.order_text.lines do
36           if items[index].name <> line then
37               let item_index = find_item (index + 1) line
38               let item = items[item_index]
39               items.remove_at item_index
40               items.add index item
41   
42           index += 1
43