Enum simplicity::Value

source ·
pub enum Value {
    Unit,
    SumL(Arc<Value>),
    SumR(Arc<Value>),
    Prod(Arc<Value>, Arc<Value>),
}
Expand description

Value of some type.

The unit value is the only value of the unit type. This is the basis for everything we are doing. Because there is only a single unit value, there is no information contained in it. Instead, we wrap unit values in sum and product values to encode information.

A sum value wraps another value. The left sum value L(a) wraps a value a from the left type A. The right sum value R(b) wraps a value b from the right type B. The type of the sum value is the sum type A + B of the left type and the right type.

We represent the false bit as a left value that wraps a unit value. The true bit is represented as a right value that wraps a unit value.

A product value (a, b) wraps two values: a value a from the left type A and a value b from the right type B. The type of the product value is the product type A × B of the left type and the right type.

We represent bit strings (tuples of bits) as trees of nested product values that have bit values (sum values wrapping the unit value) at their leaves.

Variants§

§

Unit

Unit value

§

SumL(Arc<Value>)

Sum value that wraps a left value

§

SumR(Arc<Value>)

Sum value that wraps a right value

§

Prod(Arc<Value>, Arc<Value>)

Product value that wraps a left and a right value

Implementations§

source§

impl Value

source

pub fn unit() -> Arc<Self>

Create the unit value.

source

pub fn sum_l(left: Arc<Self>) -> Arc<Self>

Create a sum value that wraps a left value.

source

pub fn sum_r(right: Arc<Self>) -> Arc<Self>

Create a sum value that wraps a right value.

source

pub fn prod(left: Arc<Self>, right: Arc<Self>) -> Arc<Self>

Create a product value that wraps a left and a right value.

source

pub fn len(&self) -> usize

The length, in bits, of the value when encoded in the Bit Machine

source

pub fn u1(n: u8) -> Arc<Self>

Encode a single bit as a value. Will panic if the input is out of range

source

pub fn u2(n: u8) -> Arc<Self>

Encode a two-bit number as a value. Will panic if the input is out of range

source

pub fn u4(n: u8) -> Arc<Self>

Encode a four-bit number as a value. Will panic if the input is out of range

source

pub fn u8(n: u8) -> Arc<Self>

Encode an eight-bit number as a value

source

pub fn u16(n: u16) -> Arc<Self>

Encode a 16-bit number as a value

source

pub fn u32(n: u32) -> Arc<Self>

Encode a 32-bit number as a value

source

pub fn u64(n: u64) -> Arc<Self>

Encode a 64-bit number as a value

source

pub fn u128(n: u128) -> Arc<Self>

Encode a 128-bit number as a value

source

pub fn u256_from_slice(v: &[u8]) -> Arc<Self>

Encode a 32-byte number as a value

Useful for encoding public keys and hashes

source

pub fn u512_from_slice(v: &[u8]) -> Arc<Self>

Encode a 64-byte number as a value

Useful for encoding signatures

source

pub fn power_of_two(v: &[u8]) -> Arc<Self>

Encode a byte slice as a value.

The length of the slice must be a power of two.

source

pub fn do_each_bit<F>(&self, f: F)
where F: FnMut(bool),

Execute function f on each bit of the encoding of the value.

source

pub fn try_to_bytes(&self) -> Result<Vec<u8>, &str>

Encode value as big-endian byte string. Fails if underlying bit string has length not divisible by 8

source

pub fn to_bytes_len(&self) -> (Vec<u8>, usize)

Encode value as big-endian byte string. Trailing zeroes are added as padding if underlying bit string has length not divisible by 8. The length of said bit string is returned as second argument

Trait Implementations§

source§

impl Clone for Value

source§

fn clone(&self) -> Value

Returns a copy 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<'a> DagLike for &'a Value

§

type Node = Value

The type of the DAG node, with no references or wrappers
source§

fn data(&self) -> &Value

A pointer to the underlying data
source§

fn as_dag_node(&self) -> Dag<Self>

Interpret the node as a DAG node
source§

fn left_child(&self) -> Option<Self>

Accessor for the left child of the node, if one exists
source§

fn right_child(&self) -> Option<Self>

Accessor for the right child of the node, if one exists
source§

fn n_children(&self) -> usize

Number of children that the node has. Read more
source§

fn rtl_post_order_iter<S: SharingTracker<SwapChildren<Self>> + Default>( self ) -> RtlPostOrderIter<Self, S>

Obtains an iterator of all the nodes rooted at the DAG, in right-to-left post order. Read more
source§

fn pre_order_iter<S: SharingTracker<Self> + Default>( self ) -> PreOrderIter<Self, S>

Obtains an iterator of all the nodes rooted at the DAG, in pre-order.
source§

fn verbose_pre_order_iter<S: SharingTracker<Self> + Default>( self ) -> VerbosePreOrderIter<Self, S>
where Self: Clone,

Obtains a verbose iterator of all the nodes rooted at the DAG, in pre-order. Read more
source§

fn post_order_iter<S: SharingTracker<Self> + Default>( self ) -> PostOrderIter<Self, S>

Obtains an iterator of all the nodes rooted at the DAG, in post order. Read more
source§

fn is_shared_as<S: SharingTracker<Self> + Default>(self) -> bool
where Self: Clone,

Checks whether a DAG’s internal sharing (as expressed by shared pointers) matches the given target sharing.
source§

fn post_order_iter_with_tracker<S: SharingTracker<Self>>( self, tracker: S ) -> PostOrderIter<Self, S>

Obtains an post-order iterator of all the nodes rooted at DAG, using the given tracker. Read more
source§

impl Debug for Value

source§

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

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

impl Display for Value

source§

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

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

impl Hash for Value

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Ord for Value

source§

fn cmp(&self, other: &Value) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl PartialEq for Value

source§

fn eq(&self, other: &Value) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

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

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl PartialOrd for Value

source§

fn partial_cmp(&self, other: &Value) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

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

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

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

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

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

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

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

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
source§

impl Eq for Value

source§

impl StructuralPartialEq for Value

Auto Trait Implementations§

§

impl RefUnwindSafe for Value

§

impl Send for Value

§

impl Sync for Value

§

impl Unpin for Value

§

impl UnwindSafe for Value

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> 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> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

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

§

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>,

§

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.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V