# PreparedStatementWriterIndex.java

    package org.codefilarete.stalactite.sql.statement.binder;

    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;

    /**
     * @author Guillaume Mary
     */
    public interface PreparedStatementWriterIndex<K, BINDER extends PreparedStatementWriter> extends PreparedStatementWriterProvider<K> {

    	/**
    	 * @return all available keys
    	 */
    	Set<K> keys();

    	/**
    	 * Aims at being used for iterating over all keys and values instead of calling {@link #getWriter(Object)} for each element of {@link #keys()}
    	 * @return all the key + value pairs of this index
    	 */
    	Set<Entry<K, BINDER>> all();

    	/**
    	 * Short way of getting a {@link PreparedStatementWriterProvider} from a Map
    	 * @param parameterBinders the source of {@link PreparedStatementWriter}
    	 * @return a {@link PreparedStatementWriterProvider} backed by the Map
    	 */
    	static <K, BINDER extends PreparedStatementWriter<?>> PreparedStatementWriterIndex<K, BINDER> fromMap(Map<K, BINDER> parameterBinders) {
    		return new PreparedStatementWriterIndexFromMap<>(parameterBinders);
    	}

    	/**
    	 * A simple {@link ParameterBinderIndex} that takes its values from a {@link Map}
    	 *
    	 * @author Guillaume Mary
    	 */
    	class PreparedStatementWriterIndexFromMap<ParamType, BINDER extends PreparedStatementWriter<?>> extends PreparedStatementWriterProviderFromMap<ParamType, BINDER> implements PreparedStatementWriterIndex<ParamType, BINDER> {

    		public PreparedStatementWriterIndexFromMap(Map<ParamType, BINDER> parameterBinders) {
    			super(parameterBinders);
    		}

    		@Override
    		public Set<ParamType> keys() {
    			return getParameterBinders().keySet();
    		}

    		@Override
    		public Set<Entry<ParamType, BINDER>> all() {
    			return getParameterBinders().entrySet();
    		}
    	}
    }