77 P : FnMut ( & T , usize , usize ) -> Satisfies ,
88{
99 let mut cache = BTreeMap :: new ( ) ;
10- let mut predicate = |idx : usize , remaining, estimate| {
10+ let mut predicate = |idx : usize , rm_no, lm_yes| {
11+ let range = lm_yes - rm_no + 1 ;
12+ // FIXME: This does not consider unknown_ranges.
13+ let remaining = range / 2 ;
14+ let estimate = estimate_steps ( range) ;
1115 * cache
1216 . entry ( idx)
1317 . or_insert_with ( || predicate ( & slice[ idx] , remaining, estimate) )
4448 }
4549 }
4650
47- let mut range = lm_yes - rm_no + 1 ;
48- // FIXME: This does not consider unknown_ranges.
49- let mut remaining = range / 2 ;
50- let estimate = estimate_steps ( range) ;
51- let r = predicate ( next, remaining, estimate) ;
51+ let r = predicate ( next, rm_no, lm_yes) ;
5252 match r {
5353 Satisfies :: Yes => {
5454 lm_yes = next;
@@ -60,20 +60,14 @@ where
6060 }
6161 Satisfies :: Unknown => {
6262 let mut left = next;
63- while left > 0
64- && predicate ( left, remaining, estimate_steps ( range) ) == Satisfies :: Unknown
65- {
63+ while left > 0 && predicate ( left, rm_no, lm_yes) == Satisfies :: Unknown {
6664 left -= 1 ;
67- remaining = remaining. saturating_sub ( 1 ) ;
68- range = range. saturating_sub ( 1 ) ;
6965 }
7066 let mut right = next;
7167 while right + 1 < slice. len ( )
72- && predicate ( right, remaining , estimate_steps ( range ) ) == Satisfies :: Unknown
68+ && predicate ( right, rm_no , lm_yes ) == Satisfies :: Unknown
7369 {
7470 right += 1 ;
75- remaining = remaining. saturating_sub ( 1 ) ;
76- range = range. saturating_sub ( 1 ) ;
7771 }
7872 unknown_ranges. push ( ( left + 1 , right - 1 ) ) ;
7973 next = left;
0 commit comments