:- protocol(queuep).


	:- info([
		version is 1.0,
		authors is 'Paulo Moura',
		date is 2000/7/24,
		comment is 'Queue protocol.']).


	:- public(empty/1).

	:- mode(empty(@queue), zero_or_one).

	:- info(empty/1, [
		comment is 'True if the queue is empty.',
		argnames is ['Queue']]).


	:- public(head/2).

	:- mode(head(+queue, ?term), zero_or_one).

	:- info(head/2, [
		comment is 'Unifies Head with the first element of the queue.',
		argnames is ['Queue', 'Head']]).


	:- public(join/3).

	:- mode(join(@term, +queue, -queue), zero_or_one).

	:- info(join/3, [
		comment is 'Adds the new element at the end of the queue.',
		argnames is ['Element', 'Queue_in', 'Queue_out']]).


	:- public(join_all/3).

	:- mode(join_all(+list, +queue, -queue), zero_or_one).

	:- info(join_all/3, [
		comment is 'Adds the new elements at the end of the queue.  The elements are added in the same order that they appear in the list.',
		argnames is ['List', 'Queue_in', 'Queue_out']]).


	:- public(jump/3).

	:- mode(jump(@term, +queue, -queue), zero_or_one).

	:- info(jump/3, [
		comment is 'Adds the new element at the front of the queue.',
		argnames is ['Element', 'Queue_in', 'Queue_out']]).


	:- public(jump_all/3).

	:- mode(jump_all(+list, +queue, -queue), zero_or_one).

	:- info(jump_all/3, [
		comment is 'Adds the new elements at the front of the queue.  The elements are added in the same order that they appear in the list.',
		argnames is ['Element', 'Queue_in', 'Queue_out']]).


	:- public(length/2).

	:- mode(length(+queue, ?integer), zero_or_one).

	:- info(length/2,
		[comment is 'Queue length.',
		 argnames is ['Queue', 'Length']]).


	:- public(serve/3).

	:- mode(serve(+queue, ?term, -queue), zero_or_one).

	:- info(serve/3, [
		comment is 'Removes the first element of the queue for service.',
		argnames is ['Queue_in', 'Head', 'Queue_out']]).


	:- public(as_list/2).

	:- mode(as_list(+queue, -list), one).

	:- info(as_list/2,
		[comment is 'Converts a queue to a list.',
		 argnames is ['Queue', 'List']]).


:- end_protocol.