( parser: () => DocTreeParser<DocStream.DocStream<A>, DocTree.DocTree<A>> )
| 449 | } |
| 450 | |
| 451 | const tree = <A>( |
| 452 | parser: () => DocTreeParser<DocStream.DocStream<A>, DocTree.DocTree<A>> |
| 453 | ): DocTreeParser<DocStream.DocStream<A>, DocTree.DocTree<A>> => { |
| 454 | return parserFlatMap(nextToken<A>(), (token) => { |
| 455 | switch (token._tag) { |
| 456 | case "EmptyToken": { |
| 457 | return parserSucceed(empty) |
| 458 | } |
| 459 | case "CharToken": { |
| 460 | return parserSucceed(char<A>(token.char)) |
| 461 | } |
| 462 | case "TextToken": { |
| 463 | return parserSucceed(text<A>(token.text)) |
| 464 | } |
| 465 | case "LineToken": { |
| 466 | return parserSucceed(line<A>(token.indentation)) |
| 467 | } |
| 468 | case "PushAnnotationToken": { |
| 469 | return parserFlatMap(parser(), (annotatedContents) => |
| 470 | // Make sure to handle the subsequent pop annotation token |
| 471 | |
| 472 | parserMap( |
| 473 | nextToken<A>(), |
| 474 | () => annotation(annotatedContents, token.annotation) |
| 475 | )) |
| 476 | } |
| 477 | case "PopAnnotationToken": { |
| 478 | return () => Option.none() |
| 479 | } |
| 480 | } |
| 481 | }) |
| 482 | } |
| 483 | |
| 484 | /** @internal */ |
| 485 | export const parser = <A>(): DocTreeParser<DocStream.DocStream<A>, DocTree.DocTree<A>> => |
no test coverage detected
searching dependent graphs…