i thik something like an “interface/inheritance” can help with all the duplicated code making an isolation with the concret type but i cant find anything like that
the other problematic line is
defp process_block_decode_loop(%__MODULE__{} = value, index) when index < @block_length do
because you need the block_length to make the loop work…
i appretiate any idea/insight/suggestion to make the code looks better and to learn a better way
if i understood it correctly the struct that you’re using seems to be an internal abstraction. so why not internalize the digest_length and the block_length in the struct, this way you can always have it available on the function head by just destructing it and keep the same guard validations.
Are you sure you got all the references? This take(134) seems extremely suspicious - it’s two less than @block_length for @digest_length == 32 in 256-bit, but not changed for 512-bit where @digest_length is different.