Skip to content

Commit fc6ad55

Browse files
authored
Add SExpPrinter (#145)
1 parent d7fb516 commit fc6ad55

File tree

2 files changed

+202
-0
lines changed

2 files changed

+202
-0
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
//
2+
// SExpPrinter.swift
3+
// OpenSwiftUICore
4+
//
5+
// Audited for RELEASE_2024
6+
// Status: Complete
7+
8+
package struct SExpPrinter {
9+
var output: String
10+
var depth: Int
11+
package internal(set) var indent: String
12+
13+
package init(tag: String, singleLine: Bool = false) {
14+
output = "(\(tag)"
15+
depth = singleLine ? 0 : 1
16+
indent = singleLine ? "" : " "
17+
}
18+
19+
package mutating func end() -> String {
20+
if depth == 0 {
21+
output.append(")")
22+
return output
23+
} else {
24+
depth -= 1
25+
indent.removeLast(2)
26+
output.append(")")
27+
return output
28+
}
29+
}
30+
31+
package mutating func print(_ string: String, newline: Bool = true) {
32+
if newline, depth != 0 {
33+
output.append("\n\(indent)")
34+
} else {
35+
output.append(" ")
36+
}
37+
output.append(string)
38+
}
39+
40+
package mutating func newline() {
41+
guard depth != 0 else {
42+
return
43+
}
44+
output.append("\n")
45+
output.append(indent)
46+
}
47+
48+
package mutating func push(_ tag: String) {
49+
if depth == 0 {
50+
output.append("(\(tag)")
51+
} else {
52+
output.append("\n\(indent)(\(tag)")
53+
depth += 1
54+
indent.append(" ")
55+
}
56+
}
57+
58+
package mutating func pop() {
59+
if depth == 0 {
60+
output.append(")")
61+
} else {
62+
depth -= 1
63+
indent.removeLast(2)
64+
output.append(")")
65+
}
66+
}
67+
}
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
//
2+
// SExpPrinterTests.swift
3+
// OpenSwiftUICoreTests
4+
5+
import OpenSwiftUICore
6+
import OpenGraphShims
7+
import Testing
8+
9+
struct SExpPrinterTests {
10+
@Test
11+
func singleLine() {
12+
var printer = SExpPrinter(tag: "(test", singleLine: true)
13+
printer.push("A")
14+
printer.push("B")
15+
printer.pop()
16+
printer.pop()
17+
let end = printer.end()
18+
#expect(end == "((test(A(B)))")
19+
}
20+
21+
@Test
22+
func multiLine() {
23+
var printer = SExpPrinter(tag: "(test", singleLine: false)
24+
printer.push("A")
25+
printer.push("B")
26+
printer.pop()
27+
printer.pop()
28+
let end = printer.end()
29+
#expect(end == """
30+
((test
31+
(A
32+
(B)))
33+
""")
34+
}
35+
36+
@Test
37+
func newline() {
38+
var printer = SExpPrinter(tag: "(test", singleLine: false)
39+
printer.push("A")
40+
printer.newline()
41+
printer.push("B")
42+
printer.newline()
43+
printer.pop()
44+
printer.pop()
45+
let end = printer.end()
46+
#expect(end == """
47+
((test
48+
(A
49+
50+
(B
51+
)))
52+
""")
53+
printer.newline()
54+
let newEnd = printer.end()
55+
#expect(newEnd == """
56+
((test
57+
(A
58+
59+
(B
60+
))))
61+
""")
62+
}
63+
64+
@Test
65+
func printString() {
66+
do {
67+
var printer = SExpPrinter(tag: "(test", singleLine: false)
68+
printer.push("A")
69+
printer.print("B")
70+
printer.print("C")
71+
printer.pop()
72+
let end = printer.end()
73+
#expect(end == """
74+
((test
75+
(A
76+
B
77+
C))
78+
""")
79+
}
80+
do {
81+
var printer = SExpPrinter(tag: "(test", singleLine: false)
82+
printer.push("A")
83+
printer.print("B")
84+
printer.pop()
85+
_ = printer.end()
86+
printer.print("C")
87+
let end = printer.end()
88+
#expect(end == """
89+
((test
90+
(A
91+
B)) C)
92+
""")
93+
}
94+
do {
95+
var printer = SExpPrinter(tag: "(test", singleLine: true)
96+
printer.push("A")
97+
printer.print("B")
98+
printer.print("C")
99+
printer.pop()
100+
let end = printer.end()
101+
#expect(end == """
102+
((test(A B C))
103+
""")
104+
}
105+
do {
106+
var printer = SExpPrinter(tag: "(test", singleLine: true)
107+
printer.push("A")
108+
printer.print("B")
109+
printer.pop()
110+
printer.print("C")
111+
let end = printer.end()
112+
#expect(end == """
113+
((test(A B) C)
114+
""")
115+
}
116+
}
117+
118+
@Test
119+
func pushPop() {
120+
var printer = SExpPrinter(tag: "(test", singleLine: false)
121+
printer.push("A")
122+
printer.push("B")
123+
printer.pop()
124+
printer.push("C")
125+
printer.pop()
126+
printer.pop()
127+
let end = printer.end()
128+
#expect(end == """
129+
((test
130+
(A
131+
(B)
132+
(C)))
133+
""")
134+
}
135+
}

0 commit comments

Comments
 (0)