#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 );
}
#endif