anchor.diff:  -spec length(utf8_string()) -> non_neg_integer().
   length(<<>>) ->
       0;
  -length(_String = <<_Char/utf8, Rest/bytes>>) ->
  +length(<<_Char/utf8, Rest/bytes>>) ->
       1 + length(Rest).
   
   %% @doc Returns true if a UTF-8 string contains a multibyte character.
   -spec has_mb_char(utf8_string()) -> boolean().
  -has_mb_char(String) ->
  -    lists:any(fun (C) -> C >= 128 end, binary:bin_to_list(String)).
  +has_mb_char(Str) ->
  +    lists:any(fun (C) -> C >= 128 end, binary:bin_to_list(Str)).
   
   %% @doc Returns true if a UTF-8 string ends with the given suffix.
   -spec suffix(utf8_string(), utf8_string()) -> boolean().
  -suffix(Suffix, String) ->
  +suffix(Suffix, Str) ->
       Xiffus = reverse(Suffix),
  -    Gnirts = reverse(String),
  +    Gnirts = reverse(Str),
       L = erlang:length(binary:bin_to_list(Suffix)),
       case Gnirts of
           <<Xiffus:L/bytes, _/bytes>> -> true;
  
positive.code: -spec reverse(utf8_string()) -> utf8_string().
  reverse(<<>>) ->
      <<>>;
  reverse(_String = <<Char/utf8, Rest/bytes>>) ->
      <<(reverse(Rest))/bytes, Char/utf8>>.
  
  %% @doc Extracts a substring. The substring starts at the given position. The
  
negative.code: -spec substr(utf8_string(), integer()) -> utf8_string().
  substr(<<>>, _) ->
      <<>>;
  substr(Str, 0) ->
      Str;
  substr(Str, 1) ->
      Str;
  substr(<<_Char/utf8, Rest/bytes>>, Start) when Start > 1 ->
      substr(Rest, Start - 1);
  substr(Str, Start) when Start < 0 ->
      substr(Str, 1 + length(Str) + Start).
  
  %% @doc Extracts a substring. The substring starts at the given position and
  %% it has the given length. If the length is negative, then the substring ends
  