content: package rabbitescape.engine;
  
  import rabbitescape.engine.util.Position;
  
  /** The directions that can be affected by a cell during cellular automation. */
  public enum CellularDirection
  {
      UP( 0, -1 ),
      RIGHT( 1, 0 ),
      DOWN( 0, 1 ),
      LEFT( -1, 0 ),
      HERE( 0, 0 );
  
      public final int xOffset;
      public final int yOffset;
  
      private CellularDirection( int xOffset, int yOffset )
      {
          this.xOffset = xOffset;
          this.yOffset = yOffset;
      }
  
      public static CellularDirection opposite( CellularDirection input )
      {
          switch( input )
          {
              case UP:    return DOWN;
              case RIGHT: return LEFT;
              case DOWN:  return UP;
              case LEFT:  return RIGHT;
              case HERE:  throw new IllegalStateException(
                  "Here has no opposite" );
              default: throw new IllegalArgumentException( input.name() );
          }
      }
  
      public Position offset( Position position )
      {
          return new Position( position.x + xOffset, position.y + yOffset );
      }
  }
  