Merger is a generic interface defining an iterator for merging two
ordered sequences.
GENERIC INTERFACEMerger (Elem);
WhereElem.Tis a reference type andElemcontains
PROCEDURE Compare(a, b: Elem.T): [-1..1];Comparemust be a total order. It may be declared with a parameter mode of eitherVALUEorREADONLY, but notVAR.
TYPE
T <: Public;
Public = OBJECT METHODS
next(VAR a, b: Elem.T): BOOLEAN RAISES ANY;
compare(READONLY a, b: Elem.T): [-1..1];
getA(): Elem.T RAISES ANY := NIL;
getB(): Elem.T RAISES ANY := NIL;
END;
A Merger.T(Elem), or merger, is an iterator which yields successive
elements from a merge of two sorted input sequences. The merger
gets elements from the two input sequences by calling its methods
m.getA() and m.getB(). These methods are undefined by
default, and must be appropriately overridden through subtyping.
Each method must return the next element of its input sequence,
or NIL if the sequence is exhausted. The elements so returned
must be ordered as defined by m.compare(a, b).
The default implementation of m.compare(a, b) calls
Elem.Compare(a, b). It may be overridden if desired.
The elements of the merged sequence are obtained by calls to
m.next(a, b). This method returns FALSE when the merged
sequence is exhausted; otherwise, it returns TRUE. The VAR
parameters a and/or b are set to the next element of the merged
sequence, depending on which input sequence it came from. If the
elements from the two input sequences are equal according to
m.compare(a, b), then both a and b are set. Otherwise,
one of them is set to NIL.
The RAISES set for the next method is the union of the RAISES
sets of getA and getB.
END Merger.