anchor.diff:    consume(Src, Fun).
   
   -spec read_until(char(), state()) -> state().
  -read_until(Delim, #{src := <<Delim, Src/binary>>} = State) ->
  +read_until(Delim, #{src := <<Delim/utf8, Src/binary>>} = State) ->
     erlang:erase(read_delim),
     State#{src => Src};
  -read_until(Delim, #{src := <<X, Src/binary>>} = State) ->
  +read_until(Delim, #{src := <<X/utf8, Src/binary>>} = State) ->
     case clj_utils:char_type(X) of
       whitespace ->
         read_until(Delim, State#{src => Src});
  
positive.code: 
  read_regex(#{src := <<>>}) ->
    throw(<<"EOF">>);
  read_regex(#{src := <<$\\, Ch, Src/binary>>} = State) ->
    Current = maps:get(current, State, <<>>),
    NewState = State#{src => Src, current => <<Current/binary, $\\, Ch>>},
    read_regex(NewState);
  read_regex(#{src := <<$", Src/binary>>,
               forms := Forms} = State) ->
    Current = maps:get(current, State, <<>>),
    {ok, Regex} = re:compile(Current),
    State#{src => Src, forms => [Regex | Forms]};
  read_regex(#{src := <<Ch, Src/binary>>} = State) ->
    Current = maps:get(current, State, <<>>),
    NewState = State#{src => Src, current => <<Current/binary, Ch>>},
    read_regex(NewState).
  
  %%------------------------------------------------------------------------------
  
negative.code: %% Unquote
  %%------------------------------------------------------------------------------
  
  read_unquote(#{src := <<"~", Src/binary>>} = State) ->
    case Src of
      <<"@", RestSrc/binary>> ->
        UnquoteSplicing = clj_core:symbol(<<"clojure.core">>,
                                          <<"unquote-splicing">>),
        wrapped_read(UnquoteSplicing, State#{src => RestSrc});
  