let add_extensions tags files =
  let open Result in
  let extensions = default_extensions tags in
  let rec loop exts fnames acc =
    match exts, fnames with
    | [], _ -> return (List.rev acc, fnames)
    | at_least_one :: _, [] -> fail (`tags `not_enough_filenames)
    | ext :: more_exts, file :: more_files ->
      loop more_exts more_files (sprintf "%s.%s" file ext :: acc)
  in
  loop extensions files []