rust2fun 0.2.1

A library for functional programming in Rust
Documentation
extern crate rust2fun_laws;

use std::marker::PhantomData;

use rust2fun_laws::apply_laws::*;
use rust2fun_laws::contravariant_laws::*;
use rust2fun_laws::flatmap_laws::*;
use rust2fun_laws::functor_laws::*;
use rust2fun_laws::invariant_laws::*;
use rust2fun_laws::semigroup_laws::*;
use rust2fun_laws::semigroupal_laws::*;

use crate::common::{parse, print};

mod common;

#[test]
fn test_invariant() {
    assert!(invariant_identity(PhantomData::<bool>).holds());
    assert!(invariant_composition(PhantomData::<u32>, print, parse, parse::<i32>, print).holds());
}

#[test]
fn test_functor() {
    assert!(covariant_identity(PhantomData::<u32>).holds());
    assert!(covariant_composition(PhantomData::<i32>, print, parse::<u32>).holds());
    assert!(lift_identity(PhantomData::<u32>).holds());
    assert!(lift_composition(PhantomData::<i32>, print, parse::<i64>).holds());
}

#[test]
fn test_contravariant() {
    assert!(contravariant_identity(PhantomData::<u32>).holds());
    assert!(contravariant_composition(PhantomData::<i32>, parse::<i32>, print::<u32>).holds());
    assert!(lift_contravariant_identity(PhantomData::<u32>).holds());
    assert!(lift_contravariant_composition(PhantomData::<i32>, parse::<i32>, print::<u32>).holds());
}

#[test]
fn test_semigroup() {
    assert!(repeat_0(PhantomData::<u32>).holds());
    assert!(repeat_1(PhantomData::<u32>).holds());
    assert!(
        semigroup_associativity(PhantomData::<u32>, PhantomData::<u32>, PhantomData::<u32>).holds()
    );
}

#[test]
fn test_semigroupal() {
    assert!(
        semigroupal_associativity(PhantomData::<u32>, PhantomData::<u32>, PhantomData::<u32>)
            .holds()
    );
}

#[test]
fn test_apply() {
    assert!(map2_product_consistency(PhantomData, PhantomData, |x: &str, l| x.len() == l).holds());
    assert!(product_r_consistency(PhantomData::<u32>, PhantomData::<u32>).holds());
    assert!(product_l_consistency(PhantomData::<u32>, PhantomData::<u32>).holds());
}

#[test]
fn test_flatmap() {
    assert!(flat_map_associativity(
        PhantomData::<i32>,
        |_| PhantomData::<f32>,
        |_| PhantomData::<u32>
    )
    .holds());
    assert!(flat_map_consistent_apply(PhantomData, PhantomData::<fn(i32) -> u32>).holds());
    assert!(m_product_consistency(PhantomData, |_: bool| PhantomData::<u32>).holds());
}