anchor.diff:  size(Val) ->
       erlang:error({badmap,Val},[Val]).
   
  +-spec iterator(Map) -> Iterator when
  +      Map :: map(),
  +      Iterator :: iterator().
  +
  +iterator(Map) when is_map(Map) ->
  +    maps:to_list(Map);
  +iterator(M) ->
  +    erlang:error(error_type(M),[M]).
  +
  +-spec next(Iterator) -> {K,V,NextIterator} | 'none' when
  +      Iterator :: iterator(),
  +      K :: term(),
  +      V :: term(),
  +      NextIterator :: iterator().
  +next([]) -> none;
  +next([{K, V} | I]) ->
  +    {K, V, I}.
   
   -spec without(Ks,Map1) -> Map2 when
       Ks :: [K],
  
positive.code:     K :: term().
  
  without(Ks,M) when is_list(Ks), is_map(M) ->
      lists:foldl(fun(K, M1) -> ?MODULE:remove(K, M1) end, M, Ks);
  without(Ks,M) ->
      erlang:error(error_type(M),[Ks,M]).
  
  
  -spec with(Ks, Map1) -> Map2 when
      Ks :: [K],
      Map1 :: map(),
  
negative.code:     V2 :: term().
  
  map(Fun,Map) when is_function(Fun, 2), is_map(Map) ->
      maps:from_list(map_1(Fun, iterator(Map)));
  map(Fun,Map) ->
      erlang:error(error_type(Map),[Fun,Map]).
  
  map_1(Fun, Iter) ->
      case next(Iter) of
          {K, V, NextIter} ->
              [{K, Fun(K, V)} | map_1(Fun, NextIter)];
          none ->
              []
      end.
  
  -spec size(Map) -> non_neg_integer() when
      Map :: map().
  