@@ -31,6 +31,8 @@ defmodule RrbTree do
3131 p = Enum . reduce ( nodes , 0 , fn node , sum -> count_items ( node ) + sum end )
3232 extra_steps = a - ( ( p - 1 ) >>> @ m ) - 1
3333
34+ #IO.puts "extra steps #{extra_steps}"
35+
3436 nodes |> balance ( extra_steps ) |> root ( h )
3537 end
3638
@@ -100,36 +102,66 @@ defmodule RrbTree do
100102 balance ( xs , e , [ x | result ] )
101103 end
102104
103- def balance ( [ % Node { slots: slots } | xs ] , extra_steps , result ) when tuple_size ( slots ) == 0 do
104- balance ( xs , extra_steps - 1 , result )
105+ def balance ( [ x1 = % Node { } , x2 = % Node { slots: slots } | xs ] , extra_steps , result ) when tuple_size ( slots ) == 0 do
106+ balance ( xs , extra_steps - 1 , [ x1 | result ] )
105107 end
106108
107- def balance ( [ x1 = % Node { slots: slots } , x2 | xs ] , _extra_steps , result ) when tuple_size ( slots ) == @ b do
108- balance ( [ x2 | xs ] , @ e , [ x1 | result ] )
109+ def balance ( [ x1 = % Node { slots: slots } , x2 | xs ] , extra_steps , result ) when tuple_size ( slots ) == @ b do
110+ balance ( [ x2 | xs ] , extra_steps , [ x1 | result ] )
109111 end
110112
111113 def balance ( [ x1 = % Node { slots: slots } , x2 | xs ] , extra_steps , result ) when tuple_size ( slots ) < @ b do
112114 [ x1 , x2 ] = join_nodes ( x1 , x2 )
113- balance ( [ x1 , x2 | xs ] , extra_steps - 1 , result )
115+ balance ( [ x1 , x2 | xs ] , extra_steps , result )
116+ end
117+
118+ # TODO: Tuple only duplication
119+ # def balance([slots | xs], extra_steps, result) when tuple_size(slots) == 0 do
120+ # balance(xs, extra_steps - 1, result)
121+ # end
122+ def balance ( [ x1 , x2 | xs ] , e , result ) when tuple_size ( x2 ) == 0 do
123+ balance ( xs , e - 1 , [ x1 | result ] )
124+ end
125+
126+ def balance ( [ x1 , x2 | xs ] , e , result ) when tuple_size ( x1 ) == @ b do
127+ balance ( [ x2 | xs ] , e , [ x1 | result ] )
114128 end
115129
130+ def balance ( [ x1 , x2 | xs ] , extra_steps , result ) when tuple_size ( x1 ) < @ b do
131+ [ x1 , x2 ] = join_nodes ( x1 , x2 )
132+ balance ( [ x1 , x2 | xs ] , extra_steps , result )
133+ end
134+
135+ # TODO: Node only
116136 def join_nodes ( n1 = % Node { slots: n1_slots } , n2 = % Node { slots: n2_slots } ) when tuple_size ( n1_slots ) == @ b or tuple_size ( n2_slots ) == 0 do
117137 [ n1 , n2 ]
118138 end
119139
120140 # TODO: try not to generate many nodes untill have a full node
121141 # TODO: handle leafs differently then internal nodes
122- def join_nodes ( n1 , n2 ) do
123- [
142+ def join_nodes ( n1 = % Node { } , n2 = % Node { } ) do
143+ join_nodes (
124144 % Node {
125145 ranges: Tuple . insert_at ( n1 . ranges , tuple_size ( n1 . ranges ) , elem ( n2 . ranges , tuple_size ( n2 . ranges ) - 1 ) + elem ( n1 . ranges , tuple_size ( n1 . ranges ) - 1 ) ) ,
126146 slots: Tuple . insert_at ( n1 . slots , tuple_size ( n1 . slots ) , elem ( n2 . slots , 0 ) )
127147 } ,
128148 % Node {
129- ranges: Tuple . delete_at ( n2 . ranges , 0 ) ,
149+ ranges: delete_first_range ( n2 . ranges ) ,
130150 slots: Tuple . delete_at ( n2 . slots , 0 )
131151 }
132- ]
152+ )
153+ end
154+
155+ # TODO: Leaf only
156+ def join_nodes ( n1 , n2 ) when tuple_size ( n1 ) == @ b or tuple_size ( n2 ) == 0 do
157+ [ n1 , n2 ]
158+ end
159+
160+ def join_nodes ( n1 , n2 ) do
161+ join_nodes (
162+ append ( n1 , elem ( n2 , 0 ) ) ,
163+ Tuple . delete_at ( n2 , 0 )
164+ )
133165 end
134166
135167 def count_items ( % Node { } = node ) do
@@ -153,7 +185,7 @@ defmodule RrbTree do
153185 make_tree ( Tuple . to_list ( lbody ( ltree ) . slots ) ++ Tuple . to_list ( mtree . node . slots ) ++ Tuple . to_list ( rbody ( rtree ) . slots ) , hl )
154186 else
155187 # IO.puts "else \nlbody #{inspect(lbody(ltree))}\n mtree #{inspect(mtree)} \n rbody #{inspect(rbody(rtree))}"
156- make_tree ( [ lbody ( ltree ) , mtree . node , rbody ( rtree ) ] , hl )
188+ # make_tree([lbody(ltree), mtree.node, rbody(rtree)], hl)
157189 end
158190 end
159191
0 commit comments