Struct ι

Source
pub struct ι<const CHAR: char, Tail>(pub PhantomData<Tail>);
Expand description

The Char type, a.k.a. ι, is used to represent type-level list of chars, which are equivalent to type-level strings.

Char is a specialized version of Cons, with the Head type being fixed to a const-generic value of type char. Similar to Cons, Char is also parameterized by a Tail type, which is expected to be either the next Char, or Nil to represent the end of the string.

Instead of reusing Cons, we combine the use of Cons within Char so that its representation is more compact when shown in compiler error messages. Similar to Cons, Char is also shown as ι to further improve its readability.

We represent type-level strings as list of Chars, because it is currently not possible to use types like String or &str as const-generic parameters. On the other hand, a single char can be used as a const-generic parameter, and so we can workaround the limitation by combining a type-level list of chars to represent a type-level string.

Char is most often not used directly, but rather through the symbol! macro, which accepts a string literal and converts it into a list of Chars.

§Example

Given the following symbol definition:

type Hello = symbol!("hello");

The following type would be generated:

type Hello = Char<'h', Char<'e', Char<'l', Char<'l', Char<'o', Nil>>>>>;

which would be shown with the shortened representation as:

type Hello = ι<'h', ι<'e', ι<'l', ι<'l', ι<'o', ε>>>>>;

Tuple Fields§

§0: PhantomData<Tail>

Trait Implementations§

Source§

impl<const CHAR: char, Tail: Clone> Clone for ι<CHAR, Tail>

Source§

fn clone(&self) -> ι<CHAR, Tail>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<const CHAR: char, Tail: Default> Default for ι<CHAR, Tail>

Source§

fn default() -> ι<CHAR, Tail>

Returns the “default value” for a type. Read more
Source§

impl<const CHAR: char, Tail> Display for Char<CHAR, Tail>
where Self: StaticFormat,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<const CHAR: char, Tail: PartialEq> PartialEq for ι<CHAR, Tail>

Source§

fn eq(&self, other: &ι<CHAR, Tail>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<const CHAR: char, Tail> StaticFormat for Char<CHAR, Tail>
where Tail: StaticFormat,

Source§

fn fmt(f: &mut Formatter<'_>) -> Result

Source§

impl<const CHAR: char, Tail: Copy> Copy for ι<CHAR, Tail>

Source§

impl<const CHAR: char, Tail: Eq> Eq for ι<CHAR, Tail>

Source§

impl<const CHAR: char, Tail> StructuralPartialEq for ι<CHAR, Tail>

Auto Trait Implementations§

§

impl<const CHAR: char, Tail> Freeze for ι<CHAR, Tail>

§

impl<const CHAR: char, Tail> RefUnwindSafe for ι<CHAR, Tail>
where Tail: RefUnwindSafe,

§

impl<const CHAR: char, Tail> Send for ι<CHAR, Tail>
where Tail: Send,

§

impl<const CHAR: char, Tail> Sync for ι<CHAR, Tail>
where Tail: Sync,

§

impl<const CHAR: char, Tail> Unpin for ι<CHAR, Tail>
where Tail: Unpin,

§

impl<const CHAR: char, Tail> UnwindSafe for ι<CHAR, Tail>
where Tail: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.