## Lluvia - A stripped down Entity Component System that allows for no-nonsense data storage in finite time.
This library lets you quickly throw together large collections of objects
with varying lifetimes into one ECS. You specify the `Components`, create
any number of reference counted `Entity` objects, and when an `Entity` goes
out of scope its data will be automatically dropped as well. You can even
store `Entity` objects as components of other entities, and everything will
get dropped at once when the root `Entity` goes out of scope.
What sets this ECS apart is that it is very fast, very small in
scope, and has a very small footprint. The implementation is ~500 lines,
it has zero dependencies, and almost all operations run in O(1) time.
There is no archetyping, there is no rayon integration, there is no
advanced iterator pattern, and there is no multi-threaded access. Emphasis
is placed on minimizing complexity and avoiding scanning or re-organizing
data, as Lluvia was designed to be the data engine for low-latency graphics
programs.
Lluvia begins with creating an `Instance` object. This will track the
validity of `Entity` objects in the system, and will hold references
to data tables used for storage.
The `Instance` can then be used to add `Component` tables, and access
them using a `Session` object. The `Session` allows for getting and
setting components for each `Entity`.
Basic usage looks like:
```
use lluvia as ll;
// Create the ECS holder
let mut inst = ll::Instance::new();
// Make a new entity
let entity = inst.add_entity();
// Now add our component. This will be a string, but
// we don't have to specify that for now
let c = inst.add_component();
// Get a session to access data for component c. This
// allows access to the per-entity data for this component and
// lets us perform queries.
let mut sesh = inst.open_session(c).unwrap();
// Before querying the value, we first need to set a valid value
// for this component. Afterwards, we can get it and check that
// it is unchanged.
sesh.set(&entity, "Hola Lluvia");
let data_ref = sesh.get(&entity).unwrap();
assert_eq!(*data_ref, "Hola Lluvia");
```