Expand description
Module that holds HList data structures, implementations, and typeclasses.
Typically, you would want to use the hlist!
macro to make it easier
for you to use HList.
§Examples
use frunk_core::{hlist, HList, poly_fn};
let h = hlist![1, "hi"];
assert_eq!(h.len(), 2);
let (a, b) = h.into_tuple2();
assert_eq!(a, 1);
assert_eq!(b, "hi");
// Reverse
let h1 = hlist![true, "hi"];
assert_eq!(h1.into_reverse(), hlist!["hi", true]);
// foldr (foldl also available)
let h2 = hlist![1, false, 42f32];
let folded = h2.foldr(
hlist![|acc, i| i + acc,
|acc, _| if acc > 42f32 { 9000 } else { 0 },
|acc, f| f + acc],
1f32
);
assert_eq!(folded, 9001);
let h3 = hlist![9000, "joe", 41f32];
// Mapping over an HList with a polymorphic function,
// declared using the poly_fn! macro (you can choose to impl
// it manually)
let mapped = h3.map(
poly_fn![
|f: f32| -> f32 { f + 1f32 },
|i: isize| -> isize { i + 1 },
['a] |s: &'a str| -> &'a str { s }
]);
assert_eq!(mapped, hlist![9001, "joe", 42f32]);
// Plucking a value out by type
let h4 = hlist![1, "hello", true, 42f32];
let (t, remainder): (bool, _) = h4.pluck();
assert!(t);
assert_eq!(remainder, hlist![1, "hello", 42f32]);
// Resculpting an HList
let h5 = hlist![9000, "joe", 41f32, true];
let (reshaped, remainder2): (HList![f32, i32, &str], _) = h5.sculpt();
assert_eq!(reshaped, hlist![41f32, 9000, "joe"]);
assert_eq!(remainder2, hlist![true]);
Modules§
- foldr_
owned HFoldRightable
inner mechanics for folding with a folder that needs to be owned.
Structs§
- HCons
- Represents the most basic non-empty HList. Its value is held in
head
while its tail is another HList. - HNil
- Represents the right-most end of a heterogeneous list
Traits§
- HFold
Leftable - Trait for performing a left fold over an HList
- HFold
Rightable - Trait for performing a right fold over an HList
- HList
- Typeclass for HList-y behaviour
- HMappable
- Trait for mapping over an HList
- HZippable
- Trait for zipping HLists
- Into
Tuple2 - Trait for transforming an HList into a nested tuple.
- Lift
From - Indexed type conversions of
T -> Self
with indexI
. This is a generalized version ofFrom
which for example allows the caller to use default values for parts ofSelf
and thus “fill in the blanks”. - Lift
Into - An indexed conversion that consumes
self
, and produces aT
. To produceT
, the indexI
may be used to for example “fill in the blanks”.LiftInto
is the reciprocal ofLiftFrom
. - Plucker
- Trait defining extraction from a given HList
- Sculptor
- Trait for pulling out some subset of an HList, using type inference.
- Selector
- Trait for borrowing an HList element by type