Struct frunk_core::hlist::HNil [−][src]
pub struct HNil;
Expand description
Implementations
Consume the current HList and return an HList with the requested shape.
sculpt
allows us to extract/reshape/scult the current HList into another shape,
provided that the requested shape’s types are are contained within the current HList.
The Indices
type parameter allows the compiler to figure out that Ts
and Self
can be morphed into each other.
Examples
let h = hlist![9000, "joe", 41f32, true]; let (reshaped, remainder): (HList![f32, i32, &str], _) = h.sculpt(); assert_eq!(reshaped, hlist![41f32, 9000, "joe"]); assert_eq!(remainder, hlist![true]);Run
Apply a function to each element of an HList.
This transforms some HList![A, B, C, ..., E]
into some
HList![T, U, V, ..., Z]
. A variety of types are supported
for the folder argument:
- An
hlist![]
of closures (one for each element). - A single closure (for mapping an HList that is homogenous).
- A single
Poly
.
Examples
use ::frunk::HNil; assert_eq!(HNil.map(HNil), HNil); let h = hlist![1, false, 42f32]; // Sadly we need to help the compiler understand the bool type in our mapper let mapped = h.to_ref().map(hlist![ |&n| n + 1, |b: &bool| !b, |&f| f + 1f32]); assert_eq!(mapped, hlist![2, true, 43f32]); // There is also a value-consuming version that passes values to your functions // instead of just references: let mapped2 = h.map(hlist![ |n| n + 3, |b: bool| !b, |f| f + 8959f32]); assert_eq!(mapped2, hlist![4, true, 9001f32]);Run
Zip two HLists together.
This zips a HList![A1, B1, ..., C1]
with a HList![A2, B2, ..., C2]
to make a HList![(A1, A2), (B1, B2), ..., (C1, C2)]
Example
use ::frunk::HNil; assert_eq!(HNil.zip(HNil), HNil); let h1 = hlist![1, false, 42f32]; let h2 = hlist![true, "foo", 2]; let zipped = h1.zip(h2); assert_eq!(zipped, hlist![ (1, true), (false, "foo"), (42f32, 2), ]);Run
pub fn foldl<Folder, Acc>(
self,
folder: Folder,
acc: Acc
) -> <Self as HFoldLeftable<Folder, Acc>>::Output where
Self: HFoldLeftable<Folder, Acc>,
pub fn foldl<Folder, Acc>(
self,
folder: Folder,
acc: Acc
) -> <Self as HFoldLeftable<Folder, Acc>>::Output where
Self: HFoldLeftable<Folder, Acc>,
Perform a left fold over an HList.
This transforms some HList![A, B, C, ..., E]
into a single
value by visiting all of the elements in left-to-right order.
A variety of types are supported for the mapper argument:
- An
hlist![]
of closures (one for each element). - A single closure (for folding an HList that is homogenous).
- A single
Poly
.
The accumulator can freely change type over the course of the call.
When called with a list of N
functions, an expanded form of the
implementation with type annotations might look something like this:
let acc: Acc0 = init_value; let acc: Acc1 = f1(acc, x1); let acc: Acc2 = f2(acc, x2); let acc: Acc3 = f3(acc, x3); ... let acc: AccN = fN(acc, xN); accRun
Examples
let nil = hlist![]; assert_eq!(nil.foldl(hlist![], 0), 0); let h = hlist![1, false, 42f32]; let folded = h.to_ref().foldl( hlist![ |acc, &i| i + acc, |acc, b: &bool| if !b && acc > 42 { 9000f32 } else { 0f32 }, |acc, &f| f + acc ], 1 ); assert_eq!(42f32, folded); // There is also a value-consuming version that passes values to your folding // functions instead of just references: let folded2 = h.foldl( hlist![ |acc, i| i + acc, |acc, b: bool| if !b && acc > 42 { 9000f32 } else { 0f32 }, |acc, f| f + acc ], 8918 ); assert_eq!(9042f32, folded2)Run
pub fn foldr<Folder, Init>(
self,
folder: Folder,
init: Init
) -> <Self as HFoldRightable<Folder, Init>>::Output where
Self: HFoldRightable<Folder, Init>,
pub fn foldr<Folder, Init>(
self,
folder: Folder,
init: Init
) -> <Self as HFoldRightable<Folder, Init>>::Output where
Self: HFoldRightable<Folder, Init>,
Perform a right fold over an HList.
This transforms some HList![A, B, C, ..., E]
into a single
value by visiting all of the elements in reverse order.
A variety of types are supported for the mapper argument:
- An
hlist![]
of closures (one for each element). - A single closure (for folding an HList that is homogenous), taken by reference.
- A single
Poly
.
The accumulator can freely change type over the course of the call.
Comparison to foldl
While the order of element traversal in foldl
may seem more natural,
foldr
does have its use cases, in particular when it is used to build
something that reflects the structure of the original HList (such as
folding an HList of Option
s into an Option
of an HList).
An implementation of such a function using foldl
will tend to
reverse the list, while foldr
will tend to preserve its order.
The reason for this is because foldr
performs what is known as
“structural induction;” it can be understood as follows:
- Write out the HList in terms of
h_cons
andHNil
. - Substitute each
h_cons
with a function, and substituteHNil
withinit
the list:
h_cons(x1, h_cons(x2, h_cons(x3, ...h_cons(xN, HNil)...)))
becomes:
f1( x1, f2( x2, f3( x3, ... fN( xN, init)...)))
Examples
let nil = hlist![]; assert_eq!(nil.foldr(hlist![], 0), 0); let h = hlist![1, false, 42f32]; let folded = h.foldr( hlist![ |acc, i| i + acc, |acc, b: bool| if !b && acc > 42f32 { 9000 } else { 0 }, |acc, f| f + acc ], 1f32 ); assert_eq!(9001, folded)Run
Trait Implementations
impl<Head, Tail> CoproductEmbedder<Coproduct<Head, Tail>, HNil> for CNil where
CNil: CoproductEmbedder<Tail, HNil>,
impl<Head, Tail> CoproductEmbedder<Coproduct<Head, Tail>, HNil> for CNil where
CNil: CoproductEmbedder<Tail, HNil>,
Reverses a given data structure.
Implementation for HNil
This method returns an ordering between self
and other
values if one exists. Read more
This method tests less than (for self
and other
) and is used by the <
operator. Read more
This method tests less than or equal to (for self
and other
) and is used by the <=
operator. Read more
This method tests greater than (for self
and other
) and is used by the >
operator. Read more
Implementation for when the target is an empty HList (HNil)
Index type is HNil because we don’t need an index for finding HNil
Implementation of Transmogrifier
for when the Target
is empty and the Source
is empty.
Consume this current object and return an object of the Target type. Read more
Implementation of Transmogrifier
for when the Target
is empty and the Source
is non-empty.
Consume this current object and return an object of the Target type. Read more
Auto Trait Implementations
impl RefUnwindSafe for HNil
impl UnwindSafe for HNil
Blanket Implementations
Mutably borrows from an owned value. Read more