::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
class Gilda.Container.Public  &Containers included in the Basis library.
         public Gilda
:
:...............................................................................



::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::  Heap procedures  ::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:::::::::::::::::::::::::::::  Heap(string)  :::::::::::::::::::::::::::::::::::
:
sequence HEAP..Heap..string  pure:  Scan a Heap from the bottom up.

 entry Heap  Heap..string,      &Heap to scan

       Start = 0   word         :First element to access; 0 is the bottom

  exit *Element    string       :At each element on the Heap
:
:...............................................................................
:
function INDEX..Heap..Heap..string:  Index to the next element up the Heap.

 entry ~Heap..Heap..string      :Iterator

  exit Count  word              :Number of elements yielded so far
:
:...............................................................................
:
function IS.LAST..Heap..Heap..string:  See if this is the last element in a Heap.

 entry ~Heap..Heap..string      :Iterator

  exit Last   Bit               :Set if the last element.
:
:  Note:  Call within a loop to check for the final iteration.
:...............................................................................
:
method PRIOR..Heap..Heap..string  pure:  Reposition to the next lower element in an open iteration.

change ~Heap..Heap..string      :Iterator

  exit *Prior    string         :At the next lower element; 0 if none below or done
:
:...............................................................................
:
method SUSPEND..Heap..Heap..string  pure:  Save the index to the next element up and terminate.

change ~Heap..Heap..string      :Iterator

  exit Count   word             :Number of elements yielded so far
:
:...............................................................................
:
method MOVE..Heap..Heap..string  pure:  Reset the index to the next element to yield.

change ~Heap..Heap..string      :Iterator

 entry Next   word              :Index to the next element to yield
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
sequence DEPLETE..Heap..string  pure:  Remove elements from the top to bottom of a Heap.

change Heap..string             :Heap to deplete

  exit *Element   string        :At each element in the Heap
:
:...............................................................................
:
method PILE..Heap..string  pure:  Add an element on top of a Heap.

change Heap..string             :Heap to append

 entry Value      string        :Value copied into the new element
:
:...............................................................................
:
method PILE.AT..Heap..string  pure:  Allocate a clean element on top of a Heap.

change Heap..string             :Heap to append

  exit *Element   string        :At the allocated element
:
:...............................................................................
:
function HEAD..Heap..string:  Copy the top element in a Heap.

 entry Heap..string             :Heap to access

  exit Value   string           :Value copied from the top element

precondition
   $Size  fault;                   Cannot get the top element of an empty Heap.
.
:...............................................................................
:
function HEAD.AT..Heap..string:  Reference the top element in a Heap.

 entry Heap..string             :Heap to access

  exit *Element   string        :At the element on the top; @0 if empty
:
:...............................................................................
:
function TAIL..Heap..string:  Copy the bottom element in a Heap.

 entry Heap..string             :Heap to access

  exit Value   string           :Value copied from the bottom element

precondition
   $Size  fault;                   Cannot get the bottom element of an empty Heap.
.
:...............................................................................
:
function TAIL.AT..Heap..string:  Reference the bottom element in a Heap.

 entry Heap..string             :Heap to access

  exit *Element   string        :At the element on the bottom; @0 if empty
:
:...............................................................................
:
function PEEK..Heap..string:  Copy an indexed element from a Heap.

 entry Heap..string,            &Heap to access
       Index = 0   word         :Element to access; 0 is the bottom

  exit Value       string       :Value copied from the selected element

precondition
   $Size  fault;                   Cannot peek into an empty Heap.
   Index _< $Size  fault Index;    Cannot peek with an index above a Heap.
.
:...............................................................................
:
function PEEK.AT..Heap..string:  Reference an indexed element in a Heap.

 entry Heap..string,            &Heap to access
       Index = 0   word         :Element to access; @0 is the bottom

  exit *Element    string       :At the selected element

precondition
   $Size  fault;                   Cannot peek into an empty Heap.
   Index _< $Size  fault Index;    Cannot peek with an index above a Heap.
.
:...............................................................................
:
function FIND..Heap..string:  Scan a Heap bottom up for a value and return its index.

 entry Heap..string,            &Heap to be scanned
       Value   string           :Value to be found

  exit Index   word             :0 based Index from the bottom; -1 if not found
:
:...............................................................................
:
function FIND.AT..Heap..string:  Scan a Heap for a value and return the element if present.

 entry Heap..string,            &Heap to be scanned
       Value     string         :Value to be found

  exit *Element  string         :At the first element found; @0 if not found
:
:...............................................................................
:
method REMOVE..Heap..string  pure:  Remove elements from the top of a Heap.

change Heap..string             :Heap containing element to remove

 entry Count = 1  word          :Number of elements to remove; may be zero

precondition
   $Size  or  Remove = 0  fault;   Cannot remove elements from an empty Heap.
   Remove _<= $Size       fault;   Tried to remove too many elements from a Heap.
.
:...............................................................................
:
method STORE..Heap..string  pure:  Copy a value into an existing Heap element.

change Heap..string             :Heap to update

 entry Index    word,           &Index of the element, zero-based
       Value    string          :Value to store in the selected element
:
:...............................................................................
:
method EMPTY..Heap..string  pure:  Remove all elements in a Heap.

change Heap..string             :Heap to empty
:
:...............................................................................
:
method DRAIN..Heap..string  pure:  Free resources used by a Heap.

change Heap..string             :Heap to drain
:
:...............................................................................



::::::::::::::::::::::::::::::  Heap(word)  ::::::::::::::::::::::::::::::::::::
:
sequence HEAP..Heap..word  pure:  Scan a Heap from the bottom up.

 entry Heap  Heap..word,        &Heap to scan
       Start = 0   word         :First element to access; 0 is the bottom

  exit *Element    word         :At each element on the Heap
:
:...............................................................................
:
function INDEX..Heap..Heap..word:  Index to the next element up the Heap.

 entry ~Heap..Heap..word        :Iterator

  exit Count  word              :Number of elements yielded so far
:
:...............................................................................
:
function IS.LAST..Heap..Heap..word:  See if this is the last element in a Heap.

 entry ~Heap..Heap..word        :Iterator

  exit Last   Bit               :Set if the last element.
:
:...............................................................................
:
method PRIOR..Heap..Heap..word  pure:  Reposition to the next lower element in an open iteration.

change ~Heap..Heap..word        :Iterator

  exit *Prior    word           :At the next lower element; 0 if none below or done
:
:...............................................................................
:
method SUSPEND..Heap..Heap..word  pure:  Save the index to the next element up and terminate.

change ~Heap..Heap..word        :Iterator

  exit Index   word             :Number of elements yielded so far
:
:...............................................................................
:
method MOVE..Heap..Heap..word  pure:  Reset the index to the next element to yield.

change ~Heap..Heap..word        :Iterator

 entry Next   word              :Index to the next element to yield
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
sequence DEPLETE..Heap..word  pure:  Remove elements from the top to bottom of a Heap.

change Heap..word               :Heap to deplete

  exit *Element   word          :At each element in the Heap
:
:...............................................................................
:
method PILE..Heap..word  pure:  Add an element on top of a Heap.

change Heap..word               :Heap to append

 entry Value   word             :Value copied to the new element
:
:...............................................................................
:
method PILE.AT..Heap..word  pure:  Allocate a clean element on top of a Heap.

change Heap..word               :Heap to append

  exit *Element   word          :At the allocated element
:
:...............................................................................
:
function HEAD..Heap..word:  Copy the top element on a Heap.

 entry Heap..word               :Heap to access

  exit Value     word           :Value copied from the top element

precondition
   $Size  fault;                   Cannot get the top element of an empty Heap.
.
:...............................................................................
:
function HEAD.AT..Heap..word:  Reference the top element on a Heap

 entry Heap..word               :Heap to access

  exit *Element  word           :At the element on the top; @0 if empty
:
:...............................................................................
:
function TAIL..Heap..word:  Copy the bottom element on a Heap.

 entry Heap..word               :Heap to access

  exit Value   word             :Value copied from the bottom element

precondition
   $Size  fault;                   Cannot get the bottom element of an empty Heap.
.
:...............................................................................
:
function TAIL.AT..Heap..word:  Reference the bottom element of a Heap.

 entry Heap..word               :Heap to access

  exit *Element   word          :At the element on the bottom; @0 if empty
:
:...............................................................................
:
function PEEK..Heap..word:  Copy an element from the bottom of a Heap.

 entry Heap..word,              &Heap to access
       Index = 0  word          :Element to access; 0 is the bottom

  exit Value      word          :Value copied from the selected element

precondition
   $Size  fault;                   Cannot peek into an empty Heap.
   Index _< $Size  fault Index;    Cannot peek with an index above a Heap.
.
:...............................................................................
:
function PEEK.AT..Heap..word:  Reference an indexed element in a Heap.

 entry Heap..word,              &Heap to access
       Index = 0  word          :Element to access; 0 is the bottom

  exit *Element   word          :At the selected element

precondition
   $Size  fault;                   Cannot peek into an empty Heap.
   Index _< $Size  fault Index;    Cannot peek with an index above a Heap.
.
:...............................................................................
:
function FIND..Heap..word:  Scan a Heap bottom up for a value and return its index.

 entry Heap..word,              &Heap to be scanned
       Value   word             :Value to be found

  exit Index   word             :0 based Index to the first element found; -1 if not found
:
:...............................................................................
:
function FIND.AT..Heap..word:  Scan a Heap for a value and return the element if present.

 entry Heap..word,              &Heap to be scanned
       Value     word           :Value to be found

  exit *Element  word           :At the first element found; @0 if not found
:
:...............................................................................
:
method REMOVE..Heap..word  pure:  Remove elements from the top of a Heap.

change Heap..word               :Heap containing element to remove

 entry Remove = 1  word         :Number of elements to remove; may be zero

precondition
   $Size  or  Remove = 0  fault;   Cannot remove elements from an empty Heap.
   Remove _<= $Size       fault;   Tried to remove too many elements from a Heap.
.
:...............................................................................
:
method STORE..Heap..word  pure:  Shallow copy into an existing Heap element.

change Heap..word               :Heap to update

 entry Index    word,           &Index of the element, zero-based
       Value    word            :Value to store in the selected element
:
:...............................................................................
:
method EMPTY..Heap..word  pure:  Remove all elements in a Heap.

change Heap..word               :Heap to empty
:
:...............................................................................
:
method DRAIN..Heap..word  pure:  Free resources used by a Heap.

change Heap..word               :Heap to drain
:
:...............................................................................



::::::::::::::::::::::::::::::  Heap(cell)  ::::::::::::::::::::::::::::::::::::
:
sequence HEAP..Heap..cell  pure:  Scan a Heap from the bottom up.

 entry Heap  Heap..cell,        &Heap to scan
       Start = 0   word         :First element to access; 0 is the bottom

  exit *Element    cell         :At each element on the Heap
:
:...............................................................................
:
function INDEX..Heap..Heap..cell:  Index to the next element up the Heap.

 entry ~Heap..Heap..cell        :Iterator

  exit Count  word              :Number of elements yielded so far
:
:...............................................................................
:
function IS.LAST..Heap..Heap..cell:  See if this is the last element in a Heap.

 entry ~Heap..Heap..cell        :Iterator

  exit Last   Bit               :Set if the last element.
:
:...............................................................................
:
method PRIOR..Heap..Heap..cell  pure:  Reposition to the next lower element in an open iteration.

change ~Heap..Heap..cell        :Iterator

  exit *Prior    cell           :At the next lower element; 0 if none below or done
:
:...............................................................................
:
method SUSPEND..Heap..Heap..cell  pure:  Save the index to the next element up and terminate.

change ~Heap..Heap..cell        :Iterator

  exit Count   word             :Number of elements yielded so far
:
:...............................................................................
:
method MOVE..Heap..Heap..cell  pure:  Reset the index to the next element to yield.

change ~Heap..Heap..cell        :Iterator

 entry Next   word              :Index to the next element to yield
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
sequence DEPLETE..Heap..cell  pure:  Remove elements from the top to bottom of a Heap.

change Heap..cell               :Heap to deplete

  exit *Element   cell          :At each element in the Heap
:
:...............................................................................
:
method PILE..Heap..cell  pure:  Add an element on top of a Heap.

change Heap..cell               :Heap to append

 entry Value   cell             :Value copied to the new element
:
:...............................................................................
:
method PILE.AT..Heap..cell  pure:  Allocate a clean element on top of a Heap.

change Heap..cell               :Heap to append

  exit *Element   cell          :At the allocated element
:
:...............................................................................
:
function HEAD..Heap..cell:  Copy the top element of a Heap.

 entry Heap..cell               :Heap to access

  exit Value    cell            :Value copied from the top element

precondition
   $Size  fault;                   Cannot get the top element of an empty Heap.
.
:...............................................................................
:
function HEAD.AT..Heap..cell:  Reference the top element on a Heap

 entry Heap..cell               :Heap to access

  exit *Element  cell           :At the element on the top; @0 if empty
:
:...............................................................................
:
function TAIL..Heap..cell:  Copy the bottom element on a Heap.

 entry Heap..cell               :Heap to access

  exit Value   cell             :Value copied from the bottom element

precondition
   $Size  fault;                   Cannot get the bottom element of an empty Heap.
.
:...............................................................................
:
function TAIL.AT..Heap..cell:  Reference the bottom element on a Heap.

 entry Heap..cell               :Heap to access

  exit *Element   cell          :At the element on the bottom; @0 if empty
:
:...............................................................................
:
function PEEK..Heap..cell:  Copy an indexed element from in a Heap.

 entry Heap..cell,              &Heap to access
       Index = 0  word          :Element to access; 0 is the bottom

  exit Value      cell          :Value copied from the selected element

precondition
   $Size  fault;                   Cannot peek into an empty Heap.
   Index _< $Size  fault Index;    Cannot peek with an index above a Heap.
.
:...............................................................................
:
function PEEK.AT..Heap..cell:  Reference an element in a Heap.

 entry Heap..cell,              &Heap to access
       Index = 0  word          :Element to access; 0 is the bottom

  exit *Element   cell          :At the selected element

precondition
   $Size  fault;                   Cannot peek into an empty Heap.
   Index _< $Size  fault Index;    Cannot peek with an index above a Heap.
.
:...............................................................................
:
function FIND..Heap..cell:  Scan a Heap bottom up for a value and return its index.

 entry Heap..cell,              &Heap to be scanned
       Value   cell             :Value to be found

  exit Index   word             :0 based Index to the first element found; -1 if not found
:
:...............................................................................
:
function FIND.AT..Heap..cell:  Scan a Heap for a value and return the element if present.

 entry Heap..cell,              &Heap to be scanned
       Value     cell           :Value to be found

  exit *Element  cell           :At the first element found; @0 if not found
:
:...............................................................................
:
method REMOVE..Heap..cell  pure:  Remove elements from the top of a Heap.

change Heap..cell               :Heap containing element to remove

 entry Remove = 1  word         :Number of elements to remove; may be zero

precondition
   $Size  or  Remove = 0  fault;   Cannot remove elements from an empty Heap.
   Remove _<= $Size       fault;   Tried to remove too many elements from a Heap.
.
:...............................................................................
:
method STORE..Heap..cell  pure:  Shallow copy into an existing Heap element.

change Heap..cell               :Heap to update

 entry Index    word,           &Index of the element, zero-based
       Value    cell            :Value to store in the selected element
:
:...............................................................................
:
method EMPTY..Heap..cell  pure:  Remove all elements in a Heap.

change Heap..cell               :Heap to empty
:
:...............................................................................
:
method DRAIN..Heap..cell  pure:  Free resources used by a Heap.

change Heap..cell               :Heap to drain
:
:...............................................................................



::::::::::::::::::::::::::::::  Heap(byte)  ::::::::::::::::::::::::::::::::::::
:
sequence HEAP..Heap..byte  pure:  Scan a Heap from the bottom up.

 entry Heap  Heap..byte,        &Heap to scan
       Start = 0   word         :First element to access; 0 is the bottom

  exit *Element    byte         :At each element on the Heap
:
:...............................................................................
:
function INDEX..Heap..Heap..byte:  Index to the next element up the Heap.

 entry ~Heap..Heap..byte        :Iterator

  exit Count  word              :Number of elements yielded so far
:
:...............................................................................
:
function IS.LAST..Heap..Heap..byte:  See if this is the last element in a Heap.

 entry ~Heap..Heap..byte        :Iterator

  exit Last   Bit               :Set if the last element.
:
:...............................................................................
:
method PRIOR..Heap..Heap..byte  pure:  Reposition to the next lower element in an open iteration.

change ~Heap..Heap..byte        :Iterator

  exit *Prior    byte           :At the next lower element; 0 if none below or done
:
:...............................................................................
:
method SUSPEND..Heap..Heap..byte  pure:  Save the index to the next element up and terminate.

change ~Heap..Heap..byte        :Iterator

  exit Index   word             :Number of elements yielded so far
:
:...............................................................................
:
method MOVE..Heap..Heap..byte  pure:  Reset the index to the next element to yield.

change ~Heap..Heap..byte        :Iterator

 entry Next   word              :Index to the next element to yield
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
sequence DEPLETE..Heap..byte  pure:  Remove elements from the top to bottom of a Heap.

change Heap..byte               :Heap to deplete

  exit *Element   byte          :At each element in the Heap
:
:...............................................................................
:
method PILE..Heap..byte  pure:  Add an element on top of a Heap.

change Heap..byte               :Heap to append

 entry Value   byte             :Value copied into the new element
:
:...............................................................................
:
method PILE.AT..Heap..byte  pure:  Allocate a clean element on top of a Heap.

change Heap..byte               :Heap to append

  exit *Element   byte          :At the allocated element
:
:...............................................................................
:
function HEAD..Heap..byte:  Copy the top element in a Heap.

 entry Heap..byte               :Heap to access

  exit Value    byte            :Value copied from the top element

precondition
   $Size  fault;                   Cannot get the top element of an empty Heap.
.
:...............................................................................
:
function HEAD.AT..Heap..byte:  Reference the top element in a Heap

 entry Heap..byte               :Heap to access

  exit *Element  byte           :At the element on the top; @0 if empty
:
:...............................................................................
:
function TAIL..Heap..byte:  Copy the bottom element in a Heap.

 entry Heap..byte               :Heap to access

  exit Value   byte             :Value copied from the bottom element

precondition
   $Size  fault;                   Cannot get the bottom element of an empty Heap.
.
:...............................................................................
:
function TAIL.AT..Heap..byte:  Reference the bottom element on a Heap.

 entry Heap..byte               :Heap to access

  exit *Element   byte          :At the bottom element; @0 if empty
:
:...............................................................................
:
function PEEK..Heap..byte:  Copy an indexed element from the bottom of a Heap.

 entry Heap..byte,              &Heap to access
       Index = 0  word          :Element to access; 0 is the bottom

  exit Value      byte          :Value copied from the selected element

precondition
   $Size  fault;                   Cannot peek into an empty Heap.
   Index _< $Size  fault Index;    Cannot peek with an index above a Heap.
.
:...............................................................................
:
function PEEK.AT..Heap..byte:  Reference an indexed element in a Heap.

 entry Heap..byte,              &Heap to access
       Index = 0  word          :Element to access; 0 is the bottom

  exit *Element   byte          :At the selected element

precondition
   $Size  fault;                   Cannot peek into an empty Heap.
   Index _< $Size  fault Index;    Cannot peek with an index above a Heap.
.
:...............................................................................
:
function FIND..Heap..byte:  Scan a Heap bottom up for a value and return its index.

 entry Heap..byte,              &Heap to be scanned
       Value   byte             :Value to be found

  exit Index   word             :0 based Index from the bottom; -1 if not found
:
:...............................................................................
:
function FIND.AT..Heap..byte:  Scan a Heap for a value and return the element if present.

 entry Heap..byte,              &Heap to be scanned
       Value     byte           :Value to be found

  exit *Element  byte           :At the first element found; @0 if not found
:
:...............................................................................
:
method REMOVE..Heap..byte  pure:  Remove elements from the top of a Heap.

change Heap..byte               :Heap containing element to remove

 entry Remove = 1  byte         :Number of elements to remove; may be zero

precondition
   $Size  or  Remove = 0  fault;   Cannot remove elements from an empty Heap.
   Remove _<= $Size       fault;   Tried to remove too many elements from a Heap.
.
:...............................................................................
:
method STORE..Heap..byte  pure:  Shallow copy into an existing Heap element.

change Heap..byte               :Heap to update

 entry Index    word,           &Index of the element, zero-based
       Value    byte            :Value to store in the selected element
:
:...............................................................................
:
method EMPTY..Heap..byte  pure:  Remove all elements in a Heap.

change Heap..byte               :Heap to empty
:
:...............................................................................
:
method DRAIN..Heap..byte  pure:  Free resources used by a Heap.

change Heap..byte               :Heap to drain
:
:...............................................................................



:::::::::::::::::::::::::::  Heap(Key..word)  ::::::::::::::::::::::::::::::::::
:
sequence HEAP..Heap..Key..word  pure:  Scan a Heap from the bottom up.

 entry Heap  Heap..Key..word,   &Heap to scan
       Start = 0   word         :First element to access; 0 is the bottom

  exit *Element    Key..word    :At each element on the Heap
:
:...............................................................................
:
function INDEX..Heap..Heap..Key..word:  Index to the next element up the Heap.

 entry ~Heap..Heap..Key..word   :Iterator

  exit Count  word              :Number of elements yielded so far
:
:...............................................................................
:
function IS.LAST..Heap..Heap..Key..word:  See if this is the last element in a Heap.

 entry ~Heap..Heap..Key..word   :Iterator

  exit Last   Bit               :Set if the last element.
:
:...............................................................................
:
method PRIOR..Heap..Heap..Key..word  pure:  Reposition to the next lower element in an open iteration.

change ~Heap..Heap..Key..word   :Iterator

  exit *Prior    Key..word      :At the next lower element; 0 if none below or done
:
:...............................................................................
:
method SUSPEND..Heap..Heap..Key..word  pure:  Save the index to the next element up and terminate.

change ~Heap..Heap..Key..word   :Iterator

  exit Count  word              :Number of elements yielded so far
:
:...............................................................................
:
method MOVE..Heap..Heap..Key..word  pure:  Reset the index to the next element to yield.

change ~Heap..Heap..Key..word   :Iterator

 entry Next   word              :Index to the next element to yield
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
sequence DEPLETE..Heap..Key..word  pure:  Remove elements from the top to bottom of a Heap.

change Heap..Key..word          :Heap to deplete

  exit *Element   Key..word     :At each element in the Heap
:
:...............................................................................
:
method PILE..Heap..Key..word  pure:  Add an element on top of a Heap.

change Heap..Key..word          :Heap to append

 entry Value   Key..word        :Element value to copy
:
:...............................................................................
:
method PILE.AT..Heap..Key..word  pure:  Allocate a clean element on top of a Heap.

change Heap..Key..word          :Heap to append

  exit *Element   Key..word     :At the allocated element
:
:...............................................................................
:
function HEAD..Heap..Key..word:  Copy the top element on a Heap.

 entry Heap..Key..word          :Heap to access

  exit Value    Key..word       :Value copied from the top element

precondition
   $Size  fault;                   Cannot get the top element of an empty Heap.
.
:...............................................................................
:
function HEAD.AT..Heap..Key..word:  Reference the top element on a Heap

 entry Heap..Key..word          :Heap to access

  exit *Element  Key..word      :At the element on the top; @0 if empty
:
:...............................................................................
:
function TAIL..Heap..Key..word:  Copy the bottom element on a Heap.

 entry Heap..Key..word          :Heap to access

  exit Value   Key..word        :Value copied from the bottom element

precondition
   $Size  fault;                   Cannot get the bottom element of an empty Heap.
.
:...............................................................................
:
function TAIL.AT..Heap..Key..word:  Reference the bottom element on a Heap.

 entry Heap..Key..word          :Heap to access

  exit *Element   Key..word     :At the element on the bottom; @0 if empty
:
:...............................................................................
:
function PEEK..Heap..Key..word:  Copy an element from the bottom of a Heap.

 entry Heap..Key..word,         &Heap to access
       Index = 0  word          :Element to access; 0 is the bottom

  exit Value      Key..word     :Value copied from the selected element

precondition
   $Size  fault;                   Cannot peek into an empty Heap.
   Index _< $Size  fault Index;    Cannot peek with an index above a Heap.
.
:...............................................................................
:
function PEEK.AT..Heap..Key..word:  Access an element from the bottom of a Heap.

 entry Heap..Key..word,         &Heap to access
       Index = 0  word          :Element to access; 0 is the bottom

  exit *Element   Key..word     :At the selected element

precondition
   $Size  fault;                   Cannot peek into an empty Heap.
   Index _< $Size  fault Index;    Cannot peek with an index above a Heap.
.
:...............................................................................
:
function FIND..Heap..Key..word:  Scan a Heap bottom up for a value and return its index.

 entry Heap..Key..word,         &Heap to be scanned
       Value   Key..word        :Value to be found

  exit Index   word             :0 based Index from the bottom; -1 if not found
:
:...............................................................................
:
function FIND.AT..Heap..Key..word:  Scan a Heap for a value and return the element if present.

 entry Heap..Key..word,         &Heap to be scanned
       Value     Key..word      :Value to be found

  exit *Element  Key..word      :At the first element found; @0 if not found
:
:...............................................................................
:
method STORE..Heap..Key..word  pure:  Shallow copy into an existing Heap element.

change Heap..Key..word          :Heap to update

 entry Index    word,           &Index of the element, zero-based
       Value    Key..word       :Value to store in the selected element
:
:...............................................................................
:
method REMOVE..Heap..Key..word  pure:  Remove elements from the top of a Heap.

change Heap..Key..word          :Heap containing element to remove

 entry Remove = 1  word         :Number of elements to remove; may be zero

precondition
   $Size  or  Remove = 0  fault;   Cannot remove elements from an empty Heap.
   Remove _<= $Size       fault;   Tried to remove too many elements from a Heap.
.
:...............................................................................
:
method EMPTY..Heap..Key..word  pure:  Remove all elements in a Heap.

change Heap..Key..word          :Heap to empty
:
:...............................................................................
:
method DRAIN..Heap..Key..word  pure:  Free resources used by a Heap.

change Heap..Key..word          :Heap to drain
:
:...............................................................................



::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::  Stack procedures  ::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::  Stack(string)  :::::::::::::::::::::::::::::::::::
:
sequence STACK..Stack..string  pure:  Scan a Stack from the top down.

 entry Stack..string,           &Stack to scan
       Index = 0   word         :First element to access; 0 is the top

  exit *Element    string       :At each element on the Stack
:
:...............................................................................
:
method SUSPEND..Stack..Stack..string:  Save the index to the next element down the Stack.

change ~Stack..Stack..string    :Iterator

  exit Count   word             :Number of values yielded so far
:
:...............................................................................
:
function IS.LAST..Stack..string:  See if the sequence has returned it's last value.

 entry ~Stack..Stack..string    :Iterator

  exit Last    Bit              :Set if the sequence has no more values.
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
sequence DEPLETE..Stack..string  pure:  Remove elements from the top to bottom of a Stack.

change Stack..Stack..string     :Stack to deplete

  exit *Element      string     :At each element in the Stack
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
method PUSH..Stack..string  pure:  Add an element to the top of a Stack.

change Stack..string            :Stack to prepend

 entry Value   string           :Value to copy into the new element
:
:...............................................................................
:
method PUSH.AT..Stack..string  pure:  Allocate a clean element on top of a Stack.

change Stack..string            :Stack to prepend

  exit *Element   string        :At the allocated element
:
:...............................................................................
:
method POP..Stack..string  pure:  Copy the top element in a Stack then remove it.

change Stack..string            :Stack to pop

  exit Value   string           :Value copied from the top element

precondition
   $Size  fault;                   Cannot get the top element of an empty Stack.
.
:...............................................................................
:
method POP.AT..Stack..string  pure:  Remove the top element and access the next top element in a Stack .

change Stack..string            :Stack to pop

  exit *Element   string        :At the next top element; @0 if no next element

precondition
   $Size  fault;                   Cannot get the top element of an empty Stack.
.
:...............................................................................
:
method HEAD..Stack..string  pure:  Copy the top element on a Stack.

 entry Stack..string            :Stack to access

  exit Value  string            :Value copied from the top element

precondition
   $Size  fault;                   Cannot get the top element of an empty Stack.
.
:...............................................................................
:
function HEAD.AT..Stack..string:  Reference the top element in a Stack.

 entry Stack..string            :Stack to access

  exit *Element   string        :At the element on the top; @0 if empty
:
:...............................................................................
:
function PEEK..Stack..string:  Copy an indexed element in a Stack.

 entry Stack..string,           &Stack to access
       Index = 0  word          :Element to access; 0 is the top

  exit Value    string          :Value copied from the selected element

precondition
   $Size  fault;                   Cannot peek into an empty Stack.
   Index _< $Size  fault Index;    Cannot peek with an index above a Stack.
.
:...............................................................................
:
function PEEK.AT..Stack..string:  Reference an indexed element in a Stack.

 entry Stack..string,           &Stack to access
       Index = 0  word          :Element to access; 0 is the top

  exit *Element   string        :At the selected element

precondition
   $Size  fault;                   Cannot peek into an empty Stack.
   Index _< $Size  fault Index;    Cannot peek with an index below a Stack.
.
:...............................................................................
:
function FIND..Stack..string:  Determine if a value is in a Stack in linear time.

 entry Stack..string,           &Stack to be scanned
       Value   string           :Value to be found

  exit Index   word             :0 based Index from the top; -1 if not found
:
:...............................................................................
:
method STORE..Stack..string  pure:  Copy a value into an existing Stack element.

change Stack..string            :Stack to update

 entry Index = 0  word,         &Index of the element; 0 is the top
       Value      string        :Value to copy into the selected element
:
:...............................................................................
:
method REMOVE..Stack..string  pure:  Remove elements from the top of a Stack.

change Stack..string            :Stack containing element to remove

 entry Remove = 1  word         :Number of elements to remove; may be zero

precondition
   $Size  or  Remove = 0  fault;   Cannot remove elements from an empty Stack.
   Remove _<= $Size       fault;   Tried to remove too may elements from a Stack.
.
:...............................................................................
:
method EMPTY..Stack..string  pure:  Remove all elements in a Stack.

change Stack..string            :Stack to empty
:
:...............................................................................
:
method DRAIN..Stack..string  pure:  Free resources used by a Stack.

change Stack..string            :Stack to drain
:
:...............................................................................




::::::::::::::::::::::::::::  Stack(word)  :::::::::::::::::::::::::::::::::::::
:
sequence STACK..Stack..word  pure:  Scan a Stack from the top down.

 entry Stack..word,             &Stack to scan
       Index = 0   word         :First element to access; 0 is the top

  exit *Element    word         :At each element on the Stack
:
:...............................................................................
:
method SUSPEND..Stack..Stack..word:  Save the index to the next element down the Stack.

change ~Stack..Stack..word      :Iterator

  exit Index   word             :Number of values yielded so far.
:
:...............................................................................
:
function IS.LAST..Stack..word:  See if the sequence has returned it's last value.

 entry ~Stack..Stack..word      :Iterator

  exit Last    Bit              :Set if the sequence has no more values.
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
sequence DEPLETE..Stack..word  pure:  Remove elements from the top to bottom of a Stack.

change Stack..Stack..word       :Stack to deplete

  exit *Element      word       :At each element in the Stack
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
method PUSH..Stack..word  pure:  Add an element to the top of a Stack.

change Stack..word              :Stack to prepend

 entry Value   word             :Value to copy into the new element
:
:...............................................................................
:
method PUSH.AT..Stack..word  pure:  Allocate a clean element on top of a Stack.

change Stack..word              :Stack to prepend

  exit *Element   word          :At the allocated element
:
:...............................................................................
:
method POP..Stack..word  pure:  Copy the top element in a Stack then remove it.

change Stack..word              :Stack to pop

  exit Value   word             :Value copied from the top element

precondition
   $Size  fault;                   Cannot get the top element of an empty Stack.
.
:...............................................................................
:
method POP.AT..Stack..word  pure:  Remove the top element and access the next top element in a Stack .

change Stack..word              :Stack to pop

  exit *Element   word          :At the next top element; @0 if no next element

precondition
   $Size  fault;                   Cannot get the top element of an empty Stack.
.
:...............................................................................
:
method HEAD..Stack..word  pure:  Copy the top element on a Stack.

 entry Stack..word              :Stack to access

  exit Value   word             :Value copied from the top element

precondition
   $Size  fault;                   Cannot get the top element of an empty Stack.
.
:...............................................................................
:
function HEAD.AT..Stack..word:  Refernce the top element in a Stack.

 entry Stack..word              :Stack to access

  exit *Element   word          :At the element on the top; @0 if empty
:
:...............................................................................
:
function PEEK..Stack..word:  Copy an indexed Stack element.

 entry Stack..word,             &Stack to access
       Index = 0  word          :Element to access; 0 is the top

  exit Value      word          :Value copied from the selected element

precondition
   $Size  fault;                   Cannot peek into an empty Stack.
   Index _< $Size  fault Index;    Cannot peek with an index below a Stack.
.
:...............................................................................
:
function PEEK.AT..Stack..word:  Reference an indexed Stack element.

 entry Stack..word,             &Stack to access
       Index = 0  word          :Element to access; 0 is the top

  exit *Element   word          :At the selected element

precondition
   $Size  fault;                   Cannot peek into an empty Stack.
   Index _< $Size  fault Index;    Cannot peek with an index below a Stack.
.
:...............................................................................
:
function FIND..Stack..word:  Determine if a value is in a Stack in linear time.

 entry Stack..word,             &Stack to be scanned
       Value   word             :Value to be found

  exit Index   word             :0 based Index from the top; -1 if not found
:
:...............................................................................
:
method STORE..Stack..word  pure:  Copy a value into an existing Stack element.

change Stack..word              :Stack to update

 entry Index = 0  word,         &Index of the element; 0 is the top
       Value      word          :Value to copy into the selected element
:
:...............................................................................
:
method REMOVE..Stack..word  pure:  Remove elements from the top of a Stack.

change Stack..word              :Stack containing element to remove

 entry Remove = 1  word         :Number of elements to remove; may be zero

precondition
   $Size  or  Remove = 0  fault;   Cannot remove elements from an empty Stack.
   Remove _<= $Size       fault;   Tried to remove too may elements from a Stack.
.
:...............................................................................
:
method EMPTY..Stack..word  pure:  Remove all elements in a Stack.

change Stack..word              :Stack to empty
:
:...............................................................................
:
method DRAIN..Stack..word  pure:  Free resources used by a Stack.

change Stack..word              :Stack to drain
:
:...............................................................................



::::::::::::::::::::::::::::  Stack(cell)  :::::::::::::::::::::::::::::::::::::
:
sequence STACK..Stack..cell  pure:  Scan a Stack from the top down.

 entry Stack..cell,             &Stack to scan
       Index = 0   word         :First element to access; 0 is the top

  exit *Element    cell         :At each element on the Stack
:
:...............................................................................
:
method SUSPEND..Stack..Stack..cell:  Save the index to the next element down the Stack.

change ~Stack..Stack..cell      :Iterator

  exit Count   word             :Number of values yielded so far.
:
:...............................................................................
:
function IS.LAST..Stack..cell:  See if the sequence has returned it's last value.

 entry ~Stack..Stack..cell      :Iterator

  exit Last    Bit              :Set if the sequence has no more values.
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
sequence DEPLETE..Stack..cell  pure:  Remove elements from the top to bottom of a Stack.

change Stack..Stack..cell       :Stack to deplete

  exit *Element      cell       :At each element in the Stack
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
method PUSH..Stack..cell  pure:  Add an element on top of a Stack.

change Stack..cell              :Stack to prepend

 entry Value   cell             :Value to copy into the new element
:
:...............................................................................
:
method PUSH.AT..Stack..cell  pure:  Allocate a clean element on top of a Stack.

change Stack..cell              :Stack to prepend

  exit *Element   cell          :At the allocated element
:
:...............................................................................
:
method POP..Stack..cell  pure:  Copy the top element in a Stack then remove it.

change Stack..cell              :Stack to pop

  exit Value   cell             :Value copied from the top element

precondition
   $Size  fault;                   Cannot pop the top element of an empty Stack.
.
:...............................................................................
:
method POP.AT..Stack..cell  pure:  Remove the top element and reference the next top element in a Stack .

change Stack..cell              :Stack to pop

  exit *Element   cell          :At the next top element; @0 if no next element

precondition
   $Size  fault;                   Cannot pop the top element of an empty Stack.
.
:...............................................................................
:
method HEAD..Stack..cell  pure:  Copy the top element on a Stack.

 entry Stack..cell              :Stack to access

  exit Value  cell              :Value copied from the top element

precondition
   $Size  fault;                   Cannot get the top element of an empty Stack.
.
:...............................................................................
:
function HEAD.AT..Stack..cell:  Reference the top element in a Stack.

 entry Stack..cell              :Stack to access

  exit *Element   cell          :At the element on the top; @0 if emptye
:
:...............................................................................
:
function PEEK..Stack..cell:  Copy an indexed element in a Stack.

 entry Stack..cell,             &Stack to access
       Index = 0  word          :Element to access; 0 is the top

  exit Value    cell            :Value copied from the selected element

precondition
   $Size  fault;                   Cannot peek into an empty Stack.
   Index _< $Size  fault Index;    Cannot peek with an index below a Stack.
.
:...............................................................................
:
function PEEK.AT..Stack..cell:  Reference an indexed Stack element.

 entry Stack..cell,             &Stack to access
       Index = 0  word          :Element to access; 0 is the top

  exit *Element   cell          :At the selected element

precondition
   $Size  fault;                   Cannot peek into an empty Stack.
   Index _< $Size  fault Index;    Cannot peek with an index below a Stack.
.
:...............................................................................
:
function FIND..Stack..cell:  See if a value is in a Stack.

 entry Stack..cell,             &Stack to be scanned
       Value   cell             :Value to be found

  exit Index   word             :0 based Index from the top; -1 if not found
:
:...............................................................................
:
method STORE..Stack..cell  pure:  Copy a value into an existing Stack element.

change Stack..cell              :Stack to update

 entry Index = 0  word,         &Index of the element; 0 is the top
       Value      cell          :Value to copy into the selected element
:
:...............................................................................
:
method REMOVE..Stack..cell  pure:  Remove elements from the top of a Stack.

change Stack..cell              :Stack containing element to remove

 entry Remove = 1  word         :Number of elements to remove; may be zero

precondition
   $Size  or  Remove = 0  fault;   Cannot remove elements from an empty Stack.
   Remove _<= $Size       fault;   Tried to remove too may elements from a Stack.
.
:...............................................................................
:
method EMPTY..Stack..cell  pure:  Remove all elements in a Stack.

change Stack..cell              :Stack to empty
:
:...............................................................................
:
method DRAIN..Stack..cell  pure:  Free resources used by a Stack.

change Stack..cell              :Stack to drain
:
:...............................................................................



::::::::::::::::::::::::::::  Stack(byte)  :::::::::::::::::::::::::::::::::::::
:
sequence STACK..Stack..byte  pure:  Scan a Stack from the top down.

 entry Stack..byte,             &Stack to scan
       Index = 0   word         :First element to access; 0 is the top

  exit *Element    byte         :At each element on the Stack
:
:...............................................................................
:
method SUSPEND..Stack..Stack..byte:  Save the index to the next element down the Stack.

change ~Stack..Stack..byte      :Iterator

  exit Count   word             :Number of values yielded so far
:
:...............................................................................
:
function IS.LAST..Stack..byte:  See if the sequence has returned it's last value.

 entry ~Stack..Stack..byte      :Iterator

  exit Last    Bit              :Set if the sequence has no more values.
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
sequence DEPLETE..Stack..byte  pure:  Remove elements from the top to bottom of a Stack.

change Stack..Stack..byte       :Stack to deplete

  exit *Element      byte       :At each element in the Stack
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
method PUSH..Stack..byte  pure:  Add an element on top of a Stack.

change Stack..byte              :Stack to prepend

 entry Value   byte             :Value to copy into the new element
:
:...............................................................................
:
method PUSH.AT..Stack..byte  pure:  Allocate a clean element on top of a Stack.

change Stack..byte              :Stack to prepend

  exit *Element   byte          :At the allocated element
:
:...............................................................................
:
method POP..Stack..byte  pure:  Copy the top element in a Stack then remove it.

change Stack..byte              :Stack to pop

  exit Value   byte             :Value copied from the top element

precondition
   $Size  fault;                   Cannot get the top element of an empty Stack.
.
:...............................................................................
:
method POP.AT..Stack..byte  pure:  Remove the top element and access the next top element in a Stack .

change Stack..byte              :Stack to pop

  exit *Element   byte          :At the next top element; @0 if no next element

precondition
   $Size  fault;                   Cannot get the top element of an empty Stack.
.
:...............................................................................
:
method HEAD..Stack..byte  pure:  Copy the top element on a Stack.

 entry Stack..byte              :Stack to access

  exit Value  byte              :Value copied from the top element

precondition
   $Size  fault;                   Cannot get the top element of an empty Stack.
.
:...............................................................................
:
function HEAD.AT..Stack..byte:  Reference the top element in a Stack.

 entry Stack..byte              :Stack to access

  exit *Element   byte          :At the element on the top; @0 if empty
:
:...............................................................................
:
function PEEK..Stack..byte:  Copy an indexed element in a Stack.

 entry Stack..byte,             &Stack to access
       Index = 0  word          :Element to access; 0 is the top

  exit Value      byte          :Value copied from the selected element

precondition
   $Size  fault;                   Cannot peek into an empty Stack.
   Index _< $Size  fault Index;    Cannot peek with an index below a Stack.
.
:...............................................................................
:
function PEEK.AT..Stack..byte:  Reference an indexed Stack element.

 entry Stack..byte,             &Stack to access
       Index = 0  word          :Element to access; 0 is the top

  exit *Element   byte          :At the selected element

precondition
   $Size  fault;                   Cannot peek into an empty Stack.
   Index _< $Size  fault Index;    Cannot peek with an index below a Stack.
.
:...............................................................................
:
function FIND..Stack..byte:  Determine if a value is in a Stack (linear time).

 entry Stack..byte,             &Stack to be scanned
       Value   byte             :Value to be found

  exit Index   word             :0 based Index from the top; -1 if not found
:
:...............................................................................
:
method STORE..Stack..byte  pure:  Copy a value into an existing Stack element.

change Stack..byte              :Stack to update

 entry Index = 0  word,         &Index of the element; 0 is the top
       Value      byte          :Value to copy into the selected element
:
:...............................................................................
:
method REMOVE..Stack..byte  pure:  Remove elements from the top of a Stack.

change Stack..byte              :Stack containing element to remove

 entry Remove = 1  word         :Number of elements to remove; may be zero

precondition
   $Size  or  Remove = 0  fault;   Cannot remove elements from an empty Stack.
   Remove _<= $Size       fault;   Tried to remove too may elements from a Stack.
.
:...............................................................................
:
method EMPTY..Stack..byte  pure:  Remove all elements in a Stack.

change Stack..byte              :Stack to empty
:
:...............................................................................
:
method DRAIN..Stack..byte  pure:  Free resources used by a Stack.

change Stack..byte              :Stack to drain
:
:...............................................................................


::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::  Queue procedures  ::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:::::::::::::::::::::::::::::  Queue(string)  ::::::::::::::::::::::::::::::::::
:
sequence QUEUE..Queue..string  pure:  Scan a Queue from front to back.

 entry Queue..cell,             &Queue to scan
       Index = 0  word          :First element to access; 0 is the front

  exit *Element   string        :At each element in the Queue
:
:...............................................................................
:
method SUSPEND..Queue..Queue..string  pure:  Save the index to the next element.

change ~Queue..Queue..string    :Iterator

  exit Count   word             :Number of values yielded so far
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
sequence DEPLETE..Queue..string  pure:  Remove elements from the front of a Queue.

change Queue..string            :Queue to deplete

  exit *Item   string           :At each element in the Queue
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
method ENQUEUE..Queue..string  pure:  Add an element in back of a Queue.

change Queue..string            :Queue to be appended

 entry Value     string         :Value copied to the new element
:
:...............................................................................
:
method ENQUEUE.AT..Queue..string  pure:  Allocate a clean element in back of a Queue.

change Queue..string            :Queue to be appended

  exit *Element  string         :At the allocated element
:
:...............................................................................
:
method DEQUEUE..Queue..string  pure:  Remove an element from the front of a Queue.

change Queue..string            :Queue to dequeue

  exit Value   string           :Value copied from the front element
:
:...............................................................................
:
method DEQUEUE.AT..Queue..string  pure:  Remove the front element and reference the next.

change Queue..string            :Queue to dequeue

  exit *Element = 0  string     :At the next element; 0 if no next element
:
:...............................................................................
:
method PUSH..Queue..string  pure:  Insert an element in the front of a Queue.

change Queue..string            :Queue to prepend

 entry Value   string           :Value to copy into the new element
:
:...............................................................................
:
method PUSH.AT..Queue..string  pure:  Allocate a clean element in front of a Queue.

change Queue..string            :Queue to prepend

  exit *Element   string        :At the allocated element
:
:...............................................................................
:
function HEAD..Queue..string:  Copy the element from the front of a Queue.

 entry Queue..string            :Queue to access

  exit Value  string            :Value copied from the front element
:
:...............................................................................
:
function HEAD.AT..Queue..string:  Reference the front element in a Queue.

 entry Queue..string            :Queue to access

  exit *Element   string        :At the front element; @0 if empty
:
:...............................................................................
:
function TAIL..Queue..string:  Copy the element in the back of a Queue.

 entry Queue..string            :Queue to access

  exit Value   string           :Value copied from the back element
:
:...............................................................................
:
function TAIL.AT..Queue..string:  At the back element in a Queue.

 entry Queue..string            :Queue to access

  exit *Element   string        :At the back element; @0 if an empty Queue
:
:...............................................................................

function PEEK..Queue..string:  Copy an indexed element in a Queue.

 entry Queue..string,           &Queue to access
       Index = 0  word          :First element to access; 0 is at the front

  exit Value    string          :Value copied from the selected element

precondition
   $Front  fault;                  Cannot peek into an empty Queue.
.
:...............................................................................
:
function PEEK.AT..Queue..string:  Reference a Queue element by index.

 entry Queue..string,           &Queue to access
       Index = 0  word          :First element to access; 0 is at the front

  exit *Element    string       :At the selected element

precondition
   $Front  fault;                  Cannot peek into an empty Queue.
.
:...............................................................................
:
function SIZE..Queue..string:  Count the number of Queue elements.

 entry Queue..string            :Queue to measure

  exit Size     word            :Number of elements in the Queue
:
:...............................................................................
:
function COUNT..Queue..string:  Scan a Queue and count occurances of an item.

 entry Queue..string,           &Queue to scan
       Value      string        :Value to count

  exit Count = 0  word          :Number of occurances
:
:...............................................................................
:
function FIND..Queue..string:  See if an item is in a Queue.

 entry Queue..string,           &Queue to scan
       Value    string          :Value to find

  exit Find     Bit             :Set if the value is in the Queue
:
:...............................................................................
:
method STORE..string  pure:  Copy a value into an existing Queue element.

change Queue..string           :Queue to update

 entry Index = 0  word,        &Number of elements in; 0 is at the front
       Value      string       :Value to store in the selected element
:
:...............................................................................
:
method REMOVE..Queue..string  pure:  Remove elements from the front of of a virtual Queue .

change Queue..string            :Queue containing element to remove

 entry Count = 1   word         :Number of elements to remove; may be zero
:
:...............................................................................
:
method EMPTY..Queue..string  pure:  Clear out an open type; leaving it open for more transactions.

change Queue..string            :Queue to empty
:
:...............................................................................
:
method DRAIN..Queue..string  pure:  Reset a Queue  to no elements.

change Queue..string            :Queue to drain
:
:...............................................................................


::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::  Vector procedures  :::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::  Vector(string)  ::::::::::::::::::::::::::::::::
:
method STORE..Vector..string  pure:  Store an element in a Vector.

change Vector..string           :Vector to update

 entry Index    word,           &Zero based index to an element
       Value    string          :Value to copy into the selected element
:
:...............................................................................
:
method STORE.AT..Vector..string  pure:  Reference a Vector element by index and add it if new.

change Vector..string           :Vector to update

 entry Index     word           :Zero based index to an element

  exit *Element  string         :At the selected element
:
:...............................................................................
:
function LOAD..Vector..string:  Copy an element Value from a Vector.

 entry Vector..string,          &Vector to access
       Index     word           :Zero based index to an element

  exit Value     string         :Element value or a clean element when new
:
:...............................................................................
:
function LOAD.AT..Vector..string:  Reference an exisitng element in a Vector.

 entry Vector..string,          &Vector to access
       Index     word           :Zero based index to an element

  exit *Element  string         :At the selected element or @0 if not set.
:
:...............................................................................
:
function SIZE..Vector..string:  Get the maximum number of indexible elements.

 entry Vector..string           :Vector to access

  exit Size    cell             :Number elements (maximum 2^32).
:
:...............................................................................
:
method EMPTY..Vector..string  pure:  Empty a Vector

change Vector..string           :Vector to empty
:
:...............................................................................
:
method DRAIN..Vector..string  pure:  Drain a Vector

change Vector..string           :Vector to drain
:
:...............................................................................



::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::  Hash procedures  :::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::


::::::::::::::::::::::::::  Hash(string, string)  ::::::::::::::::::::::::::::::
:
sequence HASH..Hash..string  pure:  Scan each element in a Hash table.

 entry Hash..string,            &Hash table to scan
       First = ""  string       :Key to start scanning; defaults to the first

  exit *Element    Key..string  :Each element in the table
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
method PUT..Hash..string  pure:  Add a Key and value to a Hash table.

change Hash..string             :Hash table to update

 entry Key   string,            &Key to be added; overwrite existing
       Tag   string             :Value copied into a new or exisitng element
:
:...............................................................................
:
method PUT.AT..Hash..string  pure:  Allocate and set an element in a Hash table.

change Hash..string             :Hash table to update

 entry Key      string          :Key to be added; may already exist

  exit *Element Key..string,    &At the new or existing element
        New     Bit             :Set if the key was added; else already exists
:
:...............................................................................
:
function GET..Hash..string:  Get the value for a key known to be present.

 entry Hash..string,            &Hash table to access
       Key = ""  string         :A key to look up; defaults to the first

  exit Tag       string         :Value associated with the key
:
:  Fault if the element is not present.
:...............................................................................
:
function GET.AT..Hash..string:  Look up a key in a Hash table.

 entry Hash..string,            &Hash table to access
       Key = ""   string        :A key to look up; defaults to the first

  exit *Element   Key..string   :At the selected element; @0 if not found
:
:...............................................................................

function ID..Hash..string:  Form a unique id for a key in a Hash table.

 entry Hash..string,            &Hash table to access
       Key = ""  string         :A name to look up; defaults to the first

  exit Label     string         :Label of the form:  n.m
:
:  Fault if the element is not present.
:...............................................................................
:
method DELETE..Hash..string  pure:  Erase the element at the key.

change Hash..string             :Hash table to update

 entry Key   string             :A key to delete; ignored if not present
:
:...............................................................................
:
method EMPTY..Hash..string  pure:  Remove all elements in a Hash table.

change Hash..string             :Hash table to empty
:
:...............................................................................
:
method DRAIN..Hash..string  pure:  Free resources used by a Hash table.

change Hash..string             :Hash table to drain
:
:...............................................................................



::::::::::::::::::::::::::  Hash(string, word)  ::::::::::::::::::::::::::::::::
:
sequence HASH..Hash..word  pure:  Scan an unordered Hash table of Keys.

 entry Hash..word,              &Hash table to scan
       First = ""  string       :Default scans from the first Key

  exit *Element    Key..word    :If found then scan from the value; else @0
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
method PUT..Hash..word  pure:  Add a Key and value to a Hash table.

change Hash..word               :Hash table to update

 entry Key      string,         &Key to be added; may already exist
       Tag      word            :Value copied into a new or exisitng element
:
:...............................................................................
:
method PUT.AT..Hash..word  pure:  Allocate and set an element in a Hash table.

change Hash..word               :Hash table to update

 entry Key       string         :Key to be added; may already exist

  exit *Element  Key..word,     &At the new or existing element
        New      Bit            :Set if the key was added; else overwritten value
:
:...............................................................................
:
function GET..Hash..word:  Get the value for a key known to be present.

 entry Hash..word,              &Hash table to access
       Key   string             :A key to look up; defaults to the first

  exit Tag   word               :Value associated with the key
:
:  Fault if the element is not present.
:...............................................................................
:
function GET.AT..Hash..word:  Look up a key in a Hash table.

 entry Hash..word,              &Hash table to access
       Key   string             :A key to look up; defaults to the first

  exit *Element   Key..word     :If found then at the value; else null.
:
:...............................................................................
:
function ID..Hash..word:  Form a unique id for a key in a Hash table.

 entry Hash..word,              &Hash table to access
       Key = ""  string         :A name to look up; defaults to the first

  exit Label     string         :Label of the form:  n.m
:
:  Fault if the element is not present.
:...............................................................................
:
method DELETE..Hash..word  pure:  Erase the element at the key.

change Hash..word               :Hash table to update

 entry Key   string             :A key to delete; ignored if not present
:
:...............................................................................
:
method EMPTY..Hash..word  pure:  Remove all elements in a Hash table.

change Hash..word               :Hash table to empty
:
:...............................................................................
:
method DRAIN..Hash..word  pure:  Free resources used by a Hash table.

change Hash..word               :Hash table to drain
:
:...............................................................................



::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::  Map procedures  :::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::


:::::::::::::::::::::::::::::::::  Map(string)  ::::::::::::::::::::::::::::::::
:
sequence MAP..Map..string  pure:  Scan each element in a Map table.

 entry Map..string,             &Map table to scan
       Key = ""  string         :First key to scan; may partially match

  exit *Element  Key..string    :Each element in the Map table
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
method ADD..Map..string:  Add a key to a Map table without duplicates.

change Map..string              :Map table to update

 entry Key    string,           &Key name to add
       Tag    string            :Value associated with the key
:
:...............................................................................
:
method PUT..Map..string  pure:  Add a Key and associated value to a Map table.

change Map..string              :Map table to update

 entry Key     string,          &Key to add; may already be in the Map table
       Value   string           :Value copied into a new or exisitng element
:
:...............................................................................
:
method PUT.AT..Map..string  pure:  Allocate an element in a Map table.

change Map..string              :Map table to update

 entry Key       string         :Key to add; may already be in the Map table

  exit *Element  Key..string,   &At the new or existing element
       New       Bit            :Set if the key was added; else already exists
:
: The Tag field is clean if the element was added.
:...............................................................................
:
function GET..Map..string:  Copy the Tag value from an element in a Map table.

 entry Map..string,             &Map table to access
       Key = ""  string         :Key to look up; defaults to the first

  exit Value     string         :Value associated with the key
:
:  Fault if the Key is not in the Map table.
:...............................................................................
:
function GET.AT..Map..string:  Look up a key in a Map table.

 entry Map..string,             &Map table to access
       Key = ""  string         :Key to look up; defaults to the first

  exit *Element  Key..string    &At the element; @0 if not found
:
:...............................................................................
:
method HEAD..Map..string  pure:  Get the alphabetically lowest element in a Map table.

change Map..string              :Map table to update

  exit Key      string,         &First key; @0 if an empty table
       Tag      string          :Value associated with the Key
:
:  Sets the current position to the lowest element.
:  Fault if the Map table is empty.
:...............................................................................
:
method HEAD.AT..Map..string  pure:  Get the alphabetically lowest element in a Map table.

change Map..string              :Map table to update

  exit *Element   Key..string   :First element in the Map table; @0 if empty
:
:  Sets the current position to the lowest element.
:  Fault if the Map table is empty.
:...............................................................................
:
method NEXT..Map..string  pure:  Advance to the next element.

change Map..string              :Map table to update

  exit Key   string,            &Next key or empty if at the end of the Map table
       Tag   string             :Value associated with the Key
:
:...............................................................................
:
method NEXT.AT..Map..string  pure:  Advance to the next element.

change Map..string              :Map table to update

  exit *Element  Key..string    :At the next element; @0 if at the end
:
:...............................................................................
:
function ITEM.AT..Map..string: Returns the current symbol in a table.

 entry Map..string              :Map table to access

  exit *Element  Key..string    :At the current element; @0 if at the end

precondition
   $Leaf ~= No.Sequence   fault;   Sequential access not initiated.
   $Leaf ~= End.Of.Table  fault;   Advanced past the end of a table.
.
:...............................................................................
:
method FIND..Map..string  pure:  Look up a key in a Map table.

change Map..string              :Map table to update

 entry Key = ""  string         :The key must be present; defaults to the first

  exit Tag       string         :Value copied from the element found
:
:  Fault if the key was not found.
:...............................................................................
:
method FIND.AT..Map..string  pure:  Look up a key in a Map table.

change Map..string              :Map table to update

 entry Key = ""  string         :A key to look up; defaults to the first

  exit *Element  Key..string,   &At the element found; @0 if not found
       Exact     Bit            :Set if an exact match; else partial or a miss
:
:...............................................................................
:
method SCAN..Map..string  pure:  Find a key, partial key, or the next higher key.

change Map..string              :Map table to scan

 entry Key = ""   string        :A key to look up; defaults to the first

  exit @Element   Key..string,  &Element with the Key or the next; @0 if no match
       Exact      Bit           :Set if an exact match; else 0
:
:...............................................................................
:
method DELETE..Map..string  pure:  Remove a selected element in a Map table.

change Map..string              :Map table to update

 entry Key   string             :Element key to delete; ignored if not present
:
:...............................................................................
:
method EMPTY..Map..string  pure:  Empty a Map table.

change Map..string                :Map table to empty
:
:...............................................................................
:
method DRAIN..Map..string  pure:  Drain a Map table.

change Map..string                :Map table to drain
:
:...............................................................................



::::::::::::::::::::::::::::::  Map(word)  :::::::::::::::::::::::::::::::::::::
:
sequence MAP..Map..word  pure:  Scan each element in a Map table.

 entry Map..word,               &Map table to scan
       Key = ""  string         :First key to scan; may partially match

  exit *Element  Key..word      :Each element in the Map table
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
method ADD..Map..word:  Add a key to a Map table without duplicates.

change Map..word                :Map table to update

 entry Key    string,           &Key name to add
       Tag    word              :Value associated with the key
:
:...............................................................................
:
method PUT..Map..word  pure:  Add a Key and associated value to a Map table.

change Map..word                :Map table to update

 entry Key     string,          &Key to add; may already be in the Map table
       Value   word             :Value copied into a new or exisitng element
:
:...............................................................................
:
method PUT.AT..Map..word  pure:  Allocate an element in a Map table.

change Map..word                :Map table to update

 entry Key       string         :Key to add; may already be in the Map table

  exit *Element  Key..word,     &At the new or existing element
       New       Bit            :Set if the key was added; else already exists
:
: The Tag field is clean if the element was added.
:...............................................................................
:
function GET..Map..word:  Copy the Tag value from an element in a Map table.

 entry Map..word,               &Map table to access
       Key = ""  string         :Key to look up; defaults to the first

  exit Value     word           :Value associated with the key
:
:  Fault if the Key is not in the Map table.
:...............................................................................
:
function GET.AT..Map..word:  Look up a key in a Map table.

 entry Map..word,               &Map table to access
       Key = ""  string         :Key to look up; defaults to the first

  exit *Element  Key..word      &At the element; @0 if not found
:
:...............................................................................
:
method HEAD..Map..word  pure:  Get the alphabetically lowest element in a Map table.

change Map..word                :Map table to update

  exit Key      string,         &First key; @0 if an empty table
       Tag      word            :Value associated with the Key
:
:  Sets the current position to the lowest element.
:  Fault if the Map table is empty.
:...............................................................................
:
method HEAD.AT..Map..word  pure:  Get the alphabetically lowest element in a Map table.

change Map..word                :Map table to update

  exit *Element   Key..word     :First element in the Map table; @0 if empty
:
:  Sets the current position to the lowest element.
:  Fault if the Map table is empty.
:...............................................................................
:
method NEXT..Map..word  pure:  Advance to the next element.

change Map..word                :Map table to update

  exit Key   string,            &Next key or empty if at the end of the Map table
       Tag   word               :Value associated with the Key
:
:...............................................................................
:
method NEXT.AT..Map..word  pure:  Advance to the next element.

change Map..word                :Map table to update

  exit *Element  Key..word      :At the next element; @0 if at the end
:
:...............................................................................
:
function ITEM.AT..Map..word:   Returns the current symbol in a table.

 entry Map..word                :Map table to access

  exit *Element  Key..word      :At the current element; @0 if at the end

precondition
   $Leaf ~= No.Sequence   fault;   Sequential access not initiated.
   $Leaf ~= End.Of.Table  fault;   Advanced past the end of a table.
.
:...............................................................................
:
method FIND..Map..word  pure:  Look up a key in a Map table.

change Map..word                :Map table to update

 entry Key = ""   string        :The key must be present; defaults to the first

  exit Tag        word          :Value copied from the element found
:
:  Fault if the key was not found.
:...............................................................................
:
method FIND.AT..Map..word  pure:  Look up a key in a Map table.

change Map..word                :Map table to update

 entry Key = ""   string        :A key to look up; defaults to the first

  exit *Element   Key..word,    &At the element found; @0 if not found
       Exact      Bit           :Set if an exact match; else partial or a miss
:
:...............................................................................
:
method SCAN..Map..word  pure:  Find a key, partial key, or the next higher key.

change Map..word                :Map table to scan

 entry Key = ""   string        :A key to look up; defaults to the first

  exit *Element   Key..word,    &Element with the Key or the next; @0 if no match
       Exact      Bit           :Set if an exact match; else 0
:
:...............................................................................
:
method DELETE..Map..word  pure:  Remove a selected element in a Map table.

change Map..word                :Map table to update

 entry Key   string             :Element key to delete; ignored if not present
:
:...............................................................................
:
method EMPTY..Map..word  pure:  Empty a Map table.

change Map..word                :Map table to empty
:
:...............................................................................
:
method DRAIN..Map..word  pure:  Drain a Map table.

change Map..word                :Map table to drain
:
:...............................................................................


end