I read how works functions upcase and downcase and try to think how to realize function swapcase.
in elixir/lib/elixir/unicode/unicode.ex line308
# Swapcase
def swapcase(string), do: swapcase(string, "")
for {codepoint, upper, lower, _title} <- codes do
cond do
lower && codepoint != lower ->
defp swapcase(unquote(codepoint) <> rest, acc) do
swapcase(rest, acc <> unquote(lower))
end
upper && codepoint != upper ->
defp swapcase(unquote(codepoint) <> rest, acc) do
swapcase(rest, acc <> unquote(upper))
end
true -> nil
end
end
defp swapcase(<<char, rest::binary>>, acc) do
swapcase(rest, <<acc::binary, char>>)
end
defp swapcase("", acc), do: acc
Result:
iex(17)> r(String.Casing)
warning: redefining module String.Unicode (current version defined in memory)
unicode.ex:1
warning: redefining module String.Casing (current version defined in memory)
unicode.ex:294
warning: redefining module String.Break (current version defined in memory)
unicode.ex:379
warning: redefining module String.Normalizer (current version defined in memory)
unicode.ex:489
{:reloaded, String.Casing,
[String.Unicode, String.Casing, String.Break, String.Normalizer]}
iex(18)> String.Casing.swapcase("ПриВЕ!!ббю..WEr5%oe902kj elk")
"пРИве!!ББЮ..weR5%OE902KJ ELK"
iex(19)>
The tests were successful
test "swapcase" do
test_string = "123 abcD 456 EFG HIJ ( %$#) kl mnop @ QRST = -_ uvwxyz"
result_string = "123 ABCd 456 efg hij ( %$#) KL MNOP @ qrst = -_ UVWXYZ"
assert String.swapcase(test_string) == result_string
assert String.swapcase(String.swapcase(test_string)) == test_string
assert String.swapcase("") == ""
end
test "swapcase utf8" do
assert String.swapcase("& % # àáâ ãäå 1 2 ç æ") == "& % # ÀÁÂ ÃÄÅ 1 2 Ç Æ"
assert String.swapcase("àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ") == "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ"
assert String.swapcase("& % # ÀÁÂ ÃÄÅ 1 2 Ç Æ") == "& % # àáâ ãäå 1 2 ç æ"
assert String.swapcase("ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ") == "àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ"
end
test "swapcase utf8 multibyte" do
assert String.swapcase("straße") == "STRASSE"
assert String.swapcase("áÜÈß") == "ÁüèSS"
end
If this code fine, can i do PR?))
In ruby this function names “swapcase”. In elixir we may use different name like “reversecase”, “togglecase”.