src/Pure/General/linear_set.scala
author wenzelm
Fri, 09 Apr 2021 22:06:59 +0200
changeset 73550 2f6855142a8c
parent 73362 dde25151c3c1
child 75393 87ebf5a50283
permissions -rw-r--r--
support for ML special forms: modified evaluation similar to Scheme;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32464
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/General/linear_set.scala
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
     3
    Author:     Fabian Immler, TU Munich
32464
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
     4
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
     5
Sets with canonical linear order, or immutable linked-lists.
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
     6
*/
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
     7
32464
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
     8
package isabelle
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
     9
55618
995162143ef4 tuned imports;
wenzelm
parents: 48761
diff changeset
    10
73136
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
    11
import scala.collection.mutable
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
    12
import scala.collection.immutable.SetOps
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
    13
import scala.collection.{IterableFactory, IterableFactoryDefaults}
32464
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
    14
36011
3ff725ac13a4 adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
wenzelm
parents: 34304
diff changeset
    15
73136
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
    16
object Linear_Set extends IterableFactory[Linear_Set]
32464
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
    17
{
46621
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
    18
  private val empty_val: Linear_Set[Nothing] = new Linear_Set[Nothing](None, None, Map(), Map())
71601
97ccf48c2f0c misc tuning based on hints by IntelliJ IDEA;
wenzelm
parents: 71383
diff changeset
    19
  override def empty[A]: Linear_Set[A] = empty_val.asInstanceOf[Linear_Set[A]]
32465
87f0e1b2d3f2 misc cleanup and internal reorganization;
wenzelm
parents: 32464
diff changeset
    20
73362
dde25151c3c1 tuned --- fewer warnings;
wenzelm
parents: 73359
diff changeset
    21
  def from[A](entries: IterableOnce[A]): Linear_Set[A] =
dde25151c3c1 tuned --- fewer warnings;
wenzelm
parents: 73359
diff changeset
    22
    entries.iterator.foldLeft(empty[A])(_.incl(_))
73136
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
    23
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
    24
  override def newBuilder[A]: mutable.Builder[A, Linear_Set[A]] = new Builder[A]
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
    25
  private class Builder[A] extends mutable.Builder[A, Linear_Set[A]]
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
    26
  {
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
    27
    private var res = empty[A]
73340
0ffcad1f6130 tuned --- fewer warnings;
wenzelm
parents: 73337
diff changeset
    28
    override def clear(): Unit = { res = empty[A] }
73136
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
    29
    override def addOne(elem: A): this.type = { res = res.incl(elem); this }
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
    30
    override def result(): Linear_Set[A] = res
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
    31
  }
32464
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
    32
38448
62d16c415019 added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents: 38368
diff changeset
    33
  class Duplicate[A](x: A) extends Exception
62d16c415019 added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents: 38368
diff changeset
    34
  class Undefined[A](x: A) extends Exception
62d16c415019 added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents: 38368
diff changeset
    35
  class Next_Undefined[A](x: Option[A]) extends Exception
32464
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
    36
}
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
    37
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
    38
46712
8650d9a95736 prefer final ADTs -- prevent ooddities;
wenzelm
parents: 46686
diff changeset
    39
final class Linear_Set[A] private(
46621
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
    40
    start: Option[A], end: Option[A], val nexts: Map[A, A], prevs: Map[A, A])
73136
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
    41
  extends Iterable[A]
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
    42
    with SetOps[A, Linear_Set, Linear_Set[A]]
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
    43
    with IterableFactoryDefaults[A, Linear_Set]
32464
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
    44
{
38448
62d16c415019 added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents: 38368
diff changeset
    45
  /* relative addressing */
32464
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
    46
48761
6a355b4b6a59 clarified Linear_Set.next/prev: check definedness;
wenzelm
parents: 48753
diff changeset
    47
  def next(elem: A): Option[A] =
6a355b4b6a59 clarified Linear_Set.next/prev: check definedness;
wenzelm
parents: 48753
diff changeset
    48
    if (contains(elem)) nexts.get(elem)
6a355b4b6a59 clarified Linear_Set.next/prev: check definedness;
wenzelm
parents: 48753
diff changeset
    49
    else throw new Linear_Set.Undefined(elem)
6a355b4b6a59 clarified Linear_Set.next/prev: check definedness;
wenzelm
parents: 48753
diff changeset
    50
6a355b4b6a59 clarified Linear_Set.next/prev: check definedness;
wenzelm
parents: 48753
diff changeset
    51
  def prev(elem: A): Option[A] =
6a355b4b6a59 clarified Linear_Set.next/prev: check definedness;
wenzelm
parents: 48753
diff changeset
    52
    if (contains(elem)) prevs.get(elem)
6a355b4b6a59 clarified Linear_Set.next/prev: check definedness;
wenzelm
parents: 48753
diff changeset
    53
    else throw new Linear_Set.Undefined(elem)
32464
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
    54
38368
07bc80bdeebc added get_after convenience;
wenzelm
parents: 37185
diff changeset
    55
  def get_after(hook: Option[A]): Option[A] =
07bc80bdeebc added get_after convenience;
wenzelm
parents: 37185
diff changeset
    56
    hook match {
46621
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
    57
      case None => start
48761
6a355b4b6a59 clarified Linear_Set.next/prev: check definedness;
wenzelm
parents: 48753
diff changeset
    58
      case Some(elem) => next(elem)
38368
07bc80bdeebc added get_after convenience;
wenzelm
parents: 37185
diff changeset
    59
    }
07bc80bdeebc added get_after convenience;
wenzelm
parents: 37185
diff changeset
    60
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
    61
  def insert_after(hook: Option[A], elem: A): Linear_Set[A] =
38448
62d16c415019 added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents: 38368
diff changeset
    62
    if (contains(elem)) throw new Linear_Set.Duplicate(elem)
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
    63
    else
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
    64
      hook match {
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
    65
        case None =>
46621
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
    66
          start match {
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
    67
            case None => new Linear_Set[A](Some(elem), Some(elem), Map(), Map())
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
    68
            case Some(elem1) =>
46621
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
    69
              new Linear_Set[A](Some(elem), end,
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
    70
                nexts + (elem -> elem1), prevs + (elem1 -> elem))
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
    71
          }
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
    72
        case Some(elem1) =>
38448
62d16c415019 added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents: 38368
diff changeset
    73
          if (!contains(elem1)) throw new Linear_Set.Undefined(elem1)
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
    74
          else
46621
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
    75
            nexts.get(elem1) match {
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
    76
              case None =>
46621
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
    77
                new Linear_Set[A](start, Some(elem),
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
    78
                  nexts + (elem1 -> elem), prevs + (elem -> elem1))
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
    79
              case Some(elem2) =>
46621
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
    80
                new Linear_Set[A](start, end,
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
    81
                  nexts + (elem1 -> elem) + (elem -> elem2),
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
    82
                  prevs + (elem2 -> elem) + (elem -> elem1))
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
    83
            }
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
    84
      }
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
    85
73136
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
    86
  def append_after(hook: Option[A], elems: Iterable[A]): Linear_Set[A] =  // FIXME reverse fold
73359
d8a0e996614b tuned --- fewer warnings;
wenzelm
parents: 73340
diff changeset
    87
    elems.foldLeft((hook, this)) {
48748
89b4e7d83d6f refined recover_spans: take visible range into account, reparse and trim results -- to improve editing experience wrt. unbalanced quotations etc.;
wenzelm
parents: 48747
diff changeset
    88
      case ((last, set), elem) => (Some(elem), set.insert_after(last, elem))
89b4e7d83d6f refined recover_spans: take visible range into account, reparse and trim results -- to improve editing experience wrt. unbalanced quotations etc.;
wenzelm
parents: 48747
diff changeset
    89
    }._2
89b4e7d83d6f refined recover_spans: take visible range into account, reparse and trim results -- to improve editing experience wrt. unbalanced quotations etc.;
wenzelm
parents: 48747
diff changeset
    90
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
    91
  def delete_after(hook: Option[A]): Linear_Set[A] =
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
    92
    hook match {
32464
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
    93
      case None =>
46621
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
    94
        start match {
38448
62d16c415019 added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents: 38368
diff changeset
    95
          case None => throw new Linear_Set.Next_Undefined[A](None)
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
    96
          case Some(elem1) =>
46621
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
    97
            nexts.get(elem1) match {
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
    98
              case None => empty
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
    99
              case Some(elem2) =>
46621
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
   100
                new Linear_Set[A](Some(elem2), end, nexts - elem1, prevs - elem2)
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
   101
            }
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
   102
        }
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
   103
      case Some(elem1) =>
38448
62d16c415019 added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents: 38368
diff changeset
   104
        if (!contains(elem1)) throw new Linear_Set.Undefined(elem1)
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
   105
        else
46621
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
   106
          nexts.get(elem1) match {
38448
62d16c415019 added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents: 38368
diff changeset
   107
            case None => throw new Linear_Set.Next_Undefined(Some(elem1))
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
   108
            case Some(elem2) =>
46621
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
   109
              nexts.get(elem2) match {
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
   110
                case None =>
46621
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
   111
                  new Linear_Set[A](start, Some(elem1), nexts - elem1, prevs - elem2)
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
   112
                case Some(elem3) =>
46621
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
   113
                  new Linear_Set[A](start, end,
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
   114
                    nexts - elem2 + (elem1 -> elem3),
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
   115
                    prevs - elem2 + (elem3 -> elem1))
32576
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
   116
              }
20b261654e33 double linking for improved performance of "prev";
wenzelm
parents: 32465
diff changeset
   117
          }
32464
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
   118
    }
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
   119
32465
87f0e1b2d3f2 misc cleanup and internal reorganization;
wenzelm
parents: 32464
diff changeset
   120
87f0e1b2d3f2 misc cleanup and internal reorganization;
wenzelm
parents: 32464
diff changeset
   121
  /* Set methods */
87f0e1b2d3f2 misc cleanup and internal reorganization;
wenzelm
parents: 32464
diff changeset
   122
71383
8313dca6dee9 misc tuning, following hint by IntelliJ;
wenzelm
parents: 65371
diff changeset
   123
  override def isEmpty: Boolean = start.isEmpty
46621
7a8dd77c9f93 streamlined abstract datatype, eliminating odd representation class;
wenzelm
parents: 46620
diff changeset
   124
  override def size: Int = if (isEmpty) 0 else nexts.size + 1
32464
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
   125
34304
b32c68328d24 elements with start entry;
wenzelm
parents: 34301
diff changeset
   126
  def contains(elem: A): Boolean =
59319
wenzelm
parents: 56658
diff changeset
   127
    nonEmpty && (end.get == elem || nexts.isDefinedAt(elem))
34304
b32c68328d24 elements with start entry;
wenzelm
parents: 34301
diff changeset
   128
48746
9e1b2aafbc7f more direct Linear_Set.reverse, swapping orientation of the graph;
wenzelm
parents: 46712
diff changeset
   129
  private def make_iterator(from: Option[A]): Iterator[A] = new Iterator[A] {
46620
wenzelm
parents: 42718
diff changeset
   130
    private var next_elem = from
73337
0af9e7e4476f tuned --- fewer warnings;
wenzelm
parents: 73136
diff changeset
   131
    def hasNext: Boolean = next_elem.isDefined
38583
wenzelm
parents: 38448
diff changeset
   132
    def next(): A =
34301
wenzelm
parents: 32591
diff changeset
   133
      next_elem match {
wenzelm
parents: 32591
diff changeset
   134
        case Some(elem) =>
48746
9e1b2aafbc7f more direct Linear_Set.reverse, swapping orientation of the graph;
wenzelm
parents: 46712
diff changeset
   135
          next_elem = nexts.get(elem)
34301
wenzelm
parents: 32591
diff changeset
   136
          elem
38583
wenzelm
parents: 38448
diff changeset
   137
        case None => Iterator.empty.next()
34301
wenzelm
parents: 32591
diff changeset
   138
      }
32464
5b9731f83569 added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
wenzelm
parents:
diff changeset
   139
  }
32465
87f0e1b2d3f2 misc cleanup and internal reorganization;
wenzelm
parents: 32464
diff changeset
   140
48746
9e1b2aafbc7f more direct Linear_Set.reverse, swapping orientation of the graph;
wenzelm
parents: 46712
diff changeset
   141
  override def iterator: Iterator[A] = make_iterator(start)
34304
b32c68328d24 elements with start entry;
wenzelm
parents: 34301
diff changeset
   142
36011
3ff725ac13a4 adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
wenzelm
parents: 34304
diff changeset
   143
  def iterator(elem: A): Iterator[A] =
48746
9e1b2aafbc7f more direct Linear_Set.reverse, swapping orientation of the graph;
wenzelm
parents: 46712
diff changeset
   144
    if (contains(elem)) make_iterator(Some(elem))
38448
62d16c415019 added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents: 38368
diff changeset
   145
    else throw new Linear_Set.Undefined(elem)
32465
87f0e1b2d3f2 misc cleanup and internal reorganization;
wenzelm
parents: 32464
diff changeset
   146
48747
ebfe3dd9f3f7 tuned signature;
wenzelm
parents: 48746
diff changeset
   147
  def iterator(from: A, to: A): Iterator[A] =
48761
6a355b4b6a59 clarified Linear_Set.next/prev: check definedness;
wenzelm
parents: 48753
diff changeset
   148
    if (contains(to))
48747
ebfe3dd9f3f7 tuned signature;
wenzelm
parents: 48746
diff changeset
   149
      nexts.get(to) match {
ebfe3dd9f3f7 tuned signature;
wenzelm
parents: 48746
diff changeset
   150
        case None => iterator(from)
ebfe3dd9f3f7 tuned signature;
wenzelm
parents: 48746
diff changeset
   151
        case Some(stop) => iterator(from).takeWhile(_ != stop)
ebfe3dd9f3f7 tuned signature;
wenzelm
parents: 48746
diff changeset
   152
      }
48761
6a355b4b6a59 clarified Linear_Set.next/prev: check definedness;
wenzelm
parents: 48753
diff changeset
   153
    else throw new Linear_Set.Undefined(to)
48747
ebfe3dd9f3f7 tuned signature;
wenzelm
parents: 48746
diff changeset
   154
48753
wenzelm
parents: 48748
diff changeset
   155
  def reverse: Linear_Set[A] = new Linear_Set(end, start, prevs, nexts)
wenzelm
parents: 48748
diff changeset
   156
wenzelm
parents: 48748
diff changeset
   157
  override def last: A = reverse.head
wenzelm
parents: 48748
diff changeset
   158
73136
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
   159
  def incl(elem: A): Linear_Set[A] = insert_after(end, elem)
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
   160
  def excl(elem: A): Linear_Set[A] = delete_after(prev(elem))
32465
87f0e1b2d3f2 misc cleanup and internal reorganization;
wenzelm
parents: 32464
diff changeset
   161
73136
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
   162
  override def iterableFactory: IterableFactory[Linear_Set] = Linear_Set
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
   163
ca17e9ebfdf1 updated to scala-2.13.4;
wenzelm
parents: 71601
diff changeset
   164
  override def toString: String = mkString("Linear_Set(", ", ", ")")
48761
6a355b4b6a59 clarified Linear_Set.next/prev: check definedness;
wenzelm
parents: 48753
diff changeset
   165
}