#ifndef SCHEME_MODULE_HPP
#define SCHEME_MODULE_HPP

#include <analysis/PolynomialBasis.hpp>
#include <language/modules/BuiltinModule.hpp>
#include <language/utils/ASTNodeDataTypeTraits.hpp>
#include <utils/PugsMacros.hpp>

class IBoundaryDescriptor;
template <>
inline ASTNodeDataType ast_node_data_type_from<std::shared_ptr<const IBoundaryDescriptor>> =
  ASTNodeDataType::build<ASTNodeDataType::type_id_t>("boundary");

class IBoundaryConditionDescriptor;
template <>
inline ASTNodeDataType ast_node_data_type_from<std::shared_ptr<const IBoundaryConditionDescriptor>> =
  ASTNodeDataType::build<ASTNodeDataType::type_id_t>("boundary_condition");

template <>
inline ASTNodeDataType ast_node_data_type_from<std::shared_ptr<const BasisType>> =
  ASTNodeDataType::build<ASTNodeDataType::type_id_t>("basis_type");

class SchemeModule : public BuiltinModule
{
 public:
  std::string_view
  name() const final
  {
    return "scheme";
  }

  SchemeModule();

  ~SchemeModule() = default;
};

#endif   // SCHEME_MODULE_HPP