MCPcopy Index your code
hub / github.com/google/mangle / unifyFunctional

Method unifyFunctional

unionfind/unifytypeexpr.go:34–73  ·  view source on GitHub ↗
(xs []ast.BaseTerm, ys []ast.BaseTerm)

Source from the content-addressed store, hash-verified

32}
33
34func (u *unionFindFun) unifyFunctional(xs []ast.BaseTerm, ys []ast.BaseTerm) error {
35 for i, x := range xs {
36 y := ys[i]
37 xApply, xOk := x.(ast.ApplyFn)
38 yApply, yOk := y.(ast.ApplyFn)
39 if !xOk && !yOk {
40 if x.Equals(ast.Variable{"_"}) || y.Equals(ast.Variable{"_"}) {
41 continue
42 }
43 u.ufrel.parent[x] = x
44 u.ufrel.parent[y] = y
45 unifyTermsUpdate([]ast.BaseTerm{x}, []ast.BaseTerm{y}, u.ufrel)
46 continue
47 }
48 if yOk && !xOk {
49 xApply = yApply
50 y = x
51 xOk, yOk = true, false
52 }
53 if xOk && !yOk {
54 yVar, yOk := y.(ast.Variable)
55 if !yOk {
56 return fmt.Errorf("cannot unify %v and %v", x, y)
57 }
58 if yExisting := u.ufrel.find(yVar); yExisting != nil && !yExisting.Equals(xApply) {
59 return fmt.Errorf("cannot unify %v and %v", x, yExisting)
60 }
61
62 u.subst[yVar] = xApply
63 continue
64 }
65 if xApply.Function != yApply.Function {
66 return fmt.Errorf("cannot unify %v and %v", xApply, yApply)
67 }
68 if err := u.unifyFunctional(xApply.Args, yApply.Args); err != nil {
69 return err
70 }
71 }
72 return nil
73}

Callers 1

UnifyTypeExprFunction · 0.95

Calls 3

unifyTermsUpdateFunction · 0.85
findMethod · 0.80
EqualsMethod · 0.65

Tested by

no test coverage detected