## 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]);
```

Run## Modules

`HFoldRightable`

inner mechanics for folding with a folder that needs to be owned.

## Structs

- Represents the most basic non-empty HList. Its value is held in
`head`

while its tail is another HList. - Represents the right-most end of a heterogeneous list

## Traits

- Trait for performing a left fold over an HList
- Trait for performing a right fold over an HList
- Typeclass for HList-y behaviour
- Trait for mapping over an HList
- Trait for zipping HLists
- Trait for transforming an HList into a nested tuple.
- Indexed type conversions of
`T -> Self`

with index`I`

. This is a generalized version of`From`

which for example allows the caller to use default values for parts of`Self`

and thus “fill in the blanks”. - An indexed conversion that consumes
`self`

, and produces a`T`

. To produce`T`

, the index`I`

may be used to for example “fill in the blanks”.`LiftInto`

is the reciprocal of`LiftFrom`

. - Trait defining extraction from a given HList
- Trait for pulling out some subset of an HList, using type inference.
- Trait for borrowing an HList element by type

## Functions

- Takes an element and an Hlist and returns another one with the element prepended to the original list. The original list is consumed
- Free function version of
`LiftFrom::lift_from`

.