@@ -1024,6 +1024,99 @@ impl<T, A: Allocator> LinkedList<T, A> {
10241024 }
10251025 }
10261026
1027+ /// Retains only the elements specified by the predicate.
1028+ ///
1029+ /// In other words, remove all elements `e` for which `f(&e)` returns false.
1030+ /// This method operates in place, visiting each element exactly once in the
1031+ /// original order, and preserves the order of the retained elements.
1032+ ///
1033+ /// # Examples
1034+ ///
1035+ /// ```
1036+ /// #![feature(linked_list_retain)]
1037+ /// use std::collections::LinkedList;
1038+ ///
1039+ /// let mut d = LinkedList::new();
1040+ ///
1041+ /// d.push_front(1);
1042+ /// d.push_front(2);
1043+ /// d.push_front(3);
1044+ ///
1045+ /// d.retain(|&x| x % 2 == 0);
1046+ ///
1047+ /// assert_eq!(d.pop_front(), Some(2));
1048+ /// assert_eq!(d.pop_front(), None);
1049+ /// ```
1050+ ///
1051+ /// Because the elements are visited exactly once in the original order,
1052+ /// external state may be used to decide which elements to keep.
1053+ ///
1054+ /// ```
1055+ /// #![feature(linked_list_retain)]
1056+ /// use std::collections::LinkedList;
1057+ ///
1058+ /// let mut d = LinkedList::new();
1059+ ///
1060+ /// d.push_front(1);
1061+ /// d.push_front(2);
1062+ /// d.push_front(3);
1063+ ///
1064+ /// let keep = [false, true, false];
1065+ /// let mut iter = keep.iter();
1066+ /// d.retain(|_| *iter.next().unwrap());
1067+ /// assert_eq!(d.pop_front(), Some(2));
1068+ /// assert_eq!(d.pop_front(), None);
1069+ /// ```
1070+ #[ unstable( feature = "linked_list_retain" , issue = "114135" ) ]
1071+ pub fn retain < F > ( & mut self , mut f : F )
1072+ where
1073+ F : FnMut ( & T ) -> bool ,
1074+ {
1075+ self . retain_mut ( |elem| f ( elem) ) ;
1076+ }
1077+
1078+ /// Retains only the elements specified by the predicate.
1079+ ///
1080+ /// In other words, remove all elements `e` for which `f(&e)` returns false.
1081+ /// This method operates in place, visiting each element exactly once in the
1082+ /// original order, and preserves the order of the retained elements.
1083+ ///
1084+ /// # Examples
1085+ ///
1086+ /// ```
1087+ /// #![feature(linked_list_retain)]
1088+ /// use std::collections::LinkedList;
1089+ ///
1090+ /// let mut d = LinkedList::new();
1091+ ///
1092+ /// d.push_front(1);
1093+ /// d.push_front(2);
1094+ /// d.push_front(3);
1095+ ///
1096+ /// d.retain_mut(|x| if *x % 2 == 0 {
1097+ /// *x += 1;
1098+ /// true
1099+ /// } else {
1100+ /// false
1101+ /// });
1102+ /// assert_eq!(d.pop_front(), Some(3));
1103+ /// assert_eq!(d.pop_front(), None);
1104+ /// ```
1105+ #[ unstable( feature = "linked_list_retain" , issue = "114135" ) ]
1106+ pub fn retain_mut < F > ( & mut self , mut f : F )
1107+ where
1108+ F : FnMut ( & mut T ) -> bool ,
1109+ {
1110+ let mut cursor = self . cursor_front_mut ( ) ;
1111+ while let Some ( node) = cursor. current ( ) {
1112+ if !f ( node) {
1113+ cursor. remove_current ( ) . unwrap ( ) ;
1114+ } else {
1115+ cursor. move_next ( ) ;
1116+ }
1117+ }
1118+ }
1119+
10271120 /// Creates an iterator which uses a closure to determine if an element should be removed.
10281121 ///
10291122 /// If the closure returns true, then the element is removed and yielded.
0 commit comments