summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniil Baturin <daniil@baturin.org>2015-09-21 08:49:41 +0600
committerDaniil Baturin <daniil@baturin.org>2015-09-21 08:49:41 +0600
commit858763ff82cec2c67864a027aac6d689b2706914 (patch)
tree4323ebd635ce177b24568f6465f3b91e726d4134 /src
parentf9fcc768e41d5ea0338dfcc9670734cd283e5939 (diff)
downloadvyconf-858763ff82cec2c67864a027aac6d689b2706914.tar.gz
vyconf-858763ff82cec2c67864a027aac6d689b2706914.zip
Fix multilevel insert logic in Vytree.
Diffstat (limited to 'src')
-rw-r--r--src/vytree.ml14
-rw-r--r--src/vytree.mli2
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