| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 | package yamlimport (	"fmt"	"io"	"strconv"	"strings")// SafeString returns a string which is sufficiently quoted and escaped for YAML.func SafeString(str string) string {	str = strings.Replace(str, "\\", "\\\\", -1)	str = strings.Replace(str, "\"", "\\\"", -1)	return "\"" + str + "\""}// PrintMatrix outputs a rectangular integer matrix in YAML text format.//// `indent` is the current YAML indentation level - the number of spaces.// `name` is the name of the corresponding YAML block. If empty, no separate block is created.// `fixNegative` changes all negative values to 0.func PrintMatrix(writer io.Writer, matrix [][]int64, indent int, name string, fixNegative bool) {	// determine the maximum length of each value	var maxnum int64 = -(1 << 32)	var minnum int64 = 1 << 32	for _, status := range matrix {		for _, val := range status {			if val > maxnum {				maxnum = val			}			if val < minnum {				minnum = val			}		}	}	width := len(strconv.FormatInt(maxnum, 10))	if !fixNegative && minnum < 0 {		negativeWidth := len(strconv.FormatInt(minnum, 10))		if negativeWidth > width {			width = negativeWidth		}	}	last := len(matrix[len(matrix)-1])	if name != "" {		fmt.Fprintf(writer, "%s%s: |-\n", strings.Repeat(" ", indent), SafeString(name))		indent += 2	}	// print the resulting triangular matrix	first := true	for _, status := range matrix {		fmt.Fprint(writer, strings.Repeat(" ", indent-1))		for i := 0; i < last; i++ {			var val int64			if i < len(status) {				val = status[i]				// not sure why this sometimes happens...				// TODO(vmarkovtsev): find the root cause of tiny negative balances				if fixNegative && val < 0 {					val = 0				}			}			if !first {				fmt.Fprintf(writer, " %[1]*[2]d", width, val)			} else {				first = false				fmt.Fprintf(writer, " %d%s", val, strings.Repeat(" ", width-len(strconv.FormatInt(val, 10))))			}		}		fmt.Fprintln(writer)	}}
 |