(
tree: DocTree.DocTree<SimpleHtml>
)
| 146 | } |
| 147 | |
| 148 | const renderTreeSafe = ( |
| 149 | tree: DocTree.DocTree<SimpleHtml> |
| 150 | ): Effect.Effect<string> => { |
| 151 | switch (tree._tag) { |
| 152 | case "EmptyTree": { |
| 153 | return Effect.succeed("") |
| 154 | } |
| 155 | case "CharTree": { |
| 156 | return Effect.succeed(tree.char) |
| 157 | } |
| 158 | case "TextTree": { |
| 159 | return Effect.succeed(tree.text) |
| 160 | } |
| 161 | case "LineTree": { |
| 162 | return Effect.succeed("\n" + Doc.textSpaces(tree.indentation)) |
| 163 | } |
| 164 | case "AnnotationTree": { |
| 165 | return Effect.map( |
| 166 | Effect.suspend(() => renderTreeSafe(tree.tree)), |
| 167 | (content) => encloseInTag(content, tree.annotation) |
| 168 | ) |
| 169 | } |
| 170 | case "ConcatTree": { |
| 171 | if (tree.trees.length === 0) { |
| 172 | return Effect.succeed("") |
| 173 | } |
| 174 | const head = tree.trees[0] |
| 175 | const tail = tree.trees.slice(1) |
| 176 | return Array.reduce( |
| 177 | tail, |
| 178 | Effect.suspend(() => renderTreeSafe(head)), |
| 179 | (acc, tree) => |
| 180 | Effect.zipWith( |
| 181 | acc, |
| 182 | Effect.suspend(() => renderTreeSafe(tree)), |
| 183 | (left, right) => left + right |
| 184 | ) |
| 185 | ) |
| 186 | } |
| 187 | } |
| 188 | } |
| 189 | |
| 190 | const renderTree = (tree: DocTree.DocTree<SimpleHtml>): string => Effect.runSync(renderTreeSafe(tree)) |
| 191 |
no test coverage detected
searching dependent graphs…