lists.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 2,008 行 · 第 1/5 页
ERL
2,008 行
case element(I, H3) of E3 when E2 =< E3 -> keymerge3_2(I, E1, H1, T1, T2, [H2 | M], T2, E3, H3, T3); _E3 -> keymerge3_21_3(I, E1, H1, T1, E2, H2, T2, T3, [H3 | M]) end;keymerge3_21_3(I, E1, H1, T1, _E2, H2, T2, [], M) -> keymerge2_2(I, T1, E1, H2, T2, M, H1).%% Take L1 apart.rkeymerge3_1(I, [H1 | T1], M, D, E2, H2, T2, E3, H3, T3) -> case element(I, H1) of E1 when E1 =< E2 -> rkeymerge3_12(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M, T2); E1 -> rkeymerge3_21(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M, D) end;rkeymerge3_1(I, [], M, _D, E2, H2, T2, E3, H3, T3) when E2 =< E3 -> rkeymerge2_2(I, E2, T2, H3, T3, M, H2);rkeymerge3_1(I, [], M, _D, _E2, H2, T2, E3, H3, T3) -> rkeymerge2_1(I, T2, E3, H3, T3, [H2 | M]).%% Take L2 apart.rkeymerge3_2(I, E1, H1, T1, [H2 | T2], M, D, E3, H3, T3) -> case element(I, H2) of E2 when E1 =< E2 -> rkeymerge3_12(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M, D); E2 -> rkeymerge3_21(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M, T1) end;rkeymerge3_2(I, E1, H1, T1, [], M, _D, E3, H3, T3) when E1 =< E3 -> rkeymerge2_2(I, E1, T1, H3, T3, M, H1);rkeymerge3_2(I, _E1, H1, T1, [], M, _D, E3, H3, T3) -> rkeymerge2_1(I, T1, E3, H3, T3, [H1 | M]).% E1 =< E2. Inlined.rkeymerge3_12(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M, _D) when E2 =< E3 -> rkeymerge3_12_3(I, E1, H1, T1, E2, H2, T2, T3, [H3 | M]);rkeymerge3_12(I, E1, H1, T1, _E2, H2, T2, E3, H3, T3, M, D) -> rkeymerge3_2(I, E1, H1, T1, T2, [H2 | M], D, E3, H3, T3).% E1 =< E2, take L3 apart.rkeymerge3_12_3(I, E1, H1, T1, E2, H2, T2, [H3 | T3], M) -> case element(I, H3) of E3 when E2 =< E3 -> rkeymerge3_12_3(I, E1, H1, T1, E2, H2, T2, T3, [H3 | M]); E3 -> rkeymerge3_2(I, E1, H1, T1, T2, [H2 | M], T2, E3, H3, T3) end;rkeymerge3_12_3(I, E1, H1, T1, _E2, H2, T2, [], M) -> rkeymerge2_2(I, E1, T1, H2, T2, M, H1).% E1 > E2. Inlined.rkeymerge3_21(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M, _D) when E1 =< E3 -> rkeymerge3_21_3(I, E1, H1, T1, E2, H2, T2, T3, [H3 | M]);rkeymerge3_21(I, _E1, H1, T1, E2, H2, T2, E3, H3, T3, M, D) -> rkeymerge3_1(I, T1, [H1 | M], D, E2, H2, T2, E3, H3, T3).% E1 > E2, take L3 apart.rkeymerge3_21_3(I, E1, H1, T1, E2, H2, T2, [H3 | T3], M) -> case element(I, H3) of E3 when E1 =< E3 -> rkeymerge3_21_3(I, E1, H1, T1, E2, H2, T2, T3, [H3 | M]); E3 -> rkeymerge3_1(I, T1, [H1 | M], T1, E2, H2, T2, E3, H3, T3) end;rkeymerge3_21_3(I, _E1, H1, T1, E2, H2, T2, [], M) -> rkeymerge2_1(I, T1, E2, H2, T2, [H1 | M]).%% keymerge/3%% Elements from the first list are prioritized.keymerge2_1(I, [H1 | T1], E2, H2, T2, M) -> case element(I, H1) of E1 when E1 =< E2 -> keymerge2_1(I, T1, E2, H2, T2, [H1 | M]); E1 -> keymerge2_2(I, T1, E1, H2, T2, M, H1) end;keymerge2_1(_I, [], _E2, H2, T2, M) -> lists:reverse(T2, [H2 | M]).keymerge2_2(I, T1, E1, HdM, [H2 | T2], M, H1) -> case element(I, H2) of E2 when E1 =< E2 -> keymerge2_1(I, T1, E2, H2, T2, [H1, HdM | M]); _E2 -> keymerge2_2(I, T1, E1, H2, T2, [HdM | M], H1) end;keymerge2_2(_I, T1, _E1, HdM, [], M, H1) -> lists:reverse(T1, [H1, HdM | M]).%% rkeymerge/3rkeymerge2_1(I, [H1 | T1], E2, H2, T2, M) -> case element(I, H1) of E1 when E1 =< E2 -> rkeymerge2_2(I, E1, T1, H2, T2, M, H1); _E1 -> rkeymerge2_1(I, T1, E2, H2, T2, [H1 | M]) end;rkeymerge2_1(_I, [], _E2, H2, T2, M) -> lists:reverse(T2, [H2 | M]).rkeymerge2_2(I, E1, T1, HdM, [H2 | T2], M, H1) -> case element(I, H2) of E2 when E1 =< E2 -> rkeymerge2_2(I, E1, T1, H2, T2, [HdM | M], H1); E2 -> rkeymerge2_1(I, T1, E2, H2, T2, [H1, HdM | M]) end;rkeymerge2_2(_I, _E1, T1, HdM, [], M, H1) -> lists:reverse(T1, [H1, HdM | M]).%% ukeysort/2%% Ascending.ukeysplit_1(I, X, EX, Y, EY, [Z | L], R, Rs) -> case element(I, Z) of EZ when EY == EZ -> ukeysplit_1(I, X, EX, Y, EY, L, R, Rs); EZ when EY < EZ -> ukeysplit_1(I, Y, EY, Z, EZ, L, [X | R], Rs); EZ when EX == EZ -> ukeysplit_1(I, X, EX, Y, EY, L, R, Rs); EZ when EX < EZ -> ukeysplit_1(I, Z, EZ, Y, EY, L, [X | R], Rs); _EZ when R == [] -> ukeysplit_1(I, X, EX, Y, EY, L, [Z], Rs); EZ -> ukeysplit_1_1(I, X, EX, Y, EY, L, R, Rs, Z, EZ) end;ukeysplit_1(I, X, _EX, Y, _EY, [], R, Rs) -> rukeymergel(I, [[Y, X | R] | Rs], []).ukeysplit_1_1(I, X, EX, Y, EY, [Z | L], R, Rs, S, ES) -> case element(I, Z) of EZ when EY == EZ -> ukeysplit_1_1(I, X, EX, Y, EY, L, R, Rs, S, ES); EZ when EY < EZ -> ukeysplit_1_1(I, Y, EY, Z, EZ, L, [X | R], Rs, S, ES); EZ when EX == EZ -> ukeysplit_1_1(I, X, EX, Y, EY, L, R, Rs, S, ES); EZ when EX < EZ -> ukeysplit_1_1(I, Z, EZ, Y, EY, L, [X | R], Rs, S, ES); EZ when ES == EZ -> ukeysplit_1_1(I, X, EX, Y, EY, L, R, Rs, S, ES); EZ when ES < EZ -> ukeysplit_1(I, S, ES, Z, EZ, L, [], [[Y, X | R] | Rs]); EZ -> ukeysplit_1(I, Z, EZ, S, ES, L, [], [[Y, X | R] | Rs]) end;ukeysplit_1_1(I, X, _EX, Y, _EY, [], R, Rs, S, _ES) -> rukeymergel(I, [[S], [Y, X | R] | Rs], []).%% Descending.ukeysplit_2(I, Y, EY, [Z | L], R) -> case element(I, Z) of EZ when EY == EZ -> ukeysplit_2(I, Y, EY, L, R); EZ when EY < EZ -> ukeysplit_1(I, Y, EY, Z, EZ, L, [], [lists:reverse(R, [])]); EZ -> ukeysplit_2(I, Z, EZ, L, [Y | R]) end;ukeysplit_2(_I, Y, _EY, [], R) -> [Y | R].ukeymergel(I, [T1, [H2 | T2], [H3 | T3] | L], Acc) -> %% The fourth argument, [H2 | H3] (=HdM), may confuse type %% checkers. Its purpose is to ensure that the tests H2 == HdM %% and H3 == HdM in ukeymerge3_1 will always fail as long as M == []. M = ukeymerge3_1(I, T1, Acc, [H2 | H3], element(I, H2), H2, T2, [], element(I, H3), H3, T3), ukeymergel(I, L, [M | Acc]);ukeymergel(I, [[H1 | T1], T2 | L], Acc) -> ukeymergel(I, L, [ukeymerge2_2(I, T1, element(I, H1), H1, T2, []) | Acc]);ukeymergel(_I, [L], []) -> L;ukeymergel(I, [L], Acc) -> rukeymergel(I, [lists:reverse(L, []) | Acc], []);ukeymergel(I, [], Acc) -> rukeymergel(I, Acc, []).rukeymergel(I, [[H3 | T3], [H2 | T2], T1 | L], Acc) -> M = rukeymerge3_1(I, T1, Acc, [], element(I, H2), H2, T2, [], element(I, H3), H3, T3), rukeymergel(I, L, [M | Acc]);rukeymergel(I, [[H2 | T2], T1 | L], Acc) -> rukeymergel(I, L, [rukeymerge2_1(I, T1, element(I,H2), T2, [], H2)|Acc]);rukeymergel(I, [L], Acc) -> ukeymergel(I, [lists:reverse(L, []) | Acc], []);rukeymergel(I, [], Acc) -> ukeymergel(I, Acc, []).%%% An extra argument, D, just to avoid some move instructions.%% Take L1 apart.ukeymerge3_1(I, [H1 | T1], D, HdM, E2, H2, T2, M, E3, H3, T3) -> case element(I, H1) of E1 when E1 =< E2 -> ukeymerge3_12(I, E1, T1, H1, E2, H2, T2, E3, H3, T3, M, HdM, D); E1 when E2 == HdM -> ukeymerge3_2(I, E1, T1, H1, T2, HdM, T2, M, E3, H3, T3); E1 -> ukeymerge3_21(I, E1, T1, H1, E2, H2, T2, E3, H3, T3, M, HdM, T2) end;ukeymerge3_1(I, [], _D, HdM, E2, _H2, T2, M, E3, H3, T3) when E2 == HdM -> ukeymerge2_1(I, T2, E3, HdM, T3, M, H3);ukeymerge3_1(I, [], _D, _HdM, E2, H2, T2, M, E3, H3, T3) when E2 =< E3 -> ukeymerge2_1(I, T2, E3, E2, T3, [H2 | M], H3);ukeymerge3_1(I, [], _D, HdM, E2, H2, T2, M, E3, _H3, T3) when E3 == HdM -> ukeymerge2_2(I, T2, E2, H2, T3, M);ukeymerge3_1(I, [], _D, _HdM, E2, H2, T2, M, _E3, H3, T3) -> ukeymerge2_2(I, T2, E2, H2, T3, [H3 | M]).%% Take L2 apart.ukeymerge3_2(I, E1, T1, H1, [H2 | T2], HdM, D, M, E3, H3, T3) -> case element(I, H2) of E2 when E1 =< E2 -> ukeymerge3_12(I, E1, T1, H1, E2, H2, T2, E3, H3, T3, M, HdM, T1); E2 -> ukeymerge3_21(I, E1, T1, H1, E2, H2, T2, E3, H3, T3, M, HdM, D) end;ukeymerge3_2(I, E1, T1, H1, [], _HdM, _D, M, E3, H3, T3) when E1 =< E3 -> ukeymerge2_1(I, T1, E3, E1, T3, [H1 | M], H3);ukeymerge3_2(I, E1, T1, H1, [], HdM, _D, M, E3, _H3, T3) when E3 == HdM -> ukeymerge2_2(I, T1, E1, H1, T3, M);ukeymerge3_2(I, E1, T1, H1, [], _HdM, _D, M, _E3, H3, T3) -> ukeymerge2_2(I, T1, E1, H1, T3, [H3 | M]).% E1 =< E2. Inlined.ukeymerge3_12(I, E1, T1, H1, E2, H2, T2, E3, H3, T3, M, _HdM, D) when E1 =< E3 -> ukeymerge3_1(I, T1, D, E1, E2, H2, T2, [H1 | M], E3, H3, T3);ukeymerge3_12(I, E1, T1, H1, E2, H2, T2, E3, _H3, T3, M, HdM, _D) when E3 == HdM -> ukeymerge3_12_3(I, E1, T1, H1, E2, H2, T2, M, T3);ukeymerge3_12(I, E1, T1, H1, E2, H2, T2, _E3, H3, T3, M, _HdM, _D) -> ukeymerge3_12_3(I, E1, T1, H1, E2, H2, T2, [H3 | M], T3).% E1 =< E2, take L3 apart.ukeymerge3_12_3(I, E1, T1, H1, E2, H2, T2, M, [H3 | T3]) -> case element(I, H3) of E3 when E1 =< E3 -> ukeymerge3_1(I, T1, T1, E1, E2, H2, T2, [H1 | M], E3, H3, T3); _E3 -> ukeymerge3_12_3(I, E1, T1, H1, E2, H2, T2, [H3 | M], T3) end;ukeymerge3_12_3(I, E1, T1, H1, E2, H2, T2, M, []) -> ukeymerge2_1(I, T1, E2, E1, T2, [H1 | M], H2).% E1 > E2. Inlined.ukeymerge3_21(I, E1, T1, H1, E2, H2, T2, E3, H3, T3, M, _HdM, D) when E2 =< E3 -> ukeymerge3_2(I, E1, T1, H1, T2, E2, D, [H2 | M], E3, H3, T3);ukeymerge3_21(I, E1, T1, H1, E2, H2, T2, E3, _H3, T3, M, HdM, _D) when E3 == HdM -> ukeymerge3_21_3(I, E1, T1, H1, E2, H2, T2, M, T3);ukeymerge3_21(I, E1, T1, H1, E2, H2, T2, _E3, H3, T3, M, _HdM, _D) -> ukeymerge3_21_3(I, E1, T1, H1, E2, H2, T2, [H3 | M], T3).% E1 > E2, take L3 apart.ukeymerge3_21_3(I, E1, T1, H1, E2, H2, T2, M, [H3 | T3]) -> case element(I, H3) of E3 when E2 =< E3 -> ukeymerge3_2(I, E1, T1, H1, T2, E2, T2, [H2 | M], E3, H3, T3); _E3 -> ukeymerge3_21_3(I, E1, T1, H1, E2, H2, T2, [H3 | M], T3) end;ukeymerge3_21_3(I, E1, T1, H1, _E2, H2, T2, M, []) -> ukeymerge2_2(I, T1, E1, H1, T2, [H2 | M]).%%% Two extra arguments, D1 and D2, just to avoid some move instructions.%% Take L1 apart.rukeymerge3_1(I, [H1 | T1], D1, D2, E2, H2, T2, M, E3, H3, T3) -> case element(I, H1) of E1 when E1 =< E2 -> rukeymerge3_12a(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M); E1 -> rukeymerge3_21a(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M, D1, D2) end;rukeymerge3_1(I, [], _D1, _D2, E2, H2, T2, M, E3, H3, T3) when E2 =< E3 -> rukeymerge2_2(I, T2, E2, T3, M, E3, H3, H2);rukeymerge3_1(I, [], _D1, _D2, _E2, H2, T2, M, E3, H3, T3) -> rukeymerge2_1(I, T2, E3, T3, [H2 | M], H3).% E1 =< E2. Inlined.rukeymerge3_12a(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M) when E2 =< E3 -> rukeymerge3_12_3(I, E1, H1, T1, E2, H2, T2, M, E3, H3, T3);rukeymerge3_12a(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M) -> rukeymerge3_2(I, E1, H1, T1, T2, H2, E2, M, E3, H3, T3).% E1 > E2. Inlinedrukeymerge3_21a(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M, _D1, _D2) when E1 =< E3 -> rukeymerge3_21_3(I, E1, H1, T1, E2, H2, T2, M, E3, H3, T3);rukeymerge3_21a(I, _E1, H1, T1, E2, H2, T2, E3, H3, T3, M, D1, D2) -> rukeymerge3_1(I, T1, D1, D2, E2, H2, T2, [H1 | M], E3, H3, T3).%% Take L2 apart. E2M > E3. E2M > E2.rukeymerge3_2(I, E1, H1, T1, [H2 | T2], H2M, E2M, M, E3, H3, T3) -> case element(I, H2) of E2 when E1 =< E2 -> % E2M > E1. rukeymerge3_12b(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M, H2M); E2 when E1 == E2M -> rukeymerge3_1(I, T1, H1, T1, E2, H2, T2, [H1 | M], E3, H3, T3); E2 -> % E2M > E1. rukeymerge3_21b(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M, H2M) end;rukeymerge3_2(I, E1, H1, T1, [], _H2M, E2M, M, E3, H3, T3) when E1 == E2M -> rukeymerge2_1(I, T1, E3, T3, [H1 | M], H3);rukeymerge3_2(I, E1, H1, T1, [], H2M, _E2M, M, E3, H3, T3) when E1 =< E3 -> rukeymerge2_2(I, T1, E1, T3, [H2M | M], E3, H3, H1);rukeymerge3_2(I, _E1, H1, T1, [], H2M, _E2M, M, E3, H3, T3) -> rukeymerge2_1(I, T1, E3, T3, [H1, H2M | M], H3).% E1 =< E2. Inlined.rukeymerge3_12b(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M, H2M) when E2 =< E3 -> rukeymerge3_12_3(I, E1, H1, T1, E2, H2, T2, [H2M | M], E3, H3, T3);rukeymerge3_12b(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M, H2M) -> rukeymerge3_2(I, E1, H1, T1, T2, H2, E2, [H2M | M], E3, H3, T3).% E1 > E2. Inlinedrukeymerge3_21b(I, E1, H1, T1, E2, H2, T2, E3, H3, T3, M,H2M) when E1 =< E3 -> rukeymerge3_21_3(I, E1, H1, T1, E2, H2, T2, [H2M | M], E3, H3, T3);rukeymerge3_21b(I, _E1, H1, T1, E2, H2, T2, E3, H3, T3, M, H2M) -> rukeymerge3_1(I, T1, H1, T1, E2, H2, T2, [H1, H2M | M], E3, H3, T3).% E1 =< E2, take L3 apart.rukeymerge3_12_3(I, E1, H1, T1, E2, H2, T2, M, E3M, H3M, [H3 | T3]) -> case element(I, H3) of E3 when E2 =< E3 -> rukeymerge3_12_3(I, E1, H1, T1, E2, H2, T2, [H3M | M], E3, H3, T3); E3 when E2 == E3M -> rukeymerge3_2(I, E1, H1, T1, T2, H2, E2, M, E3, H3, T3); E3 -> rukeymerge3_2(I, E1, H1, T1, T2, H2, E2, [H3M | M], E3, H3, T3) end;rukeymerge3_12_3(I, E1, H1, T1, E2, H2, T2, M, E3M, _H3M, []) when E2 == E3M -> rukeymerge2_2(I, T1, E1, T2, M, E2, H2, H1);rukeymerge3_12_3(I, E1, H1, T1, E2, H2, T2, M, _E3M, H3M, []) -> rukeymerge2_2(I, T1, E1, T2, [H3M | M], E2, H2, H1).% E1 > E2, take L3 apart.rukeymerge3_21_3(I, E1, H1, T1, E2, H2, T2, M, E3M, H3M, [H3 | T3]) -> case element(I, H3) of E3 when E1 =< E3 -> rukeymerge3_21_3(I, E1, H1, T1, E2, H2, T2, [H3M | M], E3, H3, T3); E3 when E1 == E3M -> rukeymerge3_1(I, T1, H1, T1, E2, H2, T2, [H1 | M], E3, H3, T3); E3 -> rukeymerge3_1(I, T1, H1, T1, E2, H2, T2, [H1,H3M | M], E3, H3, T3) end;rukeymerge3_21_3(I, E1, H1, T1, E2, H2, T2, M, E3M, _H3M, []) when E1 == E3M -> rukeymerge2_1(I, T1, E2, T2, [H1 | M], H2);rukeymerge3_21_3(I, _E1, H1, T1, E2, H2, T2, M, _E3M, H3M, []) -> rukeymerge2_1(I, T1, E2, T2, [H1, H3M | M], H2).%% ukeymerge/3%% Elements from the first list are kept and prioritized.ukeymerge2_1(I, [H1 | T1], E2, HdM, T2, M, H2) -> case element(I, H1) of E1 when E1 =< E2 -> ukeymerge2_1(I, T1, E2, E1, T2, [H1 | M], H2); E1 when E2 == HdM -> ukeymerge2_2(I, T1, E1, H1, T2, M); E1 -> ukeymerge2_2(I, T1, E1, H1, T2, [H2 | M]) end;ukeymerge2_1(_I, [], E2, HdM, T2, M, _H2) when E2 == HdM -> lists:reverse(T2, M);ukeymerge2_1(_I, [], _E2, _HdM, T2, M, H2) -> lists:reverse(T2, [H2 | M]).ukeymerge2_2(I, T1, E1, H1, [H2 | T2], M) -> case element(I, H2) of E2 when E1 =< E2 -> ukeymerge2_1(I, T1, E2, E1, T2, [H1 | M], H2); _E2 -> ukeymerge2_2(I, T1, E1, H1, T2, [H2 | M]) end;ukeymerge2_2(_I, T1, _E1, H1, [], M) -> lists:reverse(T1, [H1 | M]).%% rukeymerge/3rukeymerge2_1(I, [H1 | T1], E2, T2, M, H2) -> case element(I, H1) of E1 when E1 =< E2 -> rukeymerge2_2(I, T1, E1, T2, M, E2, H2, H1); _E1 -> rukeymerge2_1(I, T1, E2, T2, [H1 | M], H2) end;rukeymer
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?