use core::cmp::Ord;
use core::hash::{BuildHasher, Hash};
use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet, VecDeque};
#[macro_export]
macro_rules! map {
{ $first_key:expr => $first_value:expr $(, $key:expr => $value:expr)* $(,)? } => {{
let capacity = $crate::__private_count!($first_key $($key)*);
let mut map = <_ as $crate::Map1Plus<_, _, _>>::from_1(
$first_key, $first_value, capacity
);
$(
let _ = <_ as $crate::Map1Plus<_, _, _>>::insert(&mut map, $key, $value);
)*
map
}};
{} => { <_ as $crate::Map0<_, _, _>>::empty() };
}
#[macro_export]
macro_rules! seq {
[$first:expr $(, $value:expr)* $(,)?] => {{
let capacity = $crate::__private_count!(1 $($value)*);
let mut seq = <_ as $crate::Seq1Plus<_, _>>::from_1($first, capacity);
$(
// Use NonEmptySeq::add which must be implemented for all Seq types
// (including those that are naturally non-empty).
<_ as $crate::Seq1Plus<_, _>>::insert(&mut seq, $value);
)*
seq
}};
[] => { <_ as $crate::Seq0<_, _>>::empty() };
[$value:expr; $amount:expr] => { <_ as $crate::Seq<_, _>>::from_n($value, $amount) };
}
pub trait Seq0<BypassOrphanRule, T> {
fn empty() -> Self;
}
pub trait Seq1Plus<BypassOrphanRule, T> {
fn from_1(element: T, capacity: usize) -> Self;
fn insert(&mut self, element: T);
}
pub trait Map0<BypassOrphanRule, K, V> {
fn empty() -> Self;
}
pub trait Map1Plus<BypassOrphanRule, K, V> {
fn from_1(key: K, value: V, capacity: usize) -> Self;
fn insert(&mut self, key: K, value: V) -> Option<V>;
}
impl<T> Seq0<(), T> for std::vec::Vec<T> {
fn empty() -> Self {
std::vec::Vec::<T>::new()
}
}
#[doc(hidden)]
pub trait Seq<BypassOrphanRule, T> {
fn from_n(value: T, n: usize) -> Self;
}
impl<BypassOrphanRule, T: Clone, S: Seq0<BypassOrphanRule, T> + Seq1Plus<BypassOrphanRule, T>>
Seq<BypassOrphanRule, T> for S
{
fn from_n(value: T, n: usize) -> Self {
if n == 0 {
S::empty()
} else {
let mut seq = S::from_1(value.clone(), n);
for _ in 1..n {
seq.insert(value.clone());
}
seq
}
}
}
impl<T> Seq1Plus<(), T> for std::vec::Vec<T> {
fn from_1(first: T, capacity: usize) -> Self {
let mut vec = std::vec::Vec::with_capacity(capacity);
vec.push(first);
vec
}
fn insert(&mut self, value: T) {
self.push(value);
}
}
impl<T> Seq0<(), T> for VecDeque<T> {
fn empty() -> Self {
VecDeque::<T>::new()
}
}
impl<T> Seq1Plus<(), T> for VecDeque<T> {
fn from_1(first: T, capacity: usize) -> Self {
let mut deque = VecDeque::with_capacity(capacity);
deque.push_back(first);
deque
}
fn insert(&mut self, value: T) {
self.push_back(value);
}
}
impl<T: Hash + Eq, S: Default + BuildHasher> Seq0<(), T> for HashSet<T, S> {
fn empty() -> Self {
HashSet::<T, S>::with_hasher(S::default())
}
}
impl<T: Hash + Eq, S: Default + BuildHasher> Seq1Plus<(), T> for HashSet<T, S> {
fn from_1(first: T, capacity: usize) -> Self {
let mut hashset = HashSet::with_capacity_and_hasher(capacity, S::default());
hashset.insert(first);
hashset
}
fn insert(&mut self, value: T) {
self.insert(value);
}
}
impl<T: Ord> Seq0<(), T> for BTreeSet<T> {
fn empty() -> Self {
BTreeSet::<T>::new()
}
}
impl<T: Ord> Seq1Plus<(), T> for BTreeSet<T> {
fn from_1(first: T, _capacity: usize) -> Self {
BTreeSet::from_iter([first])
}
fn insert(&mut self, value: T) {
self.insert(value);
}
}
impl<K: Hash + Eq, V, S: Default + BuildHasher> Map0<(), K, V> for HashMap<K, V, S> {
fn empty() -> Self {
HashMap::<K, V, S>::with_hasher(S::default())
}
}
impl<K: Hash + Eq, V, S: Default + BuildHasher> Map1Plus<(), K, V> for HashMap<K, V, S> {
fn from_1(first_key: K, first_value: V, capacity: usize) -> Self {
let mut map = HashMap::<K, V, S>::with_capacity_and_hasher(capacity, S::default());
map.insert(first_key, first_value);
map
}
fn insert(&mut self, key: K, value: V) -> Option<V> {
self.insert(key, value)
}
}
impl<K: Ord, V> Map0<(), K, V> for BTreeMap<K, V> {
fn empty() -> Self {
BTreeMap::<K, V>::new()
}
}
impl<K: Ord, V> Map1Plus<(), K, V> for BTreeMap<K, V> {
fn from_1(first_key: K, first_value: V, _capacity: usize) -> Self {
BTreeMap::<K, V>::from_iter([(first_key, first_value)])
}
fn insert(&mut self, key: K, value: V) -> Option<V> {
self.insert(key, value)
}
}
#[doc(hidden)]
#[macro_export]
macro_rules! __private_count {
() => { 0 };
($odd:tt $($a:tt $b:tt)*) => { ($crate::__private_count!($($a)*) << 1) | 1 };
($($a:tt $even:tt)*) => { $crate::__private_count!($($a)*) << 1 };
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_private_count() {
assert_eq!(__private_count!(), 0);
assert_eq!(__private_count!(a), 1);
assert_eq!(__private_count!(a b c d e), 5,);
assert_eq!(__private_count!(1 2 3 4 5 6 7 8), 8,);
}
#[test]
fn map_infer_non_empty() {
let map: HashMap<i32, &'static str> = map! { 1 => "one", 2 => "two" };
assert_eq!(map.len(), 2);
assert_eq!(map.get(&1), Some(&"one"));
}
#[test]
fn map_infer_non_empty_trailing_comma() {
let map: HashMap<char, i32> = map! { 'a' => 1, 'b' => 2, };
assert_eq!(map.len(), 2);
}
#[test]
fn map_infer_empty() {
let map: HashMap<i32, i32> = map! {};
assert!(map.is_empty());
}
#[test]
fn map_explicit_non_empty_btreemap() {
let map: BTreeMap<&str, i32> = map! { "a" => 1, "b" => 2, "c" => 3 };
assert_eq!(map.len(), 3);
assert!(map.contains_key("b"));
}
#[test]
fn map_explicit_non_empty_hashmap() {
let map: HashMap<i32, i32> = map! { 1 => 10, 2 => 20 };
assert_eq!(map.len(), 2);
assert_eq!(map.get(&2), Some(&20));
}
#[test]
fn map_explicit_empty() {
let map: BTreeMap<u8, bool> = map! {};
assert!(map.is_empty());
}
#[test]
fn seq_infer_non_empty() {
let seq: Vec<_> = seq![10, 20, 30];
assert_eq!(seq, vec![10, 20, 30]);
}
#[test]
fn seq_infer_non_empty_trailing_comma() {
let seq: Vec<_> = seq!["a", "b",];
assert_eq!(seq, vec!["a", "b"]);
}
#[test]
fn seq_infer_empty() {
let seq: Vec<&str> = seq![];
assert!(seq.is_empty());
}
#[test]
fn seq_infer_repeat() {
let seq: Vec<i32> = seq![5; 3];
assert_eq!(seq, vec![5, 5, 5]);
}
#[test]
fn seq_explicit_non_empty_vec() {
let seq: Vec<f64> = seq![1.1, 2.2];
assert_eq!(seq.len(), 2);
}
#[test]
fn seq_explicit_non_empty_btreeset() {
let set: BTreeSet<i32> = seq![5, 1, 3];
assert_eq!(set.len(), 3);
assert_eq!(set.into_iter().collect::<Vec<_>>(), vec![1, 3, 5]);
}
#[test]
fn seq_explicit_non_empty_hashset() {
let set: HashSet<i32> = seq![5, 1, 5];
assert_eq!(set.len(), 2);
assert!(set.contains(&1));
}
#[test]
fn seq_explicit_non_empty_vecdeque() {
let deque: VecDeque<i32> = seq![1, 2, 3];
assert_eq!(deque.front(), Some(&1));
}
#[test]
fn seq_explicit_empty() {
let seq: BTreeSet<u8> = seq![];
assert!(seq.is_empty());
}
#[test]
fn seq_explicit_repeat_non_empty() {
let seq: VecDeque<char> = seq!['x'; 2];
assert_eq!(seq, VecDeque::from(vec!['x', 'x']));
}
#[test]
fn seq_explicit_repeat_empty() {
let seq: Vec<i32> = seq![10; 0];
assert!(seq.is_empty());
}
}