Trait type_level_values::type_fn::TypeFn_[][src]

pub trait TypeFn_<Params> {
    type Output;
}

A type-level function.

Type-level functions is what this library calls every implementor of this trait.

Implementations

The preferred way to implement this trait is using the type_fn macro.

Example

Implementing a multiply add operation.

use type_level_values::fn_types::{MulOp,AddOp};
use type_level_values::prelude::*;


use std::ops::{Mul,Add};

type_fn!{
    pub fn MulAdd[L,R](L,R)
    where[
        L:Mul<R,Output=res0>,
        res0:Add<R,Output=res1>,
    ]{
        let res0;
        let res1;
        res1
    }
}

fn main(){
    let _:U20=TypeFn::<MulAdd,(U4,U4)>::MTVAL;
    let _:U50=TypeFn::<MulAdd,(U4,U10)>::MTVAL;
}

A more advanced version,using function composition


use type_level_values::fn_adaptors::ApplyRhs;
use type_level_values::fn_types::{MulOp,AddOp};
use type_level_values::prelude::*;


type_fn!{
    pub fn MulAdd[L,R](L,R)
    where[ tlist![ MulOp, ApplyRhs<AddOp,R> ]:TypeFn_<(L,R),Output=out> ]
    { let out;out }
}

fn main(){
    let _:U20=TypeFn::<MulAdd,(U4,U4)>::MTVAL;
    let _:U50=TypeFn::<MulAdd,(U4,U10)>::MTVAL;
}

Example

Emulating type constructors with a TypeFn_.

use type_level_values::prelude::*;


use std::collections::{BTreeSet,BTreeMap};

type_fn!{pub fn VecFn[T](T){ Vec<T> }}

type_fn!{pub fn BTreeSetFn[T](T){ BTreeSet<T> }}

type_fn!{pub fn BTreeMapFn[K,V](K,V){ BTreeMap<K,V> }}

fn main(){
    let _:TypeFn<VecFn,usize> =
        Vec::<usize>::new();

    let _:TypeFn<BTreeSetFn,usize> =
        BTreeSet::<usize>::new();

    let _:TypeFn<BTreeMapFn,(String,usize)> =
        BTreeMap::<String,usize>::new();
}

Example

Implementing a function which unwraps a type-level Option<_> or else returns the value from the default function.

The default capture gets translated to the type parameter of UnwrapOrElse.

use type_level_values::fn_adaptors::{Const};
use type_level_values::prelude::*;



type_fn!{
    captures(default)

    pub fn
        UnwrapOrElse[T](Some_<T>)
        { T }
        
        UnwrapOrElse(None_)
        where[ default:TypeFn_<()> ]
        { default::Output }

}

fn main(){
    let _:U10=TypeFn::<UnwrapOrElse<Const<U0>>, Some_<U10>>::MTVAL;
    let _:U5 =TypeFn::<UnwrapOrElse<Const<U5>>, None_     >::MTVAL;
}

Associated Types

The return value of the function

Implementations on Foreign Types

impl<R> TypeFn_<R> for ()
[src]

impl<T0, Param> TypeFn_<Param> for (T0,) where
    T0: TypeFn_<Param>, 
[src]

impl<T0, T1, Param> TypeFn_<Param> for (T0, T1) where
    T0: TypeFn_<Param>,
    T1: TypeFn_<T0::Output>, 
[src]

impl<T0, T1, T2, Param> TypeFn_<Param> for (T0, T1, T2) where
    T0: TypeFn_<Param>,
    T1: TypeFn_<T0::Output>,
    T2: TypeFn_<T1::Output>, 
[src]

impl<T0, T1, T2, T3, Param> TypeFn_<Param> for (T0, T1, T2, T3) where
    T0: TypeFn_<Param>,
    T1: TypeFn_<T0::Output>,
    T2: TypeFn_<T1::Output>,
    T3: TypeFn_<T2::Output>, 
[src]

impl<T0, T1, T2, T3, T4, Param> TypeFn_<Param> for (T0, T1, T2, T3, T4) where
    T0: TypeFn_<Param>,
    T1: TypeFn_<T0::Output>,
    T2: TypeFn_<T1::Output>,
    T3: TypeFn_<T2::Output>,
    T4: TypeFn_<T3::Output>, 
[src]

impl<T0, T1, T2, T3, T4, T5, Param> TypeFn_<Param> for (T0, T1, T2, T3, T4, T5) where
    T0: TypeFn_<Param>,
    T1: TypeFn_<T0::Output>,
    T2: TypeFn_<T1::Output>,
    T3: TypeFn_<T2::Output>,
    T4: TypeFn_<T3::Output>,
    T5: TypeFn_<T4::Output>, 
[src]

impl<T0, T1, T2, T3, T4, T5, T6, Param> TypeFn_<Param> for (T0, T1, T2, T3, T4, T5, T6) where
    T0: TypeFn_<Param>,
    T1: TypeFn_<T0::Output>,
    T2: TypeFn_<T1::Output>,
    T3: TypeFn_<T2::Output>,
    T4: TypeFn_<T3::Output>,
    T5: TypeFn_<T4::Output>,
    T6: TypeFn_<T5::Output>, 
[src]

impl<T0, T1, T2, T3, T4, T5, T6, T7, Param> TypeFn_<Param> for (T0, T1, T2, T3, T4, T5, T6, T7) where
    T0: TypeFn_<Param>,
    T1: TypeFn_<T0::Output>,
    T2: TypeFn_<T1::Output>,
    T3: TypeFn_<T2::Output>,
    T4: TypeFn_<T3::Output>,
    T5: TypeFn_<T4::Output>,
    T6: TypeFn_<T5::Output>,
    T7: TypeFn_<T6::Output>, 
[src]

impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, Param> TypeFn_<Param> for (T0, T1, T2, T3, T4, T5, T6, T7, T8) where
    T0: TypeFn_<Param>,
    T1: TypeFn_<T0::Output>,
    T2: TypeFn_<T1::Output>,
    T3: TypeFn_<T2::Output>,
    T4: TypeFn_<T3::Output>,
    T5: TypeFn_<T4::Output>,
    T6: TypeFn_<T5::Output>,
    T7: TypeFn_<T6::Output>,
    T8: TypeFn_<T7::Output>, 
[src]

impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Param> TypeFn_<Param> for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) where
    T0: TypeFn_<Param>,
    T1: TypeFn_<T0::Output>,
    T2: TypeFn_<T1::Output>,
    T3: TypeFn_<T2::Output>,
    T4: TypeFn_<T3::Output>,
    T5: TypeFn_<T4::Output>,
    T6: TypeFn_<T5::Output>,
    T7: TypeFn_<T6::Output>,
    T8: TypeFn_<T7::Output>,
    T9: TypeFn_<T8::Output>, 
[src]

impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, Param> TypeFn_<Param> for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) where
    T0: TypeFn_<Param>,
    T1: TypeFn_<T0::Output>,
    T2: TypeFn_<T1::Output>,
    T3: TypeFn_<T2::Output>,
    T4: TypeFn_<T3::Output>,
    T5: TypeFn_<T4::Output>,
    T6: TypeFn_<T5::Output>,
    T7: TypeFn_<T6::Output>,
    T8: TypeFn_<T7::Output>,
    T9: TypeFn_<T8::Output>,
    T10: TypeFn_<T9::Output>, 
[src]

impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, Param> TypeFn_<Param> for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) where
    T0: TypeFn_<Param>,
    T1: TypeFn_<T0::Output>,
    T2: TypeFn_<T1::Output>,
    T3: TypeFn_<T2::Output>,
    T4: TypeFn_<T3::Output>,
    T5: TypeFn_<T4::Output>,
    T6: TypeFn_<T5::Output>,
    T7: TypeFn_<T6::Output>,
    T8: TypeFn_<T7::Output>,
    T9: TypeFn_<T8::Output>,
    T10: TypeFn_<T9::Output>,
    T11: TypeFn_<T10::Output>, 
[src]

impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, Param> TypeFn_<Param> for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) where
    T0: TypeFn_<Param>,
    T1: TypeFn_<T0::Output>,
    T2: TypeFn_<T1::Output>,
    T3: TypeFn_<T2::Output>,
    T4: TypeFn_<T3::Output>,
    T5: TypeFn_<T4::Output>,
    T6: TypeFn_<T5::Output>,
    T7: TypeFn_<T6::Output>,
    T8: TypeFn_<T7::Output>,
    T9: TypeFn_<T8::Output>,
    T10: TypeFn_<T9::Output>,
    T11: TypeFn_<T10::Output>,
    T12: TypeFn_<T11::Output>, 
[src]

impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Param> TypeFn_<Param> for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) where
    T0: TypeFn_<Param>,
    T1: TypeFn_<T0::Output>,
    T2: TypeFn_<T1::Output>,
    T3: TypeFn_<T2::Output>,
    T4: TypeFn_<T3::Output>,
    T5: TypeFn_<T4::Output>,
    T6: TypeFn_<T5::Output>,
    T7: TypeFn_<T6::Output>,
    T8: TypeFn_<T7::Output>,
    T9: TypeFn_<T8::Output>,
    T10: TypeFn_<T9::Output>,
    T11: TypeFn_<T10::Output>,
    T12: TypeFn_<T11::Output>,
    T13: TypeFn_<T12::Output>, 
[src]

impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, Param> TypeFn_<Param> for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) where
    T0: TypeFn_<Param>,
    T1: TypeFn_<T0::Output>,
    T2: TypeFn_<T1::Output>,
    T3: TypeFn_<T2::Output>,
    T4: TypeFn_<T3::Output>,
    T5: TypeFn_<T4::Output>,
    T6: TypeFn_<T5::Output>,
    T7: TypeFn_<T6::Output>,
    T8: TypeFn_<T7::Output>,
    T9: TypeFn_<T8::Output>,
    T10: TypeFn_<T9::Output>,
    T11: TypeFn_<T10::Output>,
    T12: TypeFn_<T11::Output>,
    T13: TypeFn_<T12::Output>,
    T14: TypeFn_<T13::Output>, 
[src]

impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, Param> TypeFn_<Param> for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) where
    T0: TypeFn_<Param>,
    T1: TypeFn_<T0::Output>,
    T2: TypeFn_<T1::Output>,
    T3: TypeFn_<T2::Output>,
    T4: TypeFn_<T3::Output>,
    T5: TypeFn_<T4::Output>,
    T6: TypeFn_<T5::Output>,
    T7: TypeFn_<T6::Output>,
    T8: TypeFn_<T7::Output>,
    T9: TypeFn_<T8::Output>,
    T10: TypeFn_<T9::Output>,
    T11: TypeFn_<T10::Output>,
    T12: TypeFn_<T11::Output>,
    T13: TypeFn_<T12::Output>,
    T14: TypeFn_<T13::Output>,
    T15: TypeFn_<T14::Output>, 
[src]

Implementors