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

package com.hypixel.hytale.codec.store;

import javax.annotation.Nullable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
import com.hypixel.hytale.codec.Codec;
import java.util.Map;

public class CodecStore
{
    public static final CodecStore STATIC;
    private final CodecStore parent;
    private final Map<CodecKey<?>, Codec<?>> codecs;
    private final Map<CodecKey<?>, Supplier<Codec<?>>> codecSuppliers;
    
    public CodecStore() {
        this.codecs = new ConcurrentHashMap<CodecKey<?>, Codec<?>>();
        this.codecSuppliers = new ConcurrentHashMap<CodecKey<?>, Supplier<Codec<?>>>();
        this.parent = CodecStore.STATIC;
    }
    
    public CodecStore(final CodecStore parent) {
        this.codecs = new ConcurrentHashMap<CodecKey<?>, Codec<?>>();
        this.codecSuppliers = new ConcurrentHashMap<CodecKey<?>, Supplier<Codec<?>>>();
        this.parent = parent;
    }
    
    @Nullable
    public <T> Codec<T> getCodec(final CodecKey<T> key) {
        Codec<T> codec = (Codec<T>)this.codecs.get(key);
        if (codec != null) {
            return codec;
        }
        final Supplier<Codec<?>> supplier = this.codecSuppliers.get(key);
        if (supplier != null) {
            codec = (Codec)supplier.get();
        }
        if (codec != null) {
            return codec;
        }
        return (Codec<T>)((this.parent != null) ? this.parent.getCodec((CodecKey<Object>)key) : null);
    }
    
    public <T> void putCodec(final CodecKey<T> key, final Codec<T> codec) {
        this.codecs.put(key, codec);
    }
    
    public <T> Codec<?> removeCodec(final CodecKey<T> key) {
        return this.codecs.remove(key);
    }
    
    public <T> void putCodecSupplier(final CodecKey<T> key, final Supplier<Codec<T>> supplier) {
        this.codecSuppliers.put(key, (Supplier<Codec<?>>)supplier);
    }
    
    public <T> Supplier<Codec<?>> removeCodecSupplier(final CodecKey<T> key) {
        return this.codecSuppliers.remove(key);
    }
    
    static {
        STATIC = new CodecStore();
    }
}
