anchor.diff:  get(#{?TYPE := ?M} = Map, Key) ->
     get(Map, Key, ?NIL).
   
  -get(#{?TYPE := ?M, vals := Vals}, Key, NotFound) ->
  -  Hash = clj_rt:hash(Key),
  -  maps:get(Hash, Vals, NotFound).
  +get(#{?TYPE := ?M, map := Map}, Key, NotFound) ->
  +  Hash = clj_rt:hash(Key),
  +  {_, Val} = maps:get(Hash, Map, {Key, NotFound}),
  +  Val.
   
   %% clojerl.IMap
   
  -keys(#{?TYPE := ?M, keys := Keys}) ->
  -  maps:values(Keys).
  -
  -vals(#{?TYPE := ?M, vals := Vals}) ->
  -  maps:values(Vals).
  -
  -without(#{?TYPE := ?M, keys := Keys, vals := Vals} = M, Key) ->
  -  Hash = clj_rt:hash(Key),
  -  M#{ keys => maps:remove(Hash, Keys)
  -    , vals => maps:remove(Hash, Vals)
  -    }.
  +keys(#{?TYPE := ?M, map := Map}) ->
  +  [K || {K, _} <- maps:values(Map)].
  +
  +vals(#{?TYPE := ?M, map := Map}) ->
  +  [V || {_, V} <- maps:values(Map)].
  +
  +without(#{?TYPE := ?M, map := Map} = M, Key) ->
  +  Hash = clj_rt:hash(Key),
  +  M#{map => maps:remove(Hash, Map)}.
   
   %% clojerl.IMeta
   
   meta(#{?TYPE := ?M, meta := Meta}) -> Meta.
   
  -with_meta(#{?TYPE := ?M} = Map, Metadata) ->
  -  Map#{meta => Metadata}.
  +with_meta(#{?TYPE := ?M} = M, Metadata) ->
  +  M#{meta => Metadata}.
   
   %% clojerl.ISeqable
   
  
positive.code: 
  %% @private
  -spec build_mappings({any(), any()}, mappings()) -> mappings().
  build_mappings({K, V}, {Keys, Values}) ->
    KHash = clj_rt:hash(K),
    {Keys#{KHash => K}, Values#{KHash => V}}.
  
  %%------------------------------------------------------------------------------
  %% Protocols
  
negative.code:     X -> X
    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).
  