aboutsummaryrefslogtreecommitdiff
path: root/worker/types/thread.go
blob: a51a5c458f7d1ce6554769d607bc8e3e75e6b6bf (plain)
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
package types

type Thread struct {
	Uid      uint32
	Children []*Thread
}

func (t *Thread) FormatThread(cb func(*Thread, []rune) bool) {
	cb(t, []rune{})
	walkThreads(t.Children, []rune{}, cb)
}

func walkThreads(threads []*Thread, threadFmt []rune,
	cb func(*Thread, []rune) bool) {
	if threads == nil {
		return
	}

	var (
		indent          []rune = []rune{'\u0020', '\u0020'}
		indentConnected []rune = []rune{'\u2502', '\u0020'}
		arrow           []rune = []rune{'\u251c', '\u2500', '\u003e'}
		arrowConnected  []rune = []rune{'\u2514', '\u2500', '\u003e'}

		threadPrefix          []rune = append(threadFmt, arrow...)
		threadPrefixConnected []rune = append(threadFmt, arrowConnected...)
		nextThread            []rune = append(threadFmt, indent...)
		nextThreadConnected   []rune = append(threadFmt, indentConnected...)
	)

	for i := len(threads) - 1; i >= 0; i-- {
		t := threads[i]
		if i > 0 && len(threads) > 1 {
			if cb(t, threadPrefix) {
				return
			}
			walkThreads(t.Children, nextThreadConnected, cb)
		} else {
			if cb(t, threadPrefixConnected) {
				return
			}
			walkThreads(t.Children, nextThread, cb)
		}
	}

}