import java.util {
    JList=List,
    ArrayList
}

"A Ceylon [[List]] that wraps a [[java.util::List]].

 If the given [[list]] contains null elements, an optional
 [[Element]] type must be explicitly specified, for example:

     CeylonList<String?>(javaStringList)

 If a non-optional `Element` type is specified, an
 [[AssertionError]] will occur whenever a null value is
 encountered while iterating the list."
shared class CeylonList<out Element>(list)
        extends CeylonCollection<Element>(list)
        satisfies List<Element> {

    JList<out Element> list;

    getFromFirst(Integer index)
            => if (0 <= index < size)
            then list[index]
            else null;
    
    size => list.size();
    
    contains(Object element) => list.contains(element);

    shared actual Integer? lastIndex {
        value size = this.size;
        return size>0 then size-1;
    }
    
    iterator() => CeylonIterator(list.iterator());
    
    shared actual default List<Element> clone()
            => CeylonList(ArrayList(list));
    
    equals(Object that) 
            => (super of List<Element>).equals(that);
    
    hash => (super of List<Element>).hash;
    
}