// Copyright 2026 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package specexpr import ( "fmt" "io" ) type tracer struct { w io.Writer level int } func (t *tracer) assign(expr Expr, v Variable, val any, err error) { if t == nil { return } fmt.Fprintf(t.w, "%*s├ %s => ", t.level, "", expr) if err == nil { fmt.Fprintf(t.w, "%s=%v\n", v, val) } else { fmt.Fprintf(t.w, "%s\n", err) } } func (t *tracer) check(expr Expr, val any, err error) { if t == nil { return } if val == false || err != nil { fmt.Fprintf(t.w, "%*s✘ %s", t.level, "", expr) if err != nil { fmt.Fprintf(t.w, " => %s", err) } fmt.Fprint(t.w, "\n") } else { fmt.Fprintf(t.w, "%*s│ %s\n", t.level, "", expr) } } func (t *tracer) enter(v Variable, val any) { if t == nil { return } fmt.Fprintf(t.w, "%*s↳ %s=%v\n", t.level, "", v, val) t.level += 4 } func (t *tracer) exit() { if t == nil { return } t.level -= 4 } func (t *tracer) sat() { if t == nil { return } fmt.Fprintf(t.w, "%*s✔ SAT\n", t.level, "") }