<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="objectzed.xsl"?>
<!DOCTYPE unicode SYSTEM "unicode.dtd">
<objectZnotation xmlns="x-schema: objectZschema.xml" xmlns:HTML="http://www.w3.org/Profiles/XHTML-transitional">
	<description align="center">This is the Z/Object-Z Queue specification.</description>
	<tydef align="left">
		[<name>MSG</name>, <name>T</name>]
	</tydef>
	<axdef layout="liberal">
		<decl>
			<name>max</name>
			<dtype>
				<type>N</type>
			</dtype>
		</decl>
		<st/>
		<predicate>max > 100</predicate>
	</axdef>
	<schemadef layout="simpl" align="left">
		<name>Queue</name>
		<decl>
			<name>items</name>
			<dtype>&seq; <type>MSG</type>
			</dtype>
		</decl>
		<st/>
		<predicate>#items &leq; max</predicate>
	</schemadef>
	<schemadef layout="simpl" align="left">
		<name>QueueInit</name>
		<incl>
			<type>Queue</type>
		</incl>
		<st/>
		<predicate>items = &emptyseq;</predicate>
	</schemadef>
	<schemadef layout="simpl" align="left">
		<name>Add</name>
		<del>
			<type>Queue</type>
		</del>
		<decl>
			<name>item?</name>
			<dtype>
				<type>MSG</type>
			</dtype>
		</decl>
		<st/>
		<predicate>items' = items &cat; &lseq;item?&rseq;</predicate>
	</schemadef>
	<schemadef layout="simpl" align="left">
		<name>Delete</name>
		<del>
			<type>Queue</type>
		</del>
		<decl>
			<name>item!</name>
			<dtype>
				<type>MSG</type>
			</dtype>
		</decl>
		<st/>
		<predicate>items &neq; &emptyseq;</predicate>
		<predicate>items =&lseq;item!&rseq; &cat; items'</predicate>
	</schemadef>
	<schemadef layout="calc" align="left">
		<name>Penguin</name>
		<predcalc op="com">
			<type>Add</type>
			<type>Delete</type>
		</predcalc>
	</schemadef>
	<classdef layout="simpl" align="left">
		<name>Queue</name>
		<state>
			<decl>
				<name>items </name>
				<dtype>
					&seq; <type>MSG</type>
				</dtype>
			</decl>
			<st/>
			<predicate># items&leq;max</predicate>
		</state>
		<init>
			<predicate>items=&emptyseq;</predicate>
		</init>
		<op layout="simpl">
			<name>Add</name>
			<delta>items</delta>
			<decl>
				<name>item?</name>
				<dtype>
					<type>MSG</type>
				</dtype>
			</decl>
			<st/>
			<predicate>items'=items&cat;&lseq;item?&rseq;</predicate>
		</op>
		<op layout="simpl">
			<name>Delete</name>
			<delta>items</delta>
			<decl>
				<name>item!</name>
				<dtype>
					<type>MSG</type>
				</dtype>
			</decl>
			<st/>
			<predicate>items &neq; &emptyseq;</predicate>
			<predicate>items=&lseq;item!&rseq;&cat;items'</predicate>
		</op>
	</classdef>
	<classdef layout="simpl" align="left">
		<name>ActiveQueue</name>
		<inherit>
			<type>Queue</type>
		</inherit>
		<state>
			<decl>
				<name>Ti, Tj</name>
				<dtype>
					<type>T</type>
				</dtype>
			</decl>
			<decl>
				<name>in, out</name>
				<dtype>
					<type>&chan;</type>
				</dtype>
			</decl>
		</state>
		<op layout="calc">
			<name>Join</name>
			<predicate>[item:<type>MSG</type>] | #items &leq; max] &dot;in? items &tfun;Add &dot; DEADLINE Tj</predicate>
		</op>
		<op layout="calc">
			<name>Leave</name>
			<predicate>[item &neq; &emptyseq;] &dot; out! head(items) &tfun; Detete &dot; DEADLINE Tl</predicate>
		</op>
		<op layout="calc">
			<name>MAIN</name>
			<predicate>&mu;Q &dot; Join &extchoice; Leave; Q</predicate>
		</op>
	</classdef>
	<classdef layout="simpl" align="left">
		<name>TwoQueue</name>
		<state>
			<decl>
				<name>q1, q2</name>
				<dtype>
					<type>Queue</type>
				</dtype>
			</decl>
		</state>
		<op layout="calc">
			<name>Join</name>
			<predicate>q1.Add</predicate>
		</op>
		<op layout="calc">
			<name>Leave</name>
			<predicate>q2.Delete</predicate>
		</op>
		<op layout="calc">
			<name>Transfer</name>
			<predicate>q1.Delete &parallel; q2.Add</predicate>
		</op>
	</classdef>
	<classdef layout="simpl" align="left">
		<name>TwoActiveQueue</name>
		<state>
			<decl>
				<name>q1</name>
				<dtype>
					<type>ActiveQueue</type>[talk/out]
				</dtype>
			</decl>
			<decl>
				<name>q2</name>
				<dtype>
					<type>ActiveQueue</type>[talk/in]
				</dtype>
			</decl>
		</state>
		<op layout="calc">
			<name>MAIN</name>
			<predicate>&parallel; (q1 &netchl; talk &netchr; q2)</predicate>
		</op>
	</classdef>
</objectZnotation>