blob: 3b999e3dee597d2f0c6ec17cd9bbba9710395175 [file] [log] [blame]
-module(hyper_bisect).
-export([new/1, get/2, set/3, fold/3, max_merge/2]).
-behaviour(hyper_register).
new(_P) ->
bisect:new(4, 1).
get(Index, B) ->
case bisect:find(B, <<Index:32/integer>>) of
not_found ->
undefined;
<<Value:8/integer>> ->
{ok, Value}
end.
set(Index, Value, B) ->
bisect:insert(B, <<Index:32/integer>>, <<Value:8/integer>>).
fold(F, Acc, B) ->
InterfaceF = fun (<<Index:32/integer>>, <<Value:8/integer>>, A) ->
F(Index, Value, A)
end,
bisect:foldl(B, InterfaceF, Acc).
max_merge(Left, Right) ->
bisect:merge(fun (_Index, L, R) -> max(L, R) end, Left, Right).