/**
 * Copyright (c) André Bargull
 * Alle Rechte vorbehalten / All Rights Reserved.  Use is subject to license terms.
 *
 * <https://github.com/anba/es6draft>
 */
package com.github.anba.es6draft.runtime.objects.collection;

import java.util.Iterator;
import java.util.Map.Entry;

import com.github.anba.es6draft.runtime.Realm;
import com.github.anba.es6draft.runtime.types.ScriptObject;
import com.github.anba.es6draft.runtime.types.builtins.OrdinaryObject;

/**
 * 23.2.5.3 Properties of Set Iterator Instances
 */
public final class SetIteratorObject extends OrdinaryObject {
    /** [[IteratedSet]] / [[SetNextIndex]] */
    Iterator<Entry<Object, Void>> iterator;

    /** [[SetIterationKind]] */
    final SetIterationKind iterationKind;

    SetIteratorObject(Realm realm, SetObject set, SetIterationKind kind, ScriptObject prototype) {
        this(realm, set.getSetData().iterator(), kind, prototype);
    }

    SetIteratorObject(Realm realm, Iterator<Entry<Object, Void>> iterator, SetIterationKind kind,
            ScriptObject prototype) {
        super(realm, prototype);
        this.iterator = iterator;
        this.iterationKind = kind;
    }

    /**
     * 23.2.5.3 Properties of Set Iterator Instances
     */
    public enum SetIterationKind {
        Key, Value, KeyValue
    }

    /**
     * [[IteratedSet]] / [[SetNextIndex]]
     * 
     * @return the internal iterator
     */
    public Iterator<Entry<Object, Void>> getIterator() {
        return iterator;
    }

    /**
     * [[IteratedSet]] / [[SetNextIndex]]
     * 
     * @param iterator
     *            the internal iterator
     */
    public void setIterator(Iterator<Entry<Object, Void>> iterator) {
        this.iterator = iterator;
    }

    /**
     * [[SetIterationKind]]
     * 
     * @return the iteration kind
     */
    public SetIterationKind getIterationKind() {
        return iterationKind;
    }

    @Override
    public String toString() {
        return String.format("%s, iterationKind=%s", super.toString(), iterationKind);
    }
}
