package code.instr;

import code.lang.SuccessModule;
import code.space.Computation;
import code.stuff.Logger;
import code.stuff.Tracer;
import code.term.Term;

/**
 * Fail the current computation. This is generally executed when a needed
 * operation rooted term cannot be narrowed to a constructor rooted term.
 *
 * @author Sergio Antoy
 * @since June 17, 2003
 */

public class Fail implements Instruction {
    private Fail() {}
    public final static Fail singleton = new Fail();

    /**
     * A sequence of FLVM instructions that causes failure.
     * Can be used to optimize Branch instructions.
     */
    public final static Instruction[] failSeq = { singleton, };

    private final static Term reduct = SuccessModule.termFail;

    public void execute(Computation computation) {
        Term term = computation.getTerm();
        if (Tracer.instruction) {
            Logger.logln(computation.getIdString() +
                    ": Fail: " + term);
        }
        if (Tracer.reduction) Tracer.traceRewrite(computation, term, reduct);
        term.update(reduct);
    }

    public String printAsTxtLoadable() { return "Fail"; }
}

