use frame_support::traits::Get;
use parity_scale_codec::{Decode, Encode};
use scale_info::TypeInfo;
#[cfg(feature = "std")]
use serde::{Deserialize, Serialize};
use sp_runtime::{BoundedVec, RuntimeDebug};
use sp_std::prelude::*;
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
#[derive(RuntimeDebug, PartialEq, Eq, Encode, Decode, Default, Clone, TypeInfo)]
pub struct OrderedSet<T>(pub Vec<T>);
impl<T: Ord> OrderedSet<T> {
pub fn new() -> Self {
Self(Vec::new())
}
pub fn from(mut v: Vec<T>) -> Self {
v.sort();
v.dedup();
Self::from_sorted_set(v)
}
pub fn from_sorted_set(v: Vec<T>) -> Self {
Self(v)
}
pub fn insert(&mut self, value: T) -> bool {
match self.0.binary_search(&value) {
Ok(_) => false,
Err(loc) => {
self.0.insert(loc, value);
true
}
}
}
pub fn remove(&mut self, value: &T) -> bool {
match self.0.binary_search(value) {
Ok(loc) => {
self.0.remove(loc);
true
}
Err(_) => false,
}
}
pub fn contains(&self, value: &T) -> bool {
self.0.binary_search(value).is_ok()
}
pub fn clear(&mut self) {
self.0.clear();
}
}
impl<T: Ord> From<Vec<T>> for OrderedSet<T> {
fn from(v: Vec<T>) -> Self {
Self::from(v)
}
}
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
#[derive(RuntimeDebug, PartialEq, Eq, Encode, Decode, Clone, TypeInfo)]
#[scale_info(skip_type_params(S))]
pub struct BoundedOrderedSet<T, S: Get<u32>>(pub BoundedVec<T, S>);
impl<T, S: Get<u32>> sp_std::default::Default for BoundedOrderedSet<T, S> {
fn default() -> Self {
BoundedOrderedSet(BoundedVec::default())
}
}
impl<T: Ord, S: Get<u32>> BoundedOrderedSet<T, S> {
pub fn new() -> Self {
Self(BoundedVec::default())
}
pub fn from(mut v: BoundedVec<T, S>) -> Self {
v.sort();
let v = v.try_mutate(|inner| inner.dedup()).expect(
"input is a valid BoundedVec and deduping can only reduce the number of entires; qed",
);
Self::from_sorted_set(v)
}
pub fn from_sorted_set(v: BoundedVec<T, S>) -> Self {
Self(v)
}
pub fn try_insert(&mut self, value: T) -> Result<bool, ()> {
match self.0.binary_search(&value) {
Ok(_) => Ok(false),
Err(loc) => self.0.try_insert(loc, value).map(|_| true).map_err(|_| ()),
}
}
pub fn remove(&mut self, value: &T) -> bool {
match self.0.binary_search(value) {
Ok(loc) => {
self.0.remove(loc);
true
}
Err(_) => false,
}
}
pub fn contains(&self, value: &T) -> bool {
self.0.binary_search(value).is_ok()
}
pub fn clear(mut self) {
let v = self.0.try_mutate(|inner| inner.clear()).expect(
"input is a valid BoundedVec and clearing can only reduce the number of entires; qed",
);
self.0 = v;
}
}
impl<T: Ord, S: Get<u32>> From<BoundedVec<T, S>> for BoundedOrderedSet<T, S> {
fn from(v: BoundedVec<T, S>) -> Self {
Self::from(v)
}
}