# Decisions

Design decisions to this project will be documented in this file.

## Give up maximum efficiency about shift assignment operator.

### Context 

If `R` of `RangeWrapper<R, T>` is `core::ops::RangeInclusive`,
we can't implement `<<=` and `>>=` with maximum efficiency.

Because it requires `T` to implements `SubAssign` or `AddAssign`.
And then, `SubAssign` and `AddAssign` requires access to `&mut T`. 
Here, unlike other range types, `RangeInclusive` does not have public
bounds fields. Therefore mutable references cannot be obtained from them.

### Options

- Give up for maximum efficiency
- Exclude `RangeInclusive` from the operation

### Decision

Choose 1st option. Because 2nd option would become an unexpected API
for many users. Additionally, the difference in efficiency is small.
(For simplicity, `RangeUniv<T>` is also implement in the same style.)
