diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/vytree.ml | 14 | ||||
-rw-r--r-- | src/vytree.mli | 2 |
2 files changed, 10 insertions, 6 deletions
diff --git a/src/vytree.ml b/src/vytree.ml index cd44600..3c5e6ab 100644 --- a/src/vytree.ml +++ b/src/vytree.ml @@ -13,6 +13,7 @@ exception Duplicate_child exception Nonexistent_path exception Insert_error of string + let make data name = { name = name; data = data; children = [] } let make_full data name children = { name = name; data = data; children = children } @@ -82,12 +83,15 @@ let rec insert ?(position=Default) node path data = | None -> raise (Insert_error "Path does not exist") -let rec insert_multi_level default_data node path data = - match path with - | [] | [_] -> insert node path data +(* When inserting at a path that, entirely or partially, + does not exist yet, create missing nodes on the way with default data *) +let rec insert_multi_level default_data node path_done path_remaining data = + match path_remaining with + | [] | [_] -> insert node (path_done @ path_remaining) data | name :: names -> - let node = insert node [name] default_data in - insert_multi_level default_data node names data + let path_done = path_done @ [name] in + let node = insert node path_done default_data in + insert_multi_level default_data node path_done names data let delete node path = do_with_child delete_immediate node path diff --git a/src/vytree.mli b/src/vytree.mli index 34692fd..2ab2c63 100644 --- a/src/vytree.mli +++ b/src/vytree.mli @@ -21,7 +21,7 @@ val find_or_fail : 'a t -> string -> 'a t val insert : ?position:position -> 'a t -> string list -> 'a -> 'a t -val insert_multi_level : 'a -> 'a t -> string list -> 'a -> 'a t +val insert_multi_level : 'a -> 'a t -> string list -> string list -> 'a -> 'a t val delete : 'a t -> string list -> 'a t |