public interface Cursor {
    // Pre: None
    // Post: Returns a copy of this Cursor that can be moved independently
    public Cursor duplicate();
        
    // Pre: None
    // Post: Returns true if two Cursors are between the same characters
    //       Returns false otherwise
    public boolean equals(Object other);
        
    // Pre: None
    // Post: Returns true if this Cursor is pointing before the first character
    public boolean atStart();

    // Pre: None
    // Post: Returns true if this Cursor is pointing after the last character
    public boolean atEnd();
        
    // Pre: None
    // Post: If atEnd(), does nothing
    //       Otherwise, advances to next position
    public void forward();
        
    // Pre: None
    // Post: If atStart(), does nothing
    //       Otherwise, moves to previous position
    public void backward();

    // Pre: !atStart()
    // Post: Returns character from before the cursor
    public char getCharBefore();

    // Pre: !atEnd()
    // Post: Returns character after the cursor
    public char getCharAfter();
        
    // Pre: None 
    // Post: Inserts c before the cursor's current position
    public void insert(char c);
        
    // Pre: !atEnd()
    // Post: Overwrites the character immediately after the cursor.
    public void overwrite(char c);
        
    // Pre: None
    // Post: if atEnd(), does nothing
    //       otherwise, deletes the next character
    public void deleteNext();
        
    // Pre: None
    // Post: if atStart(), does nothing
    //       otherwise, deletes the previous character
    public void deletePrev();
}
