rune/modules/collections/
vec_deque.rs

1use core::cmp::Ordering;
2use core::iter;
3
4use crate as rune;
5use crate::alloc;
6use crate::alloc::fmt::TryWrite;
7use crate::alloc::prelude::*;
8use crate::runtime::{
9    EnvProtocolCaller, Formatter, Iterator, Protocol, ProtocolCaller, RawAnyGuard, Ref, Value, Vec,
10    VmErrorKind, VmResult,
11};
12use crate::{Any, ContextError, Module};
13
14/// A dynamic vec deque.
15#[rune::module(::std::collections::vec_deque)]
16pub fn module() -> Result<Module, ContextError> {
17    let mut m = Module::from_meta(self::module_meta)?;
18
19    m.ty::<VecDeque>()?;
20
21    m.function_meta(VecDeque::new)?;
22    m.function_meta(VecDeque::with_capacity__meta)?;
23    m.function_meta(from)?;
24
25    m.function_meta(VecDeque::extend)?;
26    m.function_meta(VecDeque::insert)?;
27    m.function_meta(VecDeque::iter__meta)?;
28    m.function_meta(VecDeque::into_iter__meta)?;
29    m.function_meta(VecDeque::from_iter__meta)?;
30    m.function_meta(VecDeque::reserve)?;
31    m.function_meta(VecDeque::len)?;
32    m.function_meta(VecDeque::capacity)?;
33    m.function_meta(VecDeque::front)?;
34    m.function_meta(VecDeque::back)?;
35    m.function_meta(VecDeque::push_back__meta)?;
36    m.function_meta(VecDeque::push_front)?;
37    m.function_meta(VecDeque::pop_front)?;
38    m.function_meta(VecDeque::pop_back)?;
39    m.function_meta(VecDeque::remove)?;
40    m.function_meta(VecDeque::rotate_left)?;
41    m.function_meta(VecDeque::rotate_right)?;
42
43    m.associated_function(&Protocol::INDEX_GET, VecDeque::get)?;
44    m.associated_function(&Protocol::INDEX_SET, VecDeque::set)?;
45
46    m.function_meta(VecDeque::debug_fmt)?;
47
48    m.function_meta(VecDeque::partial_eq__meta)?;
49    m.implement_trait::<VecDeque>(rune::item!(::std::cmp::PartialEq))?;
50
51    m.function_meta(VecDeque::eq__meta)?;
52    m.implement_trait::<VecDeque>(rune::item!(::std::cmp::Eq))?;
53
54    m.function_meta(VecDeque::partial_cmp__meta)?;
55    m.implement_trait::<VecDeque>(rune::item!(::std::cmp::PartialOrd))?;
56
57    m.function_meta(VecDeque::cmp__meta)?;
58    m.implement_trait::<VecDeque>(rune::item!(::std::cmp::Ord))?;
59
60    m.ty::<Iter>()?;
61    m.function_meta(Iter::next__meta)?;
62    m.function_meta(Iter::size_hint__meta)?;
63    m.implement_trait::<Iter>(rune::item!(::std::iter::Iterator))?;
64
65    m.function_meta(Iter::next_back__meta)?;
66    m.implement_trait::<Iter>(rune::item!(::std::iter::DoubleEndedIterator))?;
67
68    m.function_meta(Iter::len__meta)?;
69    m.implement_trait::<Iter>(rune::item!(::std::iter::ExactSizeIterator))?;
70
71    Ok(m)
72}
73
74/// A double-ended queue implemented with a growable ring buffer.
75///
76/// The "default" usage of this type as a queue is to use [`push_back`] to add
77/// to the queue, and [`pop_front`] to remove from the queue. [`extend`] and
78/// [`append`] push onto the back in this manner, and iterating over `VecDeque`
79/// goes front to back.
80///
81/// A `VecDeque` with a known list of items can be initialized from an array:
82///
83/// ```rune
84/// use std::collections::VecDeque;
85///
86/// let deq = VecDeque::from::<Vec>([-1, 0, 1]);
87/// ```
88///
89/// [`push_back`]: VecDeque::push_back
90/// [`pop_front`]: VecDeque::pop_front
91/// [`extend`]: VecDeque::extend
92/// [`append`]: VecDeque::append
93#[derive(Any, Default)]
94#[rune(module = crate, item = ::std::collections::vec_deque)]
95pub(crate) struct VecDeque {
96    inner: alloc::VecDeque<Value>,
97}
98
99impl VecDeque {
100    /// Creates an empty deque.
101    ///
102    /// # Examples
103    ///
104    /// ```rune
105    /// use std::collections::VecDeque;
106    ///
107    /// let deque = VecDeque::new();
108    /// ```
109    #[rune::function(path = Self::new)]
110    fn new() -> VecDeque {
111        Self {
112            inner: alloc::VecDeque::new(),
113        }
114    }
115
116    /// Creates an empty deque with space for at least `capacity` elements.
117    ///
118    /// # Examples
119    ///
120    /// ```rune
121    /// use std::collections::VecDeque;
122    ///
123    /// let deque = VecDeque::with_capacity(10);
124    /// assert!(deque.capacity() >= 10);
125    /// ```
126    #[rune::function(keep, path = Self::with_capacity)]
127    pub(crate) fn with_capacity(count: usize) -> VmResult<VecDeque> {
128        VmResult::Ok(Self {
129            inner: vm_try!(alloc::VecDeque::try_with_capacity(count)),
130        })
131    }
132
133    /// Extend this VecDeque with something that implements the [`INTO_ITER`]
134    /// protocol.
135    ///
136    /// # Examples
137    ///
138    /// ```rune
139    /// use std::collections::VecDeque;
140    ///
141    /// let deque = VecDeque::new();
142    /// deque.extend([1, 2, 3]);
143    ///
144    /// assert_eq!(Some(1), deque.pop_front());
145    /// assert_eq!(Some(3), deque.pop_back());
146    /// ```
147    #[rune::function]
148    pub fn extend(&mut self, value: Value) -> VmResult<()> {
149        let mut it = vm_try!(value.into_iter());
150
151        while let Some(value) = vm_try!(it.next()) {
152            vm_try!(self.inner.try_push_back(value));
153        }
154
155        VmResult::Ok(())
156    }
157
158    /// Provides a reference to the front element, or `None` if the deque is
159    /// empty.
160    ///
161    /// # Examples
162    ///
163    /// ```rune
164    /// use std::collections::VecDeque;
165    ///
166    /// let d = VecDeque::new();
167    /// assert_eq!(d.front(), None);
168    ///
169    /// d.push_back(1);
170    /// d.push_back(2);
171    /// assert_eq!(d.front(), Some(1));
172    /// ```
173    #[rune::function]
174    fn front(&mut self) -> Option<Value> {
175        self.inner.front().cloned()
176    }
177
178    /// Provides a reference to the back element, or `None` if the deque is
179    /// empty.
180    ///
181    /// # Examples
182    ///
183    /// ```rune
184    /// use std::collections::VecDeque;
185    ///
186    /// let d = VecDeque::new();
187    /// assert_eq!(d.back(), None);
188    ///
189    /// d.push_back(1);
190    /// d.push_back(2);
191    /// assert_eq!(d.back(), Some(2));
192    /// ```
193    #[rune::function]
194    pub fn back(&self) -> Option<Value> {
195        self.inner.back().cloned()
196    }
197
198    /// Appends an element to the back of the deque.
199    ///
200    /// # Examples
201    ///
202    /// ```rune
203    /// use std::collections::VecDeque;
204    ///
205    /// let buf = VecDeque::new();
206    /// buf.push_back(1);
207    /// buf.push_back(3);
208    /// assert_eq!(Some(3), buf.back());
209    /// ```
210    #[rune::function(keep)]
211    pub(crate) fn push_back(&mut self, value: Value) -> VmResult<()> {
212        vm_try!(self.inner.try_push_back(value));
213        VmResult::Ok(())
214    }
215
216    /// Prepends an element to the deque.
217    ///
218    /// # Examples
219    ///
220    /// ```rune
221    /// use std::collections::VecDeque;
222    ///
223    /// let d = VecDeque::new();
224    /// d.push_front(1);
225    /// d.push_front(2);
226    /// assert_eq!(d.front(), Some(2));
227    /// ```
228    #[rune::function]
229    fn push_front(&mut self, value: Value) -> VmResult<()> {
230        vm_try!(self.inner.try_push_front(value));
231        VmResult::Ok(())
232    }
233
234    /// Removes the first element and returns it, or `None` if the deque is
235    /// empty.
236    ///
237    /// # Examples
238    ///
239    /// ```rune
240    /// use std::collections::VecDeque;
241    ///
242    /// let d = VecDeque::new();
243    /// d.push_back(1);
244    /// d.push_back(2);
245    ///
246    /// assert_eq!(d.pop_front(), Some(1));
247    /// assert_eq!(d.pop_front(), Some(2));
248    /// assert_eq!(d.pop_front(), None);
249    /// ```
250    #[rune::function]
251    fn pop_front(&mut self) -> Option<Value> {
252        self.inner.pop_front()
253    }
254
255    /// Removes the last element from the deque and returns it, or `None` if it
256    /// is empty.
257    ///
258    /// # Examples
259    ///
260    /// ```rune
261    /// use std::collections::VecDeque;
262    ///
263    /// let buf = VecDeque::new();
264    /// assert_eq!(buf.pop_back(), None);
265    /// buf.push_back(1);
266    /// buf.push_back(3);
267    /// assert_eq!(buf.pop_back(), Some(3));
268    /// ```
269    #[rune::function]
270    fn pop_back(&mut self) -> Option<Value> {
271        self.inner.pop_back()
272    }
273
274    /// Reserves capacity for at least `additional` more elements to be inserted
275    /// in the given deque. The collection may reserve more space to
276    /// speculatively avoid frequent reallocations.
277    ///
278    /// # Panics
279    ///
280    /// Panics if the new capacity overflows `usize`.
281    ///
282    /// # Examples
283    ///
284    /// ```rune
285    /// use std::collections::VecDeque;
286    ///
287    /// let buf = VecDeque::from::<Vec>([1]);
288    /// buf.reserve(10);
289    /// assert!(buf.capacity() >= 11);
290    /// ```
291    #[rune::function]
292    fn reserve(&mut self, index: usize) -> VmResult<()> {
293        vm_try!(self.inner.try_reserve(index));
294        VmResult::Ok(())
295    }
296
297    /// Returns the number of elements in the deque.
298    ///
299    /// # Examples
300    ///
301    /// ```rune
302    /// use std::collections::VecDeque;
303    ///
304    /// let deque = VecDeque::new();
305    /// assert_eq!(deque.len(), 0);
306    /// deque.push_back(1);
307    /// assert_eq!(deque.len(), 1);
308    /// ```
309    #[rune::function]
310    fn len(&self) -> usize {
311        self.inner.len()
312    }
313
314    /// Returns the number of elements the deque can hold without reallocating.
315    ///
316    /// # Examples
317    ///
318    /// ```rune
319    /// use std::collections::VecDeque;
320    ///
321    /// let buf = VecDeque::with_capacity(10);
322    /// assert!(buf.capacity() >= 10);
323    /// ```
324    #[rune::function]
325    fn capacity(&mut self) -> usize {
326        self.inner.capacity()
327    }
328
329    /// Inserts an element at `index` within the deque, shifting all elements
330    /// with indices greater than or equal to `index` towards the back.
331    ///
332    /// Element at index 0 is the front of the queue.
333    ///
334    /// # Panics
335    ///
336    /// Panics if `index` is greater than deque's length
337    ///
338    /// # Examples
339    ///
340    /// ```rune
341    /// use std::collections::VecDeque;
342    ///
343    /// let buf = VecDeque::new();
344    /// buf.push_back('a');
345    /// buf.push_back('b');
346    /// buf.push_back('c');
347    /// assert_eq!(buf, ['a', 'b', 'c']);
348    ///
349    /// buf.insert(1, 'd');
350    /// assert_eq!(buf, ['a', 'd', 'b', 'c']);
351    /// ```
352    #[rune::function]
353    fn insert(&mut self, index: usize, value: Value) -> VmResult<()> {
354        if index > self.inner.len() {
355            return VmResult::err(VmErrorKind::OutOfRange {
356                index: index.into(),
357                length: self.inner.len().into(),
358            });
359        }
360
361        vm_try!(self.inner.try_insert(index, value));
362        VmResult::Ok(())
363    }
364
365    /// Removes and returns the element at `index` from the deque.
366    /// Whichever end is closer to the removal point will be moved to make
367    /// room, and all the affected elements will be moved to new positions.
368    /// Returns `None` if `index` is out of bounds.
369    ///
370    /// Element at index 0 is the front of the queue.
371    ///
372    /// # Examples
373    ///
374    /// ```rune
375    /// use std::collections::VecDeque;
376    ///
377    /// let buf = VecDeque::new();
378    /// buf.push_back(1);
379    /// buf.push_back(2);
380    /// buf.push_back(3);
381    /// assert_eq!(buf, [1, 2, 3]);
382    ///
383    /// assert_eq!(buf.remove(1), Some(2));
384    /// assert_eq!(buf, [1, 3]);
385    /// ```
386    #[rune::function]
387    fn remove(&mut self, index: usize) -> Option<Value> {
388        self.inner.remove(index)
389    }
390
391    /// Rotates the double-ended queue `mid` places to the left.
392    ///
393    /// Equivalently,
394    /// - Rotates item `mid` into the first position.
395    /// - Pops the first `mid` items and pushes them to the end.
396    /// - Rotates `len() - mid` places to the right.
397    ///
398    /// # Panics
399    ///
400    /// If `mid` is greater than `len()`. Note that `mid == len()` does _not_
401    /// panic and is a no-op rotation.
402    ///
403    /// # Complexity
404    ///
405    /// Takes `*O*(min(mid, len() - mid))` time and no extra space.
406    ///
407    /// # Examples
408    ///
409    /// ```rune
410    /// use std::collections::VecDeque;
411    ///
412    /// let buf = (0..10).iter().collect::<VecDeque>();
413    ///
414    /// buf.rotate_left(3);
415    /// assert_eq!(buf, [3, 4, 5, 6, 7, 8, 9, 0, 1, 2]);
416    ///
417    /// for i in 1..10 {
418    ///     assert_eq!(i * 3 % 10, buf[0]);
419    ///     buf.rotate_left(3);
420    /// }
421    ///
422    /// assert_eq!(buf, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
423    /// ```
424    #[rune::function]
425    fn rotate_left(&mut self, mid: usize) -> VmResult<()> {
426        if mid > self.inner.len() {
427            return VmResult::err(VmErrorKind::OutOfRange {
428                index: mid.into(),
429                length: self.inner.len().into(),
430            });
431        }
432
433        self.inner.rotate_left(mid);
434        VmResult::Ok(())
435    }
436
437    /// Rotates the double-ended queue `k` places to the right.
438    ///
439    /// Equivalently,
440    /// - Rotates the first item into position `k`.
441    /// - Pops the last `k` items and pushes them to the front.
442    /// - Rotates `len() - k` places to the left.
443    ///
444    /// # Panics
445    ///
446    /// If `k` is greater than `len()`. Note that `k == len()` does _not_ panic
447    /// and is a no-op rotation.
448    ///
449    /// # Complexity
450    ///
451    /// Takes `*O*(min(k, len() - k))` time and no extra space.
452    ///
453    /// # Examples
454    ///
455    /// ```rune
456    /// use std::collections::VecDeque;
457    ///
458    /// let buf = (0..10).iter().collect::<VecDeque>();
459    ///
460    /// buf.rotate_right(3);
461    /// assert_eq!(buf, [7, 8, 9, 0, 1, 2, 3, 4, 5, 6]);
462    ///
463    /// for i in 1..10 {
464    ///     assert_eq!(0, buf[i * 3 % 10]);
465    ///     buf.rotate_right(3);
466    /// }
467    ///
468    /// assert_eq!(buf, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
469    /// ```
470    #[rune::function]
471    fn rotate_right(&mut self, mid: usize) -> VmResult<()> {
472        if mid > self.inner.len() {
473            return VmResult::err(VmErrorKind::OutOfRange {
474                index: mid.into(),
475                length: self.inner.len().into(),
476            });
477        }
478
479        self.inner.rotate_right(mid);
480        VmResult::Ok(())
481    }
482
483    /// Returns a front-to-back iterator.
484    ///
485    /// # Examples
486    ///
487    /// ```rune
488    /// use std::collections::VecDeque;
489    ///
490    /// let buf = VecDeque::new();
491    /// buf.push_back(5);
492    /// buf.push_back(3);
493    /// buf.push_back(4);
494    ///
495    /// assert_eq!([5, 3, 4], buf.iter());
496    /// assert_eq!([4, 3, 5], buf.iter().rev());
497    /// ```
498    #[inline]
499    #[rune::function(keep, instance, path = Self::iter)]
500    fn iter(this: Ref<Self>) -> Iter {
501        // SAFETY: We're holding onto the reference guard.
502        let iter = unsafe { this.inner.raw_iter() };
503        let (_, guard) = Ref::into_raw(this);
504        Iter { iter, guard }
505    }
506
507    #[rune::function(keep, instance, protocol = INTO_ITER, path = Self)]
508    fn into_iter(this: Ref<Self>) -> Iter {
509        Self::iter(this)
510    }
511
512    /// Build a [`VecDeque`] from an iterator.
513    ///
514    /// The vecdeque can be converted from anything that implements the
515    /// [`INTO_ITER`] protocol.
516    ///
517    /// # Examples
518    ///
519    /// ```rune
520    /// use std::collections::VecDeque;
521    ///
522    /// let deque = VecDeque::from_iter(["a", "b", "c"]);
523    /// assert_eq!(deque.len(), 3);
524    /// assert_eq!(deque.pop_front(), Some("a"));
525    /// assert_eq!(deque.pop_back(), Some("c"));
526    /// assert_eq!(deque.len(), 1);
527    /// ```
528    #[rune::function(keep, path = Self::from_iter)]
529    fn from_iter(mut it: Iterator) -> VmResult<Self> {
530        let (lo, _) = vm_try!(it.size_hint());
531        let mut inner = vm_try!(alloc::VecDeque::try_with_capacity(lo));
532
533        while let Some(value) = vm_try!(it.next()) {
534            vm_try!(inner.try_push_back(value));
535        }
536
537        VmResult::Ok(Self { inner })
538    }
539
540    fn get(&self, index: usize) -> VmResult<Value> {
541        let Some(v) = self.inner.get(index) else {
542            return VmResult::err(VmErrorKind::OutOfRange {
543                index: index.into(),
544                length: self.inner.len().into(),
545            });
546        };
547
548        VmResult::Ok(v.clone())
549    }
550
551    fn set(&mut self, index: usize, value: Value) -> VmResult<()> {
552        let Some(v) = self.inner.get_mut(index) else {
553            return VmResult::err(VmErrorKind::OutOfRange {
554                index: index.into(),
555                length: self.inner.len().into(),
556            });
557        };
558
559        *v = value;
560        VmResult::Ok(())
561    }
562
563    /// Write a debug representation to a string.
564    ///
565    /// This calls the [`DEBUG_FMT`] protocol over all elements of the
566    /// collection.
567    ///
568    /// # Examples
569    ///
570    /// ```rune
571    /// use std::collections::VecDeque;
572    ///
573    /// let deque = VecDeque::from::<Vec>([1, 2, 3]);
574    /// assert_eq!(format!("{:?}", deque), "[1, 2, 3]");
575    /// ```
576    #[rune::function(protocol = DEBUG_FMT)]
577    fn debug_fmt(&self, f: &mut Formatter) -> VmResult<()> {
578        self.debug_fmt_with(f, &mut EnvProtocolCaller)
579    }
580
581    #[inline]
582    fn debug_fmt_with(&self, f: &mut Formatter, caller: &mut dyn ProtocolCaller) -> VmResult<()> {
583        let mut it = self.inner.iter().peekable();
584
585        vm_try!(vm_write!(f, "["));
586
587        while let Some(value) = it.next() {
588            vm_try!(value.debug_fmt_with(f, caller));
589
590            if it.peek().is_some() {
591                vm_try!(vm_write!(f, ", "));
592            }
593        }
594
595        vm_try!(vm_write!(f, "]"));
596        VmResult::Ok(())
597    }
598
599    /// Perform a partial equality check with this deque.
600    ///
601    /// This can take any argument which can be converted into an iterator using
602    /// [`INTO_ITER`].
603    ///
604    /// # Examples
605    ///
606    /// ```rune
607    /// use std::collections::VecDeque;
608    ///
609    /// let deque = VecDeque::from::<Vec>([1, 2, 3]);
610    ///
611    /// assert!(deque == [1, 2, 3]);
612    /// assert!(deque == (1..=3));
613    /// assert!(deque != [2, 3, 4]);
614    /// ```
615    #[rune::function(keep, protocol = PARTIAL_EQ)]
616    fn partial_eq(&self, b: Value) -> VmResult<bool> {
617        self.partial_eq_with(b, &mut EnvProtocolCaller)
618    }
619
620    fn partial_eq_with(&self, b: Value, caller: &mut dyn ProtocolCaller) -> VmResult<bool> {
621        let mut b = vm_try!(b.into_iter_with(caller));
622
623        for a in &self.inner {
624            let Some(b) = vm_try!(b.next()) else {
625                return VmResult::Ok(false);
626            };
627
628            if !vm_try!(Value::partial_eq_with(a, &b, caller)) {
629                return VmResult::Ok(false);
630            }
631        }
632
633        if vm_try!(b.next()).is_some() {
634            return VmResult::Ok(false);
635        }
636
637        VmResult::Ok(true)
638    }
639
640    /// Perform a total equality check with this deque.
641    ///
642    /// # Examples
643    ///
644    /// ```rune
645    /// use std::collections::VecDeque;
646    /// use std::ops::eq;
647    ///
648    /// let deque = VecDeque::from::<Vec>([1, 2, 3]);
649    ///
650    /// assert!(eq(deque, VecDeque::from::<Vec>([1, 2, 3])));
651    /// assert!(!eq(deque, VecDeque::from::<Vec>([2, 3, 4])));
652    /// ```
653    #[rune::function(keep, protocol = EQ)]
654    fn eq(&self, b: &VecDeque) -> VmResult<bool> {
655        self.eq_with(b, &mut EnvProtocolCaller)
656    }
657
658    fn eq_with(&self, b: &VecDeque, caller: &mut dyn ProtocolCaller) -> VmResult<bool> {
659        let mut b = b.inner.iter();
660
661        for a in &self.inner {
662            let Some(b) = b.next() else {
663                return VmResult::Ok(false);
664            };
665
666            if !vm_try!(Value::eq_with(a, b, caller)) {
667                return VmResult::Ok(false);
668            }
669        }
670
671        if b.next().is_some() {
672            return VmResult::Ok(false);
673        }
674
675        VmResult::Ok(true)
676    }
677
678    /// Perform a partial comparison check with this deque.
679    ///
680    /// # Examples
681    ///
682    /// ```rune
683    /// use std::collections::VecDeque;
684    ///
685    /// let deque = VecDeque::from::<Vec>([1, 2, 3]);
686    ///
687    /// assert!(deque > VecDeque::from::<Vec>([0, 2, 3]));
688    /// assert!(deque < VecDeque::from::<Vec>([2, 2, 3]));
689    /// ```
690    #[rune::function(keep, protocol = PARTIAL_CMP)]
691    fn partial_cmp(&self, b: &VecDeque) -> VmResult<Option<Ordering>> {
692        self.partial_cmp_with(b, &mut EnvProtocolCaller)
693    }
694
695    fn partial_cmp_with(
696        &self,
697        b: &VecDeque,
698        caller: &mut dyn ProtocolCaller,
699    ) -> VmResult<Option<Ordering>> {
700        let mut b = b.inner.iter();
701
702        for a in self.inner.iter() {
703            let Some(b) = b.next() else {
704                return VmResult::Ok(Some(Ordering::Greater));
705            };
706
707            match vm_try!(Value::partial_cmp_with(a, b, caller)) {
708                Some(Ordering::Equal) => (),
709                other => return VmResult::Ok(other),
710            }
711        }
712
713        if b.next().is_some() {
714            return VmResult::Ok(Some(Ordering::Less));
715        };
716
717        VmResult::Ok(Some(Ordering::Equal))
718    }
719
720    /// Perform a total comparison check with this deque.
721    ///
722    /// # Examples
723    ///
724    /// ```rune
725    /// use std::collections::VecDeque;
726    /// use std::cmp::Ordering;
727    /// use std::ops::cmp;
728    ///
729    /// let deque = VecDeque::from::<Vec>([1, 2, 3]);
730    ///
731    /// assert_eq!(cmp(deque, VecDeque::from::<Vec>([0, 2, 3])), Ordering::Greater);
732    /// assert_eq!(cmp(deque, VecDeque::from::<Vec>([2, 2, 3])), Ordering::Less);
733    /// ```
734    #[rune::function(keep, protocol = CMP)]
735    fn cmp(&self, b: &VecDeque) -> VmResult<Ordering> {
736        self.cmp_with(b, &mut EnvProtocolCaller)
737    }
738
739    fn cmp_with(&self, other: &VecDeque, caller: &mut dyn ProtocolCaller) -> VmResult<Ordering> {
740        let mut b = other.inner.iter();
741
742        for a in self.inner.iter() {
743            let Some(b) = b.next() else {
744                return VmResult::Ok(Ordering::Greater);
745            };
746
747            match vm_try!(Value::cmp_with(a, b, caller)) {
748                Ordering::Equal => (),
749                other => return VmResult::Ok(other),
750            }
751        }
752
753        if b.next().is_some() {
754            return VmResult::Ok(Ordering::Less);
755        };
756
757        VmResult::Ok(Ordering::Equal)
758    }
759}
760
761impl From<Vec> for VecDeque {
762    fn from(value: Vec) -> Self {
763        Self {
764            inner: alloc::VecDeque::from(value.into_inner()),
765        }
766    }
767}
768
769impl TryClone for VecDeque {
770    #[inline]
771    fn try_clone(&self) -> alloc::Result<Self> {
772        Ok(Self {
773            inner: self.inner.try_clone()?,
774        })
775    }
776
777    #[inline]
778    fn try_clone_from(&mut self, source: &Self) -> alloc::Result<()> {
779        self.inner.try_clone_from(&source.inner)
780    }
781}
782
783/// Construct a [`VecDeque`] from a [`Vec`].
784///
785/// This is a cheap conversion.
786///
787/// # Examples
788///
789/// ```rune
790/// use std::collections::VecDeque;
791///
792/// let buf = VecDeque::from::<Vec>([1, 2, 3]);
793/// ```
794#[rune::function(free, path = VecDeque::from::<Vec>)]
795fn from(vec: Vec) -> VmResult<VecDeque> {
796    VmResult::Ok(VecDeque::from(vec))
797}
798
799#[derive(Any)]
800#[rune(item = ::std::collections::vec_deque)]
801pub(crate) struct Iter {
802    iter: alloc::vec_deque::RawIter<Value>,
803    // Drop must happen after the raw iterator.
804    #[allow(unused)]
805    guard: RawAnyGuard,
806}
807
808impl Iter {
809    #[rune::function(keep, protocol = NEXT)]
810    fn next(&mut self) -> Option<Value> {
811        // SAFETY: We're holding onto the reference guard.
812        unsafe { Some((*self.iter.next()?).clone()) }
813    }
814
815    #[rune::function(keep, protocol = SIZE_HINT)]
816    fn size_hint(self) -> (usize, Option<usize>) {
817        self.iter.size_hint()
818    }
819
820    #[rune::function(keep, protocol = LEN)]
821    fn len(self) -> usize {
822        self.iter.len()
823    }
824
825    #[rune::function(keep, protocol = NEXT_BACK)]
826    fn next_back(&mut self) -> Option<Value> {
827        // SAFETY: We're holding onto the reference guard.
828        unsafe { Some((*self.iter.next_back()?).clone()) }
829    }
830}
831
832impl iter::Iterator for Iter {
833    type Item = Value;
834
835    #[inline]
836    fn next(&mut self) -> Option<Self::Item> {
837        Iter::next(self)
838    }
839}
840
841impl iter::DoubleEndedIterator for Iter {
842    fn next_back(&mut self) -> Option<Self::Item> {
843        Iter::next_back(self)
844    }
845}