defmodule AdventOfCodeHelper do alias AdventOfCodeHelper.GetInputs @moduledoc """ Provides an interface to get input values for Advent of Code puzzles """ @doc """ Returns input values ## Parameters - year: Int that represents year of puzzle - day: Int that represents day of puzzle """ @spec get_input(integer(), integer()) :: {:ok, String.t()} | {:fail, any()} def get_input(year, day) do GetInputs.get_value(year, day, Application.get_env(:advent_of_code_helper, :session)) end @doc """ Return input values for most recent year ## Parameters - day: Int that represents day of puzzle """ @spec get_input(integer()) :: {:ok, String.t()} def get_input(day) do calculate_year() |> get_input(day) end @doc """ Splits the string input into a list, using a given separator. """ @spec split_to_list(String.t(), String.t(), boolean()) :: list(any()) def split_to_list(input, sep \\ "\n", trim \\ false) do String.split(input, sep, trim: trim) end @doc """ Splits the string input into a stream, using a given separator. """ @spec split_to_stream(String.t(), String.t(), boolean()) :: Enumerable.t() def split_to_stream(input, sep \\ "\n", trim \\ false) do Stream.flat_map(input, &String.split(&1, sep, trim: trim)) end def calculate_year() do today = date_mod().utc_today() case today.month < 12 do true -> today.year - 1 false -> today.year end end defp date_mod(), do: Application.get_env(:advent_of_code_helper, :date_module) || Date end