| Crates.io | nlist |
| lib.rs | nlist |
| version | 0.1.1 |
| created_at | 2024-11-11 02:15:42.125745+00 |
| updated_at | 2024-12-02 22:12:45.415645+00 |
| description | inline-allocated list with statically tracked length |
| homepage | |
| repository | https://github.com/rodrimati1992/nlist/ |
| max_upload_size | |
| id | 1443384 |
| size | 166,768 |
Provides an inline-allocated list which statically tracks its length, and type-based integer/boolean representations which don't require (additional) bounds for operators.
This example shows how NLists can be split and recombined in const,
even if the length is generic,
so long as the length is known to be greater than the split index.
use nlist::{NList, Peano, PeanoInt, nlist, peano};
const LIST: NList<u128, Peano!(7)> = transform(nlist![3, 5, 8, 13, 21, 34, 55]);
assert_eq!(LIST, nlist![21, 34, 55, 103, 105, 108, 113]);
type SplitIndex = Peano!(4);
const fn transform<L>(
list: NList<u128, peano::Add<SplitIndex, L>>,
) -> NList<u128, peano::Add<SplitIndex, L>>
where
L: PeanoInt,
{
// if we use `let` to destructure instead of `konst::destructure`,
// we get a "destructor cannot be evaluated at compile-time" error as of Rust 1.83
konst::destructure!{(before, after) = list.split_at::<SplitIndex>()}
// math spice: using arithmetic properties to coerce equal generic lengths.
//
// Alternatively, you can pass `peano::eq().unwrap_eq()` to `coerce_len`
// for an easier, but panic prone, approach:
// ```
// return after.concat(map_add_100(before)).coerce_len(peano::eq().unwrap_eq())
// ```
//
// coercing `NList<u128, L - 0>` to `NList<u128, L>`
let coerced_after = after.coerce_len(peano::proofs::sub_identity::<L>());
coerced_after.concat(map_add_100(before))
// coercing `NList<u128, L + SplitIndex>` to `NList<u128, SplitIndex + L>`
.coerce_len(peano::proofs::commutative_add::<L, SplitIndex>())
}
// Adds 100 to all elemenst of an NList
const fn map_add_100<L: PeanoInt>(list: NList<u128, L>) -> NList<u128, L> {
nlist::rec_map!(list, |elem, rest| (elem + 100, map_add_100(rest)))
}
"alloc"(enabled by default): enables methods that take or return Vecnlist is #![no_std], it can be used anywhere Rust can be used.
nlist requires Rust 1.83.0.