pub struct TypeBase<RV>(/* private fields */)
where
RV: MaybeRV;
Expand description
A HUGR type - the valid types of EdgeKind::Value and EdgeKind::Const edges. Such an edge is valid if the ports on either end agree on the Type. Types have an optional TypeBound which places limits on the valid operations on a type.
Examples:
let sum = Type::new_sum([type_row![], type_row![]]);
assert_eq!(sum.least_upper_bound(), TypeBound::Copyable);
let func_type: Type = Type::new_function(Signature::new_endo(vec![]));
assert_eq!(func_type.least_upper_bound(), TypeBound::Copyable);
Implementations§
source§impl<RV> TypeBase<RV>where
RV: MaybeRV,
impl<RV> TypeBase<RV>where
RV: MaybeRV,
sourcepub const EMPTY_TYPEROW: TypeRowBase<RV> = _
pub const EMPTY_TYPEROW: TypeRowBase<RV> = _
An empty TypeRow
or TypeRowRV
. Provided here for convenience
sourcepub fn new_function(
fun_ty: impl Into<FuncTypeBase<RowVariable>>,
) -> TypeBase<RV>
pub fn new_function( fun_ty: impl Into<FuncTypeBase<RowVariable>>, ) -> TypeBase<RV>
Initialize a new function type.
sourcepub fn new_tuple(types: impl Into<TypeRowBase<RowVariable>>) -> TypeBase<RV>
pub fn new_tuple(types: impl Into<TypeRowBase<RowVariable>>) -> TypeBase<RV>
Initialize a new tuple type by providing the elements.
sourcepub fn new_sum<R>(variants: impl IntoIterator<Item = R>) -> TypeBase<RV>
pub fn new_sum<R>(variants: impl IntoIterator<Item = R>) -> TypeBase<RV>
Initialize a new sum type by providing the possible variant types.
sourcepub const fn new_extension(opaque: CustomType) -> TypeBase<RV>
pub const fn new_extension(opaque: CustomType) -> TypeBase<RV>
Initialize a new custom type.
sourcepub const fn new_unit_sum(size: u8) -> TypeBase<RV>
pub const fn new_unit_sum(size: u8) -> TypeBase<RV>
New UnitSum with empty Tuple variants
sourcepub const fn new_var_use(idx: usize, bound: TypeBound) -> TypeBase<RV>
pub const fn new_var_use(idx: usize, bound: TypeBound) -> TypeBase<RV>
New use (occurrence) of the type variable with specified index.
bound
must be exactly that with which the variable was declared
(i.e. as a TypeParam::Type(bound)
), which may be narrower
than required for the use.
sourcepub const fn least_upper_bound(&self) -> TypeBound
pub const fn least_upper_bound(&self) -> TypeBound
Report the least upper TypeBound
sourcepub const fn as_type_enum(&self) -> &TypeEnum<RV>
pub const fn as_type_enum(&self) -> &TypeEnum<RV>
Report the component TypeEnum.
source§impl TypeBase<RowVariable>
impl TypeBase<RowVariable>
sourcepub fn is_row_var(&self) -> bool
pub fn is_row_var(&self) -> bool
Tells if this Type is a row variable, i.e. could stand for any number >=0 of Types
sourcepub const fn new_row_var_use(
idx: usize,
bound: TypeBound,
) -> TypeBase<RowVariable>
pub const fn new_row_var_use( idx: usize, bound: TypeBound, ) -> TypeBase<RowVariable>
New use (occurrence) of the row variable with specified index.
bound
must match that with which the variable was declared
(i.e. as a TypeParam::Listof a
TypeParam::Type` of that bound).
For use in OpDef, not FuncDefn, type schemes only.
source§impl<RV> TypeBase<RV>where
RV: MaybeRV,
impl<RV> TypeBase<RV>where
RV: MaybeRV,
sourcepub fn try_into_type(self) -> Result<TypeBase<NoRV>, RowVariable>
pub fn try_into_type(self) -> Result<TypeBase<NoRV>, RowVariable>
(Fallibly) converts a TypeBase (parameterized, so may or may not be able to contain RowVariables) into a Type that definitely does not.
Trait Implementations§
source§impl<'de, RV> Deserialize<'de> for TypeBase<RV>where
RV: MaybeRV + Deserialize<'de>,
impl<'de, RV> Deserialize<'de> for TypeBase<RV>where
RV: MaybeRV + Deserialize<'de>,
source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<TypeBase<RV>, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<TypeBase<RV>, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
source§impl<RV1> From<TypeBase<RV1>> for TypeRowBase<RowVariable>where
RV1: MaybeRV,
impl<RV1> From<TypeBase<RV1>> for TypeRowBase<RowVariable>where
RV1: MaybeRV,
source§fn from(t: TypeBase<RV1>) -> TypeRowBase<RowVariable>
fn from(t: TypeBase<RV1>) -> TypeRowBase<RowVariable>
source§impl<RV> Serialize for TypeBase<RV>where
RV: MaybeRV + Serialize,
impl<RV> Serialize for TypeBase<RV>where
RV: MaybeRV + Serialize,
source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
source§impl TryFrom<TypeBase<RowVariable>> for TypeBase<NoRV>
impl TryFrom<TypeBase<RowVariable>> for TypeBase<NoRV>
source§type Error = RowVariable
type Error = RowVariable
source§fn try_from(value: TypeBase<RowVariable>) -> Result<TypeBase<NoRV>, RowVariable>
fn try_from(value: TypeBase<RowVariable>) -> Result<TypeBase<NoRV>, RowVariable>
impl<RV> Eq for TypeBase<RV>where
RV: Eq + MaybeRV,
Auto Trait Implementations§
impl<RV> Freeze for TypeBase<RV>where
RV: Freeze,
impl<RV> RefUnwindSafe for TypeBase<RV>where
RV: RefUnwindSafe,
impl<RV> Send for TypeBase<RV>where
RV: Send,
impl<RV> Sync for TypeBase<RV>where
RV: Sync,
impl<RV> Unpin for TypeBase<RV>where
RV: Unpin,
impl<RV> UnwindSafe for TypeBase<RV>where
RV: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.source§impl<T> FmtForward for T
impl<T> FmtForward for T
source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moresource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moresource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.source§impl<T> Serialize for T
impl<T> Serialize for T
fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<(), Error>
fn do_erased_serialize( &self, serializer: &mut dyn Serializer, ) -> Result<(), ErrorImpl>
source§impl<T> Tap for T
impl<T> Tap for T
source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moresource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moresource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moresource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moresource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moresource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moresource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.