go-ml.dev/pkg/base@v0.0.0-20200610162856-60c38abac71b/tables/display.go (about) 1 package tables 2 3 import ( 4 "fmt" 5 "go-ml.dev/pkg/base/fu" 6 "strings" 7 ) 8 9 func (t *Table) Head(n int) string { 10 if n < t.raw.Length { 11 return t.Display(0, n) 12 } 13 return t.Display(0, t.raw.Length) 14 } 15 16 func (t *Table) Tail(n int) string { 17 if n < t.raw.Length { 18 return t.Display(t.raw.Length-n, t.raw.Length) 19 } 20 return t.Display(0, t.raw.Length) 21 } 22 23 func (t *Table) String() string { 24 return t.Display(0, t.raw.Length) 25 } 26 27 func (t *Table) Display(from, to int) string { 28 n := fu.Mini(to-from, t.raw.Length-from) 29 if n < 0 { 30 n = 0 31 } 32 w := make([]int, len(t.raw.Names)+1) 33 s := make([][]interface{}, n+1) 34 s[0] = append(make([]interface{}, len(w))) 35 s[0][0] = "" 36 for i, n := range t.raw.Names { 37 s[0][i+1] = n 38 w[i+1] = len(n) 39 } 40 for k := 0; k < n; k++ { 41 u := make([]interface{}, len(w)) 42 ln := fmt.Sprint(k + from) 43 if w[0] < len(ln) { 44 w[0] = len(ln) 45 } 46 u[0] = ln 47 for j := range w[1:] { 48 ws := fu.Cell{t.raw.Columns[j].Index(k + from)}.String() 49 if len(ws) > w[j+1] { 50 w[j+1] = len(ws) 51 } 52 u[j+1] = ws 53 } 54 s[k+1] = u 55 } 56 f0 := "" 57 f1 := "" 58 f2 := "" 59 for i, v := range w { 60 if i != 0 { 61 f0 += " . " 62 f1 += " | " 63 f2 += "-|-" 64 } 65 q := fmt.Sprintf("%%-%ds", v) 66 f0 += q 67 f1 += q 68 f2 += strings.Repeat("-", v) 69 } 70 r := "" 71 r += fmt.Sprintf(f0, s[0]...) + "\n" 72 r += f2 + "\n" 73 for _, u := range s[1:] { 74 r += fmt.Sprintf(f1, u...) + "\n" 75 } 76 return r[:len(r)-1] 77 }