anchor.diff:  		integer_to_list(Y) ++ "." ++
   		integer_to_list(Z) ++ ">").
   
  -reductions() ->
  -    [{Pid, Reds, {Curr, Init}}
  +proc_attrs(AttrName) ->
  +    [{Pid, Attr, {Curr, Init}}
        || Pid <- processes() -- [self()],
  -        {_, Reds} <- [process_info(Pid, reductions)],
  -        {_, Curr} <- [process_info(Pid, current_function)],
  -        {_, Init} <- [process_info(Pid, initial_call)]].
  +        [{_, Attr}, {_, Curr}, {_, Init}] <-
  +            [process_info(Pid, [AttrName, current_function, initial_call])]].
  
positive.code: -module(recon).
  -export([info/1,info/3]).
  -export([reductions/1, reductions/2]).
  -export([remote_load/1, remote_load/2]).
  -export([tcp/0, udp/0, sctp/0, files/0, port_types/0]).
  
  
negative.code:                     garbage_collection])},
       {work, Info([reductions])}].
  
  %% fetches reduction counts of processes
  -spec reductions(pos_integer()) -> [term()].
  reductions(Num) -> proc_count(reductions, Num).
  
  %% Fetches reduction counts of processes over a sliding window
  -spec reductions(non_neg_integer(), pos_integer()) -> [term()].
  reductions(Time, Num) -> proc_window(reductions, Time, Num).
  
  %% Fetches memory of processes
  -spec memory(pos_integer()) -> [term()].
  memory(Num) -> proc_count(memory, Num).
  
  %% Fetches memory deltas of processes over a sliding window
  -spec memory(non_neg_integer(), pos_integer()) -> [term()].
  memory(Time, Num) -> proc_window(memory, Time, Num).
  
  %% Fetches a given attribute from all processes and returns
  %% the biggest culprits over a sliding window
  -spec proc_count(atom(), pos_integer()) -> [term()].
  proc_count(AttrName, Num) ->
      lists:sublist(lists:usort(
          fun({_,A,_},{_,B,_}) -> A > B end,
          proc_attrs(AttrName)
      ), Num).
  
  %% Fetches a given attribute from all processes and returns
  %% the biggest culprits
  -spec proc_window(atom(), non_neg_integer(), pos_integer()) -> [term()].
  proc_window(AttrName, Time, Num) ->
      Sample = fun() -> proc_attrs(AttrName) end,
      {First,Last} = recon_lib:sample(Time, Sample),
      %% We could make a short dict of biggest entries to save on a full sort
      lists:sublist(lists:usort(
          fun({_,A,_},{_,B,_}) -> A > B end,
          recon_lib:sliding_window(First, Last)
      ), Num).
  
  
  %% Loads one or more modules remotely, in a diskless manner
  remote_load(Mod) -> remote_load(nodes(), Mod).
  