1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package terminal

type DirtyLines struct {
	dirty []bool
}

func NewDirtyLines(n int) DirtyLines {
	d := make([]bool, n)
	for i := range d {
		d[i] = true
	}
	return DirtyLines{dirty: d}
}

func (d *DirtyLines) Add(n int) {
	d.dirty[n] = true
}

func (d *DirtyLines) Extend(start, end int) {
	for i := start; i < end; i++ {
		d.dirty[i] = true
	}
}

func (d *DirtyLines) Resize(n int) {
	if n > len(d.dirty) {
		extra := make([]bool, n-len(d.dirty))
		d.dirty = append(d.dirty, extra...)
	} else {
		d.dirty = d.dirty[:n]
	}
}

func (d *DirtyLines) Clear() {
	for i := range d.dirty {
		d.dirty[i] = false
	}
}

func (d *DirtyLines) ToSlice() []int {
	var out []int
	for i, v := range d.dirty {
		if v {
			out = append(out, i)
		}
	}
	return out
}