anchor.diff:  
   -export_type([env/0]).
   
  +%% @doc Returns a default new environment.
   -spec default() -> env().
   default() ->
     #{ context      => expr
  
positive.code:    , mapping      => clj_scope:new()
     }.
  
  -spec context(env()) -> context().
  context(Env) -> get(context, expr, Env).
  
  -spec location(env()) -> ?NIL | clj_reader:location().
  location(Env) -> get(location, Env).
  
  -spec time(env()) -> map().
  time(Env) ->
    get(times, #{}, Env).
  
  -spec time(any(), number(), env()) -> env().
  time(Key, Delta, Env) ->
    Times0 = get(times, #{}, Env),
  
negative.code:                 end,
    lists:foldl(PutLocalFun, Env, Locals).
  
  %% @equiv get(Name, undefined, Env)
  -spec get(atom(), env()) -> any().
  get(Name, Env) ->
    get(Name, ?NIL, Env).
  
  %% @doc Get a value stored in the environment or `Default' if not
  %% found.
  -spec get(atom(), any(), env()) -> any().
  get(Name, Default, #{mapping := Mapping}) ->
    clj_scope:get(Name, Default, Mapping).
  
  %% @doc Push a custom `Mapping' into the custom scope {@link clj_scope}.
  -spec push(map(), env()) -> env().
  push(Mapping, Env = #{mapping := Parent}) ->
    Child = clj_scope:new(Parent),
    Env#{mapping := clj_scope:put(Mapping, Child)}.
  
  %% @doc Update a value in the custom scope {@link clj_scope:update/3}.
  -spec update(any(), any(), env()) -> env().
  update(Name, Value, Env = #{mapping := Mapping}) ->
    Env#{mapping := clj_scope:update(Name, Value, Mapping)}.
  
  %% @doc Put a value in the custom scope {@link clj_scope:put/3}.
  -spec put(any(), any(), env()) -> env().
  put(Name, Value, Env = #{mapping := Mapping}) ->
    Env#{mapping := clj_scope:put(Name, Value, Mapping)}.
  
  %% @doc Pop the custom scope.
  -spec pop(env()) -> env().
  pop(Env = #{mapping := Parent}) ->
    Env#{mapping := clj_scope:parent(Parent)}.
  