Skip to content

feat: add allocator-free combinators - #19

Merged
QuadnucYard merged 1 commit into
mainfrom
combinators
Oct 2, 2026
Merged

QuadnucYard merged 1 commit into
mainfrom
combinators

Conversation

@QuadnucYard

Copy link
Copy Markdown
Contributor

Value-level combinators implementing Pretty, so a document can be described without an allocator and materialized later through DocAllocator::pretty. Templates then compose as ordinary values (tuples, arrays, Option, iterators) instead of materializing each subexpression early.

  • Nullary tokens (nil, fail, hard_line, line_or_nil, line_or_space, soft_line_or_nil, soft_line_or_space, space, spaces, expand_parent) are Copy; wrappers derive conditional Clone, so a token can be reused as an intersperse separator.
  • Cover the layout, alternative and iteration operations: nest/indent/dedent (curried), group, align, dedent_to_root, flatten, line_suffix, union, partial_union, flat_alt, concat, intersperse, repeat; on_column and on_nesting under contextual.
  • No text combinator: &str, String and Cow<str> already implement Pretty; as_string handles other Display values.
  • Declarations generated by token_combinator!/unary_combinator!/ binary_combinator!; re-exported from prelude.

Value-level combinators implementing `Pretty`, so a document can be
described without an allocator and materialized later through
`DocAllocator::pretty`. Templates then compose as ordinary values
(tuples, arrays, `Option`, iterators) instead of materializing each
subexpression early.

- Nullary tokens (`nil`, `fail`, `hard_line`, `line_or_nil`,
  `line_or_space`, `soft_line_or_nil`, `soft_line_or_space`, `space`,
  `spaces`, `expand_parent`) are `Copy`; wrappers derive conditional
  `Clone`, so a token can be reused as an `intersperse` separator.
- Cover the layout, alternative and iteration operations:
  `nest`/`indent`/`dedent` (curried), `group`, `align`,
  `dedent_to_root`, `flatten`, `line_suffix`, `union`, `partial_union`,
  `flat_alt`, `concat`, `intersperse`, `repeat`; `on_column` and
  `on_nesting` under `contextual`.
- No `text` combinator: `&str`, `String` and `Cow<str>` already
  implement `Pretty`; `as_string` handles other `Display` values.
- Declarations generated by `token_combinator!`/`unary_combinator!`/
  `binary_combinator!`; re-exported from `prelude`.
@QuadnucYard
QuadnucYard merged commit ffa496e into main Oct 2, 2026
2 checks passed
@QuadnucYard
QuadnucYard deleted the combinators branch October 2, 2026 00:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant