1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include "sema.h"
namespace goose::sema
{
TCGen UnifyVectors( VecGenerator lvg, VecGenerator rvg, const Vector& solutionVec, TypeCheckingContext tcc )
{
for( auto&& [u,tcc] : Unify( lvg(), rvg(), tcc ) )
{
auto vec = Vector::MakeAppend( solutionVec, move( u ) );
if( lvg.fixedPartFinished() && rvg.fixedPartFinished() )
co_yield { TERM( make_shared< Vector >( move( vec ) ) ), tcc };
else
co_yield UnifyVectors( lvg, rvg, vec, tcc );
|
|
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include "sema.h"
namespace goose::sema
{
TCGen UnifyVectors( TCVecGenerator lvg, TCVecGenerator rvg, const Vector& solutionVec, TypeCheckingContext tcc )
{
for( auto&& [u,tcc] : Unify( lvg( tcc.LHSSubContext() ), rvg( tcc.RHSSubContext() ), tcc ) )
{
auto vec = Vector::MakeAppend( solutionVec, move( u ) );
if( lvg.fixedPartFinished() && rvg.fixedPartFinished() )
co_yield { TERM( make_shared< Vector >( move( vec ) ) ), tcc };
else
co_yield UnifyVectors( lvg, rvg, vec, tcc );
|
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
{
assert( holds_alternative< pvec >( lhs ) );
assert( holds_alternative< pvec >( rhs ) );
const auto& lVector = get< pvec >( lhs );
const auto& rVector = get< pvec >( rhs );
VecGenerator lvg( *lVector );
VecGenerator rvg( *rVector );
if( lvg.fixedPartFinished() && rvg.fixedPartFinished() )
{
co_yield { lhs, tcc };
co_return;
}
Vector sol;
co_yield UnifyVectors( lvg, rvg, sol, tcc );
} );
}
}
|
|
|
|
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
{
assert( holds_alternative< pvec >( lhs ) );
assert( holds_alternative< pvec >( rhs ) );
const auto& lVector = get< pvec >( lhs );
const auto& rVector = get< pvec >( rhs );
TCVecGenerator lvg( *lVector );
TCVecGenerator rvg( *rVector );
if( lvg.fixedPartFinished() && rvg.fixedPartFinished() )
{
co_yield { lhs, tcc };
co_return;
}
Vector sol;
co_yield UnifyVectors( lvg, rvg, sol, tcc );
} );
}
}
|