1010% %--------------------------------------------------------------------------------
1111-export ([new /0 , store /3 , find /2 , find_largest /1 , find_smallest /1 ,
1212 take_largest /1 , take_smallest /1 ,
13- lookup /2 , get_value /3 , erase /2 ,
13+ lookup /2 , get_value /3 , erase /2 ,
1414 size /1 , is_empty /1 , update /4 , update /3 , filter /2 , map /2 ,
15+ keys /1 , values /1 ,
1516 foldl /3 , foldr /3 , foldl_while /3 , foldr_while /3 , from_list /1 , to_list /1 , split /2 ]).
1617
17- -export_type ([tree / 0 , tree / 2 , key / 0 , value / 0 ,
18+ -export_type ([tree / 0 , tree / 2 , key / 0 , value / 0 ,
1819 update_fn / 0 , map_fn / 0 , fold_fn / 0 , fold_while_fn / 0 , pred_fn / 0 ]).
1920
2021% %--------------------------------------------------------------------------------
@@ -49,7 +50,7 @@ size(Tree) -> foldl(fun (_, _, Count) -> Count+1 end, 0, Tree).
4950-spec is_empty (tree ()) -> boolean ().
5051is_empty (nil ) -> true ;
5152is_empty (_ ) -> false .
52-
53+
5354-spec store (key (), value (), tree ()) -> tree ().
5455store (Key , Value , Root ) ->
5556 case path_to_node (Key , Root ) of
@@ -144,7 +145,13 @@ split(BorderKey, Tree) ->
144145 end .
145146
146147-spec to_list (tree ()) -> [{key (),value ()}].
147- to_list (Tree ) -> lists :reverse (foldl (fun (K , V , Acc ) -> [{K ,V }|Acc ] end , [], Tree )).
148+ to_list (Tree ) -> foldr (fun (K , V , Acc ) -> [{K ,V }|Acc ] end , [], Tree ).
149+
150+ -spec keys (tree ()) -> [key ()].
151+ keys (Tree ) -> foldr (fun (K , _ , Acc ) -> [K |Acc ] end , [], Tree ).
152+
153+ -spec values (tree ()) -> [value ()].
154+ values (Tree ) -> foldr (fun (_ , V , Acc ) -> [V |Acc ] end , [], Tree ).
148155
149156-spec from_list ([{key (),value ()}]) -> tree ().
150157from_list (List ) -> lists :foldl (fun ({K , V }, Tree ) -> store (K , V , Tree ) end , new (), List ).
@@ -256,7 +263,7 @@ move_smallest_node_to_front(Node, Path) ->
256263 end .
257264
258265-spec path_to_node (key (), maybe_tree_node ()) -> {maybe_tree_node (), [{direction (),tree_node ()}]}.
259- path_to_node (Key , Root ) ->
266+ path_to_node (Key , Root ) ->
260267 path_to_node (Key , Root , []).
261268
262269-spec path_to_node (key (), maybe_tree_node (), [{direction (),tree_node ()}]) ->
@@ -288,7 +295,7 @@ splay(X, [{Dir, P}]) -> % zig
288295 case Dir of
289296 lft -> rgt (X , lft (P , rgt (X )));
290297 rgt -> lft (X , rgt (P , lft (X )))
291- end ;
298+ end ;
292299splay (X , [{Dir ,P }, {Dir ,G } | Path ]) -> % zig-zig
293300 splay (case Dir of
294301 lft -> rgt (X , rgt_lft (P , lft (G , rgt (P )), rgt (X )));
0 commit comments