-- RefAnyStream.mesa: an interface for applications
--                    of a simple REF ANY stream abstraction
-- Last Modified On 21-Jan-82 12:03:03 By Paul Rovner

RefAnyStream: DEFINITIONS =
 { 

--TYPEs
   Handle: TYPE = REF Object;

   Object: TYPE = RECORD[
        procs: ObjectProcsHandle,
	data: REF ANY ← NIL
	];
     
   ObjectProcsHandle: TYPE = REF ObjectProcs;

   ObjectProcs: TYPE = RECORD[
        get: PROC[Handle] RETURNS[REF ANY],
	put: PROC[Handle, REF ANY],
	putBack: PROC[Handle, REF ANY],
	flush: PROC[Handle],
	close: PROC[Handle],
	endOf: PROC[Handle] RETURNS[BOOLEAN], 
	empty: PROC[Handle] RETURNS[BOOLEAN]
	];


-- ERRORs

Error: ERROR [ec: ErrorCode];
ErrorCode: TYPE = {

	NotImplementedForThisStream,
	 
	EndOfStream,
	  -- attempt to do a get at end of stream
	
	StreamClosed,
	  -- raised by operations after close (except flush, reset, close.)
	
	BadIndex
	  --negative length or index to SetIndex
	};


-- PROCs
-- These are here for convenience. They are examples of
-- PROCs that create RefAnyStream.Objects. They use PORTs
-- in their implementations.

CreateCoForkedProducerStream:
  PROC[producer: PROC[self: REF ANY, sink: Handle--for use by the producer--],
       data: REF ANY]
   RETURNS[Handle--for use by the consumer--];
   
CreateCoForkedConsumerStream:
  PROC[consumer: PROC[self: REF ANY, source: Handle--for use by the consumer--],
       data: REF ANY]
   RETURNS[Handle--for use by the producer--];
   


 }.