-- RealVec.mesa, an interface for dealing with vectors of real numbers
-- Last Modified On 16-Dec-81 11:59:57 By Paul Rovner

RealVec: DEFINITIONS =
 { Object: TYPE = RECORD[elements: SEQUENCE length: NAT OF REAL];
   Handle: TYPE = REF Object;
   
    -- convenient constructors  
   All: PROC[length: NAT, value: REAL ← 0.0] RETURNS[Handle];
   IndexVec: PROC[length: NAT] RETURNS[Handle];  -- h[0] = 0, h[n] = n

    -- convenient composition and extraction operations  
   SubVec: PROC[h: Handle, firstIndex, lastIndex: NAT] RETURNS[Handle];
   ConCat: PROC[h1, h2: Handle] RETURNS[Handle];

   SortOrder: PROC[h: Handle] RETURNS[perms: Handle];
    -- perms.elements[i] is the index in h of the ith smallest element
    -- i.e. (h.elements[perms.elements[i]] <= h.elements[perms.elements[i+1]])

   Permute: PROC[h: Handle, perms: Handle] RETURNS[Handle];
    -- h.elements[FixI[perms.elements[i]]] is put into ans.elements[i]   
    -- e.g., Permute[h, SortOrder[h]] produces a sorted version of h
    
   Smooth: PROC[h: Handle, nElements: NAT] RETURNS[Handle];
    -- nElements <= h.length.
    -- Result has averaged values as per some reasonable algorithm
   
    -- element-by-element operations  
   Add, Subtract, Multiply, Divide:
         PROC[h1, h2: Handle] RETURNS[Handle];
   
    -- scalar element-by-element operations  
   ScalarAdd, ScalarSubtract, ScalarMultiply, ScalarDivide:
         PROC[h: Handle, s: REAL] RETURNS[Handle];
   
   Equal: PROC[h1, h2: Handle] RETURNS[BOOLEAN];
   
   DotProduct: PROC[h1, h2: Handle] RETURNS[REAL];
   
-- SIGNALS
   LengthFault: ERROR[vec: Handle, expectedLength: NAT];
   
 }.