import ControlFlowEdge from "../edge/ControlFlowEdge.js";
import InstructionNode from "./instruction/InstructionNode.js";
import BaseNode from "../../graph/BaseNode.js";
import { NodeBuilder, NodeTypeGuard } from "../../graph/Node.js";
import { Joinpoint } from "../../../../../Joinpoints.js";
declare namespace FlowNode {
    class Class<D extends Data = Data, S extends ScratchData = ScratchData> extends BaseNode.Class<D, S> {
        insertBefore(node: InstructionNode.Class): void;
        insertSubgraphBefore(head: BaseNode.Class, tail: InstructionNode.Class[]): void;
        removeFromFlow(): void;
        get reachableNodes(): FlowNode.Class[];
        get previousEdges(): ControlFlowEdge.Class[];
        get previousNodes(): FlowNode.Class[];
        get nextEdges(): ControlFlowEdge.Class[];
        get nextNodes(): FlowNode.Class[];
        get jp(): Joinpoint | undefined;
    }
    abstract class Builder extends BaseNode.Builder implements NodeBuilder<Data, ScratchData> {
        #private;
        constructor(type: Type, $jp: Joinpoint | undefined);
        buildData(data: BaseNode.Data): Data;
        buildScratchData(scratchData: BaseNode.ScratchData): ScratchData;
    }
    const TypeGuard: NodeTypeGuard<Data, ScratchData>;
    interface Data extends BaseNode.Data {
        flowNodeType: Type;
    }
    interface ScratchData extends BaseNode.ScratchData {
        $jp: Joinpoint | undefined;
    }
    enum Type {
        INSTRUCTION = "instruction",
        CONDITION = "condition"
    }
}
export default FlowNode;
//# sourceMappingURL=FlowNode.d.ts.map