:- module queue.
:- use_module builtin, int, list, private_builtin, std_util.
:- type (queue:queue(T)) == (std_util:pair((list:list(T)), (list:list(T)))).
queue:init((std_util:(V_2 - V_3))) :-
		V_2 = list:[],
		V_3 = list:[].
queue:init = Q_2 :-
		queue:init(Q_2).
queue:is_empty((std_util:(V_2 - V_3))) :-
		V_3 = list:[].
queue:is_full(V_2) :-
		std_util:semidet_fail.
queue:put(Q1_4, T_5) = Q2_6 :-
		queue:put(Q1_4, T_5, Q2_6).
queue:put_list(Q1_4, Xs_5) = Q2_6 :-
		queue:put_list(Q1_4, Xs_5, Q2_6).
queue:first((std_util:(V_3 - V_6)), Elem_4) :-
		V_6 = list:[Elem_4 | V_5].
queue:length((std_util:(On_3 - Off_4)), Length_5) :-
		list:length(On_3, LengthOn_6),
		list:length(Off_4, LengthOff_7),
		Length_5 = int:(LengthOn_6 + LengthOff_7).
queue:length(Q_3) = N_4 :-
		queue:length(Q_3, N_4).
queue:list_to_queue(List_3, (std_util:(V_4 - List_3))) :-
		V_4 = list:[].
queue:list_to_queue(Xs_3) = Q_4 :-
		queue:list_to_queue(Xs_3, Q_4).
queue:delete_all(Q1_4, T_5) = Q2_6 :-
		queue:delete_all(Q1_4, T_5, Q2_6).
:- pragma termination_info(queue:init((builtin:out)), finite(2, [no, no]), cannot_loop).
:- pragma termination_info((queue:init) = (builtin:out), finite(2, [no, no]), cannot_loop).
:- pragma termination_info(queue:equal((builtin:in), (builtin:in)), finite(0, [no, no, no]), can_loop).
:- pragma termination_info(queue:is_empty((builtin:in)), finite(0, [no, no]), cannot_loop).
:- pragma termination_info(queue:is_full((builtin:in)), finite(0, [no, no]), can_loop).
:- pragma termination_info(queue:put((builtin:in), (builtin:in), (builtin:out)), finite(2, [no, yes, yes, no]), cannot_loop).
:- pragma termination_info(queue:put((builtin:in), (builtin:in)) = (builtin:out), finite(2, [no, yes, yes, no]), cannot_loop).
:- pragma termination_info(queue:put_list((builtin:in), (builtin:in), (builtin:out)), finite(0, [no, yes, yes, no]), can_loop).
:- pragma termination_info(queue:put_list((builtin:in), (builtin:in)) = (builtin:out), finite(0, [no, yes, yes, no]), can_loop).
:- pragma termination_info(queue:first((builtin:in), (builtin:out)), finite(-4, [no, yes, no]), cannot_loop).
:- pragma termination_info(queue:get((builtin:in), (builtin:out), (builtin:out)), infinite, can_loop).
:- pragma termination_info(queue:length((builtin:in), (builtin:out)), finite(0, [no, no, no]), can_loop).
:- pragma termination_info(queue:length((builtin:in)) = (builtin:out), finite(0, [no, no, no]), can_loop).
:- pragma termination_info(queue:list_to_queue((builtin:in), (builtin:out)), finite(2, [no, yes, no]), cannot_loop).
:- pragma termination_info(queue:list_to_queue((builtin:in)) = (builtin:out), finite(2, [no, yes, no]), cannot_loop).
:- pragma termination_info(queue:delete_all((builtin:in), (builtin:in), (builtin:out)), infinite, can_loop).
:- pragma termination_info(queue:delete_all((builtin:in), (builtin:in)) = (builtin:out), infinite, can_loop).
