// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.builtin.hytalegenerator.framework.cartas;

import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import com.hypixel.hytale.builtin.hytalegenerator.threadindexer.WorkerIndexer;
import java.util.ArrayList;
import java.util.Objects;
import javax.annotation.Nonnull;
import java.util.List;
import com.hypixel.hytale.builtin.hytalegenerator.framework.interfaces.functions.TriCarta;

public class LayeredCarta<R> extends TriCarta<R>
{
    @Nonnull
    private final List<TriCarta<R>> layers;
    @Nonnull
    private final List<R> allValues;
    @Nonnull
    private final R defaultValue;
    
    public LayeredCarta(@Nonnull final R defaultValue) {
        Objects.requireNonNull(defaultValue);
        this.layers = new ArrayList<TriCarta<R>>(1);
        this.allValues = new ArrayList<R>(1);
        this.defaultValue = defaultValue;
        this.allValues.add(defaultValue);
    }
    
    @Override
    public R apply(final int x, final int y, final int z, @Nonnull final WorkerIndexer.Id id) {
        R result = this.defaultValue;
        for (final TriCarta<R> layer : this.layers) {
            final R value = layer.apply(x, y, z, id);
            if (value == null) {
                continue;
            }
            result = value;
        }
        return result;
    }
    
    @Nonnull
    @Override
    public List<R> allPossibleValues() {
        return Collections.unmodifiableList((List<? extends R>)this.allValues);
    }
    
    @Nonnull
    public LayeredCarta<R> addLayer(@Nonnull final TriCarta<R> layer) {
        Objects.requireNonNull(layer);
        this.layers.add(layer);
        this.allValues.addAll((Collection<? extends R>)layer.allPossibleValues());
        return this;
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "LayeredCarta{layers=" + String.valueOf(this.layers) + ", allValues=" + String.valueOf(this.allValues) + ", defaultValue=" + String.valueOf(this.defaultValue);
    }
}
