anchor.diff:      [ P2("PLT ~s", [Vsn]),
         P1("FILES"), print(P2, "~s: ~s", CS),
         P1("TABLE"), PL(T),
  -      [[P2("RES ~p", [K]), PL(V)] || {K, V} <- R],
  -      P1("MOD"), print(P2, "~p: ~w", M) ].
  +      [[P2("RESULTS ~p", [K]), PL(V)] || {K, V} <- R] ].
   
   
   print(Print, Fmt, Items) ->
  
positive.code: 
  -export_type([plt/0]).
  
  -define(VERSION, "0.4").
  
  -ifdef(TEST).
  -include("purity_plt_tests.hrl").
  
negative.code:     [H|assoc_store(Key, Value, T)].
  
  
  -spec export(plt()) -> {string(), [{_,_}], [{_,_}], [{_,_}]}.
  
  %% @doc Export a PLT into a simple deterministic structure, useful
  %% for debugging.
  export(#plt{table = T, cache = C, checksums = CS, version = V}) ->
      {V, lists:keysort(2, [{md5hex(MD5), F} || {F, MD5} <- CS]),
          lists:sort(dict:to_list(T)),
          lists:sort([{K, lists:sort(dict:to_list(R))} || {K, R} <- C])}.
  
  
  %% @doc Export a PLT as plain text.
  -spec export_text(plt()) -> [iolist()].
  
  export_text(Plt) ->
      {Vsn, CS, T, R} = export(Plt),
      P1 = fun (F) -> io_lib:format(F ++ "~n", []) end,
      %% Converting to binary is necessary for large PLTs as character
      %% lists are very wasteful with regard to memory.
  