lists.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 2,008 行 · 第 1/5 页
ERL
2,008 行
usplit_1_1(X, Y, [Z | L], R, Rs, S) when Z == X -> usplit_1_1(X, Y, L, R, Rs, S);usplit_1_1(X, Y, [Z | L], R, Rs, S) when Z > S -> usplit_1(S, Z, L, [], [[Y, X | R] | Rs]);usplit_1_1(X, Y, [Z | L], R, Rs, S) when Z == S -> usplit_1_1(X, Y, L, R, Rs, S);usplit_1_1(X, Y, [Z | L], R, Rs, S) -> usplit_1(Z, S, L, [], [[Y, X | R] | Rs]);usplit_1_1(X, Y, [], R, Rs, S) -> rumergel([[S], [Y, X | R] | Rs], [], asc).%% Descending.usplit_2(X, Y, [Z | L], R, Rs) when Z < Y -> usplit_2(Y, Z, L, [X | R], Rs);usplit_2(X, Y, [Z | L], R, Rs) when Z == Y -> usplit_2(X, Y, L, R, Rs);usplit_2(X, Y, [Z | L], R, Rs) when Z < X -> usplit_2(Z, Y, L, [X | R], Rs);usplit_2(X, Y, [Z | L], R, Rs) when Z == X -> usplit_2(X, Y, L, R, Rs);usplit_2(X, Y, [Z | L], [], Rs) -> usplit_2(X, Y, L, [Z], Rs);usplit_2(X, Y, [Z | L], R, Rs) -> usplit_2_1(X, Y, L, R, Rs, Z);usplit_2(X, Y, [], R, Rs) -> umergel([[Y, X | R] | Rs], [], desc).usplit_2_1(X, Y, [Z | L], R, Rs, S) when Z < Y -> usplit_2_1(Y, Z, L, [X | R], Rs, S);usplit_2_1(X, Y, [Z | L], R, Rs, S) when Z == Y -> usplit_2_1(X, Y, L, R, Rs, S);usplit_2_1(X, Y, [Z | L], R, Rs, S) when Z < X -> usplit_2_1(Z, Y, L, [X | R], Rs, S);usplit_2_1(X, Y, [Z | L], R, Rs, S) when Z == X -> usplit_2_1(X, Y, L, R, Rs, S);usplit_2_1(X, Y, [Z | L], R, Rs, S) when Z < S -> usplit_2(S, Z, L, [], [[Y, X | R] | Rs]);usplit_2_1(X, Y, [Z | L], R, Rs, S) when Z == S -> usplit_2_1(X, Y, L, R, Rs, S);usplit_2_1(X, Y, [Z | L], R, Rs, S) -> usplit_2(Z, S, L, [], [[Y, X | R] | Rs]);usplit_2_1(X, Y, [], R, Rs, S) -> umergel([[S], [Y, X | R] | Rs], [], desc).%% umerge/1umergel(L) -> umergel(L, [], asc).umergel([[] | L], Acc, O) -> umergel(L, Acc, O);umergel([T1, [H2 | T2], [H3 | T3] | L], Acc, asc) -> umergel(L, [umerge3_1(T1, [H2 | H3], T2, H2, [], T3, H3) | Acc], asc);umergel([[H3 | T3], [H2 | T2], T1 | L], Acc, desc) -> umergel(L, [umerge3_1(T1, [H2 | H3], T2, H2, [], T3, H3) | Acc], desc);umergel([A, [] | L], Acc, O) -> umergel([A | L], Acc, O);umergel([A, B, [] | L], Acc, O) -> umergel([A, B | L], Acc, O);umergel([[H1 | T1], T2 | L], Acc, asc) -> umergel(L, [umerge2_2(T1, T2, [], H1) | Acc], asc);umergel([T2, [H1 | T1] | L], Acc, desc) -> umergel(L, [umerge2_2(T1, T2, [], H1) | Acc], desc);umergel([L], [], _O) -> L;umergel([L], Acc, O) -> rumergel([lists:reverse(L, []) | Acc], [], O);umergel([], [], _O) -> [];umergel([], Acc, O) -> rumergel(Acc, [], O).rumergel([[H3 | T3], [H2 | T2], T1 | L], Acc, asc) -> rumergel(L, [rumerge3_1(T1, T2, H2, [], T3, H3) | Acc], asc);rumergel([T1, [H2 | T2], [H3 | T3] | L], Acc, desc) -> rumergel(L, [rumerge3_1(T1, T2, H2, [], T3, H3) | Acc], desc);rumergel([[H2 | T2], T1 | L], Acc, asc) -> rumergel(L, [rumerge2_1(T1, T2, [], H2) | Acc], asc);rumergel([T1, [H2 | T2] | L], Acc, desc) -> rumergel(L, [rumerge2_1(T1, T2, [], H2) | Acc], desc);rumergel([L], Acc, O) -> umergel([lists:reverse(L, []) | Acc], [], O);rumergel([], Acc, O) -> umergel(Acc, [], O).%% umerge3/3%% Take L1 apart.umerge3_1([H1 | T1], HdM, T2, H2, M, T3, H3) when H1 =< H2 -> umerge3_12(T1, H1, T2, H2, M, T3, H3, HdM);umerge3_1([H1 | T1], HdM, T2, H2, M, T3, H3) when H2 == HdM -> umerge3_2(T1, H1, T2, H2, M, T3, H3);umerge3_1([H1 | T1], HdM, T2, H2, M, T3, H3) -> umerge3_21(T1, H1, T2, H2, M, T3, H3, HdM);umerge3_1([], HdM, T2, H2, M, T3, H3) when H2 == HdM -> umerge2_1(T2, T3, M, HdM, H3);umerge3_1([], _HdM, T2, H2, M, T3, H3) when H2 =< H3 -> umerge2_1(T2, T3, [H2 | M], H2, H3);umerge3_1([], HdM, T2, H2, M, T3, H3) when H3 == HdM -> umerge2_2(T2, T3, M, H2);umerge3_1([], _HdM, T2, H2, M, T3, H3) -> umerge2_2(T2, T3, [H3 | M], H2).%% Take L2 apart.umerge3_2(T1, H1, [H2 | T2], HdM, M, T3, H3) when H1 =< H2 -> umerge3_12(T1, H1, T2, H2, M, T3, H3, HdM);umerge3_2(T1, H1, [H2 | T2], HdM, M, T3, H3) -> umerge3_21(T1, H1, T2, H2, M, T3, H3, HdM);umerge3_2(T1, H1, [], _HdM, M, T3, H3) when H1 =< H3 -> umerge2_1(T1, T3, [H1 | M], H1, H3);umerge3_2(T1, H1, [], HdM, M, T3, H3) when H3 == HdM -> umerge2_2(T1, T3, M, H1);umerge3_2(T1, H1, [], _HdM, M, T3, H3) -> umerge2_2(T1, T3, [H3 | M], H1).% H1 =< H2. Inlined.umerge3_12(T1, H1, T2, H2, M, T3, H3, _HdM) when H1 =< H3 -> umerge3_1(T1, H1, T2, H2, [H1 | M], T3, H3);umerge3_12(T1, H1, T2, H2, M, T3, H3, HdM) when H3 == HdM -> umerge3_12_3(T1, H1, T2, H2, M, T3);umerge3_12(T1, H1, T2, H2, M, T3, H3, _HdM) -> umerge3_12_3(T1, H1, T2, H2, [H3 | M], T3).% H1 =< H2, take L3 apart.umerge3_12_3(T1, H1, T2, H2, M, [H3 | T3]) when H1 =< H3 -> umerge3_1(T1, H1, T2, H2, [H1 | M], T3, H3);umerge3_12_3(T1, H1, T2, H2, M, [H3 | T3]) -> umerge3_12_3(T1, H1, T2, H2, [H3 | M], T3);umerge3_12_3(T1, H1, T2, H2, M, []) -> umerge2_1(T1, T2, [H1 | M], H1, H2).% H1 > H2. Inlined.umerge3_21(T1, H1, T2, H2, M, T3, H3, _HdM) when H2 =< H3 -> umerge3_2(T1, H1, T2, H2, [H2 | M], T3, H3);umerge3_21(T1, H1, T2, H2, M, T3, H3, HdM) when H3 == HdM -> umerge3_21_3(T1, H1, T2, H2, M, T3);umerge3_21(T1, H1, T2, H2, M, T3, H3, _HdM) -> umerge3_21_3(T1, H1, T2, H2, [H3 | M], T3).% H1 > H2, take L3 apart.umerge3_21_3(T1, H1, T2, H2, M, [H3 | T3]) when H2 =< H3 -> umerge3_2(T1, H1, T2, H2, [H2 | M], T3, H3);umerge3_21_3(T1, H1, T2, H2, M, [H3 | T3]) -> umerge3_21_3(T1, H1, T2, H2, [H3 | M], T3);umerge3_21_3(T1, H1, T2, H2, M, []) -> umerge2_2(T1, T2, [H2 | M], H1).%% Take L1 apart.rumerge3_1([H1 | T1], T2, H2, M, T3, H3) when H1 =< H2 -> rumerge3_12a(T1, H1, T2, H2, M, T3, H3);rumerge3_1([H1 | T1], T2, H2, M, T3, H3) when H1 =< H3 -> rumerge3_21_3(T1, T2, H2, M, T3, H3, H1);rumerge3_1([H1 | T1], T2, H2, M, T3, H3) -> rumerge3_1(T1, T2, H2, [H1 | M], T3, H3);rumerge3_1([], T2, H2, M, T3, H3) when H2 =< H3 -> rumerge2_2(T2, T3, M, H3, H2);rumerge3_1([], T2, H2, M, T3, H3) -> rumerge2_1(T2, T3, [H2 | M], H3).% H1 =< H2. Inlined.rumerge3_12a(T1, H1, T2, H2, M, T3, H3) when H2 =< H3 -> rumerge3_12_3(T1, T2, H2, M, T3, H3, H1);rumerge3_12a(T1, H1, T2, H2, M, T3, H3) -> rumerge3_2(T1, T2, H2, M, T3, H3, H1).%% Take L2 apart. H2M > H3. H2M > H2.rumerge3_2(T1, [H2 | T2], H2M, M, T3, H3, H1) when H1 =< H2 -> % H2M > H1. rumerge3_12b(T1, H1, T2, H2, M, T3, H3, H2M);rumerge3_2(T1, [H2 | T2], H2M, M, T3, H3, H1) when H1 == H2M -> rumerge3_1(T1, T2, H2, [H1 | M], T3, H3);rumerge3_2(T1, [H2 | T2], H2M, M, T3, H3, H1) when H1 =< H3 -> % H2M > H1. rumerge3_21_3(T1, T2, H2, [H2M | M], T3, H3, H1);rumerge3_2(T1, [H2 | T2], H2M, M, T3, H3, H1) -> % H2M > H1. rumerge3_1(T1, T2, H2, [H1, H2M | M], T3, H3);rumerge3_2(T1, [], H2M, M, T3, H3, H1) when H1 == H2M -> rumerge2_1(T1, T3, [H1 | M], H3);rumerge3_2(T1, [], H2M, M, T3, H3, H1) when H1 =< H3 -> rumerge2_2(T1, T3, [H2M | M], H3, H1);rumerge3_2(T1, [], H2M, M, T3, H3, H1) -> rumerge2_1(T1, T3, [H1, H2M | M], H3).% H1 =< H2. Inlined.rumerge3_12b(T1, H1, T2, H2, M, T3, H3, H2M) when H2 =< H3 -> rumerge3_12_3(T1, T2, H2, [H2M | M], T3, H3, H1);rumerge3_12b(T1, H1, T2, H2, M, T3, H3, H2M) -> rumerge3_2(T1, T2, H2, [H2M | M], T3, H3, H1).% H1 =< H2, take L3 apart.rumerge3_12_3(T1, T2, H2, M, [H3 | T3], H3M, H1) when H2 =< H3 -> rumerge3_12_3(T1, T2, H2, [H3M | M], T3, H3, H1);rumerge3_12_3(T1, T2, H2, M, [H3 | T3], H3M, H1) when H2 == H3M -> rumerge3_2(T1, T2, H2, M, T3, H3, H1);rumerge3_12_3(T1, T2, H2, M, [H3 | T3], H3M, H1) -> rumerge3_2(T1, T2, H2, [H3M | M], T3, H3, H1);rumerge3_12_3(T1, T2, H2, M, [], H3M, H1) when H2 == H3M -> rumerge2_2(T1, T2, M, H2, H1);rumerge3_12_3(T1, T2, H2, M, [], H3M, H1) -> rumerge2_2(T1, T2, [H3M | M], H2, H1).% H1 > H2, take L3 apart.rumerge3_21_3(T1, T2, H2, M, [H3 | T3], H3M, H1) when H1 =< H3 -> rumerge3_21_3(T1, T2, H2, [H3M | M], T3, H3, H1);rumerge3_21_3(T1, T2, H2, M, [H3 | T3], H3M, H1) when H1 == H3M -> rumerge3_1(T1, T2, H2, [H1 | M], T3, H3);rumerge3_21_3(T1, T2, H2, M, [H3 | T3], H3M, H1) -> rumerge3_1(T1, T2, H2, [H1, H3M | M], T3, H3);rumerge3_21_3(T1, T2, H2, M, [], H3M, H1) when H1 == H3M -> rumerge2_1(T1, T2, [H1 | M], H2);rumerge3_21_3(T1, T2, H2, M, [], H3M, H1) -> rumerge2_1(T1, T2, [H1, H3M | M], H2).%% umerge/2%% Elements from the first list are kept and prioritized.umerge2_1([H1 | T1], T2, M, _HdM, H2) when H1 =< H2 -> umerge2_1(T1, T2, [H1 | M], H1, H2);umerge2_1([H1 | T1], T2, M, HdM, H2) when H2 == HdM -> umerge2_2(T1, T2, M, H1);umerge2_1([H1 | T1], T2, M, _HdM, H2) -> umerge2_2(T1, T2, [H2 | M], H1);umerge2_1([], T2, M, HdM, H2) when H2 == HdM -> lists:reverse(T2, M);umerge2_1([], T2, M, _HdM, H2) -> lists:reverse(T2, [H2 | M]).umerge2_2(T1, [H2 | T2], M, H1) when H1 =< H2 -> umerge2_1(T1, T2, [H1 | M], H1, H2);umerge2_2(T1, [H2 | T2], M, H1) -> umerge2_2(T1, T2, [H2 | M], H1);umerge2_2(T1, [], M, H1) -> lists:reverse(T1, [H1 | M]).%% rumerge/2%% Elements from the first list are kept and prioritized.rumerge2_1([H1 | T1], T2, M, H2) when H1 =< H2 -> rumerge2_2(T1, T2, M, H2, H1);rumerge2_1([H1 | T1], T2, M, H2) -> rumerge2_1(T1, T2, [H1 | M], H2);rumerge2_1([], T2, M, H2) -> lists:reverse(T2, [H2 | M]).% H1 =< H2M.rumerge2_2(T1, [H2 | T2], M, H2M, H1) when H1 =< H2 -> rumerge2_2(T1, T2, [H2M | M], H2, H1);rumerge2_2(T1, [H2 | T2], M, H2M, H1) when H1 == H2M -> rumerge2_1(T1, T2, [H1 | M], H2);rumerge2_2(T1, [H2 | T2], M, H2M, H1) -> rumerge2_1(T1, T2, [H1, H2M | M], H2);rumerge2_2(T1, [], M, H2M, H1) when H1 == H2M -> lists:reverse(T1, [H1 | M]);rumerge2_2(T1, [], M, H2M, H1) -> lists:reverse(T1, [H1, H2M | M]).%% keysort/2%% Ascending.keysplit_1(I, X, EX, Y, EY, [Z | L], R, Rs) -> case element(I, Z) of EZ when EY =< EZ -> keysplit_1(I, Y, EY, Z, EZ, L, [X | R], Rs); EZ when EX =< EZ -> keysplit_1(I, Z, EZ, Y, EY, L, [X | R], Rs); _EZ when R == [] -> keysplit_1(I, X, EX, Y, EY, L, [Z], Rs); EZ -> keysplit_1_1(I, X, EX, Y, EY, EZ, R, Rs, Z, L) end;keysplit_1(I, X, _EX, Y, _EY, [], R, Rs) -> rkeymergel(I, [[Y, X | R] | Rs], [], asc).keysplit_1_1(I, X, EX, Y, EY, ES, R, Rs, S, [Z | L]) -> case element(I, Z) of EZ when EY =< EZ -> keysplit_1_1(I, Y, EY, Z, EZ, ES, [X | R], Rs, S, L); EZ when EX =< EZ -> keysplit_1_1(I, Z, EZ, Y, EY, ES, [X | R], Rs, S, L); EZ when ES =< EZ -> keysplit_1(I, S, ES, Z, EZ, L, [], [[Y, X | R] | Rs]); EZ -> keysplit_1(I, Z, EZ, S, ES, L, [], [[Y, X | R] | Rs]) end;keysplit_1_1(I, X, _EX, Y, _EY, _ES, R, Rs, S, []) -> rkeymergel(I, [[S], [Y, X | R] | Rs], [], asc).%% Descending.keysplit_2(I, X, EX, Y, EY, [Z | L], R, Rs) -> case element(I, Z) of EZ when EY > EZ -> keysplit_2(I, Y, EY, Z, EZ, L, [X | R], Rs); EZ when EX > EZ -> keysplit_2(I, Z, EZ, Y, EY, L, [X | R], Rs); _EZ when R == [] -> keysplit_2(I, X, EX, Y, EY, L, [Z], Rs); EZ -> keysplit_2_1(I, X, EX, Y, EY, EZ, R, Rs, Z, L) end;keysplit_2(I, X, _EX, Y, _EY, [], R, Rs) -> keymergel(I, [[Y, X | R] | Rs], [], desc).keysplit_2_1(I, X, EX, Y, EY, ES, R, Rs, S, [Z | L]) -> case element(I, Z) of EZ when EY > EZ -> keysplit_2_1(I, Y, EY, Z, EZ, ES, [X | R], Rs, S, L); EZ when EX > EZ -> keysplit_2_1(I, Z, EZ, Y, EY, ES, [X | R], Rs, S, L); EZ when ES > EZ -> keysplit_2(I, S, ES, Z, EZ, L, [], [[Y, X | R] | Rs]); EZ -> keysplit_2(I, Z, EZ, S, ES, L, [], [[Y, X | R] | Rs]) end;keysplit_2_1(I, X, _EX, Y, _EY, _ES, R, Rs, S, []) -> keymergel(I, [[S], [Y, X | R] | Rs], [], desc).keymergel(I, [T1, [H2 | T2], [H3 | T3] | L], Acc, O) when O == asc -> M = keymerge3_1(I, T1, [],O,element(I,H2), H2, T2, element(I,H3), H3, T3), keymergel(I, L, [M | Acc], O);keymergel(I, [[H3 | T3], [H2 | T2], T1 | L], Acc, O) when O == desc -> M = keymerge3_1(I, T1, [],O,element(I,H2), H2, T2, element(I,H3), H3, T3), keymergel(I, L, [M | Acc], O);keymergel(I, [T1, [H2 | T2] | L], Acc, asc) -> keymergel(I, L, [keymerge2_1(I, T1, element(I,H2),H2,T2,[]) | Acc], asc);keymergel(I, [[H2 | T2], T1 | L], Acc, desc) -> keymergel(I, L, [keymerge2_1(I, T1, element(I,H2),H2,T2,[]) | Acc], desc);keymergel(_I, [L], [], _O) -> L;keymergel(I, [L], Acc, O) -> rkeymergel(I, [lists:reverse(L, []) | Acc], [], O);keymergel(I, [], Acc, O) -> rkeymergel(I, Acc, [], O).rkeymergel(I, [[H3 | T3], [H2 | T2], T1 | L], Acc, O) when O == asc -> M = rkeymerge3_1(I, T1, [],O,element(I,H2), H2, T2, element(I,H3), H3,T3), rkeymergel(I, L, [M | Acc], O);rkeymergel(I, [T1, [H2 | T2], [H3 | T3] | L], Acc, O) when O == desc -> M = rkeymerge3_1(I, T1, [],O,element(I,H2), H2, T2, element(I,H3), H3,T3), rkeymergel(I, L, [M | Acc], O);rkeymergel(I, [[H2 | T2], T1 | L], Acc, asc) -> rkeymergel(I, L, [rkeymerge2_1(I, T1, element(I,H2),H2,T2,[]) | Acc],asc);rkeymergel(I, [T1, [H2 | T2] | L], Acc, desc) -> rkeymergel(I, L, [rkeymerge2_1(I,T1, element(I,H2),H2,T2,[]) | Acc],desc);rkeymergel(I, [L], Acc, O) -> keymergel(I, [lists:reverse(L, []) | Acc], [], O);rkeymergel(I, [], Acc, O) -> keymergel(I, Acc, [], O).%%% An extra argument, D, just to avoid some move instructions.%% Take L1 apart.keymerge3_1(I, [H1 | T1], M, D, E2, H2, T2, E3, H3, T3) -> case element(I, H1) of E1 when E1 =< E2 -> keymerge3_12(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M, D); E1 -> keymerge3_21(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M, T2) end;keymerge3_1(I, [], M, _D, E2, H2, T2, E3, H3, T3) when E2 =< E3 -> keymerge2_1(I, T2, E3, H3, T3, [H2 | M]);keymerge3_1(I, [], M, _D, E2, H2, T2, _E3, H3, T3) -> keymerge2_2(I, T2, E2, H3, T3, M, H2).%% Take L2 apart.keymerge3_2(I, E1, H1, T1, [H2 | T2], M, D, E3, H3, T3) -> case element(I, H2) of E2 when E1 =< E2 -> keymerge3_12(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M, T1); E2 -> keymerge3_21(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M, D) end;keymerge3_2(I, E1, H1, T1, [], M, _D, E3, H3, T3) when E1 =< E3 -> keymerge2_1(I, T1, E3, H3, T3, [H1 | M]);keymerge3_2(I, E1, H1, T1, [], M, _D, _E3, H3, T3) -> keymerge2_2(I, T1, E1, H3, T3, M, H1).% E1 =< E2. Inlined.keymerge3_12(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M, D) when E1 =< E3 -> keymerge3_1(I, T1, [H1 | M], D, E2, H2, T2, E3, H3, T3);keymerge3_12(I, E1, H1, T1, E2, H2, T2, _E3, H3, T3, M, _D) -> keymerge3_12_3(I, E1, H1, T1, E2, H2, T2, T3, [H3 | M]).% E1 =< E2, take L3 apart.keymerge3_12_3(I, E1, H1, T1, E2, H2, T2, [H3 | T3], M) -> case element(I, H3) of E3 when E1 =< E3 -> keymerge3_1(I, T1, [H1 | M], T1, E2, H2, T2, E3, H3, T3); _E3 -> keymerge3_12_3(I, E1, H1, T1, E2, H2, T2, T3, [H3 | M]) end;keymerge3_12_3(I, _E1, H1, T1, E2, H2, T2, [], M) -> keymerge2_1(I, T1, E2, H2, T2, [H1 | M]).% E1 > E2. Inlined.keymerge3_21(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M, D) when E2 =< E3 -> keymerge3_2(I, E1, H1, T1, T2, [H2 | M], D, E3, H3, T3);keymerge3_21(I, E1, H1, T1, E2, H2, T2, _E3, H3, T3, M, _D) -> keymerge3_21_3(I, E1, H1, T1, E2, H2, T2, T3, [H3 | M]).% E1 > E2, take L3 apart.keymerge3_21_3(I, E1, H1, T1, E2, H2, T2, [H3 | T3], M) ->
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?