1
2
3
4
5 package specexpr
6
7 import (
8 "fmt"
9 "io"
10 )
11
12 type tracer struct {
13 w io.Writer
14 level int
15 }
16
17 func (t *tracer) assign(expr Expr, v Variable, val any, err error) {
18 if t == nil {
19 return
20 }
21 fmt.Fprintf(t.w, "%*s├ %s => ", t.level, "", expr)
22 if err == nil {
23 fmt.Fprintf(t.w, "%s=%v\n", v, val)
24 } else {
25 fmt.Fprintf(t.w, "%s\n", err)
26 }
27 }
28
29 func (t *tracer) check(expr Expr, val any, err error) {
30 if t == nil {
31 return
32 }
33 if val == false || err != nil {
34 fmt.Fprintf(t.w, "%*s✘ %s", t.level, "", expr)
35 if err != nil {
36 fmt.Fprintf(t.w, " => %s", err)
37 }
38 fmt.Fprint(t.w, "\n")
39 } else {
40 fmt.Fprintf(t.w, "%*s│ %s\n", t.level, "", expr)
41 }
42 }
43
44 func (t *tracer) enter(v Variable, val any) {
45 if t == nil {
46 return
47 }
48 fmt.Fprintf(t.w, "%*s↳ %s=%v\n", t.level, "", v, val)
49 t.level += 4
50 }
51
52 func (t *tracer) exit() {
53 if t == nil {
54 return
55 }
56 t.level -= 4
57 }
58
59 func (t *tracer) sat() {
60 if t == nil {
61 return
62 }
63 fmt.Fprintf(t.w, "%*s✔ SAT\n", t.level, "")
64 }
65
View as plain text