#ifndef EMPATHY_SEMA_ENV_H
#define EMPATHY_SEMA_ENV_H
namespace empathy::sema
{
class TemplateRuleSet;
class InvocationRuleSet;
class UnificationRuleSet;
class Env
{
public:
Env();
enum class Status
{
Success,
NoMatch,
AmbiguousMatch
};
using ValueProvider = function< Status ( const Context& c, const Term& identity, const Term& contextId, Term& result ) >;
void storeValue( const Term& idPat, const Term& contextIdPat, const Term& val );
void storeValue( const Term& idPat, const Term& contextIdPat, const ptr< ValueProvider >& valp );
Status retrieveValue( const Term& id, const Context& c, Term& result ) const;
void addTransitiveImport( const Term& toImport, const Term& destination );
void addIntransitiveImport( const Term& toImport, const Term& destination );
const auto& templateRuleSet() const { return m_templateRuleSet; }
const auto& invocationRuleSet() const { return m_invocationRuleSet; }
const auto& unificationRuleSet() const { return m_unificationRuleSet; }
auto& templateRuleSet() { return m_templateRuleSet; }
auto& invocationRuleSet() { return m_invocationRuleSet; }
auto& unificationRuleSet() { return m_unificationRuleSet; }
static auto GetUniqueId() { return ms_nextUniqueId++; }
private:
Trie< ptr< ValueProvider > > m_valueStore;
ptr< TemplateRuleSet > m_templateRuleSet;
ptr< InvocationRuleSet > m_invocationRuleSet;
ptr< UnificationRuleSet > m_unificationRuleSet;
static uint32_t ms_nextUniqueId;
};
}
#endif