cranpose-macros 0.0.36

Procedural macros for Cranpose
Documentation
# Cranpose Macros

Procedural macros that power the Cranpose declarative syntax.

## When to Use

You will rarely interact with this crate directly; it is re-exported by `cranpose`. Identifying how the `#[composable]` macro transforms your code is useful for debugging and understanding performance characteristics.

## Key Concepts

-   **`#[composable]`**: This attribute macro transforms a standard Rust function into a `Composable` function. It injects a hidden `Composer` parameter and wraps the function body in a uniquely identified group.
-   **Skipping**: The macro generates code to compare current arguments with previous arguments. If they haven't changed, the function body execution is skipped during recomposition, significantly improving performance.

## Transformation Example

Conceptual expansion of what `#[composable]` does:

```rust
// Source
#[composable]
fn MyComponent(name: String) {
    Text(name);
}

// Generated (Conceptual)
fn MyComponent(composer: &mut Composer, changed: usize, name: String) {
    composer.start_restart_group(12345); // Unique ID based on location
    
    if changed == 0 && composer.skipping() {
        composer.skip_to_group_end();
    } else {
        Text(composer, changed, name);
    }
    
    composer.end_restart_group(|composer| MyComponent(composer, changed | 1, name));
}
```