Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 117 additions & 0 deletions aoclp/src/cache.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
use std::env;
use std::env::VarError;
use std::error::Error;
use std::fs::{create_dir_all, read_to_string, rename, write};
use std::path::PathBuf;
use std::str::FromStr;

use crate::anyhow::Context;

#[derive(Debug)]
pub struct DiskCache {
path: PathBuf,
}

const CACHE_PATH_ENV_VAR: &str = "AOCLP_CACHE_PATH";
const DEFAULT_CACHE_PATH: &str = ".aoclp";

const CACHE_FILE_EXT: &str = ".txt";
const CACHE_FILE_TMP_EXT: &str = ".txt.tmp";
const CACHE_FILE_PC_EXT: &str = ".txt.pc";

impl DiskCache {
pub fn new() -> crate::Result<Self> {
let path: PathBuf = match env::var(CACHE_PATH_ENV_VAR) {
Ok(path) => path.into(),
Err(VarError::NotPresent) => DEFAULT_CACHE_PATH.into(),
Err(err) => {
return Err(err).with_context(|| "failed to get cache path from environment");
},
};
let path = path
.canonicalize()
.with_context(|| "failed to get absolute cache path")?;
create_dir_all(&path).with_context(|| "failed to create cache directory")?;

Ok(Self { path })
}

pub fn get<K, T>(&self, key: K) -> crate::Result<Option<T>>
where
K: AsRef<str>,
T: FromStr,
<T as FromStr>::Err: Error + Send + Sync + 'static,
{
let file_path = self.path_for(key.as_ref(), CACHE_FILE_EXT);
let pc_file_path = self.path_for(key.as_ref(), CACHE_FILE_PC_EXT);
if pc_file_path.is_file() {
rename(&pc_file_path, &file_path).with_context(|| {
format!(
"failed to rename pre-commit cache file for key '{}' from '{}' to '{}",
key.as_ref(),
pc_file_path.display(),
file_path.display(),
)
})?;
}

if !file_path.is_file() {
return Ok(None);
}

Ok(Some(
read_to_string(file_path)
.with_context(|| format!("failed to read cache file for key '{}'", key.as_ref()))?
.parse()
.with_context(|| {
format!("failed to parse cache file for key '{}'", key.as_ref())
})?,
))
}

pub fn set<K, T>(&self, key: K, value: T) -> crate::Result<()>
where
K: AsRef<str>,
T: TryInto<String>,
<T as TryInto<String>>::Error: Error + Send + Sync + 'static,
{
let data = value.try_into().with_context(|| {
format!("failed to convert cache value for key '{}' to string", key.as_ref())
})?;

let tmp_file_path = self.path_for(key.as_ref(), CACHE_FILE_TMP_EXT);
write(&tmp_file_path, data).with_context(|| {
format!(
"failed to write cache file for key '{}' to '{}",
key.as_ref(),
tmp_file_path.display(),
)
})?;

let pc_file_path = self.path_for(key.as_ref(), CACHE_FILE_PC_EXT);
rename(&tmp_file_path, &pc_file_path).with_context(|| {
format!(
"failed to rename temp cache file for key '{}' from '{}' to '{}",
key.as_ref(),
tmp_file_path.display(),
pc_file_path.display(),
)
})?;

let file_path = self.path_for(key.as_ref(), CACHE_FILE_EXT);
rename(&pc_file_path, &file_path).with_context(|| {
format!(
"failed to rename pre-commit cache file for key '{}' from '{}' to '{}",
key.as_ref(),
tmp_file_path.display(),
file_path.display(),
)
})?;

Ok(())
}

fn path_for(&self, key: &str, ext: &str) -> PathBuf {
self.path.join(key).with_added_extension(ext)
}
}
3 changes: 2 additions & 1 deletion aoclp/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
//! Helper library for Advent of Code.

pub mod cache;
pub mod captures;
pub mod forth;
pub mod functional;
pub mod looping;
pub mod mapping;
pub mod positioning;
pub mod solvers_impl;
pub mod solvers;
pub mod str;

pub type Error = anyhow::Error;
Expand Down
2 changes: 2 additions & 0 deletions aoclp/src/solvers.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pub mod build;
pub mod input;
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ macro_rules! build_solvers {
};
( $fn_name:ident, $({ $year:literal, [$($day:literal),+] }),+ ) => {
$crate::paste::paste! {
pub fn $fn_name() -> $crate::solvers_impl::solvers::Solvers {
let mut solvers = $crate::solvers_impl::solvers::Solvers::default();
pub fn $fn_name() -> $crate::solvers::build::Solvers {
let mut solvers = $crate::solvers::build::Solvers::default();
$(
$(
solvers.push_day($year, [<y $year>]::[<day_ $day>]::part_1, [<y $year>]::[<day_ $day>]::part_2);
Expand Down
File renamed without changes.
2 changes: 0 additions & 2 deletions aoclp/src/solvers_impl.rs

This file was deleted.

2 changes: 1 addition & 1 deletion aoclp_solutions/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::time::Instant;

use aoclp::solvers_impl::solvers::Solvers;
use aoclp::solvers::build::Solvers;
use aoclp_solutions::solvers;
use clap::Parser;

Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_01.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use aoclp::solvers_impl::input::safe_get_input;
use aoclp::solvers::input::safe_get_input;

pub fn part_1() -> u32 {
sum(&input(), 1)
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_02.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use aoclp::solvers_impl::input::safe_get_input_as_many_vecs;
use aoclp::solvers::input::safe_get_input_as_many_vecs;
use itertools::Itertools;

pub fn part_1() -> i32 {
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_03.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use aoclp::num::{Zero, zero};
use aoclp::positioning::direction::four_points::Direction4;
use aoclp::positioning::direction::{Direction, MovementDirection};
use aoclp::positioning::pt::{Pt, manhattan};
use aoclp::solvers_impl::input::safe_get_input;
use aoclp::solvers::input::safe_get_input;
use itertools::Itertools;

pub fn part_1() -> i64 {
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_04.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use aoclp::solvers_impl::input::safe_get_input_as_many;
use aoclp::solvers::input::safe_get_input_as_many;
use itertools::Itertools;

pub fn part_1() -> usize {
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_05.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::iter::successors;

use aoclp::solvers_impl::input::safe_get_input_as_many;
use aoclp::solvers::input::safe_get_input_as_many;

pub fn part_1() -> usize {
steps(false)
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_06.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::collections::HashMap;

use aoclp::solvers_impl::input::safe_get_input_as_one_vec;
use aoclp::solvers::input::safe_get_input_as_one_vec;

pub fn part_1() -> usize {
realloc_loop().cycles()
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_07.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use std::sync::OnceLock;

use aoclp::captures::CapturesHelper;
use aoclp::regex::Regex;
use aoclp::solvers_impl::input::safe_get_input_as_many;
use aoclp::solvers::input::safe_get_input_as_many;
use itertools::Itertools;

pub fn part_1() -> String {
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_08.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::collections::HashMap;
use std::str::FromStr;

use aoclp::anyhow::anyhow;
use aoclp::solvers_impl::input::safe_get_input_as_many;
use aoclp::solvers::input::safe_get_input_as_many;
use itertools::Itertools;

pub fn part_1() -> i64 {
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_09.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use aoclp::solvers_impl::input::safe_get_input;
use aoclp::solvers::input::safe_get_input;

pub fn part_1() -> usize {
Group::root().total_score()
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_10.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::ops::Mul;

use aoclp::solvers_impl::input::safe_get_input;
use aoclp::solvers::input::safe_get_input;

use crate::y2017::helpers::knot_hash::KnotHash;

Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_11.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use std::iter::successors;

use aoclp::num::zero;
use aoclp::positioning::pt::{Pt, manhattan};
use aoclp::solvers_impl::input::safe_get_input_as_one_vec;
use aoclp::solvers::input::safe_get_input_as_one_vec;
use gratte::EnumString;
use itertools::Itertools;

Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_12.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::collections::{HashMap, HashSet};
use std::str::FromStr;

use aoclp::solvers_impl::input::safe_get_input_as_many;
use aoclp::solvers::input::safe_get_input_as_many;
use itertools::Itertools;

pub fn part_1() -> usize {
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_13.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use aoclp::solvers_impl::input::safe_get_input_as_many_pairs;
use aoclp::solvers::input::safe_get_input_as_many_pairs;

pub fn part_1() -> usize {
input()
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_14.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::collections::HashSet;

use aoclp::positioning::pt::Pt;
use aoclp::solvers_impl::input::safe_get_input;
use aoclp::solvers::input::safe_get_input;

use crate::y2017::helpers::knot_hash::KnotHash;

Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_15.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::iter::successors;
use std::str::FromStr;

use aoclp::solvers_impl::input::safe_get_input_as_many;
use aoclp::solvers::input::safe_get_input_as_many;
use itertools::Itertools;

pub fn part_1() -> usize {
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_16.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::str::FromStr;

use aoclp::anyhow::{Context, anyhow};
use aoclp::looping::LoopingItertools;
use aoclp::solvers_impl::input::safe_get_input_as_one_vec;
use aoclp::solvers::input::safe_get_input_as_one_vec;
use itertools::Itertools;

pub fn part_1() -> String {
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_17.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use aoclp::solvers_impl::input::safe_get_input_as;
use aoclp::solvers::input::safe_get_input_as;

pub fn part_1() -> usize {
let mut spinlock = Spinlock::default();
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_18.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::rc::Rc;
use std::str::FromStr;

use aoclp::anyhow::{Context, anyhow};
use aoclp::solvers_impl::input::safe_get_input_as_many;
use aoclp::solvers::input::safe_get_input_as_many;

use crate::y2017::helpers::duet::{Queue, Registers, Value, read_register, read_value};

Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_19.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::iter::successors;
use aoclp::positioning::direction::four_points::Direction4;
use aoclp::positioning::pt::Pt;
use aoclp::positioning::turtle::Turtle;
use aoclp::solvers_impl::input::safe_get_input_as_many;
use aoclp::solvers::input::safe_get_input_as_many;

pub fn part_1() -> String {
packet().filter_map(|(_, c)| c.map(char::from)).collect()
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_20.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use aoclp::captures::CapturesHelper;
use aoclp::num::zero;
use aoclp::positioning::pt_3d::{Pt3d, manhattan};
use aoclp::regex::Regex;
use aoclp::solvers_impl::input::safe_get_input_as_many;
use aoclp::solvers::input::safe_get_input_as_many;
use itertools::Itertools;

pub fn part_1() -> usize {
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_21.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use std::fmt::{Display, Formatter};
use std::iter::successors;
use std::str::FromStr;

use aoclp::solvers_impl::input::safe_get_input_as_many;
use aoclp::solvers::input::safe_get_input_as_many;
use itertools::Itertools;

pub fn part_1() -> usize {
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_22.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use aoclp::positioning::direction::four_points::Direction4;
use aoclp::positioning::pt::Pt;
use aoclp::positioning::turtle::Turtle;
use aoclp::solvers_impl::input::safe_get_input_as_terrain;
use aoclp::solvers::input::safe_get_input_as_terrain;
use gratte::{EnumCount, FromRepr};

pub fn part_1() -> usize {
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_23.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use std::collections::HashMap;
use std::str::FromStr;

use aoclp::anyhow::{Context, anyhow};
use aoclp::solvers_impl::input::safe_get_input_as_many;
use aoclp::solvers::input::safe_get_input_as_many;
use gratte::EnumDiscriminants;
use itertools::Itertools;
use primes::is_prime;
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_24.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::convert::Infallible;
use std::str::FromStr;

use aoclp::solvers_impl::input::safe_get_input_as_many;
use aoclp::solvers::input::safe_get_input_as_many;
use itertools::Itertools;

pub fn part_1() -> usize {
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2017/day_25.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::collections::HashMap;
use std::rc::Rc;

use aoclp::solvers_impl::input::safe_get_input;
use aoclp::solvers::input::safe_get_input;
use bit_vec::BitVec;
use gratte::EnumString;
use itertools::Itertools;
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2024/day_01.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use aoclp::solvers_impl::input::safe_get_input_as_many_pairs;
use aoclp::solvers::input::safe_get_input_as_many_pairs;
use itertools::Itertools;

pub fn part_1() -> i64 {
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2024/day_02.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use aoclp::solvers_impl::input::safe_get_input_as_many_vecs;
use aoclp::solvers::input::safe_get_input_as_many_vecs;
use itertools::Itertools;

pub fn part_1() -> usize {
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2024/day_03.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use aoclp::captures::CapturesHelper;
use aoclp::regex::Regex;
use aoclp::solvers_impl::input::safe_get_input;
use aoclp::solvers::input::safe_get_input;

pub fn part_1() -> i64 {
sum_of_muls(false)
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2024/day_04.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::iter::successors;

use aoclp::positioning::direction::eight_points::Direction8;
use aoclp::positioning::pt::{Pt, matrix_to_map};
use aoclp::solvers_impl::input::safe_get_input_as_terrain;
use aoclp::solvers::input::safe_get_input_as_terrain;
use gratte::IntoEnumIterator;

pub fn part_1() -> usize {
Expand Down
2 changes: 1 addition & 1 deletion aoclp_solutions/src/y2024/day_05.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::cmp::Ordering;

use aoclp::solvers_impl::input::safe_get_input_as_many_vecs_of_two_types;
use aoclp::solvers::input::safe_get_input_as_many_vecs_of_two_types;
use itertools::Itertools;

pub fn part_1() -> u64 {
Expand Down
Loading
Loading