( self: DocTree.DocTree<A>, M: monoid.Monoid<M>, renderText: (text: string) => M, renderAnnotation: (annotation: A, out: M) => M )
| 294 | ) |
| 295 | |
| 296 | const renderSimplyDecoratedSafe = <A, M>( |
| 297 | self: DocTree.DocTree<A>, |
| 298 | M: monoid.Monoid<M>, |
| 299 | renderText: (text: string) => M, |
| 300 | renderAnnotation: (annotation: A, out: M) => M |
| 301 | ): Effect.Effect<M> => { |
| 302 | switch (self._tag) { |
| 303 | case "EmptyTree": { |
| 304 | return Effect.succeed(M.empty) |
| 305 | } |
| 306 | case "CharTree": { |
| 307 | return Effect.succeed(renderText(self.char)) |
| 308 | } |
| 309 | case "TextTree": { |
| 310 | return Effect.succeed(renderText(self.text)) |
| 311 | } |
| 312 | case "LineTree": { |
| 313 | return Effect.succeed( |
| 314 | M.combine(renderText("\n"), renderText(doc.textSpaces(self.indentation))) |
| 315 | ) |
| 316 | } |
| 317 | case "AnnotationTree": { |
| 318 | return Effect.map( |
| 319 | Effect.suspend(() => renderSimplyDecoratedSafe(self.tree, M, renderText, renderAnnotation)), |
| 320 | (out) => renderAnnotation(self.annotation, out) |
| 321 | ) |
| 322 | } |
| 323 | case "ConcatTree": { |
| 324 | if (Arr.isEmptyReadonlyArray(self.trees)) { |
| 325 | return Effect.succeed(M.empty) |
| 326 | } |
| 327 | const head = self.trees[0] |
| 328 | const tail = self.trees.slice(1) |
| 329 | return Arr.reduce( |
| 330 | tail, |
| 331 | Effect.suspend(() => renderSimplyDecoratedSafe(head, M, renderText, renderAnnotation)), |
| 332 | (acc, tree) => |
| 333 | Effect.zipWith( |
| 334 | acc, |
| 335 | Effect.suspend(() => renderSimplyDecoratedSafe(tree, M, renderText, renderAnnotation)), |
| 336 | M.combine |
| 337 | ) |
| 338 | ) |
| 339 | } |
| 340 | } |
| 341 | } |
| 342 | |
| 343 | // ----------------------------------------------------------------------------- |
| 344 | // Conversions |
no test coverage detected