diff options
author | Matthias Zenger <mzenger@gmail.com> | 2003-07-09 16:24:42 +0000 |
---|---|---|
committer | Matthias Zenger <mzenger@gmail.com> | 2003-07-09 16:24:42 +0000 |
commit | 3f3eab9278f87c1f3808b283f4ac8b00f726fd86 (patch) | |
tree | a633f9d6fc8a39e212c42ee9411c9cb85d178f90 /sources | |
parent | 916bc3b9cdcbf2a8d864988dbd1cb3a76197b86d (diff) | |
download | scala-3f3eab9278f87c1f3808b283f4ac8b00f726fd86.tar.gz scala-3f3eab9278f87c1f3808b283f4ac8b00f726fd86.tar.bz2 scala-3f3eab9278f87c1f3808b283f4ac8b00f726fd86.zip |
Simple implementation of Sets using lists (even...
Simple implementation of Sets using lists (even though this
implementation detail is hidden in a cool programming pattern).
Diffstat (limited to 'sources')
-rw-r--r-- | sources/scala/collection/immutable/ListSet.scala | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/sources/scala/collection/immutable/ListSet.scala b/sources/scala/collection/immutable/ListSet.scala index 9676fd2dd8..e9a7ccd6b5 100644 --- a/sources/scala/collection/immutable/ListSet.scala +++ b/sources/scala/collection/immutable/ListSet.scala @@ -7,27 +7,33 @@ ** $Id$ \* */ - package scala.collection.immutable; -/** I promise, there will be some documentation soon! :-) Matthias - */ -class ListSet[A] extends Set[A] { - protected var elems: List[A] = Nil; +class ListSet[A] with Set[A, ListSet[A]] { - def size: Int = elems.length; + def size: Int = 0; - def contains(elem: A): Boolean = elems.contains(elem); + override def isEmpty: Boolean = true; - def add(elem: A): Unit = if (!elems.contains(elem)) elems = elem :: elems; + def contains(elem: A): Boolean = false; - def remove(elem: A): Unit = { elems = elems.filter(e => e != elem); } + def +(elem: A): ListSet[A] = new Node(elem); - def clear: Unit = { elems = Nil; } + def -(elem: A): ListSet[A] = this; - def elements: Iterator[A] = elems.elements; + def elements: Iterator[A] = toList.elements; - override def toList: List[A] = elems; + override def toList: List[A] = Nil; + protected class Node(elem: A) extends ListSet[A] { + override def size = ListSet.this.size + 1; + override def isEmpty: Boolean = false; + override def contains(e: A) = (e == elem) || ListSet.this.contains(e); + override def +(e: A): ListSet[A] = if (contains(e)) this else new Node(e); + override def -(e: A): ListSet[A] = if (e == elem) ListSet.this else { + val y = ListSet.this - e; (new y.Node(e)) : ListSet[A] + } + override def toList: List[A] = elem :: ListSet.this.toList; + } } |