Function Parameter Pattern Matching on multiple candidates?

For a list starting with something, it’s trivial:

def foo([first | _rest]) when first in ["a", "b"] do
end

For a list ending with something, it’s more involved as the Erlang lists are single-linked lists (in the C lingo) and you have to traverse the entire list to find the ending:

def foo(list) when is_list(list) do
  if List.last(list) in ["a", "b"] do
    # all good, proceed
  else
    # report an error
  end
end

For this usually people make a public function that does these validations and handles returning errors and then define something like defp do_foo to handle the happy path only.