| 161 | export const compact = <A>(self: Doc.Doc<A>): DocStream.DocStream<A> => Effect.runSync(compactSafe(List.of(self), 0)) |
| 162 | |
| 163 | const compactSafe = <A>( |
| 164 | docs: List.List<Doc.Doc<A>>, |
| 165 | i: number |
| 166 | ): Effect.Effect<DocStream.DocStream<A>> => |
| 167 | Effect.gen(function*() { |
| 168 | if (List.isNil(docs)) { |
| 169 | return InternalDocStream.empty |
| 170 | } |
| 171 | const head = docs.head |
| 172 | const tail = docs.tail |
| 173 | switch (head._tag) { |
| 174 | case "Fail": { |
| 175 | return InternalDocStream.failed |
| 176 | } |
| 177 | case "Empty": { |
| 178 | return yield* compactSafe(tail, i) |
| 179 | } |
| 180 | case "Char": { |
| 181 | const stream = yield* compactSafe(tail, i + 1) |
| 182 | return InternalDocStream.char(stream, head.char) |
| 183 | } |
| 184 | case "Text": { |
| 185 | const stream = yield* compactSafe(tail, i + head.text.length) |
| 186 | return InternalDocStream.text(stream, head.text) |
| 187 | } |
| 188 | case "Line": { |
| 189 | const stream = yield* compactSafe(tail, 0) |
| 190 | return InternalDocStream.line(stream, 0) |
| 191 | } |
| 192 | case "FlatAlt": { |
| 193 | return yield* compactSafe(List.cons(head.left, tail), i) |
| 194 | } |
| 195 | case "Cat": { |
| 196 | const list = List.cons(head.left, List.cons(head.right, tail)) |
| 197 | return yield* compactSafe(list, i) |
| 198 | } |
| 199 | case "Nest": { |
| 200 | return yield* compactSafe(List.cons(head.doc, tail), i) |
| 201 | } |
| 202 | case "Union": { |
| 203 | return yield* compactSafe(List.cons(head.right, tail), i) |
| 204 | } |
| 205 | case "Column": { |
| 206 | return yield* compactSafe(List.cons(head.react(i), tail), i) |
| 207 | } |
| 208 | case "WithPageWidth": { |
| 209 | return yield* compactSafe(List.cons(head.react(InternalPageWidth.unbounded), tail), i) |
| 210 | } |
| 211 | case "Nesting": { |
| 212 | return yield* compactSafe(List.cons(head.react(0), tail), i) |
| 213 | } |
| 214 | case "Annotated": { |
| 215 | return yield* compactSafe(List.cons(head.doc, tail), i) |
| 216 | } |
| 217 | } |
| 218 | }) |
| 219 | |
| 220 | // ----------------------------------------------------------------------------- |