@@ -26,26 +26,26 @@ defmodule RrbTree do
2626 end
2727
2828 # Given two subtrees, returns a balanced tree
29- def make_tree ( nodes , h ) do
29+ defp make_tree ( nodes , h ) do
3030 a = Enum . count ( nodes )
3131 p = Enum . reduce ( nodes , 0 , fn node , sum -> count_items ( node ) + sum end )
3232 extra_steps = a - ( ( p - 1 ) >>> @ m ) - 1
3333
3434 nodes |> balance ( extra_steps ) |> root ( h )
3535 end
3636
37- def root ( nodes , h ) do
37+ defp root ( nodes , h ) do
3838 do_root ( nodes , % RrbTree {
3939 h: h ,
4040 node: % Node { }
4141 } )
4242 end
4343
44- def do_root ( [ ] , root ) do
44+ defp do_root ( [ ] , root ) do
4545 root
4646 end
4747
48- def do_root ( nodes , root = % RrbTree { node: % Node { slots: root_slots } } ) when tuple_size ( root_slots ) == @ b do
48+ defp do_root ( nodes , root = % RrbTree { node: % Node { slots: root_slots } } ) when tuple_size ( root_slots ) == @ b do
4949 nr = root ( nodes , root . h )
5050
5151 % RrbTree {
@@ -57,7 +57,7 @@ defmodule RrbTree do
5757 }
5858 end
5959
60- def do_root ( [ node = % Node { } | nodes ] , root = % RrbTree { } ) do
60+ defp do_root ( [ node = % Node { } | nodes ] , root = % RrbTree { } ) do
6161 do_root ( nodes ,
6262 % { root |
6363 node: % { root . node |
@@ -69,7 +69,7 @@ defmodule RrbTree do
6969 end
7070
7171 # TODO: remove duplication of logic for Leaf and Nodes
72- def do_root ( [ node | nodes ] , root = % RrbTree { } ) do
72+ defp do_root ( [ node | nodes ] , root = % RrbTree { } ) do
7373 do_root ( nodes ,
7474 % { root |
7575 node: % { root . node |
@@ -80,61 +80,61 @@ defmodule RrbTree do
8080 )
8181 end
8282
83- def last_range ( ranges ) when tuple_size ( ranges ) == 0 do
83+ defp last_range ( ranges ) when tuple_size ( ranges ) == 0 do
8484 0
8585 end
8686
87- def last_range ( ranges ) do
87+ defp last_range ( ranges ) do
8888 last ( ranges )
8989 end
9090
91- def balance ( nodes , extra_steps ) do
91+ defp balance ( nodes , extra_steps ) do
9292 balance ( nodes , extra_steps , [ ] )
9393 end
9494
95- def balance ( [ ] , _e , result ) do
95+ defp balance ( [ ] , _e , result ) do
9696 Enum . reverse ( result )
9797 end
9898
99- def balance ( [ x | xs ] , e , result ) when e <= @ e do
99+ defp balance ( [ x | xs ] , e , result ) when e <= @ e do
100100 balance ( xs , e , [ x | result ] )
101101 end
102102
103- def balance ( [ x1 = % Node { } , x2 = % Node { slots: slots } | xs ] , extra_steps , result ) when tuple_size ( slots ) == 0 do
103+ defp balance ( [ x1 = % Node { } , x2 = % Node { slots: slots } | xs ] , extra_steps , result ) when tuple_size ( slots ) == 0 do
104104 balance ( xs , extra_steps - 1 , [ x1 | result ] )
105105 end
106106
107- def balance ( [ x1 = % Node { slots: slots } , x2 | xs ] , extra_steps , result ) when tuple_size ( slots ) == @ b do
107+ defp balance ( [ x1 = % Node { slots: slots } , x2 | xs ] , extra_steps , result ) when tuple_size ( slots ) == @ b do
108108 balance ( [ x2 | xs ] , extra_steps , [ x1 | result ] )
109109 end
110110
111- def balance ( [ x1 = % Node { slots: slots } , x2 | xs ] , extra_steps , result ) when tuple_size ( slots ) < @ b do
111+ defp balance ( [ x1 = % Node { slots: slots } , x2 | xs ] , extra_steps , result ) when tuple_size ( slots ) < @ b do
112112 [ x1 , x2 ] = join_nodes ( x1 , x2 )
113113 balance ( [ x1 , x2 | xs ] , extra_steps , result )
114114 end
115115
116116 # TODO: Leaf only
117- def balance ( [ x1 , x2 | xs ] , e , result ) when tuple_size ( x2 ) == 0 do
117+ defp balance ( [ x1 , x2 | xs ] , e , result ) when tuple_size ( x2 ) == 0 do
118118 balance ( xs , e - 1 , [ x1 | result ] )
119119 end
120120
121- def balance ( [ x1 , x2 | xs ] , e , result ) when tuple_size ( x1 ) == @ b do
121+ defp balance ( [ x1 , x2 | xs ] , e , result ) when tuple_size ( x1 ) == @ b do
122122 balance ( [ x2 | xs ] , e , [ x1 | result ] )
123123 end
124124
125- def balance ( [ x1 , x2 | xs ] , extra_steps , result ) when tuple_size ( x1 ) < @ b do
125+ defp balance ( [ x1 , x2 | xs ] , extra_steps , result ) when tuple_size ( x1 ) < @ b do
126126 [ x1 , x2 ] = join_nodes ( x1 , x2 )
127127 balance ( [ x1 , x2 | xs ] , extra_steps , result )
128128 end
129129
130130 # TODO: Node only
131- 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
131+ defp 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
132132 [ n1 , n2 ]
133133 end
134134
135135 # TODO: try not to generate many nodes untill have a full node
136136 # TODO: handle leafs differently then internal nodes
137- def join_nodes ( n1 = % Node { } , n2 = % Node { } ) do
137+ defp join_nodes ( n1 = % Node { } , n2 = % Node { } ) do
138138 join_nodes (
139139 % Node {
140140 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 ) ) ,
@@ -148,30 +148,30 @@ defmodule RrbTree do
148148 end
149149
150150 # TODO: Leaf only
151- def join_nodes ( n1 , n2 ) when tuple_size ( n1 ) == @ b or tuple_size ( n2 ) == 0 do
151+ defp join_nodes ( n1 , n2 ) when tuple_size ( n1 ) == @ b or tuple_size ( n2 ) == 0 do
152152 [ n1 , n2 ]
153153 end
154154
155- def join_nodes ( n1 , n2 ) do
155+ defp join_nodes ( n1 , n2 ) do
156156 join_nodes (
157157 append ( n1 , elem ( n2 , 0 ) ) ,
158158 Tuple . delete_at ( n2 , 0 )
159159 )
160160 end
161161
162- def count_items ( % Node { } = node ) do
162+ defp count_items ( % Node { } = node ) do
163163 tuple_size ( node . slots )
164164 end
165165
166- def count_items ( leaf ) do
166+ defp count_items ( leaf ) do
167167 tuple_size ( leaf )
168168 end
169169
170- def do_concat ( % Node { } = ltree , % Node { } = rtree , _hl = 2 , _hr = 2 ) do
170+ defp do_concat ( % Node { } = ltree , % Node { } = rtree , _hl = 2 , _hr = 2 ) do
171171 make_tree ( Tuple . to_list ( ltree . slots ) ++ Tuple . to_list ( rtree . slots ) , 2 )
172172 end
173173
174- def do_concat ( % Node { } = ltree , % Node { } = rtree , hl , hr ) when hl == hr do
174+ defp do_concat ( % Node { } = ltree , % Node { } = rtree , hl , hr ) when hl == hr do
175175 mtree = do_concat ( rhand ( ltree ) , lhand ( rtree ) , hl - 1 , hr - 1 )
176176
177177 # TODO: check correctness when mtree.h > ltree.h OR mtree.h > rtree.h
@@ -184,65 +184,60 @@ defmodule RrbTree do
184184 end
185185 end
186186
187- def do_concat ( % Node { } = ltree , % Node { } = rtree , hl , hr ) when hl > hr do
187+ defp do_concat ( % Node { } = ltree , % Node { } = rtree , hl , hr ) when hl > hr do
188188 mtree = do_concat ( rhand ( ltree ) , rtree , hl - 1 , hr )
189189
190190 make_tree ( Tuple . to_list ( lbody ( ltree ) . slots ) ++ Tuple . to_list ( mtree . node . slots ) , hl )
191191 end
192192
193- def do_concat ( % Node { } = ltree , % Node { } = rtree , hl , hr ) when hl < hr do
193+ defp do_concat ( % Node { } = ltree , % Node { } = rtree , hl , hr ) when hl < hr do
194194 mtree = do_concat ( ltree , lhand ( rtree ) , hl , hr - 1 )
195195
196196 make_tree ( Tuple . to_list ( mtree . node . slots ) ++ Tuple . to_list ( rbody ( rtree ) . slots ) , hr )
197197 end
198198
199- def rhand ( % Node { } = node ) do
199+ defp rhand ( % Node { } = node ) do
200200 last ( node . slots )
201201 end
202202
203- def lhand ( % Node { } = node ) do
203+ defp lhand ( % Node { } = node ) do
204204 first ( node . slots )
205205 end
206206
207- def lbody ( % Node { ranges: ranges , slots: slots } ) do
207+ defp lbody ( % Node { ranges: ranges , slots: slots } ) do
208208 % Node {
209209 ranges: Tuple . delete_at ( ranges , tuple_size ( ranges ) - 1 ) ,
210210 slots: Tuple . delete_at ( slots , tuple_size ( slots ) - 1 )
211211 }
212212 end
213213
214- def rbody ( % Node { ranges: ranges , slots: slots } ) do
214+ defp rbody ( % Node { ranges: ranges , slots: slots } ) do
215215 % Node {
216216 ranges: delete_first_range ( ranges ) ,
217217 slots: Tuple . delete_at ( slots , 0 )
218218 }
219219 end
220220
221- def delete_first_range ( ranges ) do
221+ defp delete_first_range ( ranges ) do
222222 fst = elem ( ranges , 0 )
223223
224224 Tuple . delete_at ( ranges , 0 )
225225 |> Tuple . to_list
226226 |> Enum . reduce ( { } , fn ( r , rs ) -> append ( rs , r - fst ) end )
227227 end
228228
229- def first ( tuple ) do
229+ defp first ( tuple ) do
230230 elem ( tuple , 0 )
231231 end
232232
233- def last ( tuple ) do
233+ defp last ( tuple ) do
234234 elem ( tuple , tuple_size ( tuple ) - 1 )
235235 end
236236
237- def append ( tuple , e ) do
237+ defp append ( tuple , e ) do
238238 Tuple . insert_at ( tuple , tuple_size ( tuple ) , e )
239239 end
240240
241- #defp do_concat(%RrbTree{h: hl} = ltree, %RrbTree{h: hr} = rtree) when hl > hr do
242- # mtree = do_concat(rhand(ltree), rtree)
243- # make_tree(ltree, mtree)
244- #end
245-
246241 def get ( % RrbTree { } = t , index ) do
247242 do_get ( t . h , t . node , index )
248243 end
@@ -259,7 +254,7 @@ defmodule RrbTree do
259254 elem ( leaf , i )
260255 end
261256
262- # Finds the branch in which the index is expected to be found.
257+ # Internal: Finds the branch in which the index is expected to be found.
263258 # Equivalent to, since the branching factor is a power of 2:
264259 #
265260 # 1. find the number of items in each branch: $n = 2^{m^{h - 1}}$
@@ -270,7 +265,7 @@ defmodule RrbTree do
270265 i >>> ( @ m * ( h - 1 ) )
271266 end
272267
273- # Since our constraints over the branching factor $2^m$ are relaxed,
268+ # Internal: Since our constraints over the branching factor $2^m$ are relaxed,
274269 # e.g. we may have both $2^m - 1$ and $2^m$ branching, sometimes
275270 # the expected branch calculated with `do_radix` may not be correct,
276271 # so here we do a linear search for the correct branch.
@@ -282,7 +277,7 @@ defmodule RrbTree do
282277 end
283278 end
284279
285- # In order to recursively get an item from the tree, we need to
280+ # Internal: In order to recursively get an item from the tree, we need to
286281 # adjust the index, reducing it by the number of items to the
287282 # left of the branch we are going to search.
288283 defp do_new_index ( ranges , branch_index , i ) do
0 commit comments