class Range extends AviatorObject implements Sequence<Number> {


  private static final long serialVersionUID = 1463899968843425932L;
  private static final AviatorLong ZERO = AviatorLong.valueOf(0L);
  public static final Range LOOP = new Range(ZERO, ZERO, ZERO);

  static {
    LOOP.isLoop = true;
  }

  private final AviatorNumber step;
  private final AviatorNumber start;
  private final AviatorNumber end;
  final boolean forward;
  private boolean isLoop;

  public boolean isLoop() {
    return this.isLoop;
  }

  public Range(final AviatorNumber start, final AviatorNumber end, final AviatorNumber step) {
    super();
    this.start = start;
    this.end = end;
    this.step = step;
    this.forward = Range.this.step.compare(ZERO, Env.EMPTY_ENV) >= 0;
    this.isLoop = false;
  }

  @Override
  public String desc(final Map<String, Object> env) {<FILL_FUNCTION_BODY>}


  @Override
  public int innerCompare(final AviatorObject other, final Map<String, Object> env) {
    throw new CompareNotSupportedException();
  }



  @Override
  public AviatorType getAviatorType() {
    return AviatorType.Range;
  }



  @Override
  public Object getValue(final Map<String, Object> env) {
    return this;
  }



  public AviatorNumber first() {
    return this.start;
  }

  public AviatorNumber last() {
    return this.end;
  }


  @Override
  public int hintSize() {
    try {
      return size();
    } catch (Throwable t) {
      return 10;
    }
  }

  public int size() {
    int size =
        ((Number) this.end.sub(this.start, null).div(this.step, null).getValue(null)).intValue();
    return size < 0 ? 0 : size;
  }

  @Override
  public Collector newCollector(final int size) {
    if (size <= 0) {
      return new Collector() {
        List<Object> list = new ArrayList<>();

        @Override
        public void add(final Object e) {
          this.list.add(e);
        }

        @Override
        public Object getRawContainer() {
          return this.list;
        }
      };
    } else {
      return new Collector() {
        Object array = Array.newInstance(Object.class, size);
        int i = 0;

        @Override
        public void add(final Object e) {
          ArrayUtils.set(this.array, this.i++, e);
        }

        @Override
        public Object getRawContainer() {
          return this.array;
        }
      };
    }
  }

  @Override
  public Iterator<Number> iterator() {
    return new Iterator<Number>() {
      AviatorNumber current = Range.this.start;

      @Override
      public boolean hasNext() {
        if (Range.this.forward) {
          return this.current.compare(Range.this.end, Env.EMPTY_ENV) < 0;
        } else {
          return this.current.compare(Range.this.end, Env.EMPTY_ENV) > 0;
        }
      }

      @Override
      public void remove() {
        throw new UnsupportedOperationException();
      }

      @Override
      public Number next() {
        if (!hasNext()) {
          throw new NoSuchElementException();
        }
        AviatorNumber result = this.current;
        this.current = (AviatorNumber) this.current.add(Range.this.step, Env.EMPTY_ENV);
        return (Number) result.getValue(Env.EMPTY_ENV);
      }

    };
  }


}

    return "<Range, [" + this.start.getValue(env) + ", " + this.end.getValue(env) + "], "
        + this.step.getValue(env) + ">";
  
<methods>public non-sealed void <init>() ,public com.googlecode.aviator.runtime.type.AviatorObject add(com.googlecode.aviator.runtime.type.AviatorObject, Map<java.lang.String,java.lang.Object>) ,public com.googlecode.aviator.runtime.type.AviatorObject bitAnd(com.googlecode.aviator.runtime.type.AviatorObject, Map<java.lang.String,java.lang.Object>) ,public com.googlecode.aviator.runtime.type.AviatorObject bitNot(Map<java.lang.String,java.lang.Object>) ,public com.googlecode.aviator.runtime.type.AviatorObject bitOr(com.googlecode.aviator.runtime.type.AviatorObject, Map<java.lang.String,java.lang.Object>) ,public com.googlecode.aviator.runtime.type.AviatorObject bitXor(com.googlecode.aviator.runtime.type.AviatorObject, Map<java.lang.String,java.lang.Object>) ,public boolean booleanValue(Map<java.lang.String,java.lang.Object>) ,public int compare(com.googlecode.aviator.runtime.type.AviatorObject, Map<java.lang.String,java.lang.Object>) ,public int compareEq(com.googlecode.aviator.runtime.type.AviatorObject, Map<java.lang.String,java.lang.Object>) ,public com.googlecode.aviator.runtime.type.AviatorObject defineValue(com.googlecode.aviator.runtime.type.AviatorObject, Map<java.lang.String,java.lang.Object>) ,public com.googlecode.aviator.runtime.type.AviatorObject deref(Map<java.lang.String,java.lang.Object>) ,public java.lang.String desc(Map<java.lang.String,java.lang.Object>) ,public com.googlecode.aviator.runtime.type.AviatorObject div(com.googlecode.aviator.runtime.type.AviatorObject, Map<java.lang.String,java.lang.Object>) ,public com.googlecode.aviator.runtime.type.AviatorObject exponent(com.googlecode.aviator.runtime.type.AviatorObject, Map<java.lang.String,java.lang.Object>) ,public abstract com.googlecode.aviator.runtime.type.AviatorType getAviatorType() ,public com.googlecode.aviator.runtime.type.AviatorObject getElement(Map<java.lang.String,java.lang.Object>, com.googlecode.aviator.runtime.type.AviatorObject) ,public Map<java.lang.Object,java.lang.Object> getMetadata() ,public abstract java.lang.Object getValue(Map<java.lang.String,java.lang.Object>) ,public abstract int innerCompare(com.googlecode.aviator.runtime.type.AviatorObject, Map<java.lang.String,java.lang.Object>) ,public boolean isNull(Map<java.lang.String,java.lang.Object>) ,public com.googlecode.aviator.runtime.type.AviatorObject match(com.googlecode.aviator.runtime.type.AviatorObject, Map<java.lang.String,java.lang.Object>) ,public java.lang.Object meta(java.lang.Object) ,public com.googlecode.aviator.runtime.type.AviatorObject mod(com.googlecode.aviator.runtime.type.AviatorObject, Map<java.lang.String,java.lang.Object>) ,public com.googlecode.aviator.runtime.type.AviatorObject mult(com.googlecode.aviator.runtime.type.AviatorObject, Map<java.lang.String,java.lang.Object>) ,public com.googlecode.aviator.runtime.type.AviatorObject neg(Map<java.lang.String,java.lang.Object>) ,public com.googlecode.aviator.runtime.type.AviatorObject not(Map<java.lang.String,java.lang.Object>) ,public java.lang.Number numberValue(Map<java.lang.String,java.lang.Object>) ,public com.googlecode.aviator.runtime.type.AviatorObject setValue(com.googlecode.aviator.runtime.type.AviatorObject, Map<java.lang.String,java.lang.Object>) ,public com.googlecode.aviator.runtime.type.AviatorObject shiftLeft(com.googlecode.aviator.runtime.type.AviatorObject, Map<java.lang.String,java.lang.Object>) ,public com.googlecode.aviator.runtime.type.AviatorObject shiftRight(com.googlecode.aviator.runtime.type.AviatorObject, Map<java.lang.String,java.lang.Object>) ,public java.lang.String stringValue(Map<java.lang.String,java.lang.Object>) ,public com.googlecode.aviator.runtime.type.AviatorObject sub(com.googlecode.aviator.runtime.type.AviatorObject, Map<java.lang.String,java.lang.Object>) ,public java.lang.String toString() ,public com.googlecode.aviator.runtime.type.AviatorObject unsignedShiftRight(com.googlecode.aviator.runtime.type.AviatorObject, Map<java.lang.String,java.lang.Object>) ,public com.googlecode.aviator.runtime.type.AviatorObject withMeta(java.lang.Object, java.lang.Object) ,public com.googlecode.aviator.runtime.type.AviatorObject withoutMeta(java.lang.Object) <variables>protected Map<java.lang.Object,java.lang.Object> metadata,private static final long serialVersionUID