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