1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
#![cfg_attr(not(feature = "std"), no_std)] #![doc(html_playground_url = "https://play.rust-lang.org/")] //! Frunk Core //! //! This library forms the core of Frunk. It should ideally be minimalistic, //! containing only the fundamental building blocks of generic programming. //! //! # Examples //! //! ``` //! # #[macro_use] extern crate frunk_core; //! # use frunk_core::hlist::*; //! # fn main() { //! //! let h = hlist![1, false, 42f32]; //! let folded = h.foldr(hlist![|i, acc| i + acc, //! |_, acc| if acc > 42f32 { 9000 } else { 0 }, //! |f, acc| 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![|i, acc| i + acc, //! |_, acc| if acc > 42f32 { 9000 } else { 0 }, //! |f, acc| 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](https://github.com/lloydmeta/frunk) //! 2. [Crates.io page](https://crates.io/crates/frunk) #[cfg(not(feature = "std"))] extern crate core as std; #[macro_use] mod macros; pub mod coproduct; pub mod generic; pub mod hlist; pub mod indices; pub mod labelled; pub mod path; pub mod traits; mod tuples; #[cfg(test)] mod test_structs; #[cfg(feature = "serde")] #[macro_use] extern crate serde;