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

package org.jline.console;

import java.util.HashMap;
import java.util.Map;
import org.jline.reader.ParsedLine;
import org.jline.terminal.Terminal;
import org.jline.reader.Completer;
import java.util.Collection;
import java.io.File;
import org.jline.builtins.ConsoleOptionGetter;

public interface SystemRegistry extends CommandRegistry, ConsoleOptionGetter
{
    void setCommandRegistries(final CommandRegistry... p0);
    
    void register(final String p0, final CommandRegistry p1);
    
    void initialize(final File p0);
    
    Collection<String> getPipeNames();
    
    Completer completer();
    
    CmdDesc commandDescription(final CmdLine p0);
    
    Object execute(final String p0) throws Exception;
    
    void cleanUp();
    
    void trace(final Throwable p0);
    
    void trace(final boolean p0, final Throwable p1);
    
    Object consoleOption(final String p0);
    
     <T> T consoleOption(final String p0, final T p1);
    
    void setConsoleOption(final String p0, final Object p1);
    
    Terminal terminal();
    
    Object invoke(final String p0, final Object... p1) throws Exception;
    
    boolean isCommandOrScript(final ParsedLine p0);
    
    boolean isCommandOrScript(final String p0);
    
    boolean isCommandAlias(final String p0);
    
    void close();
    
    default SystemRegistry get() {
        return Registeries.getInstance().getSystemRegistry();
    }
    
    default void add(final SystemRegistry systemRegistry) {
        Registeries.getInstance().addRegistry(systemRegistry);
    }
    
    default void remove() {
        Registeries.getInstance().removeRegistry();
    }
    
    public static class Registeries
    {
        private static final Registeries instance;
        private final Map<Long, SystemRegistry> systemRegisteries;
        
        private Registeries() {
            this.systemRegisteries = new HashMap<Long, SystemRegistry>();
        }
        
        protected static Registeries getInstance() {
            return Registeries.instance;
        }
        
        protected void addRegistry(final SystemRegistry systemRegistry) {
            this.systemRegisteries.put(getThreadId(), systemRegistry);
        }
        
        protected SystemRegistry getSystemRegistry() {
            return this.systemRegisteries.getOrDefault(getThreadId(), null);
        }
        
        protected void removeRegistry() {
            this.systemRegisteries.remove(getThreadId());
        }
        
        private static long getThreadId() {
            return Thread.currentThread().getId();
        }
        
        static {
            instance = new Registeries();
        }
    }
}
