#include "builtins/builtins.h"
using namespace goose;
using namespace goose::eir;
using namespace goose::cir;
namespace goose::builtins
{
void SetupLocalVarTypeChecking( Env& e )
{
auto localVarPattern = GetValueType< LocalVar >( ANYTERM( _ ) );
// LocalVar type checking against another LocalVar: unify their types.
e.typeCheckingRuleSet()->addTypeCheckingRule( TCRINFOS,
ParamPat( localVarPattern ),
ValueToEIR( ValuePattern(
ANYTERM( _ ),
localVarPattern,
ANYTERM( _ ) ) ),
[]( const Term& lhs, const Term& rhs, const TypeCheckingContext& tcc ) -> TCGen
{
auto lvarType = *FromValue< LocalVarType >( *EIRToValue( EIRToValuePattern( lhs )->type() ) );
auto rhsVal = *EIRToValuePattern( rhs );
auto rvarType = *FromValue< LocalVarType >( *EIRToValue( rhsVal.type() ) );
for( auto&& [s, tcc] : Unify( lvarType.type(), rvarType.type(), tcc ) )
{
co_yield { ValueToEIR( Value( ValueToEIR( ToValue( LocalVarType( s ) ) ),
rhsVal.val() ).setLocationId( rhsVal.locationId() ) ), tcc };
}
} );
}
}