dioxus/packages/generational-box
2024-01-15 23:24:59 -08:00
..
src and mut bound to mut methods on signals 2024-01-15 23:24:59 -08:00
Cargo.toml remove bump in generational box 2024-01-06 16:55:52 -06:00
README.md Merge branch 'master' into debug-signals 2023-10-31 13:55:20 -05:00

Generational Box

Generational Box is a runtime for Rust that allows any static type to implement Copy. It can be combined with a global runtime to create an ergonomic state solution like dioxus-signals. This crate contains no unsafe code.

Three main types manage state in Generational Box:

  • Store: Handles recycling generational boxes that have been dropped. Your application should have one store or one store per thread.
  • Owner: Handles dropping generational boxes. The owner acts like a runtime lifetime guard. Any states that you create with an owner will be dropped when that owner is dropped.
  • GenerationalBox: The core Copy state type. The generational box will be dropped when the owner is dropped.

Example:

use generational_box::Store;

// Create a store for this thread
let store = Store::default();

{
    // Create an owner for some state for a scope
    let owner = store.owner();

    // Create some non-copy data, move it into a owner, and work with copy data
    let data: String = "hello world".to_string();
    let key = owner.insert(data);
    
    // The generational box can be read from and written to like a RefCell
    let value = key.read();
    assert_eq!(*value, "hello world");
}
// Reading value at this point will cause a panic

How it works

Internally, generational-box creates an arena of generational RefCell's that are recyled when the owner is dropped. You can think of the cells as something like &'static RefCell<Box<dyn Any>> with a generational check to make recyling a cell easier to debug. Then GenerationalBox's are Copy because the &'static pointer is Copy