package buf2d import ( "strings" "github.com/mattn/go-runewidth" ) // WriteString writes a whole string to the buffer at position (x,y). // no word wrap is applied at all. If the string does not fit, it will be truncated. // It returns the amount of runes in str func WriteString(b *Buffer[rune], str string, x, y int) (width int) { dx := x for _, r := range str { if dx >= b.Width() { return } b.Set(dx, y, r) dx += runewidth.RuneWidth(r) } return dx - x } // WriteMultiLineString writes a multi-line string to the buffer at position (x,y) // no word wrap is applied at all. If a line does not fit horizontally, it will be truncated // All lines which do not fit vertically will be truncated as well func WriteMultiLineString(b *Buffer[rune], str string, x, y int) { lines := strings.Split(str, "\n") for dy, line := range lines { if dy >= b.height { return } WriteString(b, line, x, y+dy) } } // Fill fills the whole buffer with c func (b *Buffer[T]) Fill(value T) { for _, col := range b.data { for ri := range col { col[ri] = value } } }