| -module(hyper_gb). |
| -export([new/1, get/2, set/3, fold/3, max_merge/2]). |
| -behaviour(hyper_register). |
| |
| new(_P) -> |
| gb_trees:empty(). |
| |
| get(Index, T) -> |
| case gb_trees:lookup(Index, T) of |
| {value, V} -> |
| {ok, V}; |
| none -> |
| undefined |
| end. |
| |
| set(Index, Value, T) -> |
| gb_trees:enter(Index, Value, T). |
| |
| max_merge(Left, Right) -> |
| fold(fun (Index, L, Registers) -> |
| case get(Index, Registers) of |
| {ok, R} when R < L -> |
| set(Index, L, Registers); |
| {ok, _} -> |
| Registers; |
| undefined -> |
| set(Index, L, Registers) |
| end |
| end, Right, Left). |
| |
| fold(F, A, {_, T}) when is_function(F, 3) -> |
| fold_1(F, A, T). |
| |
| fold_1(F, Acc0, {Key, Value, Small, Big}) -> |
| Acc1 = fold_1(F, Acc0, Small), |
| Acc = F(Key, Value, Acc1), |
| fold_1(F, Acc, Big); |
| fold_1(_, Acc, _) -> |
| Acc. |