use std::collections::HashMap; use std::io::{Bytes, Read}; use std::iter::Peekable; use crate::common; pub type Number = i32; #[derive(Debug, Clone, Hash, PartialEq, Eq)] pub struct Rule { pub first: Number, pub second: Number, } pub fn read_rules(mut input: &mut Peekable>) -> HashMap> { let mut rules_by_number = HashMap::>::new(); while let Some(Ok(ch)) = input.peek() { if ch == &b'\n' { input.next(); break; } let first = common::read_number(&mut input); input.next(); let second = common::read_number(&mut input); input.next(); let rule = Rule { first, second }; rules_by_number .entry(rule.first) .or_default() .push(rule.clone()); rules_by_number.entry(rule.second).or_default().push(rule); } rules_by_number } pub fn read_number_list(mut input: &mut Peekable>) -> Vec { let mut numbers = Vec::::new(); while let Some(Ok(ch)) = input.peek() { if ch == &b'\n' { break; } else if ch == &b',' { input.next(); continue; } let number = common::read_number(&mut input); numbers.push(number); } numbers } pub fn read_number(input: &mut Peekable>) -> Number { let mut number: Number = 0; while let Some(Ok(b'0'..=b'9')) = input.peek() { number *= 10; number += (input.next().unwrap().unwrap() - b'0') as Number; } number }