lib/file_cache.ex

defmodule FileCache do
  @moduledoc """
  Simple File cache Agent
  """
  use Agent

  def start_link do
    Agent.start_link(fn -> %{} end, name: __MODULE__)
  end

  def get(filename) do
    Agent.get_and_update(
      __MODULE__,
      fn state ->
        if cached = Map.get(state, filename) do
          {cached, state}
        else
          file = File.stream!(filename)
          {file, Map.put(state, filename, file)}
        end
      end
    )
  end
end