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

package com.hypixel.hytale.metrics;

import com.hypixel.hytale.codec.Codec;
import java.util.function.Function;
import java.util.concurrent.Executor;
import java.util.concurrent.CompletableFuture;
import org.bson.BsonValue;
import com.hypixel.hytale.codec.ExtraInfo;
import javax.annotation.Nonnull;

public class ExecutorMetricsRegistry<T extends ExecutorMetric> extends MetricsRegistry<T>
{
    @Override
    public BsonValue encode(@Nonnull final T t, final ExtraInfo extraInfo) {
        if (t.isInThread()) {
            return super.encode(t, extraInfo);
        }
        return CompletableFuture.supplyAsync(() -> super.encode((T)t, extraInfo), t).join();
    }
    
    @Override
    public <R extends MetricProvider> ExecutorMetricsRegistry<T> register(final String id, @Nonnull final Function<T, R> func) {
        return (ExecutorMetricsRegistry)super.register(id, func);
    }
    
    @Override
    public <R> ExecutorMetricsRegistry<T> register(final String id, final Function<T, R> func, final Codec<R> codec) {
        return (ExecutorMetricsRegistry)super.register(id, func, codec);
    }
    
    @Override
    public ExecutorMetricsRegistry<T> register(final String id, final MetricsRegistry<Void> metricsRegistry) {
        return (ExecutorMetricsRegistry)super.register(id, metricsRegistry);
    }
    
    @Override
    public <R> ExecutorMetricsRegistry<T> register(final String id, final Function<T, R> func, final Function<R, MetricsRegistry<R>> codecFunc) {
        return (ExecutorMetricsRegistry)super.register(id, func, codecFunc);
    }
    
    public interface ExecutorMetric extends Executor
    {
        boolean isInThread();
    }
}
