Macro typewit::inj_type_fn
source · macro_rules! inj_type_fn { ($($args:tt)*) => { ... }; }
Expand description
Declares an injective type-level function
This macro takes in the exact same syntax as the type_fn
macro.
This macro generates the same items as the type_fn
macro,
in addition to implementing RevTypeFn
,
so that the function implements InjTypeFn
.
§Example
This macro is also demonstrated in
TypeNe::{
map
,
project
,
unmap
,
unproject
}
.
§Basic
use typewit::{CallFn, UncallFn, inj_type_fn};
// Calls the `ToSigned` function with `u64` as the argument.
let _: CallFn<ToSigned, u64> = 3i64;
// Gets the argument of the `ToSigned` function from the `i8` return value.
let _: UncallFn<ToSigned, i8> = 5u8;
inj_type_fn!{
struct ToSigned;
impl u128 => i128;
impl u64 => i64;
impl u32 => i32;
impl u16 => i16;
impl u8 => i8;
}
the above inj_type_fn
macro invocation roughly expands to this code
inj_type_fn
macro invocation roughly expands to this codestruct ToSigned;
impl ToSigned {
const NEW: Self = Self;
}
impl ::typewit::TypeFn<u128> for ToSigned {
type Output = i128;
}
impl ::typewit::RevTypeFn<i128> for ToSigned {
type Arg = u128;
}
impl ::typewit::TypeFn<u64> for ToSigned {
type Output = i64;
}
impl ::typewit::RevTypeFn<i64> for ToSigned {
type Arg = u64;
}
impl ::typewit::TypeFn<u32> for ToSigned {
type Output = i32;
}
impl ::typewit::RevTypeFn<i32> for ToSigned {
type Arg = u32;
}
impl ::typewit::TypeFn<u16> for ToSigned {
type Output = i16;
}
impl ::typewit::RevTypeFn<i16> for ToSigned {
type Arg = u16;
}
impl ::typewit::TypeFn<u8> for ToSigned {
type Output = i8;
}
impl ::typewit::RevTypeFn<i8> for ToSigned {
type Arg = u8;
}