"A wrapper class that exposes any [[List]] as unmodifiable, 
 hiding the underlying `List` implementation from clients, 
 and preventing attempts to narrow to [[MutableList]]."
by ("Gavin King")
serializable class UnmodifiableList<out Element>(List<Element> list) 
        satisfies List<Element> {

    getFromFirst(Integer index) => list.getFromFirst(index);
    
    size => list.size;
    lastIndex => list.lastIndex;
    
    first => list.first;
    rest => UnmodifiableList(list.rest);
    
    iterator() => list.iterator();
    
    reversed => UnmodifiableList(list.reversed);
    
    measure(Integer from, Integer length)
            => list.measure(from, length);
    span(Integer from, Integer to)
            => list.span(from, to);
    spanFrom(Integer from)
            => list.spanFrom(from);
    spanTo(Integer to)
            => list.spanTo(to);
    
    equals(Object that) => list==that;
    hash => list.hash;
    
    clone() => UnmodifiableList(list.clone());
    
    each(void step(Element element)) => list.each(step);
    
}

"Wrap the given [[List]], preventing attempts to narrow the
 returned `List` to [[MutableList]]."
shared List<Element> unmodifiableList<Element>(List<Element> list)
        => UnmodifiableList(list);