-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.