-
Notifications
You must be signed in to change notification settings - Fork 77
/
output.go
47 lines (41 loc) · 1018 Bytes
/
output.go
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
package vm
import "encoding/json"
// StackOutput holds information about the stack, used for pretty printing
// the stack.
type stackItem struct {
Value interface{} `json:"value"`
Type string `json:"type"`
}
func appendToItems(items *[]stackItem, val StackItem, seen map[StackItem]bool) {
if arr, ok := val.Value().([]StackItem); ok {
if seen[val] {
return
}
seen[val] = true
intItems := make([]stackItem, 0, len(arr))
for _, v := range arr {
appendToItems(&intItems, v, seen)
}
*items = append(*items, stackItem{
Value: intItems,
Type: val.String(),
})
} else {
*items = append(*items, stackItem{
Value: val,
Type: val.String(),
})
}
}
func stackToArray(s *Stack) []stackItem {
items := make([]stackItem, 0, s.Len())
seen := make(map[StackItem]bool)
s.IterBack(func(e *Element) {
appendToItems(&items, e.value, seen)
})
return items
}
func buildStackOutput(s *Stack) string {
b, _ := json.MarshalIndent(stackToArray(s), "", " ")
return string(b)
}