anchor.diff:  
   %% test
   -export([pids/0,
  -         terms/0]).
  +         terms/0,
  +         subs/0,
  +         waits/0]).
   
   %% debug
   -export([state/0,
  
positive.code: %% # handle_info/2
  %% ----------------------------------------------------------
  
  handle_info({'DOWN', MRef, process, Pid, _}, S) ->
      ets:delete_object(?TABLE, ?MONITOR(Pid, MRef)),
      ets:match_delete(?TABLE, ?MAPPING('_', Pid)),
      {noreply, S};
  
  handle_info(_Info, S) ->
      {noreply, S}.
  
negative.code: %% terms/0
  
  -spec terms()
     -> [{key(), [pid()]}].
  
  terms() ->
      to_list(fun id/1).
  
  swap({X,Y}) -> {Y,X}.
  
  %% subs/0
  
  -spec subs()
     -> [{pattern(), [{pid(), term()}]}].
  
  subs() ->
      #state{receivers = RD} = state(),
      dict:fold(fun sub/3, orddict:new(), RD).
  
  sub(Pat, Ps, Dict) ->
      lists:foldl(fun([P|T], D) -> orddict:append(Pat, {P,T}, D);
                     (_, D) -> D
                  end,
                  Dict,
                  Ps).
  
  %% waits/0
  
  -spec waits()
     -> [{pattern(), [{from(), term()}]}].
  
  waits() ->
      #state{receivers = RD} = state(),
      dict:fold(fun wait/3, orddict:new(), RD).
  
  wait(Pat, Ps, Dict) ->
      lists:foldl(fun({_,_} = F, D) -> orddict:append(Pat, F, D);
                     (_, D) -> D
                  end,
                  Dict,
                  Ps).
  
  %% ----------------------------------------------------------
  %% # init/1
  