Crates.io | nlist |
lib.rs | nlist |
version | |
source | src |
created_at | 2024-11-11 02:15:42.125745 |
updated_at | 2024-12-02 22:12:45.415645 |
description | inline-allocated list with statically tracked length |
homepage | |
repository | https://github.com/rodrimati1992/nlist/ |
max_upload_size | |
id | 1443384 |
Cargo.toml error: | TOML parse error at line 25, column 1 | 25 | autolib = false | ^^^^^^^ unknown field `autolib`, expected one of `name`, `version`, `edition`, `authors`, `description`, `readme`, `license`, `repository`, `homepage`, `documentation`, `build`, `resolver`, `links`, `default-run`, `default_dash_run`, `rust-version`, `rust_dash_version`, `rust_version`, `license-file`, `license_dash_file`, `license_file`, `licenseFile`, `license_capital_file`, `forced-target`, `forced_dash_target`, `autobins`, `autotests`, `autoexamples`, `autobenches`, `publish`, `metadata`, `keywords`, `categories`, `exclude`, `include` |
size | 0 |
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 NList
s 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 Vec
nlist
is #![no_std]
, it can be used anywhere Rust can be used.
nlist
requires Rust 1.83.0.