content: /*
   * Copyright 2005-2010 Roger Kapsi, Sam Berlin
   *
   *   Licensed under the Apache License, Version 2.0 (the "License");
   *   you may not use this file except in compliance with the License.
   *   You may obtain a copy of the License at
   *
   *       http://www.apache.org/licenses/LICENSE-2.0
   *
   *   Unless required by applicable law or agreed to in writing, software
   *   distributed under the License is distributed on an "AS IS" BASIS,
   *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *   See the License for the specific language governing permissions and
   *   limitations under the License.
   */
  
  package org.apache.cassandra.index.sasi.utils.trie;
  
  import java.util.Map;
  import java.util.Map.Entry;
  
  /**
   * This class is taken from https://github.com/rkapsi/patricia-trie (v0.6), and slightly modified
   * to correspond to Cassandra code style, as the only Patricia Trie implementation,
   * which supports pluggable key comparators (e.g. commons-collections PatriciaTrie (which is based
   * on rkapsi/patricia-trie project) only supports String keys)
   * but unfortunately is not deployed to the maven central as a downloadable artifact.
   */
  
  /**
   * A {@link Cursor} can be used to traverse a {@link Trie}, visit each node
   * step by step and make {@link Decision}s on each step how to continue with
   * traversing the {@link Trie}.
   */
  public interface Cursor<K, V>
  {
  
      /**
       * The {@link Decision} tells the {@link Cursor} what to do on each step
       * while traversing the {@link Trie}.
       *
       * NOTE: Not all operations that work with a {@link Cursor} support all
       * {@link Decision} types
       */
      enum Decision
      {
  
          /**
           * Exit the traverse operation
           */
          EXIT,
  
          /**
           * Continue with the traverse operation
           */
          CONTINUE,
  
          /**
           * Remove the previously returned element
           * from the {@link Trie} and continue
           */
          REMOVE,
  
          /**
           * Remove the previously returned element
           * from the {@link Trie} and exit from the
           * traverse operation
           */
          REMOVE_AND_EXIT
      }
  
      /**
       * Called for each {@link Entry} in the {@link Trie}. Return
       * {@link Decision#EXIT} to finish the {@link Trie} operation,
       * {@link Decision#CONTINUE} to go to the next {@link Entry},
       * {@link Decision#REMOVE} to remove the {@link Entry} and
       * continue iterating or {@link Decision#REMOVE_AND_EXIT} to
       * remove the {@link Entry} and stop iterating.
       *
       * Note: Not all operations support {@link Decision#REMOVE}.
       */
      Decision select(Map.Entry<? extends K, ? extends V> entry);
  }
  