anchor.diff:      ?FAIL_MSG("Unsupported key generator requested: ~p\n", [Other]).
   
   
  +dimension({sequential_int, MaxKey}) ->
  +    MaxKey;
  +dimension({sequential_int_bin, MaxKey}) ->
  +    MaxKey;
   dimension({uniform_int_bin, MaxKey}) ->
       MaxKey;
   dimension({uniform_int_str, MaxKey}) ->
  
positive.code: %% API
  %% ====================================================================
  
  new({uniform_int_bin, MaxKey}, _Id) ->
      fun() -> Key = random:uniform(MaxKey), <<Key:32/native>> end;
  new({uniform_int_str, MaxKey}, _Id) ->
  
negative.code:     0.0;
  dimension(Other) ->
      ?FAIL_MSG("Unsupported key generator dimension requested: ~p\n", [Other]).
  
  
  
  
  %% ====================================================================
  %% Internal functions
  %% ====================================================================
  
  sequential_int_generator(Ref, MaxValue) ->
     %% A bit of evil here. We want to generate numbers in sequence and stop
     %% at MaxKey. This means we need state in our anonymous function. Use the process
     %% dictionary to keep track of where we are.
     case erlang:get({sigen, Ref}) of
         undefined ->
             erlang:put({sigen, Ref}, 1),
             0;
         MaxValue ->
             throw({stop, empty_keygen});
         Value ->
             erlang:put({sigen, Ref}, Value+1),
             Value
     end.
  