module mod_function_utils
  use mod_global_variables, only: dp

  implicit none

  private

  public :: zero_func
  public :: from_function

contains

  real(dp) function zero_func()
    zero_func = 0.0_dp
  end function zero_func


  function from_function(func, values) result(array)
    procedure(real(dp)), pointer :: func
    real(dp), intent(in) :: values(:)
    real(dp) :: array(size(values))
    integer :: i

    do i = 1, size(values)
      array(i) = func(values(i))
    end do
  end function from_function

end module mod_function_utils
