anchor.diff:  -type mappings() :: {map(), map()}.
   
   -type type() :: #{ ?TYPE => ?M
  -                 , keys  => map()
  -                 , vals  => map()
  +                 , map   => #{integer() => {any(), any()} | [{any(), any()}]}
                    , meta  => ?NIL | any()
                    }.
   
  
positive.code:   end.
  
  to_list(#{?TYPE := ?M, map := Map}) ->
    FoldFun = fun(_Hash, {K, V}, List) ->
                  ['clojerl.Vector':?CONSTRUCTOR([K, V]) | List]
              end,
    maps:fold(FoldFun, [], Map).
  
  %% clojerl.IStringable
  
  str(#{?TYPE := ?M} = M) ->
    clj_rt:print(M).
  
negative.code: %% clojerl.IAssociative
  
  contains_key(#{?TYPE := ?M, map := Map}, Key) ->
    ?NIL /= get_entry(Map, clj_rt:hash(Key), Key).
  
  entry_at(#{?TYPE := ?M, map := Map}, Key) ->
    Hash = clj_rt:hash(Key),
    case get_entry(Map, Hash, Key) of
      ?NIL -> ?NIL;
      {K, V} -> 'clojerl.Vector':?CONSTRUCTOR([K, V])
    end.
  
  assoc(#{?TYPE := ?M, map := Map} = M, Key, Value) ->
    Hash = clj_rt:hash(Key),
    Entry = create_entry(Map, Hash, Key, Value),
    M#{map => Map#{Hash => Entry}}.
  
  %% clojerl.ICounted
  
  count(#{?TYPE := ?M, map := Map}) ->
    F = fun
          (_, {_, _}, Count) -> Count + 1;
          (_, KVs, Count)    -> Count + length(KVs)
        end,
    maps:fold(F, 0, Map).
  
  %% clojerl.IEquiv
  
  