summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ht.erl28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/ht.erl b/src/ht.erl
index 7915e78..462dfa2 100644
--- a/src/ht.erl
+++ b/src/ht.erl
@@ -22,7 +22,7 @@
-module(ht).
-behaviour(gen_server).
--export([size/0, add/1, tree_hash/0, tree_hash/1]).
+-export([reset_tree/1, size/0, add/1, tree_hash/0, tree_hash/1]).
-export([path/2, consistency/2]).
-export([start_link/0, start_link/1, stop/0]).
-export([init/1, handle_call/3, terminate/2, handle_cast/2, handle_info/2,
@@ -45,6 +45,8 @@ start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
start_link(NEntries) ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [NEntries], []).
+reset_tree(Arg) ->
+ gen_server:call(?MODULE, {reset_tree, Arg}).
stop() ->
gen_server:call(?MODULE, stop).
size() ->
@@ -67,8 +69,6 @@ print_tree(HashOutputLen) ->
gen_server:call(?MODULE, {print_tree, HashOutputLen}).
%% gen_server callbacks
-init([]) ->
- {ok, new()};
init(Args) ->
{ok, new(Args)}.
handle_cast(_Request, State) ->
@@ -79,6 +79,11 @@ code_change(_OldVersion, State, _Extra) ->
{ok, State}.
terminate(_Reason, _State) ->
ok.
+
+% public api
+handle_call({reset_tree, Arg}, _From, _State) ->
+ NewTree = new(Arg),
+ {reply, NewTree, NewTree};
handle_call(stop, _From, State) ->
{stop, normal, stopped, State};
handle_call(size, _From, State) ->
@@ -245,22 +250,25 @@ add(Tree = #tree{version = V, store = Store}, Entry) ->
Tree#tree{version = NewVersion,
store = ts:store(Store, {LeafIndex, 0}, LeafHash)}.
--spec new() -> tree().
-new() ->
+%% @doc Return a new tree.
+-spec new(list()) -> tree().
+new([]) ->
#tree{version = -1,
evaluated = -1,
- store = ts:new()}.
-
--spec new([non_neg_integer()]) -> tree().
+ store = ts:new()};
+new([-1]) ->
+ new([]);
+%% Initialise tree from db.
new([Version]) when is_integer(Version) ->
foldl(fun(#mtl{entry = E}, Tree) ->
D = (E#timestamped_entry.entry)#plop_entry.data,
add(Tree, D) % Return value -> Tree in next invocation.
- end, new(), db:get_by_index_sorted(0, Version));
+ end, new([]), db:get_by_index_sorted(0, Version));
+%% Initialise tree from List.
new([List]) when is_list(List) ->
foldl(fun(D, Tree) ->
add(Tree, D) % Return value -> Tree in next invocation.
- end, new(), List).
+ end, new([]), List).
update(Tree) ->
update(Tree, Tree#tree.version).