Example demostrating how to use trait to provide effective implementation of linked list while keeping encapsulation
1 package org.apidesign.effectivelist
4 * Implementation of add and remove efficient list. It has just one
5 * restriction - its items need to carry additional information to help
6 * the list to be effective. All items must extend trait {@link Listable}:
8 * <b>case class</b> Person(name : String) <b>extends</b> Listable[Person]
11 final class List[T <: Listable[T]] {
12 private var item : T = _
13 private final var EMPTY : T = _
15 final def get(index : Int) : T = {
17 for (i <- 1 to index) {
20 throw new IndexOutOfBoundsException()
26 final def size() : Int = {
39 final def add(toAdd : T) : Boolean = {
40 if (toAdd.prev != EMPTY) {
50 toAdd.prev = item.prev
51 item.prev.next = toAdd
57 final def remove(toRemove : T) : Boolean = {
58 if (toRemove.prev == EMPTY) {
61 toRemove.prev.next = toRemove.next
62 toRemove.next.prev = toRemove.prev;
63 if (item.next == item) {
66 if (item == toRemove) {