From abf983528f4f80ffb48fc517cf1cff523ab1ad34 Mon Sep 17 00:00:00 2001
From: Liam <byteslice@airmail.cc>
Date: Sat, 1 Jun 2024 23:09:06 -0400
Subject: [PATCH] Fix post-Elixir 1.16 divergence in File.stream!

---
 lib/philomena/sha512.ex | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/lib/philomena/sha512.ex b/lib/philomena/sha512.ex
index 1b500440..03c9645e 100644
--- a/lib/philomena/sha512.ex
+++ b/lib/philomena/sha512.ex
@@ -1,11 +1,27 @@
 defmodule Philomena.Sha512 do
-  @spec file(String.t()) :: String.t()
-  def file(file) do
+  @chunk_size 10_485_760
+
+  @spec file(Path.t()) :: String.t()
+  def file(path) do
     hash_ref = :crypto.hash_init(:sha512)
 
-    File.stream!(file, [], 10_485_760)
+    path
+    |> stream_file()
     |> Enum.reduce(hash_ref, &:crypto.hash_update(&2, &1))
     |> :crypto.hash_final()
     |> Base.encode16(case: :lower)
   end
+
+  if Version.match?(System.version(), ">= 1.16.0") do
+    # `stream!/2` was added in Elixir 1.16 to accept a shortened form,
+    # where we only need to specify the size of each stream chunk
+    defp stream_file(file) do
+      File.stream!(file, @chunk_size)
+    end
+  else
+    # Use legacy stream/3 for older Elixir versions
+    defp stream_file(file) do
+      File.stream!(file, [], @chunk_size)
+    end
+  end
 end