Without this, all base class and splay trees were becoming linked lists after cloning..
{ "replaced four" } [ test-tree 9 over delete-at 4 of ] unit-test
{ "nine" "replaced four" } [ test-tree 7 over delete-at 9 over at 4 rot at ] unit-test
{ "nine" } [ test-tree 7 over delete-at 4 over delete-at 9 of ] unit-test
+
+! test that cloning doesn't reshape the tree
+{ TREE{
+ { 7 "seven" }
+ { 9 "nine" }
+ { 4 "four" }
+} } [ TREE{
+ { 7 "seven" }
+ { 9 "nine" }
+ { 4 "four" }
+} clone ] unit-test
M: tree new-assoc
2drop <tree> ;
-M: tree clone dup assoc-clone-like ;
+<PRIVATE
+
+: clone-nodes ( node -- node' )
+ dup [
+ clone
+ [ clone-nodes ] change-left
+ [ clone-nodes ] change-right
+ ] when ;
+
+PRIVATE>
+
+M: tree clone (clone) [ clone-nodes ] change-root ;
: >tree ( assoc -- tree )
T{ tree f f 0 } assoc-clone-like ;