diff options
author | Daniil Baturin <daniil@baturin.org> | 2015-09-21 08:49:41 +0600 |
---|---|---|
committer | Daniil Baturin <daniil@baturin.org> | 2015-09-21 08:49:41 +0600 |
commit | 858763ff82cec2c67864a027aac6d689b2706914 (patch) | |
tree | 4323ebd635ce177b24568f6465f3b91e726d4134 /src | |
parent | f9fcc768e41d5ea0338dfcc9670734cd283e5939 (diff) | |
download | vyconf-858763ff82cec2c67864a027aac6d689b2706914.tar.gz vyconf-858763ff82cec2c67864a027aac6d689b2706914.zip |
Fix multilevel insert logic in Vytree.
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 |