#labelled-generic #frunk #generics #generic #coproduct #hlist #h-list

no-std frunk_core

Frunk core provides developers with HList, Coproduct, LabelledGeneric and Generic

34 releases

0.4.2 Jun 17, 2023
0.4.1 Nov 3, 2022
0.4.0 Jun 25, 2021
0.3.1 Dec 21, 2019
0.0.11 Mar 22, 2017

#2001 in Rust patterns

Download history 45090/week @ 2023-11-27 45111/week @ 2023-12-04 44505/week @ 2023-12-11 47870/week @ 2023-12-18 29445/week @ 2023-12-25 39466/week @ 2024-01-01 46562/week @ 2024-01-08 49362/week @ 2024-01-15 46084/week @ 2024-01-22 54176/week @ 2024-01-29 50527/week @ 2024-02-05 45458/week @ 2024-02-12 37802/week @ 2024-02-19 40268/week @ 2024-02-26 41831/week @ 2024-03-04 17592/week @ 2024-03-11

139,853 downloads per month
Used in 265 crates (39 directly)

MIT license

195KB
3K SLoC

Frunk Core

This library forms the core of Frunk. It should ideally be minimalistic, containing only the fundamental building blocks of generic programming.

Examples


let h = hlist![1, false, 42f32];
let folded = h.foldr(hlist![|acc, i| i + acc,
    |acc, _| if acc > 42f32 { 9000 } else { 0 },
    |acc, f| f + acc],
    1f32);
assert_eq!(folded, 9001);

// 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);

// Mapping over an HList
let h3 = hlist![9000, "joe", 41f32];
let mapped = h3.to_ref().map(hlist![|&n| n + 1,
                              |&s| s,
                              |&f| f + 1f32]);
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]);

Links:

  1. Source on Github
  2. Crates.io page

Dependencies

~175KB