use crate::iter::{FusedIterator, TrustedLen}; /// Creates an iterator that yields an element exactly once. /// /// This is commonly used to adapt a single value into a [`chain()`] of other /// kinds of iteration. Maybe you have an iterator that covers almost /// everything, but you need an extra special case. Maybe you have a function /// which works on iterators, but you only need to process one value. /// /// [`chain()`]: Iterator::chain /// /// # Examples /// /// Basic usage: /// /// ``` /// use std::iter; /// /// // one is the loneliest number /// let mut one = iter::once(1); /// /// assert_eq!(Some(1), one.next()); /// /// // just one, that's all we get /// assert_eq!(None, one.next()); /// ``` /// /// Chaining together with another iterator. Let's say that we want to iterate /// over each file of the `.foo` directory, but also a configuration file, /// `.foorc`: /// /// ```no_run /// use std::iter; /// use std::fs; /// use std::path::PathBuf; /// /// let dirs = fs::read_dir(".foo").unwrap(); /// /// // we need to convert from an iterator of DirEntry-s to an iterator of /// // PathBufs, so we use map /// let dirs = dirs.map(|file| file.unwrap().path()); /// /// // now, our iterator just for our config file /// let config = iter::once(PathBuf::from(".foorc")); /// /// // chain the two iterators together into one big iterator /// let files = dirs.chain(config); /// /// // this will give us all of the files in .foo as well as .foorc /// for f in files { /// println!("{f:?}"); /// } /// ``` #[stable(feature = "iter_once", since = "1.2.0")] pub fn once(value: T) -> Once { Once { inner: Some(value).into_iter() } } /// An iterator that yields an element exactly once. /// /// This `struct` is created by the [`once()`] function. See its documentation for more. #[derive(Clone, Debug)] #[stable(feature = "iter_once", since = "1.2.0")] pub struct Once { inner: crate::option::IntoIter, } #[stable(feature = "iter_once", since = "1.2.0")] impl Iterator for Once { type Item = T; fn next(&mut self) -> Option { self.inner.next() } fn size_hint(&self) -> (usize, Option) { self.inner.size_hint() } } #[stable(feature = "iter_once", since = "1.2.0")] impl DoubleEndedIterator for Once { fn next_back(&mut self) -> Option { self.inner.next_back() } } #[stable(feature = "iter_once", since = "1.2.0")] impl ExactSizeIterator for Once { fn len(&self) -> usize { self.inner.len() } } #[unstable(feature = "trusted_len", issue = "37572")] unsafe impl TrustedLen for Once {} #[stable(feature = "fused", since = "1.26.0")] impl FusedIterator for Once {}