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  }