| 185 | >(2, (self, f) => Effect.runSync(alterAnnotationsSafe(self, f))) |
| 186 | |
| 187 | const alterAnnotationsSafe = <A, B>( |
| 188 | self: DocTree.DocTree<A>, |
| 189 | f: (a: A) => Iterable<B> |
| 190 | ): Effect.Effect<DocTree.DocTree<B>> => { |
| 191 | switch (self._tag) { |
| 192 | case "EmptyTree": { |
| 193 | return Effect.succeed(empty) |
| 194 | } |
| 195 | case "CharTree": { |
| 196 | return Effect.succeed(char(self.char)) |
| 197 | } |
| 198 | case "TextTree": { |
| 199 | return Effect.succeed(text(self.text)) |
| 200 | } |
| 201 | case "LineTree": { |
| 202 | return Effect.succeed(line(self.indentation)) |
| 203 | } |
| 204 | case "AnnotationTree": { |
| 205 | return Arr.reduce( |
| 206 | Arr.fromIterable(f(self.annotation)), |
| 207 | Effect.suspend(() => alterAnnotationsSafe(self.tree, f)), |
| 208 | (acc, b) => Effect.map(acc, annotation(b)) |
| 209 | ) |
| 210 | } |
| 211 | case "ConcatTree": { |
| 212 | return pipe( |
| 213 | Effect.forEach(self.trees, (tree) => alterAnnotationsSafe(tree, f)), |
| 214 | Effect.map(concat) |
| 215 | ) |
| 216 | } |
| 217 | } |
| 218 | } |
| 219 | |
| 220 | /** @internal */ |
| 221 | export const reAnnotate = dual< |