(description: &str)
| 21 | reason = "false-positive, try_fold is fail-fast, our implementation is fail-slow" |
| 22 | )] |
| 23 | fn parse_experiment(description: &str) -> Result<Vec<(u64, u64)>, Report<ParseExperimentError>> { |
| 24 | let values = description |
| 25 | .split(' ') |
| 26 | .map(|value| { |
| 27 | value |
| 28 | .parse::<u64>() |
| 29 | .attach_with(|| format!("{value:?} could not be parsed as experiment")) |
| 30 | }) |
| 31 | .map(|value| value.map(|ok| (ok, 2 * ok))) |
| 32 | .fold(Ok(vec![]), |accum, value| match (accum, value) { |
| 33 | (Ok(mut accum), Ok(value)) => { |
| 34 | accum.push(value); |
| 35 | |
| 36 | Ok(accum) |
| 37 | } |
| 38 | (Ok(_), Err(err)) => Err(err.expand()), |
| 39 | (Err(accum), Ok(_)) => Err(accum), |
| 40 | (Err(mut accum), Err(err)) => { |
| 41 | accum.push(err); |
| 42 | |
| 43 | Err(accum) |
| 44 | } |
| 45 | }) |
| 46 | .change_context(ParseExperimentError)?; |
| 47 | |
| 48 | Ok(values) |
| 49 | } |
| 50 | |
| 51 | #[derive(Debug)] |
| 52 | struct ExperimentError; |
no test coverage detected