Enum polars::frame::column::Column

source ·
pub enum Column {
    Series(Series),
    Scalar(ScalarColumn),
}
Expand description

A column within a DataFrame.

This is lazily initialized to a Series with methods like as_materialized_series and take_materialized_series.

Currently, there are two ways to represent a Column.

  1. A Series of values
  2. A ScalarColumn that repeats a single Scalar

Variants§

§

Series(Series)

§

Scalar(ScalarColumn)

Implementations§

source§

impl Column

source

pub fn new<T, Phantom>(name: PlSmallStr, values: T) -> Column
where Series: NamedFrom<T, Phantom>, Phantom: ?Sized,

source

pub fn new_empty(name: PlSmallStr, dtype: &DataType) -> Column

source

pub fn new_scalar(name: PlSmallStr, scalar: Scalar, length: usize) -> Column

source

pub fn as_materialized_series(&self) -> &Series

Get a reference to a Series for this Column

This may need to materialize the Series on the first invocation for a specific column.

source

pub fn into_materialized_series(&mut self) -> &mut Series

Turn Column into a Column::Series.

This may need to materialize the Series on the first invocation for a specific column.

source

pub fn take_materialized_series(self) -> Series

Take Series from a Column

This may need to materialize the Series on the first invocation for a specific column.

source

pub fn dtype(&self) -> &DataType

source

pub fn field(&self) -> Cow<'_, Field>

source

pub fn name(&self) -> &PlSmallStr

source

pub fn len(&self) -> usize

source

pub fn with_name(self, name: PlSmallStr) -> Column

source

pub fn rename(&mut self, name: PlSmallStr)

source

pub fn as_series(&self) -> Option<&Series>

source

pub fn as_scalar_column(&self) -> Option<&ScalarColumn>

source

pub fn bool(&self) -> Result<&ChunkedArray<BooleanType>, PolarsError>

source

pub fn i8(&self) -> Result<&ChunkedArray<Int8Type>, PolarsError>

source

pub fn i16(&self) -> Result<&ChunkedArray<Int16Type>, PolarsError>

source

pub fn i32(&self) -> Result<&ChunkedArray<Int32Type>, PolarsError>

source

pub fn i64(&self) -> Result<&ChunkedArray<Int64Type>, PolarsError>

source

pub fn u8(&self) -> Result<&ChunkedArray<UInt8Type>, PolarsError>

source

pub fn u16(&self) -> Result<&ChunkedArray<UInt16Type>, PolarsError>

source

pub fn u32(&self) -> Result<&ChunkedArray<UInt32Type>, PolarsError>

source

pub fn u64(&self) -> Result<&ChunkedArray<UInt64Type>, PolarsError>

source

pub fn f32(&self) -> Result<&ChunkedArray<Float32Type>, PolarsError>

source

pub fn f64(&self) -> Result<&ChunkedArray<Float64Type>, PolarsError>

source

pub fn str(&self) -> Result<&ChunkedArray<StringType>, PolarsError>

source

pub fn list(&self) -> Result<&ChunkedArray<ListType>, PolarsError>

source

pub fn binary(&self) -> Result<&ChunkedArray<BinaryType>, PolarsError>

source

pub fn idx(&self) -> Result<&ChunkedArray<UInt32Type>, PolarsError>

source

pub fn binary_offset( &self, ) -> Result<&ChunkedArray<BinaryOffsetType>, PolarsError>

source

pub fn datetime(&self) -> Result<&Logical<DatetimeType, Int64Type>, PolarsError>

Available on crate feature dtype-datetime only.
source

pub fn struct_(&self) -> Result<&ChunkedArray<StructType>, PolarsError>

Available on crate feature dtype-struct only.
source

pub fn decimal(&self) -> Result<&Logical<DecimalType, Int128Type>, PolarsError>

Available on crate feature dtype-decimal only.
source

pub fn array(&self) -> Result<&ChunkedArray<FixedSizeListType>, PolarsError>

Available on crate feature dtype-array only.
source

pub fn categorical(&self) -> Result<&CategoricalChunked, PolarsError>

Available on crate feature dtype-categorical only.
source

pub fn date(&self) -> Result<&Logical<DateType, Int32Type>, PolarsError>

Available on crate feature dtype-date only.
source

pub fn duration(&self) -> Result<&Logical<DurationType, Int64Type>, PolarsError>

Available on crate feature dtype-duration only.
source

pub fn cast_with_options( &self, dtype: &DataType, options: CastOptions, ) -> Result<Column, PolarsError>

source

pub fn strict_cast(&self, dtype: &DataType) -> Result<Column, PolarsError>

source

pub fn cast(&self, dtype: &DataType) -> Result<Column, PolarsError>

source

pub unsafe fn cast_unchecked( &self, dtype: &DataType, ) -> Result<Column, PolarsError>

§Safety

This can lead to invalid memory access in downstream code.

source

pub fn clear(&self) -> Column

source

pub fn shrink_to_fit(&mut self)

source

pub fn new_from_index(&self, index: usize, length: usize) -> Column

source

pub fn has_nulls(&self) -> bool

source

pub fn is_null(&self) -> ChunkedArray<BooleanType>

source

pub fn is_not_null(&self) -> ChunkedArray<BooleanType>

source

pub fn to_physical_repr(&self) -> Column

source

pub fn head(&self, length: Option<usize>) -> Column

source

pub fn tail(&self, length: Option<usize>) -> Column

source

pub fn slice(&self, offset: i64, length: usize) -> Column

source

pub fn split_at(&self, offset: i64) -> (Column, Column)

source

pub fn null_count(&self) -> usize

source

pub fn take( &self, indices: &ChunkedArray<UInt32Type>, ) -> Result<Column, PolarsError>

source

pub fn take_slice(&self, indices: &[u32]) -> Result<Column, PolarsError>

source

pub unsafe fn take_unchecked( &self, indices: &ChunkedArray<UInt32Type>, ) -> Column

§Safety

No bounds on the indexes are performed.

source

pub unsafe fn take_slice_unchecked(&self, indices: &[u32]) -> Column

§Safety

No bounds on the indexes are performed.

source

pub unsafe fn agg_min(&self, groups: &GroupsProxy) -> Column

Available on crate feature algorithm_group_by only.
§Safety

Does no bounds checks, groups must be correct.

source

pub unsafe fn agg_max(&self, groups: &GroupsProxy) -> Column

Available on crate feature algorithm_group_by only.
§Safety

Does no bounds checks, groups must be correct.

source

pub unsafe fn agg_mean(&self, groups: &GroupsProxy) -> Column

Available on crate feature algorithm_group_by only.
§Safety

Does no bounds checks, groups must be correct.

source

pub unsafe fn agg_sum(&self, groups: &GroupsProxy) -> Column

Available on crate feature algorithm_group_by only.
§Safety

Does no bounds checks, groups must be correct.

source

pub unsafe fn agg_first(&self, groups: &GroupsProxy) -> Column

§Safety

Does no bounds checks, groups must be correct.

source

pub unsafe fn agg_last(&self, groups: &GroupsProxy) -> Column

§Safety

Does no bounds checks, groups must be correct.

source

pub unsafe fn agg_n_unique(&self, groups: &GroupsProxy) -> Column

§Safety

Does no bounds checks, groups must be correct.

source

pub unsafe fn agg_quantile( &self, groups: &GroupsProxy, quantile: f64, interpol: QuantileInterpolOptions, ) -> Column

§Safety

Does no bounds checks, groups must be correct.

source

pub unsafe fn agg_median(&self, groups: &GroupsProxy) -> Column

Available on crate feature algorithm_group_by only.
§Safety

Does no bounds checks, groups must be correct.

source

pub unsafe fn agg_var(&self, groups: &GroupsProxy, ddof: u8) -> Column

Available on crate feature algorithm_group_by only.
§Safety

Does no bounds checks, groups must be correct.

source

pub unsafe fn agg_list(&self, groups: &GroupsProxy) -> Column

Available on crate feature algorithm_group_by only.
§Safety

Does no bounds checks, groups must be correct.

source

pub fn full_null(name: PlSmallStr, size: usize, dtype: &DataType) -> Column

source

pub fn is_empty(&self) -> bool

source

pub fn reverse(&self) -> Column

source

pub fn equals(&self, right: &Column) -> bool

source

pub fn equals_missing(&self, right: &Column) -> bool

source

pub fn set_sorted_flag(&mut self, sorted: IsSorted)

source

pub fn get_flags(&self) -> MetadataFlags

source

pub fn get_data_ptr(&self) -> usize

source

pub fn vec_hash( &self, build_hasher: RandomState, buf: &mut Vec<u64>, ) -> Result<(), PolarsError>

source

pub fn vec_hash_combine( &self, build_hasher: RandomState, hashes: &mut [u64], ) -> Result<(), PolarsError>

source

pub fn append(&mut self, other: &Column) -> Result<&mut Column, PolarsError>

source

pub fn arg_sort(&self, options: SortOptions) -> ChunkedArray<UInt32Type>

source

pub fn bit_repr(&self) -> Option<BitRepr>

source

pub fn into_frame(self) -> DataFrame

source

pub fn unique_stable(&self) -> Result<Column, PolarsError>

source

pub fn extend(&mut self, other: &Column) -> Result<&mut Column, PolarsError>

source

pub fn rechunk(&self) -> Column

source

pub fn explode(&self) -> Result<Column, PolarsError>

source

pub fn fill_null( &self, strategy: FillNullStrategy, ) -> Result<Column, PolarsError>

source

pub fn divide(&self, rhs: &Column) -> Result<Column, PolarsError>

source

pub fn shift(&self, periods: i64) -> Column

source

pub fn zip_with( &self, mask: &ChunkedArray<BooleanType>, other: &Column, ) -> Result<Column, PolarsError>

Available on crate feature zip_with only.
source

pub fn zip_with_same_type( &self, mask: &ChunkedArray<BooleanType>, other: &Column, ) -> Result<Column, PolarsError>

Available on crate feature zip_with only.
source

pub fn drop_nulls(&self) -> Column

source

pub fn is_sorted_flag(&self) -> IsSorted

source

pub fn unique(&self) -> Result<Column, PolarsError>

source

pub fn reshape_list(&self, dimensions: &[i64]) -> Result<Column, PolarsError>

source

pub fn reshape_array(&self, dimensions: &[i64]) -> Result<Column, PolarsError>

Available on crate feature dtype-array only.
source

pub fn sort(&self, sort_options: SortOptions) -> Result<Column, PolarsError>

source

pub fn filter( &self, filter: &ChunkedArray<BooleanType>, ) -> Result<Column, PolarsError>

source

pub fn shuffle(&self, seed: Option<u64>) -> Column

Available on crate feature random only.
source

pub fn sample_frac( &self, frac: f64, with_replacement: bool, shuffle: bool, seed: Option<u64>, ) -> Result<Column, PolarsError>

Available on crate feature random only.
source

pub fn sample_n( &self, n: usize, with_replacement: bool, shuffle: bool, seed: Option<u64>, ) -> Result<Column, PolarsError>

Available on crate feature random only.
source

pub fn gather_every(&self, n: usize, offset: usize) -> Column

source

pub fn extend_constant( &self, value: AnyValue<'_>, n: usize, ) -> Result<Column, PolarsError>

source

pub fn is_finite(&self) -> Result<ChunkedArray<BooleanType>, PolarsError>

source

pub fn is_infinite(&self) -> Result<ChunkedArray<BooleanType>, PolarsError>

source

pub fn is_nan(&self) -> Result<ChunkedArray<BooleanType>, PolarsError>

source

pub fn is_not_nan(&self) -> Result<ChunkedArray<BooleanType>, PolarsError>

source

pub fn wrapping_trunc_div_scalar<T>(&self, rhs: T) -> Column
where T: Num + NumCast,

source

pub fn product(&self) -> Result<Scalar, PolarsError>

source

pub fn phys_iter(&self) -> Box<dyn ExactSizeIterator<Item = AnyValue<'_>> + '_>

source

pub fn get(&self, index: usize) -> Result<AnyValue<'_>, PolarsError>

source

pub unsafe fn get_unchecked(&self, index: usize) -> AnyValue<'_>

§Safety

Does not perform bounds check on index

source

pub fn get_object( &self, index: usize, ) -> Option<&(dyn PolarsObjectSafe + 'static)>

Available on crate feature object only.
source

pub fn bitand(&self, rhs: &Column) -> Result<Column, PolarsError>

source

pub fn max_reduce(&self) -> Result<Scalar, PolarsError>

source

pub fn min_reduce(&self) -> Result<Scalar, PolarsError>

Trait Implementations§

source§

impl<T> Add<T> for &Column
where T: Num + NumCast,

§

type Output = Result<Column, PolarsError>

The resulting type after applying the + operator.
source§

fn add(self, rhs: T) -> <&Column as Add<T>>::Output

Performs the + operation. Read more
source§

impl<T> Add<T> for Column
where T: Num + NumCast,

§

type Output = Result<Column, PolarsError>

The resulting type after applying the + operator.
source§

fn add(self, rhs: T) -> <Column as Add<T>>::Output

Performs the + operation. Read more
source§

impl Add for &Column

§

type Output = Result<Column, PolarsError>

The resulting type after applying the + operator.
source§

fn add(self, rhs: &Column) -> <&Column as Add>::Output

Performs the + operation. Read more
source§

impl Add for Column

§

type Output = Result<Column, PolarsError>

The resulting type after applying the + operator.
source§

fn add(self, rhs: Column) -> <Column as Add>::Output

Performs the + operation. Read more
source§

impl BitAnd for &Column

§

type Output = Result<Column, PolarsError>

The resulting type after applying the & operator.
source§

fn bitand(self, rhs: &Column) -> <&Column as BitAnd>::Output

Performs the & operation. Read more
source§

impl BitAnd for Column

§

type Output = Result<Column, PolarsError>

The resulting type after applying the & operator.
source§

fn bitand(self, rhs: Column) -> <Column as BitAnd>::Output

Performs the & operation. Read more
source§

impl BitOr for &Column

§

type Output = Result<Column, PolarsError>

The resulting type after applying the | operator.
source§

fn bitor(self, rhs: &Column) -> <&Column as BitOr>::Output

Performs the | operation. Read more
source§

impl BitOr for Column

§

type Output = Result<Column, PolarsError>

The resulting type after applying the | operator.
source§

fn bitor(self, rhs: Column) -> <Column as BitOr>::Output

Performs the | operation. Read more
source§

impl BitXor for &Column

§

type Output = Result<Column, PolarsError>

The resulting type after applying the ^ operator.
source§

fn bitxor(self, rhs: &Column) -> <&Column as BitXor>::Output

Performs the ^ operation. Read more
source§

impl BitXor for Column

§

type Output = Result<Column, PolarsError>

The resulting type after applying the ^ operator.
source§

fn bitxor(self, rhs: Column) -> <Column as BitXor>::Output

Performs the ^ operation. Read more
source§

impl ChunkCompare<&Column> for Column

source§

fn equal(&self, rhs: &Column) -> Result<ChunkedArray<BooleanType>, PolarsError>

Create a boolean mask by checking for equality.

source§

fn equal_missing( &self, rhs: &Column, ) -> Result<ChunkedArray<BooleanType>, PolarsError>

Create a boolean mask by checking for equality.

source§

fn not_equal( &self, rhs: &Column, ) -> Result<ChunkedArray<BooleanType>, PolarsError>

Create a boolean mask by checking for inequality.

source§

fn not_equal_missing( &self, rhs: &Column, ) -> Result<ChunkedArray<BooleanType>, PolarsError>

Create a boolean mask by checking for inequality.

source§

fn gt(&self, rhs: &Column) -> Result<ChunkedArray<BooleanType>, PolarsError>

Create a boolean mask by checking if self > rhs.

source§

fn gt_eq(&self, rhs: &Column) -> Result<ChunkedArray<BooleanType>, PolarsError>

Create a boolean mask by checking if self >= rhs.

source§

fn lt(&self, rhs: &Column) -> Result<ChunkedArray<BooleanType>, PolarsError>

Create a boolean mask by checking if self < rhs.

source§

fn lt_eq(&self, rhs: &Column) -> Result<ChunkedArray<BooleanType>, PolarsError>

Create a boolean mask by checking if self <= rhs.

§

type Item = Result<ChunkedArray<BooleanType>, PolarsError>

source§

impl Clone for Column

source§

fn clone(&self) -> Column

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 Debug for Column

source§

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

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

impl Default for Column

source§

fn default() -> Column

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

impl<T> Div<T> for &Column
where T: Num + NumCast,

§

type Output = Result<Column, PolarsError>

The resulting type after applying the / operator.
source§

fn div(self, rhs: T) -> <&Column as Div<T>>::Output

Performs the / operation. Read more
source§

impl<T> Div<T> for Column
where T: Num + NumCast,

§

type Output = Result<Column, PolarsError>

The resulting type after applying the / operator.
source§

fn div(self, rhs: T) -> <Column as Div<T>>::Output

Performs the / operation. Read more
source§

impl Div for &Column

§

type Output = Result<Column, PolarsError>

The resulting type after applying the / operator.
source§

fn div(self, rhs: &Column) -> <&Column as Div>::Output

Performs the / operation. Read more
source§

impl Div for Column

§

type Output = Result<Column, PolarsError>

The resulting type after applying the / operator.
source§

fn div(self, rhs: Column) -> <Column as Div>::Output

Performs the / operation. Read more
source§

impl From<ScalarColumn> for Column

source§

fn from(value: ScalarColumn) -> Column

Converts to this type from the input type.
source§

impl From<Series> for Column

source§

fn from(series: Series) -> Column

Converts to this type from the input type.
source§

impl FromIterator<Column> for DataFrame

source§

fn from_iter<T>(iter: T) -> DataFrame
where T: IntoIterator<Item = Column>,

§Panics

Panics if Column have different lengths.

source§

impl IntoColumn for Column

source§

impl<T> Mul<T> for &Column
where T: Num + NumCast,

§

type Output = Result<Column, PolarsError>

The resulting type after applying the * operator.
source§

fn mul(self, rhs: T) -> <&Column as Mul<T>>::Output

Performs the * operation. Read more
source§

impl<T> Mul<T> for Column
where T: Num + NumCast,

§

type Output = Result<Column, PolarsError>

The resulting type after applying the * operator.
source§

fn mul(self, rhs: T) -> <Column as Mul<T>>::Output

Performs the * operation. Read more
source§

impl Mul for &Column

§

type Output = Result<Column, PolarsError>

The resulting type after applying the * operator.
source§

fn mul(self, rhs: &Column) -> <&Column as Mul>::Output

Performs the * operation. Read more
source§

impl Mul for Column

§

type Output = Result<Column, PolarsError>

The resulting type after applying the * operator.
source§

fn mul(self, rhs: Column) -> <Column as Mul>::Output

Performs the * operation. Read more
source§

impl PartialEq for Column

source§

fn eq(&self, other: &Column) -> 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<T> Rem<T> for &Column
where T: Num + NumCast,

§

type Output = Result<Column, PolarsError>

The resulting type after applying the % operator.
source§

fn rem(self, rhs: T) -> <&Column as Rem<T>>::Output

Performs the % operation. Read more
source§

impl<T> Rem<T> for Column
where T: Num + NumCast,

§

type Output = Result<Column, PolarsError>

The resulting type after applying the % operator.
source§

fn rem(self, rhs: T) -> <Column as Rem<T>>::Output

Performs the % operation. Read more
source§

impl Rem for &Column

§

type Output = Result<Column, PolarsError>

The resulting type after applying the % operator.
source§

fn rem(self, rhs: &Column) -> <&Column as Rem>::Output

Performs the % operation. Read more
source§

impl Rem for Column

§

type Output = Result<Column, PolarsError>

The resulting type after applying the % operator.
source§

fn rem(self, rhs: Column) -> <Column as Rem>::Output

Performs the % operation. Read more
source§

impl<T> Sub<T> for &Column
where T: Num + NumCast,

§

type Output = Result<Column, PolarsError>

The resulting type after applying the - operator.
source§

fn sub(self, rhs: T) -> <&Column as Sub<T>>::Output

Performs the - operation. Read more
source§

impl<T> Sub<T> for Column
where T: Num + NumCast,

§

type Output = Result<Column, PolarsError>

The resulting type after applying the - operator.
source§

fn sub(self, rhs: T) -> <Column as Sub<T>>::Output

Performs the - operation. Read more
source§

impl Sub for &Column

§

type Output = Result<Column, PolarsError>

The resulting type after applying the - operator.
source§

fn sub(self, rhs: &Column) -> <&Column as Sub>::Output

Performs the - operation. Read more
source§

impl Sub for Column

§

type Output = Result<Column, PolarsError>

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Column) -> <Column as Sub>::Output

Performs the - operation. Read more

Auto Trait Implementations§

§

impl !Freeze for Column

§

impl !RefUnwindSafe for Column

§

impl Send for Column

§

impl Sync for Column

§

impl Unpin for Column

§

impl !UnwindSafe for Column

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, dst: *mut T)

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

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

source§

fn __clone_box(&self, _: Private) -> *mut ()

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> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
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, 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

source§

impl<T, Rhs, Output> NumOps<Rhs, Output> for T
where T: Sub<Rhs, Output = Output> + Mul<Rhs, Output = Output> + Div<Rhs, Output = Output> + Add<Rhs, Output = Output> + Rem<Rhs, Output = Output>,