## Expand description

## Periodic: datastructures over a lattice

The dual space of a lattice is *periodic*, meaning that it is bounded and, reaching
those boundaries, one returns to the starting point. A tipical (non-trivial) example
of a periodic space is a sphere: choose a direction and go straight: you will always
return to the starting point.

This analogy aims to describe how this crate is conceived and what purpose it
serves: it offers two modules, `ring`

, that expose implementation of periodic
Vec-like structs, and `map`

, that offers a HashMap-like struct that overwrites
its key-value pairs after a certain capacity has been reached.

### Why?

What are these structures for? Their main use is to have caches that occupy a
constant amount of *slots* of memory, being therefore limited in the amount of
consumed memory, but a cache of a very simplistic nature:
*first-in-first-overwritten-when-full*.

### How?

The simplest api of this package is the following:

```
use periodic::map::RingDict;
// 3 is the total capacity
let mut rd: RingDict<&str, i32> = RingDict::new(3);
rd.insert("a", 1);
rd.insert("b", 2);
rd.insert("c", 3);
assert_eq!(rd.get("a"), Some(&1));
assert_eq!(rd.get("b"), Some(&2));
assert_eq!(rd.get("c"), Some(&3));
// Now we add a new key-value pair, overcoming the capacity
rd.insert("d", 4);
assert_eq!(rd.get("d"), Some(&4));
assert!(rd.get("a").is_none());
```