Packages
otpbp
4.62.0
7.18.0
7.16.1
7.15.0
7.14.0
7.13.0
7.12.0
7.11.0
7.10.2
7.9.3
7.9.2
7.9.1
7.8.7
7.8.6
7.8.5
7.8.4
7.7.1
7.7.0
7.6.3
7.6.2
7.6.1
7.6.0
7.5.1
7.5.0
7.4.0
7.3.4
7.3.3
7.3.2
7.3.1
7.3.0
7.2.0
7.1.1
7.1.0
7.0.4
7.0.3
7.0.2
7.0.1
6.26.0
6.25.0
6.24.0
6.23.0
6.22.2
6.21.3
6.21.2
6.21.1
6.20.2
6.19.1
6.19.0
6.18.3
6.18.2
6.18.1
6.18.0
6.17.1
6.17.0
6.16.0
6.15.4
6.15.3
6.15.2
6.15.1
6.15.0
6.14.0
6.13.5
6.13.4
6.13.3
6.13.2
6.13.1
6.13.0
6.12.0
6.11.2
6.11.1
6.10.0
6.9.2
6.9.1
6.9.0
6.8.0
6.7.1
6.7.0
6.6.4
6.6.3
6.6.2
6.6.1
6.6.0
6.5.0
6.4.0
6.3.3
6.3.2
6.3.1
6.3.0
6.2.1
6.2.0
6.1.0
6.0.0
5.39.0
5.38.0
5.37.0
5.36.0
5.35.2
5.34.3
5.34.2
5.34.1
5.33.1
5.32.1
5.32.0
5.31.3
5.31.2
5.31.1
5.31.0
5.30.1
5.30.0
5.29.0
5.28.4
5.28.3
5.28.2
5.28.1
5.28.0
5.27.0
5.26.5
5.26.4
5.26.3
5.26.2
5.26.1
5.26.0
5.25.0
5.24.2
5.24.1
5.23.0
5.22.2
5.22.1
5.22.0
5.21.0
5.20.1
5.20.0
5.19.4
5.19.3
5.19.2
5.19.1
5.19.0
5.18.0
5.17.0
5.16.3
5.16.1
5.16.0
5.15.1
5.15.0
5.14.0
5.13.1
5.13.0
5.12.1
5.12.0
5.11.2
5.11.1
5.10.1
5.10.0
5.9.0
5.8.0
5.7.0
5.6.1
5.6.0
5.5.0
5.4.2
5.4.1
5.4.0
5.3.0
5.2.2
5.2.1
5.2.0
5.1.2
5.1.1
4.79.0
4.78.0
4.77.0
4.76.2
4.75.3
4.75.2
4.75.1
4.74.0
4.73.1
4.73.0
4.72.3
4.72.2
4.72.1
4.72.0
4.71.1
4.71.0
4.70.0
4.69.4
4.69.3
4.69.2
4.69.1
4.69.0
4.68.0
4.67.5
4.67.4
4.67.3
4.67.2
4.67.0
4.66.0
4.65.2
4.65.1
4.64.0
4.63.2
4.63.1
4.63.0
4.62.0
4.61.1
4.61.0
4.60.4
4.60.3
4.60.2
4.60.1
4.60.0
4.59.0
4.58.0
4.57.2
4.57.1
4.57.0
4.56.2
4.56.1
4.56.0
4.55.0
4.54.0
4.53.0
4.52.1
4.52.0
4.51.3
4.51.2
4.51.0
4.50.0
4.49.3
4.49.2
OTP backports
Current section
Files
Jump to
Current section
Files
src/otpbp_queue.erl
-module(otpbp_queue).
-ifndef(HAVE_queue__all_2).
% OTP 24.0
-export([all/2]).
-endif.
-ifndef(HAVE_queue__any_2).
% OTP 24.0
-export([any/2]).
-endif.
-ifndef(HAVE_queue__delete_2).
% OTP 24.0
-export([delete/2]).
-endif.
-ifndef(HAVE_queue__delete_r_2).
% OTP 24.0
-export([delete_r/2]).
-endif.
-ifndef(HAVE_queue__delete_with_2).
% OTP 24.0
-export([delete_with/2]).
-endif.
-ifndef(HAVE_queue__delete_with_r_2).
% OTP 24.0
-export([delete_with_r/2]).
-endif.
-ifndef(HAVE_queue__fold_3).
% OTP 24.0
-export([fold/3]).
-endif.
-ifndef(HAVE_queue__filtermap_2).
% OTP 24.0
-export([filtermap/2]).
-endif.
-ifndef(HAVE_queue__foreach_2).
-export([foreach/2]).
-endif.
-ifndef(HAVE_queue__foreach_2).
-ifdef(HAVE_queue__fold_3).
-import(queue, [fold/3]).
-endif.
-endif.
-ifndef(HAVE_queue__all_2).
all(Pred, {R, F}) when is_function(Pred, 1), is_list(R), is_list(F) -> lists:all(Pred, F) andalso lists:all(Pred, R);
all(Pred, Q) -> error(badarg, [Pred, Q]).
-endif.
-ifndef(HAVE_queue__any_2).
any(Pred, {R, F}) when is_function(Pred, 1), is_list(R), is_list(F) -> lists:any(Pred, F) orelse lists:any(Pred, R);
any(Pred, Q) -> error(badarg, [Pred, Q]).
-endif.
-ifndef(HAVE_queue__delete_2).
-ifndef(NEED__delete_front_2).
-define(NEED__delete_front_2, true).
-endif.
-ifndef(NEED__delete_rear_2).
-define(NEED__delete_rear_2, true).
-endif.
-ifndef(NEED__f2r_1).
-define(NEED__f2r_1, true).
-endif.
-ifndef(NEED__r2f_1).
-define(NEED__r2f_1, true).
-endif.
delete(Item, {R0, F0} = Q) when is_list(R0), is_list(F0) ->
case delete_front(Item, F0) of
false ->
case delete_rear(Item, R0) of
false -> Q;
[] -> f2r(F0);
R1 -> {R1, F0}
end;
[] -> r2f(R0);
F1 -> {R0, F1}
end;
delete(Item, Q) -> error(badarg, [Item, Q]).
-endif.
-ifndef(HAVE_queue__delete_r_2).
-ifndef(NEED__delete_front_2).
-define(NEED__delete_front_2, true).
-endif.
-ifndef(NEED__delete_rear_2).
-define(NEED__delete_rear_2, true).
-endif.
-ifndef(NEED__f2r_1).
-define(NEED__f2r_1, true).
-endif.
-ifndef(NEED__r2f_1).
-define(NEED__r2f_1, true).
-endif.
delete_r(Item, {R0, F0} = Q) when is_list(R0), is_list(F0) ->
case delete_front(Item, R0) of
false ->
case delete_rear(Item, F0) of
false -> Q;
[] -> r2f(R0);
F1 -> {R0, F1}
end;
[] -> f2r(F0);
R1 -> {R1, F0}
end;
delete_r(Item, Q) -> error(badarg, [Item, Q]).
-endif.
-ifndef(HAVE_queue__delete_with_2).
-ifndef(NEED__delete_with_front_2).
-define(NEED__delete_with_front_2, true).
-endif.
-ifndef(NEED__delete_with_rear_2).
-define(NEED__delete_with_rear_2, true).
-endif.
-ifndef(NEED__f2r_1).
-define(NEED__f2r_1, true).
-endif.
-ifndef(NEED__r2f_1).
-define(NEED__r2f_1, true).
-endif.
delete_with(Pred, {R0, F0} = Q) when is_function(Pred, 1), is_list(R0), is_list(F0) ->
case delete_with_front(Pred, F0) of
false ->
case delete_with_rear(Pred, R0) of
false -> Q;
[] -> f2r(F0);
R1 -> {R1, F0}
end;
[] -> r2f(R0);
F1 -> {R0, F1}
end;
delete_with(Pred, Q) -> error(badarg, [Pred, Q]).
-endif.
-ifndef(HAVE_queue__delete_with_r_2).
-ifndef(NEED__delete_with_front_2).
-define(NEED__delete_with_front_2, true).
-endif.
-ifndef(NEED__delete_with_rear_2).
-define(NEED__delete_with_rear_2, true).
-endif.
-ifndef(NEED__f2r_1).
-define(NEED__f2r_1, true).
-endif.
-ifndef(NEED__r2f_1).
-define(NEED__r2f_1, true).
-endif.
delete_with_r(Pred, {R0, F0} = Q) when is_function(Pred, 1), is_list(R0), is_list(F0) ->
case delete_with_front(Pred, R0) of
false ->
case delete_with_rear(Pred, F0) of
false -> Q;
[] -> r2f(R0);
F1 -> {R0, F1}
end;
[] -> f2r(F0);
R1 -> {R1, F0}
end;
delete_with_r(Pred, Q) -> error(badarg, [Pred, Q]).
-endif.
-ifndef(HAVE_queue__fold_3).
fold(Fun, Acc, {R, F}) when is_function(Fun, 2), is_list(R), is_list(F) -> lists:foldr(Fun, lists:foldl(Fun, Acc, F), R);
fold(Fun, Acc0, Q) -> error(badarg, [Fun, Acc0, Q]).
-endif.
-ifndef(HAVE_queue__filtermap_2).
-ifndef(NEED__f2r_1).
-define(NEED__f2r_1, true).
-endif.
-ifndef(NEED__r2f_1).
-define(NEED__r2f_1, true).
-endif.
filtermap(Fun, {R0, F0}) when is_function(Fun, 1), is_list(R0), is_list(F0) ->
case {filtermap_r(Fun, R0), lists:filtermap(Fun, F0)} of
{[], F} -> f2r(F);
{R, []} -> r2f(R);
RF -> RF
end;
filtermap(Fun, Q) -> error(badarg, [Fun, Q]).
%% Call Fun in reverse order, i.e tail to head
filtermap_r(Fun, [X|R0]) ->
R = filtermap_r(Fun, R0),
case Fun(X) of
true -> [X|R];
{true, Y} -> [Y|R];
false -> R
end;
filtermap_r(_, []) -> [].
-endif.
-ifndef(HAVE_queue__foreach_2).
foreach(F, Q) when is_function(F, 1) ->
fold(fun(E, _) ->
F(E),
ok
end,
ok, Q);
foreach(F, Q) -> error(badarg, [F, Q]).
-endif.
-ifdef(NEED__r2f_1).
%% Move half of elements from R to F, if there are at least three
r2f([]) -> {[], []};
r2f([_] = R) -> {[], R};
r2f([Y, X]) -> {[Y], [X]};
r2f(List) ->
{RR, FF} = lists:split(length(List) div 2, List),
{RR, lists:reverse(FF, [])}.
-endif.
-ifdef(NEED__f2r_1).
%% Move half of elements from F to R, if there are enough
f2r([]) -> {[], []};
f2r([_] = F) -> {F, []};
f2r([X, Y]) -> {[Y], [X]};
f2r(List) ->
{FF, RR} = lists:split(length(List) div 2, List),
{lists:reverse(RR, []), FF}.
-endif.
-ifdef(NEED__delete_front_2).
delete_front(Item, [Item|Rest]) -> Rest;
delete_front(Item, [X|Rest]) ->
case delete_front(Item, Rest) of
false -> false;
F -> [X|F]
end;
delete_front(_, []) -> false.
-endif.
-ifdef(NEED__delete_rear_2).
delete_rear(Item, [X|Rest]) ->
case delete_rear(Item, Rest) of
false -> X =:= Item andalso Rest;
R -> [X|R]
end;
delete_rear(_, []) -> false.
-endif.
-ifdef(NEED__delete_with_front_2).
delete_with_front(Pred, [X|Rest]) ->
case Pred(X) of
true -> Rest;
false ->
case delete_with_front(Pred, Rest) of
false -> false;
F -> [X|F]
end
end;
delete_with_front(_, []) -> false.
-endif.
-ifdef(NEED__delete_with_rear_2).
delete_with_rear(Pred, [X|Rest]) ->
case delete_with_rear(Pred, Rest) of
false -> Pred(X) andalso Rest;
R -> [X|R]
end;
delete_with_rear(_, []) -> false.
-endif.