!=================================================================
!> Module defining convenient index retrieval functions on various arrays.
module mod_get_indices
  implicit none

  private

  !> interface to retrieve the index of an element in an array.
   !! @note: replace get_index by `findloc` once we drop support for gfortran<9 @endnote
  interface get_index
    module procedure find_index_in_character_array
    module procedure find_indices_in_character_array
  end interface get_index

  public :: get_index

contains

  !> Function to locate the index of a given character in a character array.
  !! Iterates over the elements and returns on the first hit, if no match
  !! was found zero is returned.
  pure function find_index_in_character_array(name, array) result(match_idx)
    !> the name to search for
    character(len=*), intent(in)  :: name
    !> array with the names to search in
    character(len=*), intent(in)  :: array(:)
    !> index of first match
    integer :: match_idx
    integer :: i

    match_idx = 0
    do i = 1, size(array)
      if (array(i) == trim(adjustl(name))) then
        match_idx = i
        exit
      end if
    end do
  end function find_index_in_character_array


  !> Function to locate the indices of an array of characters in another
  !! character array. Returns the indices of the first hit, it no match was
  !! found zero is returned.
  pure function find_indices_in_character_array(names, array) result(match_idxs)
    !> the names to search for
    character(len=*), intent(in)  :: names(:)
    !> array in which to sarch in
    character(len=*), intent(in)  :: array(:)
    !> index of first matches
    integer :: match_idxs(size(names))
    integer :: i

    do i = 1, size(names)
      match_idxs(i) = find_index_in_character_array(names(i), array)
    end do
  end function find_indices_in_character_array

end module mod_get_indices
