Erlang multi-key sort with nulls last
Erlang
-module(multi_sort).
-export([sort_by/2]).
%% Keys are map fields compared left to right; undefined sorts last.
sort_by(Rows, Keys) ->
lists:sort(fun(A, B) -> leq(A, B, Keys) end, Rows).
leq(_A, _B, []) -> true;
leq(A, B, [K | Ks]) ->
case cmp(maps:get(K, A, undefined), maps:get(K, B, undefined)) of
lt -> true;
gt -> false;
eq -> leq(A, B, Ks)
end.
cmp(undefined, undefined) -> eq;
cmp(undefined, _) -> gt;
cmp(_, undefined) -> lt;
cmp(A, B) when A < B -> lt;
cmp(A, B) when A > B -> gt;
cmp(_, _) -> eq.