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 + -
显示快捷键?