public interface Sequence { // Generic Container methods: public int size(); public boolean isEmpty(); // Positional Sequence methods public Position insertBefore(Position p, Object e) throws InvalidPositionException; public Position insertAfter(Position p, Object e) throws InvalidPositionException; public Object remove(Position p) throws InvalidPositionException; public Position before(Position p) throws InvalidPositionException; public Position after(Position p) throws InvalidPositionException; public Position firstPosition() throws EmptyContainerException; public Position lastPosition() throws EmptyContainerException; // Ranked Sequence methods public Object atRank(int rank) throws BoundaryViolationException; public void insertAtRank(int rank, Object e) throws BoundaryViolationException; public Object remove(int rank) throws BoundaryViolationException; // Deque methods public Position insertFirst(Object e); public Position insertLast(Object e); public Object removeFirst() throws EmptyContainerException; public Object removeLast() throws EmptyContainerException; public Object firstElement() throws EmptyContainerException; public Object lastElement() throws EmptyContainerException; // Conversion methods for ranks and positions public Position positionAtRank(int rank) throws BoundaryViolationException; public int rankOf(Position position) throws InvalidPositionException; }