# 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
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)>