Current section

Files

Jump to
utility src lists2.erl
Raw

src/lists2.erl

%%----------------------------------------------------
%% @doc 列表增强函数
%%
%% @author QingXuan
%% @end
%%----------------------------------------------------
-module(lists2).
-export([
shuffle/1,
unique/1,
for/3,
for/4,
sum/1,
list_to_atom/1
]).
-export([to_json/1, is_proplist/1]).
%% @spec shuffle(L) -> NewList
%% @doc 打乱数组顺序
shuffle(L) when is_list(L) ->
List1 = [{rand:uniform(), X} || X <- L],
List2 = lists:keysort(1, List1),
[E || {_, E} <- List2].
%% 移除数组中重复的值
%% @return list()
unique([]) -> [];
unique([A]) -> [A];
unique([A, A]) -> [A];
unique([A, B]) -> [A, B];
unique([A | L]) ->
unique(L, [A]).
%%
unique([], L2) -> lists:reverse(L2);
unique([A | L], L2) ->
case lists:member(A, L2) of
true -> unique(L, L2);
false -> unique(L, [A | L2])
end.
%% for循环
for(Min, Max, _F) when Min>Max ->
error;
for(Max, Max, F) ->
F(Max);
for(I, Max, F) ->
F(I),
for(I+1, Max, F).
%% 带返回状态的for循环
%% @return Acc
for(Max, Min, _F, Acc) when Min < Max -> Acc;
for(Max, Max, F, Acc) -> F(Max, Acc);
for(I, Max, F, Acc) -> Acc1 = F(I, Acc), for(I+1, Max, F, Acc1).
sum([]) ->
0;
sum([H|T]) ->
H + sum(T).
list_to_atom(List) when is_list(List) ->
case catch(list_to_existing_atom(List)) of
{'EXIT', _} ->
erlang:list_to_atom(List);
Atom ->
Atom
end.
to_json(List) ->
{obj, do_to_json(List)}.
do_to_json([{K, V} | T]) ->
case is_proplist(V) of
true ->
[{K, to_json(V)} | do_to_json(T)];
false ->
[{K, V} | do_to_json(T)]
end;
do_to_json([]) ->
[].
is_proplist([{_, _} | T]) ->
is_proplist(T);
is_proplist([]) ->
true;
is_proplist(_) ->
false.