#include "stmdsp.hpp"
#include "exprtk.hpp"
#include <string>
#include <vector>

std::vector<stmdsp::dacsample_t> siggen_formula_parse(const std::string& formulaString)
{
    double x = 0;

    exprtk::symbol_table<double> symbol_table;
    symbol_table.add_variable("x", x);
    symbol_table.add_constants();

    exprtk::expression<double> expression;
    expression.register_symbol_table(symbol_table);

    exprtk::parser<double> parser;
    parser.compile(formulaString, expression);

    std::vector<stmdsp::dacsample_t> samples;
    for (x = 0; samples.size() < stmdsp::SAMPLES_MAX; x += 1) {
        auto y = static_cast<stmdsp::dacsample_t>(expression.value());
        samples.push_back(y);
    }

    return samples;
}