Current section
Files
Jump to
Current section
Files
src/translators/beamoji_baseemoji_translator.erl
-module(beamoji_baseemoji_translator).
-behaviour(beamoji_translator).
-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").
-endif.
-export(['π£'/0, 'β©'/2, 'βͺ'/2]).
-spec 'π£'() -> beamoji_translator:'πΊ'().
'π£'() ->
Path = filename:join([code:priv_dir(beamoji), "base_emoji.eterm"]),
{ok, [BaseEmoji]} = file:consult(Path),
{_I, ToBaseEmoji, FromBaseEmoji} =
lists:foldl(fun(Emoji, {I, To, From}) ->
{I + 1, maps:put(I, Emoji, To), maps:put(Emoji, I, From)}
end,
{0, #{}, #{}},
BaseEmoji),
#{'β©' => ToBaseEmoji, 'βͺ' => FromBaseEmoji}.
-spec 'β©'(beamoji_translator:'β'(), beamoji_translator:'πΊ'()) ->
beamoji_translator:'βοΈ'().
'β©'(UnquotedAtom, #{'β©' := ToBaseEmoji}) ->
Letters = atom_to_list(UnquotedAtom),
Emojis = [maps:get(X, ToBaseEmoji, X) || X <- Letters],
binary_to_atom(iolist_to_binary(Emojis)).
-spec 'βͺ'(beamoji_translator:'βοΈ'(), beamoji_translator:'πΊ'()) ->
beamoji_translator:'β'().
'βͺ'(EmojifiedAtom, #{'βͺ' := FromBaseEmoji}) ->
CodePoints = string:to_graphemes(atom_to_list(EmojifiedAtom)),
Emojis = lists:map(fun characters_to_binary/1, CodePoints),
Letters = [maps:get(X, FromBaseEmoji, X) || X <- Emojis],
binary_to_atom(iolist_to_binary(Letters)).
characters_to_binary(A) when is_integer(A) ->
unicode:characters_to_binary([A]);
characters_to_binary(L) when is_list(L) ->
unicode:characters_to_binary(L).
-ifdef(TEST).
'βͺ_test'() ->
State = 'π£'(),
?assertEqual(smile, 'βͺ'('ππ§π±π¦π', State)),
?assertEqual(true, 'βͺ'('π¦ππ¦π', State)),
?assertEqual(false, 'βͺ'('π₯ππ¦ππ', State)),
?assertEqual(undefined, 'βͺ'('π¦ππΆππ₯π±πππΆ', State)),
?assertEqual(should, 'βͺ'('πβ€οΈππ¦π¦πΆ', State)),
ok.
'β©_test'() ->
State = 'π£'(),
?assertEqual('ππ§π±π¦π', 'β©'(smile, State)),
?assertEqual('π¦ππ¦π', 'β©'(true, State)),
?assertEqual('π₯ππ¦ππ', 'β©'(false, State)),
?assertEqual('π¦ππΆππ₯π±πππΆ', 'β©'(undefined, State)),
ok.
-endif.