[][src]Trait core_extensions::prelude::TypeIdentity

pub trait TypeIdentity {
    type Type: ?Sized;
    fn into_type_val(self) -> Self::Type
    where
        Self: Sized,
        Self::Type: Sized
, { ... }
fn into_type_ref(&self) -> &Self::Type { ... }
fn into_type_mut(&mut self) -> &mut Self::Type { ... }
fn into_type_box(self: Box<Self>) -> Box<Self::Type> { ... }
fn into_type_arc(this: Arc<Self>) -> Arc<Self::Type> { ... }
fn into_type_rc(this: Rc<Self>) -> Rc<Self::Type> { ... }
fn from_type_val(this: Self::Type) -> Self
    where
        Self: Sized,
        Self::Type: Sized
, { ... }
fn from_type_ref(this: &Self::Type) -> &Self { ... }
fn from_type_mut(this: &mut Self::Type) -> &mut Self { ... }
fn from_type_box(this: Box<Self::Type>) -> Box<Self> { ... }
fn from_type_arc(this: Arc<Self::Type>) -> Arc<Self> { ... }
fn from_type_rc(this: Rc<Self::Type>) -> Rc<Self> { ... } }

Allows converting Self to Self::Type by proving that both types are equal.

For extension methods of types, either generic (Vec<T>) or fully concrete (str), to avoid repeating method and function signatures in both the trait and the impl block.

To create a type Alias in a where clause ,eg:Vec<i32>:TypeIdentity<Type=List>.

To unwrap a generic type ,eg:I:TypeIdentity<Type=Option<U>>.

Example

Defining an extension trait on Vec.

use core_extensions::TypeIdentity;

trait VecExt<T>:TypeIdentity<Type=Vec<T>>{
    fn is_nonempty(&self)->bool{
        !self.into_type_ref().is_empty()
    }
    fn moved_vec(self)->Vec<T>
    where Self:Sized
    {
        self.into_type_val()
    }
    fn mutable_vec(&mut self)->&mut Vec<T>{
        self.into_type_mut()
    }
}
impl<T> VecExt<T> for Vec<T> {}

assert!(  vec![100].is_nonempty() );
assert!( !Vec::<i32>::new().is_nonempty() );

Example of a method requiring Self==Other

Wrapper::iter is only callable on Wrapper<Vec<T>>

use core_extensions::TypeIdentity;
use std::slice;

struct Wrapper<U>(U);

impl<U> Wrapper<U>{
     fn iter<T>(&self)->slice::Iter<T>
     where U:TypeIdentity<Type=Vec<T>>
     {
         self.0.into_type_ref().iter()
     }
}

assert_eq!(
    Wrapper(vec![0,1,2,3,4]).iter().cloned().collect::<Vec<_>>() ,
    vec![0,1,2,3,4]
);

Example of creating a type alias in a where clause

use core_extensions::TypeIdentity;
use std::ops::Deref;

struct Example<T>(T);

impl<T,Target0,Target1> Deref for Example<T>
where
    T:Deref,
    <T as Deref>::Target:TypeIdentity<Type=Target0>,
    Target0:Deref,
    <Target0 as Deref>::Target:TypeIdentity<Type=Target1>,
{   
    type Target=Target1;
     
    fn deref(&self)->&Target1{
        &**self
    }
}

Associated Types

type Type: ?Sized

The same type as Self.

Used in bounds to require that a generic type is a particular type.

Loading content...

Provided methods

fn into_type_val(self) -> Self::Type where
    Self: Sized,
    Self::Type: Sized

Converts a value back to the original type.

fn into_type_ref(&self) -> &Self::Type

Converts a reference back to the original type.

fn into_type_mut(&mut self) -> &mut Self::Type

Converts a mutable reference back to the original type.

fn into_type_box(self: Box<Self>) -> Box<Self::Type>

Converts a box back to the original type.

fn into_type_arc(this: Arc<Self>) -> Arc<Self::Type>

Converts an Arc back to the original type.

fn into_type_rc(this: Rc<Self>) -> Rc<Self::Type>

Converts an Rc back to the original type.

fn from_type_val(this: Self::Type) -> Self where
    Self: Sized,
    Self::Type: Sized

Converts a value back to the original type.

fn from_type_ref(this: &Self::Type) -> &Self

Converts a reference back to the original type.

fn from_type_mut(this: &mut Self::Type) -> &mut Self

Converts a mutable reference back to the original type.

fn from_type_box(this: Box<Self::Type>) -> Box<Self>

Converts a box back to the original type.

fn from_type_arc(this: Arc<Self::Type>) -> Arc<Self>

Converts an Arc back to the original type.

fn from_type_rc(this: Rc<Self::Type>) -> Rc<Self>

Converts an Rc back to the original type.

Loading content...

Implementors

impl<T: ?Sized> TypeIdentity for T[src]

type Type = T

Loading content...