#temporary #scope #revert

scope-cell

A crate for temporary, scope-bound, and thread-safe mutation of data in Rust

3 releases

0.1.2 Oct 23, 2024
0.1.1 Oct 22, 2024
0.1.0 Oct 22, 2024

#488 in Data structures

MIT/Apache

15KB
244 lines

Scope-cell: Temporary, Scope-Bound, Reverting Mutations in Rust

Scope-cell provides a mechanism for temporary, scope-bound mutability of immutable data in Rust. It allows for non-permanent changes within a defined scope while ensuring the original data remains unaffected. This is useful in scenarios where you need temporary mutation without ownership or long-term modification of the underlying data.

Key features include:

  • Temporary mutation: Enables mutation of data within a scope without requiring ownership.
  • Automatic reversion: All changes are discarded when the scope ends, reverting to the original state.
  • Low-overhead mutability: Only clone when necessary to ensure efficient memory use.
  • Rust safety guarantees: Operates within Rust’s strict borrowing and ownership rules to ensure thread safety and data integrity.
  • Compile-time safety: No runtime checks are required; Rust's type system ensures safe use.

Key Features

  • Temporary mutation: Modify immutable data within a scope, and ensure the data reverts to its original state once the scope is dropped.
  • Automatic reversion: Changes are discarded upon scope exit, making it easy to test or simulate changes without committing them.
  • No runtime overhead: Reversion and data integrity are managed with compile-time guarantees.
  • Non-ownership, minimal cloning: Only clone when necessary to make modifications, optimizing memory usage.
  • Safety with Rust’s borrowing rules: Safely borrow and mutate data within the strict rules of Rust's ownership and borrowing system.

Use Cases

Scope-cell is useful in scenarios where you need to temporarily mutate immutable data without affecting the original state:

  • Simulation: Simulate temporary changes to immutable data and automatically roll back.
  • Transactional systems: Experiment with temporary changes before committing.
  • Testing: Make non-persistent changes during tests that should be automatically undone.
  • Concurrency: Share data across threads with safe, temporary mutability.

Example Usage

use Scope_cell::ScopeCell;

fn main() {
    let immutable_data = vec![1, 2, 3];
    {
        let mut scope = ScopeCell::new(&immutable_data);
        scope.get_mut().push(4); // Temporarily mutate the data
        assert_eq!(scope.get().len(), 4); // Verify the change within the scope
    } // Changes revert here
    assert_eq!(immutable_data.len(), 3); // The original data remains unchanged
}

## How it Works

ScopeCell operates by storing a reference to the original data and optionally cloning it into a temporary mutable version. When the ScopeCell is dropped, any changes made are discarded, and the original data remains unaffected.

Key methods:
* **get()** - Borrow the data (either original or modified).
* **get_mut()** - Mutably borrow the data, cloning the original if necessary.
* **revert()** - Explicitly discard any changes, restoring the original data.

## Installation

To use Scope-cell add the following to your Cargo.toml

```toml
[dependencies]
scope-cell = "0.1.2"

## License
This project is licensed under the MIT License.

Dependencies

~10KB