anchor.diff:  reply_to_all([{threshold, read, From, Type, Threshold}=H|T],
                StillWaiting0,
                {ok, Type, Value, Next}=Result) ->
  -    lager:info("Result: ~p, Read threshold: ~p", [Result, Threshold]),
       StillWaiting = case lasp_lattice:threshold_met(Type, Value, Threshold) of
           true ->
  -            lager:info("Read threshold ~p met: ~p", [Threshold, Value]),
               case From of
                   {server, undefined, {Address, Ref}} ->
                       gen_server:reply({Address, Ref}, {ok, Type, Value, Next});
  
positive.code:              {ok, ReadThreshold}=Result) ->
      StillWaiting = case lasp_lattice:threshold_met(Type, Threshold, ReadThreshold) of
          true ->
              lager:info("Wait threshold ~p met: ~p", [Threshold, ReadThreshold]),
              case From of
                  {server, undefined, {Address, Ref}} ->
                      gen_server:reply({Address, Ref}, {ok, ReadThreshold});
  
negative.code: %%
  -spec read(id(), value(), store(), pid(), function(), function()) ->
      {ok, type(), value(), id()}.
  read(Id, Threshold0, Store, Self, ReplyFun, BlockingFun) ->
      [{_Key, V=#dv{value=Value,
                    lazy_threads=LazyThreads,
                    type=Type}}] = ets:lookup(Store, Id),
  
      %% When no threshold is specified, use the bottom value for the
      %% given lattice.
      %%
      Threshold = case Threshold0 of
          undefined ->
              Type:new();
          {strict, undefined} ->
              {strict, Type:new()};
          Threshold0 ->
              Threshold0
      end,
  
      %% Notify all lazy processes of this read.
      {ok, StillLazy} = reply_to_all(LazyThreads, {ok, Threshold}),
  
  