#ifndef GOOSE_SEMA_TYPECHECK_H
#define GOOSE_SEMA_TYPECHECK_H
namespace goose::sema
{
struct NoUnification
{
};
struct AmbiguousTypeCheck
{
};
using TCSol = pair< Term, TypeCheckingContext >;
using TypeCheckingSolution = variant< NoUnification, AmbiguousTypeCheck, TCSol >;
TypeCheckingSolution FindBestTyping( const Term& lhs, const Term& rhs, const Context& context );
using TCGen = Generator< pair< Term, TypeCheckingContext > >;
TCGen TypeCheck( const Term& lhs, const Term& rhs, const TypeCheckingContext& tcc );
TCGen Unify( const Term& lhs, const Term& rhs, const TypeCheckingContext& tcc );
optional< Term > HalfUnify( const Term& lhs, TypeCheckingContext& tcc );
} // namespace goose::sema
#endif