Goose  Diff

Differences From Artifact [0d04bf3b29]:

  • File bs/builtins/types/overloadset/overloadset.cpp — part of check-in [25d0ee65d4] at 2019-03-31 20:42:15 on branch trunk — Higher order functions: template lambdas can be passed to template function parameters. (user: achavasse size: 2513)

To Artifact [a63419f46d]:

  • File bs/builtins/types/overloadset/overloadset.cpp — part of check-in [2acce94d2d] at 2019-06-29 14:36:18 on branch trunk — Handle execution domains when invoking/unifying functions, template functions, overload sets and constrained funcs. (user: achavasse size: 3162)

8
9
10
11
12
13
14

15
16
17
18
19
20
21
22

23

24
25


26
27
28
29
30
31






32
33
34
35









36
37
38
39
40
41

42
43
44
45
46
47
48
49





50
51
52
53
54
55
56
57
58
59












60
61
62
63
64
65
66
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

23
24
25
26
27
28
29






30
31
32
33
34
35
36



37
38
39
40
41
42
43
44
45
46
47
48
49
50

51
52
53
54
55
56
57
58
59
60
61
62
63
64










65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83







+







-
+

+


+
+
-
-
-
-
-
-
+
+
+
+
+
+

-
-
-
+
+
+
+
+
+
+
+
+





-
+








+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+







    assert( pInvRule );

    auto signature = pInvRule->getSignature( callee );
    assert( signature );

    auto result = Decompose( *signature,
        Vec(
            SubTerm(),
            Val< pvec >(),
            SubTerm()
        )
    );

    assert( result );

    auto&& [params,rt] = *result;
    auto&& [domain, p, rt] = *result;
    const auto& rtype = rt;
    const auto& params = p;

    bool success = false;
    m_trie = Merge( m_trie, domain, [&]< class UT >( const ptr< UT >& paramUTrie )
    {
    m_trie = m_trie->merge( *params, [&]( auto&& rtTrie )
    {
        return Merge( rtTrie, rtype, [&]( auto&& previous ) -> Overload
        {
            if( previous.callee )
                return move( previous );
        auto uTrieMergeFunc = [&]( auto&& rtTrie )
        {
            return Merge( rtTrie, rtype, [&]( auto&& previous ) -> Overload
            {
                if( previous.callee )
                    return move( previous );

            success = true;
            return { pInvRule, callee };
        } );
                success = true;
                return { pInvRule, callee };
            } );
        };

        if( !paramUTrie )
            return UT().merge( *params, uTrieMergeFunc );

        return paramUTrie->merge( *params, uTrieMergeFunc );
    } );

    return success;
}

OverloadSet::UniGen OverloadSet::unify( const Term& argsPat, const Term& rtPat, UnificationContext& uc ) const
OverloadSet::UniGen OverloadSet::unify( const Term& domPat, const Term& argsPat, const Term& rtPat, UnificationContext& uc ) const
{
    auto argDecomp = Decompose( argsPat,
        Val< pvec >()
    );

    if( !argDecomp )
        co_return;

    for( auto&& [domain,paramUTrie] : Enumerate( m_trie ) )
    {
        auto localC = uc;
        for( auto&& [uniDom,uc] : Unify( domain, domPat, localC ) )
        {
    for( auto&& [uniParamsVec,rtTrie,uc] : m_trie->unify( *argDecomp->get(), uc ) )
    {
        auto uniParams = TERM( make_shared< Vector >( uniParamsVec ) );
        for( auto&& [rt,ovl] : Enumerate( rtTrie ) )
        {
            auto localC = uc;
            for( auto&& [uniRt,uc] : Unify( rt, rtPat, localC ) )
            {
                auto uniCall = TERM( Vector::Make( uniParams, uniRt ) );
                co_yield { move( uniCall ), ovl, uc };
            for( auto&& [uniParamsVec,rtTrie,uc] : paramUTrie->unify( *argDecomp->get(), uc ) )
            {
                auto uniParams = TERM( make_shared< Vector >( uniParamsVec ) );
                for( auto&& [rt,ovl] : Enumerate( rtTrie ) )
                {
                    auto localC = uc;
                    for( auto&& [uniRt,uc] : Unify( rt, rtPat, localC ) )
                    {
                        auto uniCall = TERM( Vector::Make( uniDom, uniParams, uniRt ) );
                        co_yield { move( uniCall ), ovl, uc };
                    }
                }
            }
        }
    }
}

bool empathy::builtins::IsOverloadSet( const Value& os )
{