#![no_std]
#![doc(html_playground_url = "https://play.rust-lang.org/")]
#![cfg_attr(
feature = "alloc",
doc = r#"
Here is a small taste of what `OrdoFP` has to offer:
```
# fn main() {
use ordofp::prelude::*;
use ordofp::{self, hlist, coniunctio_pat, NominataUniversalis, monoid, Compositio, Universalis};
// Combining Monoids
let v = vec![Some(1), Some(3)];
assert_eq!(monoid::combine_all(&v), Some(4));
// HLists
let h = hlist![1, "hi"];
assert_eq!(h.len(), 2);
let coniunctio_pat!(a, b) = h;
assert_eq!(a, 1);
assert_eq!(b, "hi");
let h1 = hlist![Some(1), 3.3, 53i64, "hello".to_owned()];
let h2 = hlist![Some(2), 1.2, 1i64, " world".to_owned()];
let h3 = hlist![Some(3), 4.5, 54, "hello world".to_owned()];
assert_eq!(h1.combine(&h2), h3);
// Universalis and NominataUniversalis-based programming
// Allows Structs to play well easily with HLists
#[derive(Universalis, NominataUniversalis)]
struct ApiUser<'a> {
FirstName: &'a str,
LastName: &'a str,
Age: usize,
}
#[derive(Universalis, NominataUniversalis)]
struct NewUser<'a> {
first_name: &'a str,
last_name: &'a str,
age: usize,
}
#[derive(NominataUniversalis)]
struct SavedUser<'a> {
first_name: &'a str,
last_name: &'a str,
age: usize,
}
// Instantiate a struct from an HList. Note that you can go the other way too.
let a_user: ApiUser = ordofp::from_universalis(hlist!["Joe", "Blow", 30]);
// Convert using Universalis
let n_user: NewUser = Universalis::convert_from(a_user); // done
// Convert using NominataUniversalis
//
// This will fail if the fields of the types converted to and from do not
// have the same names or do not line up properly :)
//
// Also note that we're using a helper method to avoid having to use universal
// function call syntax
let s_user: SavedUser = ordofp::nominata_convert_from(n_user);
assert_eq!(s_user.first_name, "Joe");
assert_eq!(s_user.last_name, "Blow");
assert_eq!(s_user.age, 30);
// Uh-oh ! last_name and first_name have been flipped!
#[derive(NominataUniversalis)]
struct DeletedUser<'a> {
last_name: &'a str,
first_name: &'a str,
age: usize,
}
// let d_user = <DeletedUser as NominataUniversalis>::convert_from(s_user); <-- this would fail at compile time :)
// This will, however, work, because we make use of the Sculptor type-class
// to type-safely reshape the representations to align/match each other.
let d_user: DeletedUser = ordofp::transform_from(s_user);
assert_eq!(d_user.first_name, "Joe");
# }
```"#
)]
#[cfg(feature = "alloc")]
extern crate alloc;
#[cfg(any(feature = "std", test))]
extern crate std;
pub mod monoid;
pub mod semigroup;
#[cfg(feature = "Probatum")]
pub mod validated;
pub use ordofp_core::*;
#[cfg(feature = "derives")]
pub use ordofp_macros::{NominataUniversalis, Universalis};
#[cfg(feature = "proc-macros")]
pub use ordofp_macros::{path, path_type};
#[macro_export]
macro_rules! Path {
($($t:tt)*) => {
$crate::path_type!($($t)*)
};
}
#[doc(no_inline)]
pub use crate::hlist::lift_from;
#[doc(no_inline)]
pub use crate::hlist::Coniunctio;
#[doc(no_inline)]
pub use crate::hlist::Nihil;
#[doc(no_inline)]
pub use crate::traits::Func;
#[doc(no_inline)]
pub use crate::traits::Poly;
#[doc(no_inline)]
pub use crate::traits::{ToMut, ToRef};
#[doc(no_inline)]
pub use crate::disiunctio::Absurdum;
#[doc(no_inline)]
pub use crate::disiunctio::Disiunctio;
#[doc(no_inline)]
pub use ordofp_core::universalis::Universalis;
#[doc(no_inline)]
pub use ordofp_core::universalis::convert_from;
#[doc(no_inline)]
pub use ordofp_core::universalis::from_universalis;
#[doc(no_inline)]
pub use ordofp_core::universalis::into_universalis;
#[doc(no_inline)]
pub use ordofp_core::universalis::map_inter;
#[doc(no_inline)]
pub use ordofp_core::universalis::map_repr;
#[doc(no_inline)]
pub use crate::labelled::NominataUniversalis;
#[doc(no_inline)]
pub use crate::labelled::from_labelled_universalis;
#[doc(no_inline)]
pub use crate::labelled::into_labelled_universalis;
#[doc(no_inline)]
pub use crate::labelled::nominata_convert_from;
#[doc(no_inline)]
pub use crate::labelled::transform_from;
#[doc(no_inline)]
pub use crate::semigroup::Compositio;
#[doc(no_inline)]
pub use crate::monoid::Unitas;
#[doc(no_inline)]
#[cfg(feature = "Probatum")]
pub use crate::validated::IntoProbatum;
#[doc(no_inline)]
#[cfg(feature = "Probatum")]
pub use crate::validated::Probatum;
#[doc(no_inline)]
pub use crate::typeclasses::Applicatio;
#[doc(no_inline)]
pub use crate::typeclasses::Apply;
#[doc(no_inline)]
pub use crate::typeclasses::Functor;
#[doc(no_inline)]
pub use crate::typeclasses::Monad;
#[doc(no_inline)]
#[cfg(feature = "alloc")]
pub use crate::zipper::Zipper;
pub mod prelude {
#[doc(no_inline)]
pub use crate::hlist::HList; #[doc(no_inline)]
pub use crate::hlist::LiftFrom;
#[doc(no_inline)]
pub use crate::hlist::LiftInto;
#[doc(no_inline)]
#[cfg(feature = "Probatum")]
pub use crate::validated::IntoProbatum;
#[doc(no_inline)]
pub use crate::typeclasses::Applicatio;
#[doc(no_inline)]
pub use crate::typeclasses::Apply;
#[doc(no_inline)]
pub use crate::typeclasses::Functor;
#[doc(no_inline)]
pub use crate::typeclasses::Monad;
}