From d33442c2576793420802bbd54127923079c487c4 Mon Sep 17 00:00:00 2001 From: Daniil Baturin Date: Sun, 2 Sep 2018 13:03:12 +0200 Subject: Add support for node renaming. --- src/vytree.ml | 12 ++++++++++++ src/vytree.mli | 2 ++ test/vytree_test.ml | 10 ++++++++++ 3 files changed, 24 insertions(+) diff --git a/src/vytree.ml b/src/vytree.ml index b200cc4..57c3612 100644 --- a/src/vytree.ml +++ b/src/vytree.ml @@ -43,6 +43,11 @@ let replace node child = let children' = Vylist.replace (fun x -> x.name = name) child children in { node with children = children' } +let replace_full node child name = + let children = node.children in + let children' = Vylist.replace (fun x -> x.name = name) child children in + { node with children = children' } + let find node name = Vylist.find (fun x -> x.name = name) node.children @@ -131,6 +136,13 @@ let rec insert_multi_level default_data node path_done path_remaining data = let delete node path = do_with_child delete_immediate node path +let rename node path newname = + let rename_immediate newname' node' name' = + let child = find_or_fail node' name' in + let child = { child with name=newname' } in + replace_full node' child name' + in do_with_child (rename_immediate newname) node path + let update node path data = let update_data data' node' name = let child = find_or_fail node' name in diff --git a/src/vytree.mli b/src/vytree.mli index da593f1..556ca77 100644 --- a/src/vytree.mli +++ b/src/vytree.mli @@ -29,6 +29,8 @@ val delete : 'a t -> string list -> 'a t val update : 'a t -> string list -> 'a -> 'a t +val rename : 'a t -> string list -> string -> 'a t + val list_children : 'a t -> string list val get : 'a t -> string list -> 'a t diff --git a/test/vytree_test.ml b/test/vytree_test.ml index 4da2335..23c52ce 100644 --- a/test/vytree_test.ml +++ b/test/vytree_test.ml @@ -107,6 +107,15 @@ let test_update test_ctxt = let node = insert node ["foo"] 1 in assert_equal (data_of_node (get (update node ["foo"] 9) ["foo"])) 9 +(* rename works *) +let test_rename test_ctxt = + let node = make 0 "root" in + let node = insert node ["foo"] 1 in + let node = insert node ["bar"] 2 in + let node' = rename node ["bar"] "quux" in + let child_quux = get node' ["quux"] in + assert_equal (data_of_node child_quux) 2 + (* get_existent_path works *) let test_get_existent_path test_ctxt = let node = make () "root" in @@ -171,6 +180,7 @@ let suite = "test_get_child_multilevel" >:: test_get_child_multilevel; "test_get_child_nonexistent" >:: test_get_child_nonexistent; "test_update" >:: test_update; + "test_rename" >:: test_rename; "test_get_existent_path" >:: test_get_existent_path; "test_exists_existent" >:: test_exists_existent; "test_exists_nonexistent" >:: test_exists_nonexistent; -- cgit v1.2.3