-- PiecewiseCubic.mesa
-- Michael Plass 

PiecewiseCubic: DEFINITIONS =
BEGIN

Handle: TYPE = LIST OF PieceRec; -- non-overlapping pieces in increasing order
PieceRec: TYPE = RECORD
       [domainStart, domainEnd: REAL,
	initValue, initSlope, finalSlope, finalValue: REAL];

Zero: PROCEDURE RETURNS [Handle];

Piece: PROCEDURE [domainStart, domainEnd: REAL,
		  initValue, initSlope, finalSlope, finalValue: REAL]
	RETURNS [Handle];

PieceProc: TYPE = PROCEDURE [p, q: PieceRec];

EnumerateCommonPieces: PROCEDURE [f: Handle, g: Handle, P: PieceProc] ;

Combine: PROCEDURE [a: REAL, f: Handle, b: REAL, g: Handle] RETURNS [Handle];
    -- calculates a*f + b*g

Eval: PROCEDURE [f: Handle, t: REAL] RETURNS [REAL];

EvalDeriv: PROCEDURE [f: Handle, t: REAL] RETURNS [REAL];

EvalDerivDeriv: PROCEDURE [f: Handle, t: REAL] RETURNS [REAL];

EvalAll: PROCEDURE [f: Handle, t: REAL] RETURNS [value,deriv,derivDeriv,derivDerivDeriv,domainStart,domainEnd: REAL];

END.