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

package com.hypixel.hytale.component.data;

import com.hypixel.hytale.component.task.ParallelRangeTask;
import javax.annotation.Nonnull;
import com.hypixel.hytale.component.task.ParallelTask;
import javax.annotation.Nullable;
import com.hypixel.hytale.component.CommandBuffer;
import com.hypixel.hytale.component.ArchetypeChunk;
import com.hypixel.hytale.function.consumer.IntBiObjectConsumer;
import java.util.function.IntConsumer;

public class ForEachTaskData<ECS_TYPE> implements IntConsumer
{
    @Nullable
    private IntBiObjectConsumer<ArchetypeChunk<ECS_TYPE>, CommandBuffer<ECS_TYPE>> consumer;
    @Nullable
    private ArchetypeChunk<ECS_TYPE> archetypeChunk;
    @Nullable
    private CommandBuffer<ECS_TYPE> commandBuffer;
    
    public void init(final IntBiObjectConsumer<ArchetypeChunk<ECS_TYPE>, CommandBuffer<ECS_TYPE>> consumer, final ArchetypeChunk<ECS_TYPE> archetypeChunk, final CommandBuffer<ECS_TYPE> commandBuffer) {
        this.consumer = consumer;
        this.archetypeChunk = archetypeChunk;
        this.commandBuffer = commandBuffer;
    }
    
    @Override
    public void accept(final int index) {
        assert this.commandBuffer.setThread();
        this.consumer.accept(index, this.archetypeChunk, this.commandBuffer);
    }
    
    public void clear() {
        this.consumer = null;
        this.archetypeChunk = null;
        this.commandBuffer = null;
    }
    
    public static <ECS_TYPE> void invokeParallelTask(@Nonnull final ParallelTask<ForEachTaskData<ECS_TYPE>> parallelTask, @Nonnull final CommandBuffer<ECS_TYPE> commandBuffer) {
        final int parallelTaskSize = parallelTask.size();
        if (parallelTaskSize <= 0) {
            return;
        }
        parallelTask.doInvoke();
        for (int x = 0; x < parallelTaskSize; ++x) {
            final ParallelRangeTask<ForEachTaskData<ECS_TYPE>> systemTask = parallelTask.get(x);
            for (int i = 0, systemTaskSize = systemTask.size(); i < systemTaskSize; ++i) {
                final ForEachTaskData<ECS_TYPE> data = systemTask.get(i);
                data.commandBuffer.mergeParallel(commandBuffer);
                data.clear();
            }
        }
    }
}
