docs: def closest_val(x, L):
      '''
      Finds the index value in an iterable closest to a desired value.
  
      Parameters
      ----------
      x : object
          The desired value.
      L : iterable
          The iterable in which to search for the desired value.
  
      Returns
      -------
      index : int
          The index of the closest value to x in L.
  
      Notes
      -----
      Assumes x and the entries of L are of comparable types.
  
      Raises
      ------
      ValueError:
          if L is empty
      '''
      # Make sure the iterable is nonempty
      if len(L) == 0:
          raise ValueError('L must not be empty')
      if isinstance(L, np.ndarray):
          # use faster numpy methods if using a numpy array
          return (np.abs(L-x)).argmin()
      # for a general iterable (like a list) we need general Python
      # start by assuming the first item is closest
      min_index = 0
      min_diff = abs(L[0] - x)
      i = 1
      while i < len(L):
          # check if each other item is closer than our current closest
          diff = abs(L[i] - x)
          if diff < min_diff:
              # if it is, set it as the new closest
              min_index = i
              min_diff = diff
          i += 1
      return min_index