Bottom type and infallible eliminator
parent
569e291cd3
commit
70fa5daf6c
@ -0,0 +1,82 @@
|
|||||||
|
use std::convert::Infallible;
|
||||||
|
|
||||||
|
/// The bottom type ⊥ with no elements. Since it has no elements, having an element of `Bot` is an
|
||||||
|
/// inherent contradiction and it can therefore be converted to any other type. In MLTT, this
|
||||||
|
/// corresponds to a proof by contradiction.
|
||||||
|
///
|
||||||
|
/// `Bot` serves the same purpose as `std::convert::Infallible` and the currently unstable "never"
|
||||||
|
/// type `!`, but provides more convenience methods than the former.
|
||||||
|
pub struct Bot(BotRepr);
|
||||||
|
|
||||||
|
impl Bot {
|
||||||
|
#[inline]
|
||||||
|
#[must_use]
|
||||||
|
pub fn elim<T>(self) -> T {
|
||||||
|
self.0.elim()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
#[must_use]
|
||||||
|
pub fn elim_ref<T>(&self) -> T {
|
||||||
|
self.0.elim()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn never(self) -> ! {
|
||||||
|
self.elim()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Clone for Bot {
|
||||||
|
#[inline]
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
self.elim_ref()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Copy for Bot {}
|
||||||
|
|
||||||
|
impl From<Infallible> for Bot {
|
||||||
|
fn from(infallible: Infallible) -> Self {
|
||||||
|
infallible_elim(infallible)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<Bot> for Infallible {
|
||||||
|
fn from(bot: Bot) -> Self {
|
||||||
|
bot.elim()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum BotRepr {}
|
||||||
|
|
||||||
|
impl BotRepr {
|
||||||
|
#[inline]
|
||||||
|
fn elim<T>(self) -> T {
|
||||||
|
match self {}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn elim_ref<T>(&self) -> T {
|
||||||
|
match *self {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Clone for BotRepr {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
self.elim_ref()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Copy for BotRepr {}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
#[must_use]
|
||||||
|
pub fn infallible_elim<T>(infallible: Infallible) -> T {
|
||||||
|
match infallible {}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn infallible_to_never(infallible: Infallible) -> ! {
|
||||||
|
infallible_elim(infallible)
|
||||||
|
}
|
||||||
@ -1 +1,2 @@
|
|||||||
|
pub mod convert;
|
||||||
pub mod strings;
|
pub mod strings;
|
||||||
|
|||||||
Loading…
Reference in New Issue