ORDSET signature
    Ordered sets are sets along with an ordering on their elements.
    This interface is nearly identical to
    SET except for the ordered set functions
    starting with first, and
    Key now ascribing to
    ORDKEY.
  
structure Key : ORDKEY
structure Seq : SEQUENCE
type t
type set = t
exception Order
val size : set → int
val toString : set → string
val toSeq : set → Key.t Seq.t
val empty : unit → set
val singleton : Key.t → set
val fromSeq : Key.t Seq.t → set
val find : set → Key.t → bool
val insert : set * Key.t → set
val delete : set * Key.t → set
val filterKey : (Key.t → bool) → set → set
val reduceKey : (Key.t * Key.t → Key.t) → Key.t → set → Key.t
val iterateKey : (α * Key.t → α) → α → set → α
val union : set * set → set
val intersection : set * set → set
val difference : set * set → set
val $ : Key.t → set
val first : set → Key.t option
val last : set → Key.t option
val prev : set * Key.t → Key.t option
val next : set * Key.t → Key.t option
val split : set * Key.t → set * bool * set
val join : set * set → set
val getRange : set → Key.t * Key.t → set
val rank : set * Key.t → int
val select : set * int → Key.t option
val splitRank : set * int → set * setstructure Key : ORDKEYKey substructure defines the type of
      elements in a set, providing comparison and other useful functions.
    structure Seq :
      SEQUENCESeq substructure defines the underlying
      sequence type to and from which sets can be converted.type ttype set = tt, for readability.exception OrderOrder is raised whenever set operations would violate the ordering invariant.val size :
       set → int(size x) evaluates to $|x|$,
      the number of elements in the set $x$.val toString :
       set → string(toString x) evaluates to a string representation of $x$.
      Each element of $x$ is converted to a string by Key.toString.
      For example, the set $\{1,2,3\}$ would be represented by the string
      “{1,2,3}”.
    val toSeq :
       set → Key.t Seq.tval empty :
       unit → setval singleton :
       Key.t → set(singleton x) evaluates to $\{x\}$, the singleton set
      containing only the element $x$.
    val fromSeq :
       Key.t Seq.t → setval find :
       set → Key.t → bool(find x k) returns whether or not $k$ is a member of
      the set $x$.
    val insert :
       set * Key.t → set(insert (x, k)) evaluates to the set $x \cup \{k\}$.
    val delete :
       set * Key.t → set(delete (x, k)) evaluates to the set $x \setminus \{k\}$.
    val filterKey :
       (Key.t → bool) → set → set(filterKey p x) evaluates to the subset of $x$ containing
      every key $k$ which satisfies $p(k)$.
    val reduceKey :
      (Key.t * Key.t → Key.t) → Key.t → set → Key.t(reduceKey f b x) is logically equivalent to
      (Seq.reduce f b (toSeq x)).
    val iterateKey :
      (α * Key.t → α) → α → set → α(iterateKey f b x) is logically equivalent to
      (Seq.iterate f b (toSeq x)).
    val union :
       set * set → set(union (x, y)) evaluates to the set $x \cup y$.val intersection :
       set * set → set(intersection (x, y)) evaluates to the set $x \cap y$.val difference :
       set * set → set(difference (x, y)) evaluates to the set
      $x \setminus y$.val $ :
      Key.t → setsingleton.val first :
      set → Key.t optionNONE if the set is
      empty.
    val last :
      set → Key.t optionNONE if the set is
      empty.
    val prev :
      set * Key.t → Key.t option(prev (x, k)) evaluates to $\max \{ k' \in x\ |\ k' < k \}$,
      or NONE if there is no such element.
    val next :
      set * Key.t → Key.t option(next (x, k)) evaluates to $\min \{ k' \in x\ |\ k' > k \}$,
      or NONE if there is no such element.
    val split :
      set * Key.t → set * bool * set(split (x, k)) evaluates to $(l, b, r)$, where
      $l = \{ k' \in x\ |\ k' < k \}$, $r = \{ k' \in x\ |\ k' > k \}$, and $b$
      indicates whether or not $k \in x$.
    val join :
      set * set → set(join (x, y)) evaluates to $x \cup y$.
    val getRange :
      set → Key.t * Key.t → set(getRange x (a, b)) evaluates to
      $\{ k \in x\ |\ a \leq k \leq b \}$.
    val rank :
      set * Key.t → int(rank (x, k)) evaluates to
      $\big|\{ k' \in x\ |\ k' < k \}\big|$.
    val select :
      set * int → Key.t option(select (x, i)) evaluates to the $i^\text{th}$ smallest
      element in $x$, or NONE if either $i < 0$ or $i \geq |x|$.
    val splitRank :
      set * int → set * set(splitRank (x, i)) evaluates to $(l, r)$ such that
      $|l| = i$, $|r| = |x| - i$, every key in $l$ is strictly less than
      every key in $r$, and their union is $x$.
      Raises Fail if $i < 0$ or $i \geq |x|$.