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