anchor.diff:      end.
   
   %% Initialize a new data spec
  -new() -> new(root).
  +new() -> new('T').
   
   new(Class) -> {Class, 0, sample_data(), []}.
   
  
positive.code: %% When adding a value to the spec:
  %% - each class knows which subtype the data fits in.
  %% Adding a new value is a recursive process:
  %% - starting from the root class, each class
  %%   - accounts for the new value itself;
  %%   - chooses appropriate subtype (if any) and
  %%   - passes the value to that subtype.
  %%
  %% Eg. when adding the value 100, 'root' accounts
  %% for this (increases counter of values, etc),
  %% determines that it is a numeric type, and so
  %% passes it to 'numeric' which, in turn, determines
  
negative.code: %% For lists and tuples, the LeafData stores a list of type specs
  %% for each list/tuple element position.
  leaf_data_recur(V, []) ->
      lists:map(fun(D) -> new('T', D) end, V);
  leaf_data_recur(V, LeafData) ->
      lists:map(fun({D, S}) -> add(D, S) end, lists:zip(V, LeafData)).
  
  