11module Filec = Filec
22
33type tree =
4- | File of string * Filec .t Lazy .t * Filec .file_type Lazy .t
5- | Dir of string * tree array Lazy .t
4+ | File of {
5+ name : string ;
6+ contents : Filec .t Lazy .t ;
7+ file_type : Filec .file_type Lazy .t ;
8+ }
9+ | Dir of {
10+ name : string ;
11+ children : tree array Lazy .t ;
12+ }
613
714type dir_cursor = {
815 pos : int ;
@@ -15,8 +22,8 @@ type cursor =
1522
1623(* Extracts the file name from a tree node *)
1724let file_name = function
18- | File ( name , _ , _ ) -> name
19- | Dir ( name , _ ) -> name
25+ | File { name; _ } -> name
26+ | Dir { name; _ } -> name
2027
2128(* A files comparison:
2229
@@ -30,10 +37,10 @@ let order_files t1 t2 =
3037 | _ , _ -> String. compare (file_name t1) (file_name t2)
3138
3239let rec sort_tree = function
33- | File ( name , contents , ft ) -> File (name, contents, ft)
34- | Dir ( name , (lazy children )) ->
40+ | File _ as f -> f
41+ | Dir { name; children = (lazy children ) } ->
3542 Array. sort order_files children;
36- Dir ( name, lazy (Array. map sort_tree children))
43+ Dir { name; children = lazy (Array. map sort_tree children) }
3744
3845(* Recursively reads a directory tree *)
3946let rec to_tree path =
@@ -44,13 +51,15 @@ let rec to_tree path =
4451 (fun child_name -> to_tree (Filename. concat path child_name))
4552 (Sys. readdir path))
4653 in
47- let dirname = Filename. basename path in
48- Dir (dirname, children)
54+ let name = Filename. basename path in
55+ Dir { name; children }
4956 else
5057 File
51- ( Filename. basename path,
52- lazy (Filec. read path),
53- lazy (Filec. type_of_path path) )
58+ {
59+ name = Filename. basename path;
60+ contents = lazy (Filec. read path);
61+ file_type = lazy (Filec. type_of_path path);
62+ }
5463
5564let read_tree path = path |> to_tree |> sort_tree
5665let file_at cursor = cursor.files.(cursor.pos)
@@ -100,12 +109,12 @@ let go_next zipper =
100109 | Dir_cursor cursor -> (
101110 let next = file_at cursor in
102111 match next with
103- | File ( _name , contents , _ ) ->
112+ | File { contents; _ } ->
104113 {
105114 parents = cursor :: zipper .parents;
106115 current = File_cursor (Lazy. force contents);
107116 }
108- | Dir ( _ , (lazy next )) ->
117+ | Dir { children = (lazy next ); _ } ->
109118 if Array. length next = 0 then zipper
110119 else
111120 {
0 commit comments