#pragma once

#include <string>

#include "machine.h"
#include "katom.h"

enum class eval_t {
    shell,
    python,
    cpp,
};

class Eval
{
public:
    explicit Eval(Machine& machine, const Locator& loc)
        : m_machine(machine),
          m_loc(loc)
        {};
    Eval(const Eval&) = delete;
    Eval& operator=(const Eval&) = delete;
    //~Eval_cpp();

    std::vector<Katom> eval(
        std::vector<Katom>::iterator begin, std::vector<Katom>::iterator end);

    // Dispatch the @eval command (python/shell/haskell/cpp) and return its
    // raw string result, without re-reading it as Klammertext.  Used by
    // :after_apply phase functions, whose input and output are final target
    // text -- re-katomizing it would misparse target characters (a "@" in
    // justified txt output) as Klammertext syntax.
    std::string eval_command(
        std::vector<Katom>::iterator begin, std::vector<Katom>::iterator end);

    Machine m_machine;
    Locator m_loc;
};
